summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcvs2svn Import User <samba-bugs@samba.org>1997-10-10 14:46:44 +0000
committercvs2svn Import User <samba-bugs@samba.org>1997-10-10 14:46:44 +0000
commit4480ee713f3ebaaf6852c2e3a5967b30e587f7db (patch)
tree70a8a34fa622fd9adef3dd7f65da299bf6c3e48a
parent3590a783338defa4ff1385b2d5bb095c5051ac82 (diff)
downloadsamba-misc-tags/samba.tar.gz
samba-misc-tags/samba.tar.xz
samba-misc-tags/samba.zip
This commit was manufactured by cvs2svn to create tag 'samba'.samba-misc-tags/samba
-rw-r--r--COPYING339
-rw-r--r--Manifest66
-rw-r--r--README152
-rw-r--r--Read-Manifest-Now0
-rw-r--r--Roadmap30
-rw-r--r--WHATSNEW.txt106
-rw-r--r--docs/NT4_PlainPassword.reg11
-rw-r--r--docs/THANKS137
-rw-r--r--docs/Win95_PlainPassword.reg4
-rw-r--r--docs/announce133
-rw-r--r--docs/faq/Samba-Server-FAQ-1.html77
-rw-r--r--docs/faq/Samba-Server-FAQ-2.html500
-rw-r--r--docs/faq/Samba-Server-FAQ.html88
-rw-r--r--docs/faq/Samba-Server-FAQ.sgml492
-rw-r--r--docs/faq/Samba-meta-FAQ-1.html160
-rw-r--r--docs/faq/Samba-meta-FAQ-2.html384
-rw-r--r--docs/faq/Samba-meta-FAQ-3.html101
-rw-r--r--docs/faq/Samba-meta-FAQ-4.html215
-rw-r--r--docs/faq/Samba-meta-FAQ-5.html30
-rw-r--r--docs/faq/Samba-meta-FAQ-6.html30
-rw-r--r--docs/faq/Samba-meta-FAQ.html102
-rw-r--r--docs/faq/Samba-meta-FAQ.sgml771
-rw-r--r--docs/faq/Samba-meta-FAQ.txt924
-rw-r--r--docs/faq/sambafaq-1.html392
-rw-r--r--docs/faq/sambafaq-2.html239
-rw-r--r--docs/faq/sambafaq-3.html322
-rw-r--r--docs/faq/sambafaq-4.html37
-rw-r--r--docs/faq/sambafaq-5.html30
-rw-r--r--docs/faq/sambafaq.html115
-rw-r--r--docs/faq/sambafaq.sgml792
-rw-r--r--docs/faq/sambafaq.txt1122
-rw-r--r--docs/history196
-rw-r--r--docs/htmldocs/wfw_slip.htm175
-rw-r--r--docs/manpages/nmbd.8231
-rw-r--r--docs/manpages/samba.7202
-rw-r--r--docs/manpages/smb.conf.53643
-rw-r--r--docs/manpages/smbclient.11211
-rw-r--r--docs/manpages/smbd.8428
-rw-r--r--docs/manpages/smbpasswd.8112
-rw-r--r--docs/manpages/smbrun.174
-rw-r--r--docs/manpages/smbstatus.170
-rw-r--r--docs/manpages/smbtar.1179
-rw-r--r--docs/manpages/testparm.1109
-rw-r--r--docs/manpages/testprns.1112
-rw-r--r--docs/samba.lsm26
-rw-r--r--docs/textdocs/Application_Serving.txt50
-rw-r--r--docs/textdocs/BROWSING.txt548
-rw-r--r--docs/textdocs/BUGS.txt135
-rw-r--r--docs/textdocs/DIAGNOSIS.txt260
-rw-r--r--docs/textdocs/DNIX.txt69
-rw-r--r--docs/textdocs/DOMAIN.txt361
-rw-r--r--docs/textdocs/DOMAIN_CONTROL.txt108
-rw-r--r--docs/textdocs/ENCRYPTION.txt324
-rw-r--r--docs/textdocs/Faxing.txt220
-rw-r--r--docs/textdocs/GOTCHAS.txt68
-rw-r--r--docs/textdocs/HINTS.txt209
-rw-r--r--docs/textdocs/INSTALL.sambatar33
-rwxr-xr-xdocs/textdocs/MIRRORS.txt90
-rw-r--r--docs/textdocs/NetBIOS.txt152
-rw-r--r--docs/textdocs/OS2-Client-HOWTO.txt61
-rw-r--r--docs/textdocs/PROJECTS88
-rw-r--r--docs/textdocs/Passwords.txt46
-rw-r--r--docs/textdocs/Printing.txt93
-rw-r--r--docs/textdocs/README.DCEDFS78
-rw-r--r--docs/textdocs/README.jis149
-rw-r--r--docs/textdocs/README.sambatar23
-rw-r--r--docs/textdocs/SCO.txt19
-rw-r--r--docs/textdocs/SMBTAR.notes46
-rw-r--r--docs/textdocs/Speed.txt333
-rw-r--r--docs/textdocs/Support.txt1847
-rw-r--r--docs/textdocs/Tracing.txt93
-rw-r--r--docs/textdocs/UNIX-SMB.txt231
-rw-r--r--docs/textdocs/UNIX_INSTALL.txt343
-rw-r--r--docs/textdocs/Win95.txt74
-rw-r--r--docs/textdocs/WinNT.txt74
-rw-r--r--docs/textdocs/security_level.txt96
-rw-r--r--examples/README11
-rw-r--r--examples/dce-dfs/README4
-rw-r--r--examples/dce-dfs/smb.conf42
-rw-r--r--examples/misc/extra_smbstatus50
-rw-r--r--examples/misc/wall.perl69
-rw-r--r--examples/printer-accounting/README63
-rw-r--r--examples/printer-accounting/acct-all9
-rw-r--r--examples/printer-accounting/acct-sum29
-rw-r--r--examples/printer-accounting/hp5-redir43
-rw-r--r--examples/printer-accounting/lp-acct38
-rw-r--r--examples/printer-accounting/printcap22
-rwxr-xr-xexamples/printing/smbprint77
-rw-r--r--examples/printing/smbprint.sysv52
-rw-r--r--examples/simple/README2
-rw-r--r--examples/simple/smb.conf167
-rw-r--r--examples/smb.conf.default235
-rw-r--r--examples/svr4-startup/README24
-rwxr-xr-xexamples/svr4-startup/samba.server38
-rw-r--r--examples/thoralf/smb.conf152
-rw-r--r--examples/tridge/README8
-rw-r--r--examples/tridge/smb.conf101
-rw-r--r--examples/tridge/smb.conf.WinNT14
-rw-r--r--examples/tridge/smb.conf.fjall21
-rw-r--r--examples/tridge/smb.conf.lapland14
-rw-r--r--examples/tridge/smb.conf.vittjokk14
-rw-r--r--examples/validchars/msdos70.out257
-rw-r--r--examples/validchars/nwdos70.out257
-rw-r--r--examples/validchars/readme101
-rw-r--r--examples/validchars/validchr.c123
-rw-r--r--examples/validchars/validchr.combin9792 -> 0 bytes
-rw-r--r--packaging/README34
-rw-r--r--packaging/SGI/Makefile722
-rw-r--r--packaging/SGI/README38
-rwxr-xr-xpackaging/SGI/inetd.sh29
-rw-r--r--packaging/SGI/legal_notice.html53
-rwxr-xr-xpackaging/SGI/mkman22
-rwxr-xr-xpackaging/SGI/mkprintcap.sh15
-rwxr-xr-xpackaging/SGI/mkrelease.sh25
-rw-r--r--packaging/SGI/printcap5
-rw-r--r--packaging/SGI/psfixes.sed4
-rw-r--r--packaging/SGI/relnotes.html234
-rw-r--r--packaging/SGI/samba.config1
-rw-r--r--packaging/SGI/samba.idb394
-rw-r--r--packaging/SGI/samba.rc42
-rw-r--r--packaging/SGI/samba.spec45
-rw-r--r--packaging/SGI/sambalp21
-rw-r--r--packaging/SGI/smb.conf84
-rw-r--r--packaging/SGI/smbpasswd1
-rw-r--r--packaging/SGI/smbprint52
-rw-r--r--packaging/Solaris/pkg-specs/Packaging.script5
-rw-r--r--packaging/Solaris/pkg-specs/mkprototype31
-rw-r--r--packaging/Solaris/pkg-specs/pkginfo12
-rw-r--r--packaging/Solaris/pkg-specs/postinstall37
-rw-r--r--packaging/Solaris/pkg-specs/postremove30
-rw-r--r--source/.cvsignore12
-rw-r--r--source/arcfour.c91
-rw-r--r--source/arcfour.h39
-rw-r--r--source/cgi.c163
-rw-r--r--source/change-log1878
-rw-r--r--source/client/client.c4910
-rw-r--r--source/client/clientutil.c1040
-rw-r--r--source/client/clitar.c1771
-rw-r--r--source/codepages/codepage_def.43770
-rw-r--r--source/codepages/codepage_def.85054
-rw-r--r--source/codepages/codepage_def.85263
-rw-r--r--source/codepages/codepage_def.93224
-rw-r--r--source/include/byteorder.h200
-rw-r--r--source/include/charset.h75
-rw-r--r--source/include/clitar.h17
-rw-r--r--source/include/includes.h1290
-rw-r--r--source/include/kanji.h133
-rw-r--r--source/include/local.h167
-rw-r--r--source/include/nameserv.h427
-rw-r--r--source/include/nterr.h505
-rw-r--r--source/include/proto.h1057
-rw-r--r--source/include/smb.h1694
-rw-r--r--source/include/trans2.h251
-rw-r--r--source/include/version.h1
-rw-r--r--source/include/vt_mode.h48
-rw-r--r--source/internals.doc212
-rw-r--r--source/lib/access.c289
-rw-r--r--source/lib/charcnv.c164
-rw-r--r--source/lib/charset.c383
-rw-r--r--source/lib/fault.c82
-rw-r--r--source/lib/getsmbpass.c165
-rw-r--r--source/lib/interface.c457
-rw-r--r--source/lib/kanji.c868
-rw-r--r--source/lib/md4.c171
-rw-r--r--source/lib/replace.c325
-rw-r--r--source/lib/system.c413
-rw-r--r--source/lib/time.c495
-rw-r--r--source/lib/ufc.c782
-rw-r--r--source/lib/username.c324
-rw-r--r--source/lib/util.c4392
-rw-r--r--source/libsmb/credentials.c101
-rw-r--r--source/libsmb/namequery.c295
-rw-r--r--source/libsmb/nmblib.c731
-rw-r--r--source/libsmb/smbdes.c320
-rw-r--r--source/libsmb/smbencrypt.c111
-rw-r--r--source/locking/locking.c1535
-rw-r--r--source/locking/shmem.c844
-rw-r--r--source/lsaparse.c468
-rw-r--r--source/nameannounce.c528
-rw-r--r--source/nameannounce.doc265
-rw-r--r--source/namebrowse.c246
-rw-r--r--source/namebrowse.doc149
-rw-r--r--source/nameconf.c350
-rw-r--r--source/namedbname.c601
-rw-r--r--source/namedbname.doc182
-rw-r--r--source/namedbresp.c166
-rw-r--r--source/namedbresp.doc100
-rw-r--r--source/namedbserver.c212
-rw-r--r--source/namedbsubnet.c367
-rw-r--r--source/namedbwork.c245
-rw-r--r--source/nameelect.c855
-rw-r--r--source/nameelect.doc256
-rw-r--r--source/namelogon.c145
-rw-r--r--source/namelogon.doc36
-rw-r--r--source/namepacket.c637
-rw-r--r--source/namepacket.doc133
-rw-r--r--source/namequery.doc83
-rw-r--r--source/nameresp.c324
-rw-r--r--source/nameresp.doc178
-rw-r--r--source/nameserv.c506
-rw-r--r--source/nameserv.doc159
-rw-r--r--source/nameservreply.c667
-rw-r--r--source/nameservreply.doc213
-rw-r--r--source/nameservresp.c848
-rw-r--r--source/nameservresp.doc191
-rw-r--r--source/namework.c723
-rw-r--r--source/namework.doc363
-rw-r--r--source/nmbd/nmbd.c647
-rw-r--r--source/nmbsync.c191
-rw-r--r--source/param/loadparm.c2361
-rw-r--r--source/param/params.c566
-rw-r--r--source/passdb/smbpass.c293
-rw-r--r--source/printing/pcap.c381
-rw-r--r--source/printing/printing.c1102
-rw-r--r--source/script/addtosmbpass74
-rwxr-xr-xsource/script/installbin.sh44
-rwxr-xr-xsource/script/installcp.sh36
-rwxr-xr-xsource/script/installman.sh38
-rwxr-xr-xsource/script/installscripts.sh43
-rw-r--r--source/script/mkproto.awk82
-rwxr-xr-xsource/script/mksmbpasswd.sh6
-rwxr-xr-xsource/script/revert.sh15
-rw-r--r--source/script/smbtar140
-rwxr-xr-xsource/script/uninstallbin.sh43
-rwxr-xr-xsource/script/uninstallcp.sh33
-rwxr-xr-xsource/script/uninstallman.sh31
-rwxr-xr-xsource/script/uninstallscripts.sh37
-rwxr-xr-xsource/script/updatesmbpasswd.sh14
-rwxr-xr-xsource/smbadduser74
-rw-r--r--source/smbd/chgpasswd.c400
-rw-r--r--source/smbd/dir.c996
-rw-r--r--source/smbd/ipc.c3133
-rw-r--r--source/smbd/mangle.c673
-rw-r--r--source/smbd/message.c201
-rw-r--r--source/smbd/password.c1707
-rw-r--r--source/smbd/pipes.c1196
-rw-r--r--source/smbd/predict.c158
-rw-r--r--source/smbd/quotas.c657
-rw-r--r--source/smbd/reply.c3821
-rw-r--r--source/smbd/server.c5024
-rw-r--r--source/smbd/smbrun.c97
-rw-r--r--source/smbd/trans2.c1794
-rw-r--r--source/smbd/uid.c478
-rw-r--r--source/smbd/vt_mode.c490
-rw-r--r--source/smbparse.c551
-rw-r--r--source/utils/make_smbcodepage.c472
-rw-r--r--source/utils/nmblookup.c241
-rw-r--r--source/utils/smbpasswd.c581
-rw-r--r--source/utils/status.c526
-rw-r--r--source/utils/testparm.c112
-rw-r--r--source/utils/testprns.c72
-rw-r--r--source/web/cgi.c163
-rw-r--r--source/wsmbconf.c251
-rw-r--r--source/wsmbstatus.c87
254 files changed, 0 insertions, 94730 deletions
diff --git a/COPYING b/COPYING
deleted file mode 100644
index a43ea2126fb..00000000000
--- a/COPYING
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/Manifest b/Manifest
deleted file mode 100644
index 7e8dc0106f6..00000000000
--- a/Manifest
+++ /dev/null
@@ -1,66 +0,0 @@
-Copyright (C) 1997 - Samba-Team
-
-The Samba package you have just unpacked contains the following:
-
-Directory Notes:
-========= ======
-docs (Samba Documentation):
---------------------------------------
-
- The Samba documentation for 1.9.17 has had some of its content
- updated and a new structure has been put in place. However, since
- this is all rather new the documentation format of previous
- versions will remain in place.
-
- Note in particular two files - <your OS>_INSTALL.txt and DIAGNOSIS.txt
- There is the potential for there to be many *INSTALL.txt files, one
- for each OS that Samba supports. However we are moving all this into
- the new structure. For now, most people will be using UNIX_INSTALL.txt.
-
- You pay close attention to all the files with a
- .txt extension. Most problems can be solved by reference to the
- two files mentioned.
-
- The new documentation can be accessed starting from Samba-meta-FAQ.html,
- in the docs/faq directory. This is incomplete, but to quote from the
- abstract, it:
-
- "contains overview information for the Samba suite of programs,
- a quick-start guide, and pointers to all other Samba documentation.
- Other FAQs exist for specific client and server issues, and HOWTO
- documents for more extended topics to do with Samba software."
-
-
-examples (Example configuration files):
-----------------------------------------------
- Please pay close attention to the reference smb.conf file
- smb.conf.default that has now been included as the master guide.
-
- Do read the smb.conf manual page in considering what settings are
- appropriate for your site.
-
-
-packaging (Only for those wishing to build binary distributions):
------------------------------------------------------------------------
- Currently support is included only for RedHat Linux. We hope that
- other Unix OS vendors will contribute their binary distribution
- packaging control files - and we hope to make their binary packages
- available on the master ftp site under:
- samba.anu.edu.au/pub/samba/Binary_Packages/"OS_Vendor"
-
-
-source (The official Samba source files - expect more of these!):
---------------------------------------------------------------------------
- To build your own binary files you will need a suitable ansi C
- compiler. Also, you must edit the enclosed "Makefile" as required
- for your operating system platform. Then just run:
- a) make
- b) make install
- then
- c) set up your configuration files.
-
- NOTE: OS Vendors who provide Samba binary packages will generally
- integrate all Samba files into their preferred directory locations.
- These may differ from the default location ALWAYS used by the Samba
- sources. Please be careful when upgrading a vendor provided binary
- distribution from files you have built yourself.
diff --git a/README b/README
deleted file mode 100644
index 30103241841..00000000000
--- a/README
+++ /dev/null
@@ -1,152 +0,0 @@
-This is version 1.9.17 of Samba, the free SMB client and server for unix
-and other operating systems. Samba is maintained by the Samba Team,
-who support the original author, Andrew Tridgell.
-
->>>> Please read THE WHOLE of this file as it gives important information
->>>> about the configuration and use of Samba.
-
-This software is freely distributable under the GNU public license, a
-copy of which you should have received with this software (in a file
-called COPYING).
-
-WHAT IS SMB?
-============
-
-This is a big question.
-
-The very short answer is that it is the protocol by which a lot of
-PC-related machines share files and printers and other informatiuon
-such as lists of available files and printers. Operating systems that
-support this natively include Windows NT, OS/2, and Linux and add on
-packages that achieve the same thing are available for DOS, Windows,
-VMS, Unix of all kinds, MVS, and more. Apple Macs and some Web Browsers
-can speak this protocol as well. Alternatives to SMB include
-Netware, NFS, Appletalk, Banyan Vines, Decnet etc; many of these have
-advantages but none are both public specifications and widely
-implemented in desktop machines by default.
-
-The Common Internet Filesystem is what the new SMB initiative is
-called. For details watch http://samba.anu.edu.au/cifs.
-
-WHAT CAN SAMBA DO?
-==================
-
-Here is a very short list of what samba includes, and what it does.
-
-- a SMB server, to provide Windows NT and LAN Manager-style file and print
- services to SMB clients such as Windows 95, Warp Server, smbfs and others.
-
-- a Netbios (rfc1001/1002) nameserver, which among other things gives
- browsing support. Samba can be the master browser on your LAN if you wish.
-
-- a ftp-like SMB client so you can access PC resources (disks and
-printers) from unix, Netware and other operating systems
-
-- a tar extension to the client for backing up PCs
-
-For a much better overview have a look at the web site at
-http://samba.anu.edu.au/samba, and browse the user survey.
-
-Related packages include:
-
-- smbfs, a linux-only filesystem allowing you to mount remote SMB
-filesystems from PCs on your linux box. This is included as standard with
-Linux 2.0 and later.
-
-- tcpdump-smb, a extension to tcpdump to allow you to investigate SMB
-networking problems over netbeui and tcp/ip.
-
-- smblib, a library of smb functions which are designed to make it
-easy to smb-ise any particular application. See
-ftp://samba.anu.edu.au/pub/samba/smblib.
-
-CONTRIBUTIONS
-=============
-
-If you want to contribute to the development of the software then
-please join the mailing list. The Samba team accepts patches
-(preferably in "diff -u" format, see docs/BUGS.txt for more details)
-and are always glad to receive feedback or suggestions to the address
-samba-bugs@samba.anu.edu.au.
-
-You could also send hardware/software/money/jewelry or pizza
-vouchers directly to Andrew. The pizza vouchers would be especially
-welcome, in fact there is a special field in the survey for people who
-have paid up their pizza :-)
-
-If you like a particular feature then look through the change-log and
-see who added it, then send them an email.
-
-Remember that free software of this kind lives or dies by the response
-we get. If noone tells us they like it then we'll probably move onto
-something else. However, as you can see from the user survey quite a lot of
-people do seem to like it at the moment :-)
-
-Andrew Tridgell
-Email: samba-bugs@samba.anu.edu.au
-
-3 Ballow Crescent
-Macgregor, A.C.T.
-2615 Australia
-
-Samba Team
-Email: samba-bugs@samba.anu.edu.au
-
-MORE INFO
-=========
-
-DOCUMENTATION
--------------
-
-There is quite a bit of documentation included with the package,
-including man pages, and lots of .txt files with hints and useful
-info. This is also available from the web page. There is a growing
-collection of information under docs/faq; by the next release expect
-this to be the default starting point.
-
-FTP SITE
---------
-
-Please use a mirror site! The list of mirrors is in docs/MIRRORS.txt.
-The master ftp site is samba.anu.edu.au in the directory pub/samba.
-
-MAILING LIST
-------------
-
-There is a mailing list for discussion of Samba. To subscribe send
-mail to listproc@samba.anu.edu.au with a body of "subscribe samba Your Name"
-Please do NOT send this request to the list alias instead.
-
-To send mail to everyone on the list mail to samba@listproc.anu.edu.au
-
-There is also an announcement mailing list where new versions are
-announced. To subscribe send mail to listproc@samba.anu.edu.au with a
-body of "subscribe samba-announce Your Name". All announcements also
-go to the samba list.
-
-
-NEWS GROUP
-----------
-
-You might also like to look at the usenet news group
-comp.protocols.smb as it often contains lots of useful info and is
-frequented by lots of Samba users. The newsgroup was initially setup
-by people on the Samba mailing list. It is not, however, exclusive to
-Samba, it is a forum for discussing the SMB protocol (which Samba
-implements). The samba list is gatewayed to this newsgroup.
-
-
-WEB SITE
---------
-
-A Samba WWW site has been setup with lots of useful info. Connect to:
-
-http://samba.anu.edu.au/samba/
-
-As well as general information and documentation, this also has searchable
-archives of the mailing list and a user survey that shows who else is using
-this package. Have you registered with the survey yet? :-)
-
-It is maintained by Paul Blackman (thanks Paul!). You can contact him
-at ictinus@samba.anu.edu.au.
-
diff --git a/Read-Manifest-Now b/Read-Manifest-Now
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/Read-Manifest-Now
+++ /dev/null
diff --git a/Roadmap b/Roadmap
deleted file mode 100644
index 52902d556e4..00000000000
--- a/Roadmap
+++ /dev/null
@@ -1,30 +0,0 @@
-Copyright (C) 1997 - Samba-Team
-
-The Samba-Team are committed to an agressive program to deliver quality
-controlled software to a well defined roadmap.
-
-The current Samba release 1.9.17 is called the "Browse Fix Release"
-The following development objectives are in place:
-
-Version / Codename Notes
------------------- ----------------------------------------------------
-1.9.18 This version will feature two main areas of improvement
-"Perf-Lock Release" - introduction of OpLock support
- - introduction of new browse list and WINS methods
-
-1.9.19 An authentication update release to offer improved
-"Auth Code Release" security and password synchronisation capabilities
-
-1.9.20 Introduction of new managment tools
-"GUI Config Release" Improved multi-language support.
-
-2.0 The next generation Directory Services update
-"DSA Release"
-
-While no release date or content promises are made we are hoping to release
-the remainder of the 1.9 series relases within short time frame.
-
-Should a budding contributor spring into gear and deliver any of the above
-ahead of the above release sequence then we reserve the option to make an
-out of sequence release (but always keeping to a logical sequence code number).
-
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
deleted file mode 100644
index 072679d0401..00000000000
--- a/WHATSNEW.txt
+++ /dev/null
@@ -1,106 +0,0 @@
- WHATS NEW IN 1.9.17 - August 25th 1997
- ======================================
-
-New stable release of Samba.
-----------------------------
-
-This is the new stable release of Samba, superceding
-the last stable release 1.9.16p11. All users are
-encouraged to upgrade to this new release as there have
-been many improvements to the code since that time.
-See the Frequently Asked Questions (under docs/faq) for
-an explanation of how the version numbering scheme works,
-distinguishing between stable and development releases.
-
-Changes since 1.9.16p11.
-------------------------
-
-Improved browsing support.
---------------------------
-
-Samba now should support propagation of browse lists
-across subnets correctly. Look in the file docs/BROWSING.txt
-as it has been largely re-written to explain how to do this.
-
-*IMPORTANT* All Samba servers acting as local/domain master
-browsers must be running 1.9.17 (or later).
-
-Thanks to Silicon Graphics for allowing us to test the new
-code on their corporate network.
-
-
-Improved share mode handling
-----------------------------
-
-The handling of share modes has been completely rewritten.
-Samba can now run agressive PC Benchmarks (Ziff-Davis
-NetBench) correctly with many hundreds of concurrent PC's.
-The confidence level on share mode handling in Samba
-is now much higher than it was previously. PC database
-packages should be safe when run against a Samba share.
-Thanks to Silicon Graphics for testing this code for us.
-
-If at all possible compile Samba to use the new share
-mode handling with shared memory (set the flags
-FAST_SHARE_MODES in the Makefile). This will be *much* faster
-than old file-based share modes. FAST_SHARE_MODES have
-been turned on by default on the following platforms in
-the Makefile :
-
- Linux
- Solaris
- BSDI
- IRIX 5.x.x
- FreeBSD
-
-Roving profile support.
------------------------
-
-Roving profiles are believed to work correctly
-with Windows NT 4.x and Windows 95. Domain logons
-are fully implemented *for Windows 95 machines only*.
-
-
-Updated documentation
----------------------
-All options are now documented in the smb.conf man page
-we believe. Much work has been done by Samba Team members
-to improve the quality and quantity of the Samba documentation.
-
-A draft new structure for documentation is being worked on: see
-docs/faq/Samba-meta-FAQ for details. This will soon be a master
-reference to all Samba documentation.
-
-Many bugfixes and improvements
-------------------------------
-From around the 'net around the world. Many
-thanks to everyone who contributed.
-
-Commercial thanks.
-------------------
-
-Thanks to Cisco for the new netbios alias code support.
-Thanks to Silicon Graphics for the help with the cross
-subnet browsing and NetBench code.
-Thanks to Whistle for funding one of the Samba Team
-members.
-
-Reporting bugs
---------------
-
-The Samba Team believes that this is a stable
-production release, but all software has bugs.
-If you have problems, or think you have found a
-bug please email a report to :
-
-samba-bugs@samba.anu.edu.au
-
-Stating the version number of Samba that you
-are running, and *full details* of the steps
-we need to reproduce the problem.
-
-As always, all bugs are our responsibility.
-
-Regards,
-
- The Samba Team.
diff --git a/docs/NT4_PlainPassword.reg b/docs/NT4_PlainPassword.reg
deleted file mode 100644
index b30db150c24..00000000000
--- a/docs/NT4_PlainPassword.reg
+++ /dev/null
@@ -1,11 +0,0 @@
-REGEDIT4
-
-;Contributor: Tim Small (tim.small@virgin.net)
-;Updated: 20 August 1997
-;Status: Current
-;
-;Subject: Registry file to enable plain text passwords in NT4-SP3 and later
-
-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rdr\Parameters]
-"EnablePlainTextPassword"=dword:00000001
-
diff --git a/docs/THANKS b/docs/THANKS
deleted file mode 100644
index 19c11dc432f..00000000000
--- a/docs/THANKS
+++ /dev/null
@@ -1,137 +0,0 @@
-=====================================================================
-This file is for thanks to individuals or organisations who have
-helped with the development of Samba, other than by coding or bug
-reports. Their contributions are gratefully acknowledged.
-
-Please refer to the manual pages and change-log for a list of those
-who have contributed in the form of patches, bug fixes or other
-direct changes to the package.
-
-Contributions of any kind are welcomed. If you want to help then
-please contact Andrew.Tridgell@anu.edu.au, or via normal mail at
-
- Andrew Tridgell
- 3 Ballow Crescent
- Macgregor, A.C.T
- 2615 Australia
-=====================================================================
-
-
-Lee Fisher (leefi@microsoft.com)
-Charles Fox (cfox@microsoft.com)
-Dan Perry (danp@exchnge.microsoft.com)
-Paul Leach (paulle@microsoft.com)
-Isaac Heizer (isaache@microsoft.com)
-
- These Microsoft people have been very helpful and supportive of
- the development of Samba over some years.
-
- Lee very kindly supplied me with a copy of the X/Open SMB
- specs. These have been invaluable in getting the details of the
- implementation right. They will become even more important as we move
- towards a Lanman 2.1 compliant server. Lee has provided very
- useful advice on several aspects of the server.
- Lee has also provided me with copies of Windows NTAS 3.1, Visual C
- and a developers CD-ROM. Being able to run NT at home is a
- great help.
-
- Charles has helped out in numerous ways with the provision of SMB
- specifications and helpful advice. He has been following the
- discussion of Samba on the mailing list and has stepped in
- regularly to clarify points and to offer help.
-
- Dan has put me in touch with NT developers to help sort out bugs and
- compatability issues. He has also supplied me with a copy of the
- NT browsing spec, which will help a lot in the development of the
- Samba browser code.
-
- Paul was responsible for Microsoft paying my flight to Seattle for the
- first CIFS conference (see http://samba.anu.edu.au/cifs) and has been
- generally helpful and cooperative as the SMB community moves towards
- an Internet-ready specification. Isaac has regularly provided help on
- the behaviour of NT networks.
-
-Bruce Perens (bruce@pixar.com)
-
- In appreciation of his effort on Samba we have sent Andrew copies of
- various Pixar computer-graphics software products. Pixar is best known
- for its "Renderman" product, the 3-D renderer used by ILM to make special
- effects for "Terminator II" and "Jurassic Park". We won the first Oscar
- given to a computer graphic animated feature for our short film "Tin Toy".
- Our retail products "Typestry" and "Showplace", incorporate the same
- renderer used on the films, and are available on Windows and the
- Macintosh.
-
-
-
-Henry Lee (hyl@microplex.co)
-
- Henry sent me a M202 ethernet print server, making my little lan
- one of the few home networks to have it's own print server!
-
- ``Microplex Systems Ltd. is a manufacturer of local and wide area
- network communications equipment based in beautiful Vancouver, British
- Columbia, Canada. Microplex's first products were synchronous wide
- area network devices used in the mainframe communication networks. In
- August 1991 Microplex introduced its first LAN product, the M200 print
- server, the first high performance print server under US$1,000.''
-
-
-Tom Haapanen (tomh@metrics.com)
-
- Tom sent me two 16 bit SMC ethernet cards to replace my ancient 8
- bit ones. The performance is much better!
-
- Software Metrics Inc. is a small custom software development and
- consulting firm located in Waterloo, Ontario, Canada. We work
- with a variety of environments (such as Windows, Windows NT and
- Unix), tools and application areas, and can provide assistance for
- development work ranging from a few days to to multiple man-year
- projects. You can find more information at http://www.metrics.com/.
-
-
-Steve Kennedy (steve@gbnet.net)
-
- Steve sent me 16Mb of ram so that I could install/test
- NT3.5. I previous had only 8Mb ram in my test machine, which
- wasn't enough to install a properly functioning copy of
- NTAS. Being able to directly test NT3.5 allowed me to solve
- several long standing NT<->Samba problems. Thanks Steve!
-
-John Terpstra (jht@aquasoft.com.au)
-
- Aquasoft are a specialist consulting company whose Samba-using
- customers span the world.
-
- Aquasoft have been avid supporters of the Samba project. As a
- token of appreciation Aquasoft have donated a 486DX2/66 PC with
- a 540MB EIDE drive and 20MB RAM.
-
- John has helped to isolate quite a few little glitches over time
- and has managed to implement some very interesting installations
- of Samba.
-
- The donation of the new PC will make it possible to more fully
- diagnose and observe the behaviour of Samba in conjuction with
- other SMB protocol utilising systems.
-
-
-Timothy F. Sipples (tsipple@vnet.IBM.COM)
-Steve Withers (swithers@vnet.IBM.COM)
-
- Tim and Steve from IBM organised a copy of the OS/2 developers
- connection CD set for me, and gave lots of help in getting
- OS/2 Warp installed. I hope this will allow me to finally fix
- up those annoying OS/2 related Samba bugs that I have been
- receiving reports of.
-
-Keith Wilkins (wilki1k@nectech.co.uk)
-
- Keith from NEC in England very generously supplied a PC to
- Luke Leighton to help with his nmbd development work. At the
- same time Keith offered to help me with some new hardware, and
- he sent me a pentium motherboard with 32MB of ram
- onboard. This was very helpful as it allowed me to upgrade
- my aging server to be a very powerful system. Thanks!
-
-
diff --git a/docs/Win95_PlainPassword.reg b/docs/Win95_PlainPassword.reg
deleted file mode 100644
index 9dd3103689c..00000000000
--- a/docs/Win95_PlainPassword.reg
+++ /dev/null
@@ -1,4 +0,0 @@
-REGEDIT4
-
-[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP]
-"EnablePlainTextPassword"=dword:00000001
diff --git a/docs/announce b/docs/announce
deleted file mode 100644
index a03ddcd0e6a..00000000000
--- a/docs/announce
+++ /dev/null
@@ -1,133 +0,0 @@
- Announcing Samba version 1.9
- ============================
-
-What is Samba?
---------------
-
-Samba is a SMB file server that runs on Unix and other operating systems.
-It allows these operating systems (currently Unix, Netware, OS/2 and
-AmigaDOS) to act as a file and print server for SMB clients. There are many
-Lan-Manager compatible clients such as LanManager for DOS, Windows for
-Workgroups, Windows NT, Windows 95, OS/2, Pathworks and many more.
-
-The package also includes a SMB client for accessing other SMB servers
-and a netbios nameserver for browsing support.
-
-What can it do for me?
-----------------------
-
-If you have any PCs running SMB clients, such as a PC running Windows
-for Workgroups, then you can mount file space or printers on a Samba
-host, so that directories, files and printers on the host are
-available on the PC.
-
-The client part of the package will also allow you to attach to other
-SMB-based servers (such as windows NT and windows for workgroups) so
-that you can copy files to and from your unix host. The client also
-allows you to access a SMB printer (such as one attached to an OS/2 or
-WfWg server) from Unix, using an entry in /etc/printcap, or by
-explicitly specifying the command used to print files.
-
-What are its features?
-------------------------
-
-Samba supports many features that are not supported in other SMB
-implementations (all of which are commercial). Some of it's features
-include host as well as username/password security, a client,
-automatic home directory exporting, automatic printer exporting, dead
-connection timeouts, umask support, guest connections, name mangling
-and hidden and system attribute mapping. Look at the man pages
-included with the package for a full list of features.
-
-What's new since 1.8?
----------------------
-
-Lots of stuff. See the change log and man pages for details.
-
-Where can I get a client for my PC?
------------------------------------
-
-There is a free client for MS-DOS based PCs available from
-ftp.microsoft.com in the directory bussys/Clients/MSCLIENT/. Please
-read the licencing information before downloading. The built in
-Windows for Workgroups client is also very good.
-
-What network protocols are supported?
--------------------------------------
-
-Currently only TCP/IP is supported. There has been some discussion
-about ports to other protocols but nothing is yet available.
-
-There is a free TCP/IP implementation for Windows for Workgroups
-available from ftp.microsoft.com (it's small, fast and quite reliable).
-
-How much does it cost?
-----------------------
-
-Samba software is free software. It is available under the
-GNU Public licence in source code form at no cost. Please read the
-file COPYING that comes with the package for more information.
-
-What operating systems does it support?
----------------------------------------
-
-The code has been written to be as portable as possible. It has been
-"ported" to many unixes, which mostly required changing only a few
-lines of code. It has been run (to my knowledge) on at least these
-unixes:
-
-Linux, SunOS, Solaris, SVR4, Ultrix, OSF1, AIX, BSDI, NetBSD,
-Sequent, HP-UX, SGI, FreeBSD, NeXT, ISC, A/UX, SCO, Intergraph,
-Silicon Graphics Inc., Domain/OS and DGUX.
-
-Some of these have received more testing than others. If it doesn't
-work with your unix then it should be easy to fix. It has also been ported
-to Netware, OS/2 and the Amiga. A VMS port is available too. See the web site
-for more details.
-
-Who wrote it?
--------------
-
-Many people on the internet have contributed to the development of
-Samba. The maintainer and original author is Andrew Tridgell, but
-large parts of the package were contributed by several people from all
-over the world. Please look at the file `change-log' for information
-on who did what bits.
-
-Where can I get it?
--------------------
-
-The package is available via anonymous ftp from samba.anu.edu.au in
-the directory pub/samba/.
-
-What about SMBServer?
----------------------
-
-Samba used to be known as SMBServer, until it was pointed out that
-Syntax, who make a commercial Unix SMB based server, have trademarked
-that name. The name was then changed to Samba. Also, in 1992 a very
-early incarnation of Samba was distributed as nbserver.
-
-If you see any copies of nbserver or smbserver on ftp sites please let
-me or the ftp archive maintainer know, as I want to get them deleted.
-
-Where can I get more info?
----------------------------
-
-Please join the mailing list if you want to discuss the development or
-use of Samba. To join the mailing list send mail to
-listproc@listproc.anu.edu.au with a body of "subscribe samba Your
-Name".
-
-There is also an announcement mailing list for new version
-announcements. Subscribe as above but with "subscribe samba-announce
-Your Name".
-
-There is also often quite a bit of discussion about Samba on the
-newsgroup comp.protocols.smb.
-
-A WWW site with lots of Samba info can be found at
-http://samba.anu.edu.au/samba/
-
-The Samba Team (Contact: samba-bugs@samba.anu.edu.au)
-June 1996
diff --git a/docs/faq/Samba-Server-FAQ-1.html b/docs/faq/Samba-Server-FAQ-1.html
deleted file mode 100644
index 0bf7f046109..00000000000
--- a/docs/faq/Samba-Server-FAQ-1.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba Server FAQ: What is Samba?</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="Samba-Server-FAQ-2.html">Next</A>
-<A HREF="Samba-Server-FAQ.html#toc1">Table of Contents</A>
-<HR>
-<H2><A NAME="s1">1. What is Samba?</A></H2>
-
-<P>
-<A NAME="WhatIsSamba"></A>
-</P>
-<P>See the
-<A HREF="Samba-meta-FAQ.html#introduction">meta FAQ introduction</A> if you don't have any idea what Samba does.</P>
-<P>Samba has many features that are not supported in other CIFS and SMB
-implementations, all of which are commercial. It approaches some
-problems from a different angle.</P>
-<P>Some of its features include:
-<UL>
-<LI>extremely dynamic runtime configuration</LI>
-<LI>host as well as username/password security</LI>
-<LI>scriptable SMB client</LI>
-<LI>automatic home directory exporting</LI>
-<LI>automatic printer exporting</LI>
-<LI>intelligent dead connection timeouts</LI>
-<LI>guest connections</LI>
-</UL>
-</P>
-<P>Look at the
-<A HREF="samba-man-index.html">manual pages</A> included with the package for a full list of
-features. The components of the suite are (in summary):</P>
-<P>
-<DL>
-
-<DT><B>smbd</B><DD><P>the SMB server. This handles actual connections from clients,
-doing all the interfacing with the
-<A HREF="Samba-meta-FAQ.html#DomainModeSecurity">authentication database</A> for file, permission and username work.</P>
-
-<DT><B>nmbd</B><DD><P>the NetBIOS name server, which helps clients locate servers,
-maintaining the
-<A HREF="Samba-meta-FAQ.html#BrowseAndDomainDefs">authentication database</A> doing the browsing work and managing
-domains as this capability is being built into Samba.</P>
-
-<DT><B>smbclient</B><DD><P>the scriptable commandline SMB client program.
-Useful for automated work, printer filters and testing purposes. It is
-more CIFS-compliant than most commercial implementations. Note that this
-is not a filesystem. The Samba team does not supply a network filesystem
-driver, although the smbfs filesystem for Linux is derived from
-smbclient code.</P>
-
-<DT><B>smbrun</B><DD><P>a little 'glue' program to help the server run
-external programs.</P>
-
-<DT><B>testprns</B><DD><P>a program to test server access to printers</P>
-
-<DT><B>testparms</B><DD><P>a program to test the Samba configuration file
-for correctness</P>
-
-<DT><B>smb.conf</B><DD><P>the Samba configuration file</P>
-
-<DT><B>examples</B><DD><P>many examples have been put together for the different
-operating systems that Samba supports.</P>
-
-<DT><B>Documentation!</B><DD><P>DON'T neglect to read it - you will save a great
-deal of time!</P>
-
-</DL>
-</P>
-
-<HR>
-Previous
-<A HREF="Samba-Server-FAQ-2.html">Next</A>
-<A HREF="Samba-Server-FAQ.html#toc1">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-Server-FAQ-2.html b/docs/faq/Samba-Server-FAQ-2.html
deleted file mode 100644
index 731391a9987..00000000000
--- a/docs/faq/Samba-Server-FAQ-2.html
+++ /dev/null
@@ -1,500 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba Server FAQ: How do I get the CIFS, SMB and NetBIOS protocols?</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-Server-FAQ-1.html">Previous</A>
-Next
-<A HREF="Samba-Server-FAQ.html#toc2">Table of Contents</A>
-<HR>
-<H2><A NAME="s2">2. How do I get the CIFS, SMB and NetBIOS protocols?</A></H2>
-
-<P>
-<A NAME="ServerProtocols"></A>
-</P>
-<P>See the
-<A HREF="Samba-meta-FAQ.html#CifsSmb">meta FAQ on CIFS and SMB</A> if you don't have any idea what these protocols are.</P>
-<P>CIFS and SMB are implemented by the main Samba fileserving daemon, smbd.
-<F>.....</F></P>
-<P>nmbd speaks a limited amount of CIFS (...) but is mostly concerned with
-NetBIOS. NetBIOS is <F>....</F></P>
-<P>RFC1001, RFC1002 <F>...</F></P>
-<P>So, provided you have got Samba correctly installed and running you have
-all three of these protocols. Some operating systems already come with
-stacks for all or some of these, such as SCO Unix, OS/2 and <F>...</F> In this
-case you must <F>...</F></P>
-
-<H2><A NAME="ss2.1">2.1 What server operating systems are supported?</A></H2>
-
-<P>
-<A NAME="PortInfo"></A>
-</P>
-<P>At the last count, Samba runs on about 40 operating systems! This
-section looks at general questions about running Samba on the different
-platforms. Issues specific to particular operating systems are dealt
-with in elsewhere in this document.</P>
-<P>Many of the ports have been done by people outside the Samba team keen
-to get the advantages of Samba. The Samba team is currently trying to
-bring as many of these ports as possible into the main source tree and
-integrate the documentation. Samba is an integration tool, and so it has
-been made as easy as possible to port. The platforms most widely used
-and thus best tested are Linux and SunOS.</P>
-<P>This migration has not been completed yet. This means that some
-documentation is on web sites <F>...</F></P>
-<P>There are two main families of Samba ports, Unix and other. The Unix
-ports cover anything that remotely resembles Unix and includes some
-extremely old products as well as best-sellers, tiny PCs to massive
-multiprocessor machines supporting hundreds of thousands of users. Samba
-has been run on more than 30 Unix and Unix-like operating systems.</P>
-
-<H3>Running Samba on a Unix or Unix-like system</H3>
-
-<P>
-<A NAME="OnUnix"></A>
-</P>
-<P>
-<A HREF="../UNIX-SMB.txt">../UNIX-SMB.txt</A> describes some of the issues that confront a
-SMB implementation on unix, and how Samba copes with them. They may help
-people who are looking at unix<->PC interoperability.</P>
-<P>There is great variation between Unix implementations, especially those
-not adhering to the Common Unix Specification agreed to in 1996. Things
-that can be quite tricky are <F>.....</F></P>
-<P>There are also some considerable advantages conferred on Samba running
-under Unix compared to, say, Windows NT or LAN Server. Unix has <F>...</F></P>
-<P>At time of writing, the Makefile claimed support for:
-<UL>
-<LI> A/UX 3.0</LI>
-<LI> AIX</LI>
-<LI> Altos Series 386/1000</LI>
-<LI> Amiga</LI>
-<LI> Apollo Domain/OS sr10.3</LI>
-<LI> BSDI </LI>
-<LI> B.O.S. (Bull Operating System)</LI>
-<LI> Cray, Unicos 8.0</LI>
-<LI> Convex</LI>
-<LI> DGUX. </LI>
-<LI> DNIX.</LI>
-<LI> FreeBSD</LI>
-<LI> HP-UX</LI>
-<LI> Intergraph. </LI>
-<LI> Linux with/without shadow passwords and quota</LI>
-<LI> LYNX 2.3.0</LI>
-<LI> MachTen (a unix like system for Macintoshes)</LI>
-<LI> Motorola 88xxx/9xx range of machines</LI>
-<LI> NetBSD</LI>
-<LI> NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for Mach).</LI>
-<LI> OS/2 using EMX 0.9b</LI>
-<LI> OSF1</LI>
-<LI> QNX 4.22</LI>
-<LI> RiscIX. </LI>
-<LI> RISCOs 5.0B</LI>
-<LI> SEQUENT. </LI>
-<LI> SCO (including: 3.2v2, European dist., OpenServer 5)</LI>
-<LI> SGI.</LI>
-<LI> SMP_DC.OSx v1.1-94c079 on Pyramid S series</LI>
-<LI> SONY NEWS, NEWS-OS (4.2.x and 6.1.x)</LI>
-<LI> SUNOS 4</LI>
-<LI> SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')</LI>
-<LI> Sunsoft ISC SVR3V4</LI>
-<LI> SVR4</LI>
-<LI> System V with some berkely extensions (Motorola 88k R32V3.2).</LI>
-<LI> ULTRIX.</LI>
-<LI> UNIXWARE</LI>
-<LI> UXP/DS</LI>
-</UL>
-</P>
-
-
-<H3>Running Samba on systems unlike Unix</H3>
-
-<P>
-<A NAME="OnUnlikeUnix"></A>
-</P>
-<P>More recently Samba has been ported to a number of operating systems
-which can provide a BSD Unix-like implementation of TCP/IP sockets.
-These include OS/2, Netware, VMS, StratOS, Amiga and MVS. BeOS,
-Windows NT and several others are being worked on but not yet available
-for use.</P>
-<P>Home pages for these ports are:</P>
-<P><F>... </F></P>
-
-
-<H2><A NAME="ss2.2">2.2 Exporting server resources with Samba</A></H2>
-
-<P>
-<A NAME="Exporting"></A>
-</P>
-<P>Files, printers, CD ROMs and other local devices. Network devices,
-including networked filesystems and remote printer queues. Other devices
-such as <F>....</F></P>
-<P>1.4) Configuring SHARES
-1.4.1) Homes service
-1.4.2) Public services
-1.4.3) Application serving
-1.4.4) Team sharing a Samba resource</P>
-<P>1.5) Printer configuration
-1.5.1) Berkeley LPR/LPD systems
-1.5.2) ATT SysV lp systems
-1.5.3) Using a private printcap file
-1.5.4) Use of the smbprint utility
-1.5.5) Printing from Windows to Unix
-1.5.6) Printing from Unix to Windows</P>
-
-
-<H2><A NAME="ss2.3">2.3 Name Resolution and Browsing</A></H2>
-
-<P>
-<A NAME="NameBrowsing"></A>
-</P>
-<P>See also
-<A HREF="../BROWSING.txt">../BROWSING.txt</A></P>
-<P>1.6) Name resolution issues
-1.6.1) LMHOSTS file and when to use it
-1.6.2) configuring WINS (support, server, proxy)
-1.6.3) configuring DNS proxy</P>
-<P>1.7) Problem Diagnosis
-1.8) What NOT to do!!!!</P>
-<P>3.2) Browse list managment
-3.3) Name resolution mangement</P>
-
-
-
-<H2><A NAME="ss2.4">2.4 Handling SMB Encryption</A></H2>
-
-<P>
-<A NAME="SMBEncryptionSteps"></A>
-</P>
-<P>SMB encryption is ...</P>
-<P>...in
-<A HREF="../ENCRYPTION.txt">../ENCRYPTION.txt</A> there is...</P>
-<P>Samba compiled with libdes - enabling encrypted passwords</P>
-
-
-<H3>Laws in different countries affecting Samba</H3>
-
-<P>
-<A NAME="CryptoLaws"></A>
-</P>
-
-<H3>Relationship between encryption and Domain Authentication</H3>
-
-
-
-
-<H2><A NAME="ss2.5">2.5 Files and record locking</A> 3.1.1) Old DOS clients 3.1.2) Opportunistic locking and the consequences 3.1.3) Files caching under Windows for Workgroups, Win95 and NT Some of the foregoing links into Client-FAQ</H2>
-
-
-<H2><A NAME="ss2.6">2.6 Managing Samba Log files</A></H2>
-
-<P>
-<A NAME="LogFiles"></A>
-</P>
-
-
-<H2><A NAME="ss2.7">2.7 I can't see the Samba server in any browse lists!</A></H2>
-
-<P>
-<A NAME="no_browse"></A>
-
-See
-<A HREF="ftp://samba.anu.edu.au/pub/samba/BROWSING.txt">BROWSING.txt</A>
-for more information on browsing. Browsing.txt can also be found
-in the docs directory of the Samba source.</P>
-<P>If your GUI client does not permit you to select non-browsable
-servers, you may need to do so on the command line. For example, under
-Lan Manager you might connect to the above service as disk drive M:
-thusly:
-<BLOCKQUOTE><CODE>
-<PRE>
- net use M: \\mary\fred
-</PRE>
-</CODE></BLOCKQUOTE>
-
-The details of how to do this and the specific syntax varies from
-client to client - check your client's documentation.</P>
-
-
-<H2><A NAME="ss2.8">2.8 Some files that I KNOW are on the server doesn't show up when I view the files from my client! </A></H2>
-
-<P>
-<A NAME="missing_files"></A>
-
-See the next question.</P>
-
-
-<H2><A NAME="ss2.9">2.9 Some files on the server show up with really wierd filenames when I view the files from my client! </A></H2>
-
-<P>
-<A NAME="strange_filenames"></A>
-
-If you check what files are not showing up, you will note that they
-are files which contain upper case letters or which are otherwise not
-DOS-compatible (ie, they are not legal DOS filenames for some reason).</P>
-<P>The Samba server can be configured either to ignore such files
-completely, or to present them to the client in "mangled" form. If you
-are not seeing the files at all, the Samba server has most likely been
-configured to ignore them. Consult the man page smb.conf(5) for
-details of how to change this - the parameter you need to set is
-"mangled names = yes".</P>
-
-
-<H2><A NAME="ss2.10">2.10 My client reports "cannot locate specified computer" or similar</A></H2>
-
-<P>
-<A NAME="cant_see_server"></A>
-
-This indicates one of three things: You supplied an incorrect server
-name, the underlying TCP/IP layer is not working correctly, or the
-name you specified cannot be resolved.</P>
-<P>After carefully checking that the name you typed is the name you
-should have typed, try doing things like pinging a host or telnetting
-to somewhere on your network to see if TCP/IP is functioning OK. If it
-is, the problem is most likely name resolution.</P>
-<P>If your client has a facility to do so, hardcode a mapping between the
-hosts IP and the name you want to use. For example, with Man Manager
-or Windows for Workgroups you would put a suitable entry in the file
-LMHOSTS. If this works, the problem is in the communication between
-your client and the netbios name server. If it does not work, then
-there is something fundamental wrong with your naming and the solution
-is beyond the scope of this document.</P>
-<P>If you do not have any server on your subnet supplying netbios name
-resolution, hardcoded mappings are your only option. If you DO have a
-netbios name server running (such as the Samba suite's nmbd program),
-the problem probably lies in the way it is set up. Refer to Section
-Two of this FAQ for more ideas.</P>
-<P>By the way, remember to REMOVE the hardcoded mapping before further
-tests :-) </P>
-
-
-<H2><A NAME="ss2.11">2.11 My client reports "cannot locate specified share name" or similar</A></H2>
-
-<P>
-<A NAME="cant_see_share"></A>
-
-This message indicates that your client CAN locate the specified
-server, which is a good start, but that it cannot find a service of
-the name you gave.</P>
-<P>The first step is to check the exact name of the service you are
-trying to connect to (consult your system administrator). Assuming it
-exists and you specified it correctly (read your client's doco on how
-to specify a service name correctly), read on:</P>
-<P>
-<UL>
-<LI> Many clients cannot accept or use service names longer than eight characters.</LI>
-<LI> Many clients cannot accept or use service names containing spaces.</LI>
-<LI> Some servers (not Samba though) are case sensitive with service names.</LI>
-<LI> Some clients force service names into upper case.</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss2.12">2.12 My client reports "cannot find domain controller", "cannot log on to the network" or similar </A></H2>
-
-<P>
-<A NAME="cant_see_net"></A>
-
-Nothing is wrong - Samba does not implement the primary domain name
-controller stuff for several reasons, including the fact that the
-whole concept of a primary domain controller and "logging in to a
-network" doesn't fit well with clients possibly running on multiuser
-machines (such as users of smbclient under Unix). Having said that,
-several developers are working hard on building it in to the next
-major version of Samba. If you can contribute, send a message to
-<A HREF="mailto:samba-bugs@anu.edu.au">samba-bugs@anu.edu.au</A> !</P>
-<P>Seeing this message should not affect your ability to mount redirected
-disks and printers, which is really what all this is about.</P>
-<P>For many clients (including Windows for Workgroups and Lan Manager),
-setting the domain to STANDALONE at least gets rid of the message.</P>
-
-
-<H2><A NAME="ss2.13">2.13 Printing doesn't work :-(</A></H2>
-
-<P>
-<A NAME="no_printing"></A>
- </P>
-<P>Make sure that the specified print command for the service you are
-connecting to is correct and that it has a fully-qualified path (eg.,
-use "/usr/bin/lpr" rather than just "lpr", if you happen to be using
-Unix).</P>
-<P>Make sure that the spool directory specified for the service is
-writable by the user connected to the service. </P>
-<P>Make sure that the user specified in the service is permitted to use
-the printer.</P>
-<P>Check the debug log produced by smbd. Search for the printer name and
-see if the log turns up any clues. Note that error messages to do with
-a service ipc$ are meaningless - they relate to the way the client
-attempts to retrieve status information when using the LANMAN1
-protocol.</P>
-<P>If using WfWg then you need to set the default protocol to TCP/IP, not
-Netbeui. This is a WfWg bug.</P>
-<P>If using the Lanman1 protocol (the default) then try switching to
-coreplus. Also not that print status error messages don't mean
-printing won't work. The print status is received by a different
-mechanism.</P>
-
-
-<H2><A NAME="ss2.14">2.14 My programs install on the server OK, but refuse to work properly</A></H2>
-
-<P>
-<A NAME="programs_wont_run"></A>
-
-There are numerous possible reasons for this, but one MAJOR
-possibility is that your software uses locking. Make sure you are
-using Samba 1.6.11 or later. It may also be possible to work around
-the problem by setting "locking=no" in the Samba configuration file
-for the service the software is installed on. This should be regarded
-as a strictly temporary solution.</P>
-<P>In earlier Samba versions there were some difficulties with the very
-latest Microsoft products, particularly Excel 5 and Word for Windows
-6. These should have all been solved. If not then please let Andrew
-Tridgell know via email at
-<A HREF="mailto:samba-bugs@anu.edu.au">samba-bugs@anu.edu.au</A>.</P>
-
-
-<H2><A NAME="ss2.15">2.15 My "server string" doesn't seem to be recognised</A></H2>
-
-<P>
-<A NAME="bad_server_string"></A>
-
-OR My client reports the default setting, eg. "Samba 1.9.15p4", instead
-of what I have changed it to in the smb.conf file.</P>
-<P>You need to use the -C option in nmbd. The "server string" affects
-what smbd puts out and -C affects what nmbd puts out.</P>
-<P>Current versions of Samba (1.9.16 +) have combined these options into
-the "server string" field of smb.conf, -C for nmbd is now obsolete.</P>
-
-
-<H2><A NAME="ss2.16">2.16 My client reports "This server is not configured to list shared resources" </A></H2>
-
-<P>
-<A NAME="cant_list_shares"></A>
-
-Your guest account is probably invalid for some reason. Samba uses the
-guest account for browsing in smbd. Check that your guest account is
-valid.</P>
-<P>See also 'guest account' in smb.conf man page.</P>
-
-
-<H2><A NAME="ss2.17">2.17 Issues specific to Unix and Unix-like systems</A></H2>
-
-<P>
-<A NAME="UnixIssues"></A>
-</P>
-
-<H3>Printing doesn't work with my Unix Samba server</H3>
-
-<P>
-<A NAME="no_printing"></A>
- </P>
-<P>The user "nobody" often has problems with printing, even if it worked
-with an earlier version of Samba. Try creating another guest user other
-than "nobody".</P>
-
-<H3>Log message "you appear to have a trapdoor uid system" </H3>
-
-<P>
-<A NAME="trapdoor_uid"></A>
-
-This can have several causes. It might be because you are using a uid
-or gid of 65535 or -1. This is a VERY bad idea, and is a big security
-hole. Check carefully in your /etc/passwd file and make sure that no
-user has uid 65535 or -1. Especially check the "nobody" user, as many
-broken systems are shipped with nobody setup with a uid of 65535.</P>
-<P>It might also mean that your OS has a trapdoor uid/gid system :-)</P>
-<P>This means that once a process changes effective uid from root to
-another user it can't go back to root. Unfortunately Samba relies on
-being able to change effective uid from root to non-root and back
-again to implement its security policy. If your OS has a trapdoor uid
-system this won't work, and several things in Samba may break. Less
-things will break if you use user or server level security instead of
-the default share level security, but you may still strike
-problems.</P>
-<P>The problems don't give rise to any security holes, so don't panic,
-but it does mean some of Samba's capabilities will be unavailable.
-In particular you will not be able to connect to the Samba server as
-two different uids at once. This may happen if you try to print as a
-"guest" while accessing a share as a normal user. It may also affect
-your ability to list the available shares as this is normally done as
-the guest user.</P>
-<P>Complain to your OS vendor and ask them to fix their system.</P>
-<P>Note: the reason why 65535 is a VERY bad choice of uid and gid is that
-it casts to -1 as a uid, and the setreuid() system call ignores (with
-no error) uid changes to -1. This means any daemon attempting to run
-as uid 65535 will actually run as root. This is not good!</P>
-
-
-<H2><A NAME="ss2.18">2.18 Issues specific to IBM OS/2 systems</A></H2>
-
-<P>
-<A NAME="OS2Issues"></A>
-</P>
-<P>
-<A HREF="http://carol.wins.uva.nl/~leeuw/samba/samba2.html">Samba for OS/2</A></P>
-
-
-<H2><A NAME="ss2.19">2.19 Issues specific to IBM MVS systems</A></H2>
-
-<P>
-<A NAME="MVSIssues"></A>
-</P>
-<P>
-<A HREF="ftp://ftp.mks.com/pub/samba/">Samba for OS/390 MVS</A></P>
-
-
-<H2><A NAME="ss2.20">2.20 Issues specific to Digital VMS systems</A></H2>
-
-<P>
-<A NAME="VMSIssues"></A>
-</P>
-
-
-<H2><A NAME="ss2.21">2.21 Issues specific to Amiga systems</A></H2>
-
-<P>
-<A NAME="AmigaIssues"></A>
-</P>
-<P>
-<A HREF="http://www.gbar.dtu.dk/~c948374/Amiga/Samba/">Samba for Amiga</A></P>
-<P>There is a mailing list for Samba on the Amiga.</P>
-<P>Subscribing.</P>
-<P>Send an email to rask-samba-request@kampsax.dtu.dk with the word subscribe
-in the message. The list server will use the address in the Reply-To: or
-From: header field, in that order.</P>
-<P>Unsubscribing.</P>
-<P>Send an email to rask-samba-request@kampsax.dtu.dk with the word
-unsubscribe in the message. The list server will use the address in the
-Reply-To: or From: header field, in that order. If you are unsure which
-address you are subscribed with, look at the headers. You should see a
-"From " (no colon) or Return-Path: header looking something like</P>
-<P>rask-samba-owner-myname=my.domain@kampsax.dtu.dk</P>
-<P>where myname=my.domain gives you the address myname@my.domain. This also
-means that I will always be able to find out which address is causing
-bounces, for example.
-List archive.</P>
-<P>Messages sent to the list are archived in HTML. See the mailing list home
-page at
-<A HREF="http://www.gbar.dtu.dk/~c948374/Amiga/Samba/mailinglist/">http://www.gbar.dtu.dk/~c948374/Amiga/Samba/mailinglist/</A></P>
-
-
-<H2><A NAME="ss2.22">2.22 Issues specific to Novell IntraNetware systems</A></H2>
-
-<P>
-<A NAME="NetwareIssues"></A>
-</P>
-
-
-<H2><A NAME="ss2.23">2.23 Issues specific to Stratos VOS systems</A></H2>
-
-<P>
-<A NAME="NetwareIssues"></A>
-</P>
-<P>
-<A HREF="ftp://ftp.stratus.com/pub/vos/tools/">Samba for Stratus VOS</A></P>
-
-
-<HR>
-<A HREF="Samba-Server-FAQ-1.html">Previous</A>
-Next
-<A HREF="Samba-Server-FAQ.html#toc2">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-Server-FAQ.html b/docs/faq/Samba-Server-FAQ.html
deleted file mode 100644
index eadc3e26ede..00000000000
--- a/docs/faq/Samba-Server-FAQ.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<HTML>
-<HEAD>
-<TITLE> Samba Server FAQ</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="Samba-Server-FAQ-1.html">Next</A>
-Table of Contents
-<HR>
-<H1> Samba Server FAQ</H1>
-
-<H2>Dan Shearer & Paul Blackman, <CODE>ictinus@samba.anu.edu.au</CODE></H2>v 0.3, 7 Oct '97
-<P><HR><EM> This is the <EM>Server</EM> Frequently Asked Questions (FAQ)
-document for Samba, the free and very popular SMB and CIFS server
-product. A general
-<A HREF="Samba-meta-FAQ.html">meta FAQ</A>
-exists and also a companion
-<A HREF="Samba-Client-FAQ.html">Client FAQ</A>, together with more detailed HOWTO documents on
-topics to do with Samba software. This is current to Samba version
-1.9.17. Please send any corrections to the author. </EM><HR></P>
-<P>
-<H2><A NAME="toc1">1.</A> <A HREF="Samba-Server-FAQ-1.html">What is Samba?</A></H2>
-
-<P>
-<H2><A NAME="toc2">2.</A> <A HREF="Samba-Server-FAQ-2.html">How do I get the CIFS, SMB and NetBIOS protocols?</A></H2>
-<UL>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.1">2.1 What server operating systems are supported?</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.2">2.2 Exporting server resources with Samba</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.3">2.3 Name Resolution and Browsing</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.4">2.4 Handling SMB Encryption</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.5">2.5 Files and record locking</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.6">2.6 Managing Samba Log files</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.7">2.7 I can't see the Samba server in any browse lists!</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.8">2.8 Some files that I KNOW are on the server doesn't show up when I view the files from my client! </A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.9">2.9 Some files on the server show up with really wierd filenames when I view the files from my client! </A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.10">2.10 My client reports "cannot locate specified computer" or similar</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.11">2.11 My client reports "cannot locate specified share name" or similar</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.12">2.12 My client reports "cannot find domain controller", "cannot log on to the network" or similar </A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.13">2.13 Printing doesn't work :-(</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.14">2.14 My programs install on the server OK, but refuse to work properly</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.15">2.15 My "server string" doesn't seem to be recognised</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.16">2.16 My client reports "This server is not configured to list shared resources" </A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.17">2.17 Issues specific to Unix and Unix-like systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.18">2.18 Issues specific to IBM OS/2 systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.19">2.19 Issues specific to IBM MVS systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.20">2.20 Issues specific to Digital VMS systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.21">2.21 Issues specific to Amiga systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.22">2.22 Issues specific to Novell IntraNetware systems</A>
-<LI><A HREF="Samba-Server-FAQ-2.html#ss2.23">2.23 Issues specific to Stratos VOS systems</A>
-</UL>
-
-
-<HR>
-Previous
-<A HREF="Samba-Server-FAQ-1.html">Next</A>
-Table of Contents
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-Server-FAQ.sgml b/docs/faq/Samba-Server-FAQ.sgml
deleted file mode 100644
index 020d5322811..00000000000
--- a/docs/faq/Samba-Server-FAQ.sgml
+++ /dev/null
@@ -1,492 +0,0 @@
-<!doctype linuxdoc system> <!-- -*- SGML -*- -->
-<!--
- v 0.1 23 Aug 1997 Dan Shearer
- Original Samba-Client-FAQ.sgml from Paul's sambafaq.sgml
- v 0.2 25 Aug 1997 Dan
- v 0.3 7 Oct 1997 Paul, changed email address from ictinus@lake... to ictinus@samba.anu
--->
-
-
-<article>
-
-<title> Samba Server FAQ
-
-<author>Dan Shearer & Paul Blackman, <tt>ictinus@samba.anu.edu.au</tt>
-
-<date>v 0.3, 7 Oct '97
-
-<abstract> This is the <em>Server</em> Frequently Asked Questions (FAQ)
-document for Samba, the free and very popular SMB and CIFS server
-product. A general <url url="Samba-meta-FAQ.html" name="meta FAQ">
-exists and also a companion <url url="Samba-Client-FAQ.html"
-name="Client FAQ">, together with more detailed HOWTO documents on
-topics to do with Samba software. This is current to Samba version
-1.9.17. Please send any corrections to the author.
-
-</abstract>
-
-<toc>
-
-<sect>What is Samba?<p><label id="WhatIsSamba">
-
-See the <url url="Samba-meta-FAQ.html#introduction" name="meta FAQ
-introduction"> if you don't have any idea what Samba does.
-
-Samba has many features that are not supported in other CIFS and SMB
-implementations, all of which are commercial. It approaches some
-problems from a different angle.
-
-Some of its features include:
-<itemize>
-<item>extremely dynamic runtime configuration
-<item>host as well as username/password security
-<item>scriptable SMB client
-<item>automatic home directory exporting
-<item>automatic printer exporting
-<item>intelligent dead connection timeouts
-<item>guest connections
-</itemize>
-
-Look at the <url url="samba-man-index.html" name="manual pages"> included with the package for a full list of
-features. The components of the suite are (in summary):
-
-<descrip>
-
-<tag/smbd/ the SMB server. This handles actual connections from clients,
-doing all the interfacing with the <url
-url="Samba-meta-FAQ.html#DomainModeSecurity" name="authentication
-database"> for file, permission and username work.
-
-<tag/nmbd/ the NetBIOS name server, which helps clients locate servers,
-maintaining the <url url="Samba-meta-FAQ.html#BrowseAndDomainDefs"
-name="authentication database"> doing the browsing work and managing
-domains as this capability is being built into Samba.
-
-<tag/smbclient/ the scriptable commandline SMB client program.
-Useful for automated work, printer filters and testing purposes. It is
-more CIFS-compliant than most commercial implementations. Note that this
-is not a filesystem. The Samba team does not supply a network filesystem
-driver, although the smbfs filesystem for Linux is derived from
-smbclient code.
-
-<tag/smbrun/ a little 'glue' program to help the server run
-external programs.
-
-<tag/testprns/ a program to test server access to printers
-
-<tag/testparms/ a program to test the Samba configuration file
-for correctness
-
-<tag/smb.conf/ the Samba configuration file
-
-<tag/examples/ many examples have been put together for the different
-operating systems that Samba supports.
-
-<tag/Documentation!/ DON'T neglect to read it - you will save a great
-deal of time!
-
-</descrip>
-
-<sect>How do I get the CIFS, SMB and NetBIOS protocols?<p><label id="ServerProtocols">
-
-See the <url url="Samba-meta-FAQ.html#CifsSmb" name="meta FAQ
-on CIFS and SMB"> if you don't have any idea what these protocols are.
-
-CIFS and SMB are implemented by the main Samba fileserving daemon, smbd.
-[.....]
-
-nmbd speaks a limited amount of CIFS (...) but is mostly concerned with
-NetBIOS. NetBIOS is [....]
-
-RFC1001, RFC1002 [...]
-
-So, provided you have got Samba correctly installed and running you have
-all three of these protocols. Some operating systems already come with
-stacks for all or some of these, such as SCO Unix, OS/2 and [...] In this
-case you must [...]
-
-<sect1>What server operating systems are supported?<p><label id="PortInfo">
-
-At the last count, Samba runs on about 40 operating systems! This
-section looks at general questions about running Samba on the different
-platforms. Issues specific to particular operating systems are dealt
-with in elsewhere in this document.
-
-Many of the ports have been done by people outside the Samba team keen
-to get the advantages of Samba. The Samba team is currently trying to
-bring as many of these ports as possible into the main source tree and
-integrate the documentation. Samba is an integration tool, and so it has
-been made as easy as possible to port. The platforms most widely used
-and thus best tested are Linux and SunOS.
-
-This migration has not been completed yet. This means that some
-documentation is on web sites [...]
-
-There are two main families of Samba ports, Unix and other. The Unix
-ports cover anything that remotely resembles Unix and includes some
-extremely old products as well as best-sellers, tiny PCs to massive
-multiprocessor machines supporting hundreds of thousands of users. Samba
-has been run on more than 30 Unix and Unix-like operating systems.
-
-<sect2>Running Samba on a Unix or Unix-like system<p><label id="OnUnix">
-
-<url url="../UNIX-SMB.txt"> describes some of the issues that confront a
-SMB implementation on unix, and how Samba copes with them. They may help
-people who are looking at unix<->PC interoperability.
-
-There is great variation between Unix implementations, especially those
-not adhering to the Common Unix Specification agreed to in 1996. Things
-that can be quite tricky are [.....]
-
-There are also some considerable advantages conferred on Samba running
-under Unix compared to, say, Windows NT or LAN Server. Unix has [...]
-
-At time of writing, the Makefile claimed support for:
-<itemize>
-<item> A/UX 3.0
-<item> AIX
-<item> Altos Series 386/1000
-<item> Amiga
-<item> Apollo Domain/OS sr10.3
-<item> BSDI
-<item> B.O.S. (Bull Operating System)
-<item> Cray, Unicos 8.0
-<item> Convex
-<item> DGUX.
-<item> DNIX.
-<item> FreeBSD
-<item> HP-UX
-<item> Intergraph.
-<item> Linux with/without shadow passwords and quota
-<item> LYNX 2.3.0
-<item> MachTen (a unix like system for Macintoshes)
-<item> Motorola 88xxx/9xx range of machines
-<item> NetBSD
-<item> NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for Mach).
-<item> OS/2 using EMX 0.9b
-<item> OSF1
-<item> QNX 4.22
-<item> RiscIX.
-<item> RISCOs 5.0B
-<item> SEQUENT.
-<item> SCO (including: 3.2v2, European dist., OpenServer 5)
-<item> SGI.
-<item> SMP_DC.OSx v1.1-94c079 on Pyramid S series
-<item> SONY NEWS, NEWS-OS (4.2.x and 6.1.x)
-<item> SUNOS 4
-<item> SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')
-<item> Sunsoft ISC SVR3V4
-<item> SVR4
-<item> System V with some berkely extensions (Motorola 88k R32V3.2).
-<item> ULTRIX.
-<item> UNIXWARE
-<item> UXP/DS
-</itemize>
-
-
-<sect2>Running Samba on systems unlike Unix<p><label id="OnUnlikeUnix">
-
-More recently Samba has been ported to a number of operating systems
-which can provide a BSD Unix-like implementation of TCP/IP sockets.
-These include OS/2, Netware, VMS, StratOS, Amiga and MVS. BeOS,
-Windows NT and several others are being worked on but not yet available
-for use.
-
-Home pages for these ports are:
-
-[... ]
-
-<sect1>Exporting server resources with Samba<p><label id="Exporting">
-
-Files, printers, CD ROMs and other local devices. Network devices,
-including networked filesystems and remote printer queues. Other devices
-such as [....]
-
- 1.4) Configuring SHARES
- 1.4.1) Homes service
- 1.4.2) Public services
- 1.4.3) Application serving
- 1.4.4) Team sharing a Samba resource
-
- 1.5) Printer configuration
- 1.5.1) Berkeley LPR/LPD systems
- 1.5.2) ATT SysV lp systems
- 1.5.3) Using a private printcap file
- 1.5.4) Use of the smbprint utility
- 1.5.5) Printing from Windows to Unix
- 1.5.6) Printing from Unix to Windows
-
-<sect1>Name Resolution and Browsing<p><label id="NameBrowsing">
-
-See also <url url="../BROWSING.txt">
-
- 1.6) Name resolution issues
- 1.6.1) LMHOSTS file and when to use it
- 1.6.2) configuring WINS (support, server, proxy)
- 1.6.3) configuring DNS proxy
-
- 1.7) Problem Diagnosis
- 1.8) What NOT to do!!!!
-
- 3.2) Browse list managment
- 3.3) Name resolution mangement
-
-
-<sect1>Handling SMB Encryption<p><label id="SMBEncryptionSteps">
-
-SMB encryption is ...
-
-...in <url url="../ENCRYPTION.txt"> there is...
-
-Samba compiled with libdes - enabling encrypted passwords
-
-
-<sect2>Laws in different countries affecting Samba<p><label id="CryptoLaws">
-
-<sect2>Relationship between encryption and Domain Authentication<p>
-
-<sect1> Files and record locking
-
- 3.1.1) Old DOS clients
- 3.1.2) Opportunistic locking and the consequences
- 3.1.3) Files caching under Windows for Workgroups, Win95 and NT
-
- Some of the foregoing links into Client-FAQ
-
-<sect1>Managing Samba Log files<p><label id="LogFiles">
-
-<sect1>I can't see the Samba server in any browse lists!<p><label id="no_browse">
- See <url url="ftp://samba.anu.edu.au/pub/samba/BROWSING.txt" name="BROWSING.txt">
- for more information on browsing. Browsing.txt can also be found
- in the docs directory of the Samba source.
-
-If your GUI client does not permit you to select non-browsable
-servers, you may need to do so on the command line. For example, under
-Lan Manager you might connect to the above service as disk drive M:
-thusly:
-<tscreen><verb>
- net use M: \\mary\fred
-</verb></tscreen>
-The details of how to do this and the specific syntax varies from
-client to client - check your client's documentation.
-
-<sect1>Some files that I KNOW are on the server doesn't show up when I view the files from my client! <p> <label id="missing_files">
-See the next question.
-
-<sect1>Some files on the server show up with really wierd filenames when I view the files from my client! <p> <label id="strange_filenames">
-If you check what files are not showing up, you will note that they
-are files which contain upper case letters or which are otherwise not
-DOS-compatible (ie, they are not legal DOS filenames for some reason).
-
-The Samba server can be configured either to ignore such files
-completely, or to present them to the client in "mangled" form. If you
-are not seeing the files at all, the Samba server has most likely been
-configured to ignore them. Consult the man page smb.conf(5) for
-details of how to change this - the parameter you need to set is
-"mangled names = yes".
-
-<sect1>My client reports "cannot locate specified computer" or similar<p><label id="cant_see_server">
-This indicates one of three things: You supplied an incorrect server
-name, the underlying TCP/IP layer is not working correctly, or the
-name you specified cannot be resolved.
-
-After carefully checking that the name you typed is the name you
-should have typed, try doing things like pinging a host or telnetting
-to somewhere on your network to see if TCP/IP is functioning OK. If it
-is, the problem is most likely name resolution.
-
-If your client has a facility to do so, hardcode a mapping between the
-hosts IP and the name you want to use. For example, with Man Manager
-or Windows for Workgroups you would put a suitable entry in the file
-LMHOSTS. If this works, the problem is in the communication between
-your client and the netbios name server. If it does not work, then
-there is something fundamental wrong with your naming and the solution
-is beyond the scope of this document.
-
-If you do not have any server on your subnet supplying netbios name
-resolution, hardcoded mappings are your only option. If you DO have a
-netbios name server running (such as the Samba suite's nmbd program),
-the problem probably lies in the way it is set up. Refer to Section
-Two of this FAQ for more ideas.
-
-By the way, remember to REMOVE the hardcoded mapping before further
-tests :-)
-
-<sect1>My client reports "cannot locate specified share name" or similar<p> <label id="cant_see_share">
-This message indicates that your client CAN locate the specified
-server, which is a good start, but that it cannot find a service of
-the name you gave.
-
-The first step is to check the exact name of the service you are
-trying to connect to (consult your system administrator). Assuming it
-exists and you specified it correctly (read your client's doco on how
-to specify a service name correctly), read on:
-
-<itemize>
-<item> Many clients cannot accept or use service names longer than eight characters.
-<item> Many clients cannot accept or use service names containing spaces.
-<item> Some servers (not Samba though) are case sensitive with service names.
-<item> Some clients force service names into upper case.
-</itemize>
-
-<sect1>My client reports "cannot find domain controller", "cannot log on to the network" or similar <p> <label id="cant_see_net">
-Nothing is wrong - Samba does not implement the primary domain name
-controller stuff for several reasons, including the fact that the
-whole concept of a primary domain controller and "logging in to a
-network" doesn't fit well with clients possibly running on multiuser
-machines (such as users of smbclient under Unix). Having said that,
-several developers are working hard on building it in to the next
-major version of Samba. If you can contribute, send a message to
-<htmlurl url="mailto:samba-bugs@anu.edu.au" name="samba-bugs@anu.edu.au"> !
-
-Seeing this message should not affect your ability to mount redirected
-disks and printers, which is really what all this is about.
-
-For many clients (including Windows for Workgroups and Lan Manager),
-setting the domain to STANDALONE at least gets rid of the message.
-
-<sect1>Printing doesn't work :-(<p> <label id="no_printing">
-
-Make sure that the specified print command for the service you are
-connecting to is correct and that it has a fully-qualified path (eg.,
-use "/usr/bin/lpr" rather than just "lpr", if you happen to be using
-Unix).
-
-Make sure that the spool directory specified for the service is
-writable by the user connected to the service.
-
-Make sure that the user specified in the service is permitted to use
-the printer.
-
-Check the debug log produced by smbd. Search for the printer name and
-see if the log turns up any clues. Note that error messages to do with
-a service ipc$ are meaningless - they relate to the way the client
-attempts to retrieve status information when using the LANMAN1
-protocol.
-
-If using WfWg then you need to set the default protocol to TCP/IP, not
-Netbeui. This is a WfWg bug.
-
-If using the Lanman1 protocol (the default) then try switching to
-coreplus. Also not that print status error messages don't mean
-printing won't work. The print status is received by a different
-mechanism.
-
-<sect1>My programs install on the server OK, but refuse to work properly<p><label id="programs_wont_run">
-There are numerous possible reasons for this, but one MAJOR
-possibility is that your software uses locking. Make sure you are
-using Samba 1.6.11 or later. It may also be possible to work around
-the problem by setting "locking=no" in the Samba configuration file
-for the service the software is installed on. This should be regarded
-as a strictly temporary solution.
-
-In earlier Samba versions there were some difficulties with the very
-latest Microsoft products, particularly Excel 5 and Word for Windows
-6. These should have all been solved. If not then please let Andrew
-Tridgell know via email at <htmlurl url="mailto:samba-bugs@anu.edu.au" name="samba-bugs@anu.edu.au">.
-
-<sect1>My "server string" doesn't seem to be recognised<p><label id="bad_server_string">
-OR My client reports the default setting, eg. "Samba 1.9.15p4", instead
-of what I have changed it to in the smb.conf file.
-
-You need to use the -C option in nmbd. The "server string" affects
-what smbd puts out and -C affects what nmbd puts out.
-
-Current versions of Samba (1.9.16 +) have combined these options into
-the "server string" field of smb.conf, -C for nmbd is now obsolete.
-
-<sect1>My client reports "This server is not configured to list shared resources" <p> <label id="cant_list_shares">
-Your guest account is probably invalid for some reason. Samba uses the
-guest account for browsing in smbd. Check that your guest account is
-valid.
-
-See also 'guest account' in smb.conf man page.
-
-<sect1>Issues specific to Unix and Unix-like systems<p><label id="UnixIssues">
-
-<sect2>Printing doesn't work with my Unix Samba server<p> <label id="no_printing">
-
-The user "nobody" often has problems with printing, even if it worked
-with an earlier version of Samba. Try creating another guest user other
-than "nobody".
-
-<sect2>Log message "you appear to have a trapdoor uid system" <p><label id="trapdoor_uid">
-This can have several causes. It might be because you are using a uid
-or gid of 65535 or -1. This is a VERY bad idea, and is a big security
-hole. Check carefully in your /etc/passwd file and make sure that no
-user has uid 65535 or -1. Especially check the "nobody" user, as many
-broken systems are shipped with nobody setup with a uid of 65535.
-
-It might also mean that your OS has a trapdoor uid/gid system :-)
-
-This means that once a process changes effective uid from root to
-another user it can't go back to root. Unfortunately Samba relies on
-being able to change effective uid from root to non-root and back
-again to implement its security policy. If your OS has a trapdoor uid
-system this won't work, and several things in Samba may break. Less
-things will break if you use user or server level security instead of
-the default share level security, but you may still strike
-problems.
-
-The problems don't give rise to any security holes, so don't panic,
-but it does mean some of Samba's capabilities will be unavailable.
-In particular you will not be able to connect to the Samba server as
-two different uids at once. This may happen if you try to print as a
-"guest" while accessing a share as a normal user. It may also affect
-your ability to list the available shares as this is normally done as
-the guest user.
-
-Complain to your OS vendor and ask them to fix their system.
-
-Note: the reason why 65535 is a VERY bad choice of uid and gid is that
-it casts to -1 as a uid, and the setreuid() system call ignores (with
-no error) uid changes to -1. This means any daemon attempting to run
-as uid 65535 will actually run as root. This is not good!
-
-<sect1>Issues specific to IBM OS/2 systems<p><label id="OS2Issues">
-
-<url url="http://carol.wins.uva.nl/~leeuw/samba/samba2.html" name="Samba for OS/2">
-
-<sect1>Issues specific to IBM MVS systems<p><label id="MVSIssues">
-
-<url url="ftp://ftp.mks.com/pub/samba/" name="Samba for OS/390 MVS">
-
-<sect1>Issues specific to Digital VMS systems<p><label id="VMSIssues">
-
-<sect1>Issues specific to Amiga systems<p><label id="AmigaIssues">
-
-<url url="http://www.gbar.dtu.dk/~c948374/Amiga/Samba/" name="Samba for Amiga">
-
-There is a mailing list for Samba on the Amiga.
-
- Subscribing.
-
- Send an email to rask-samba-request@kampsax.dtu.dk with the word subscribe
-in the message. The list server will use the address in the Reply-To: or
-From: header field, in that order.
-
- Unsubscribing.
-
- Send an email to rask-samba-request@kampsax.dtu.dk with the word
-unsubscribe in the message. The list server will use the address in the
-Reply-To: or From: header field, in that order. If you are unsure which
-address you are subscribed with, look at the headers. You should see a
-"From " (no colon) or Return-Path: header looking something like
-
- rask-samba-owner-myname=my.domain@kampsax.dtu.dk
-
-where myname=my.domain gives you the address myname@my.domain. This also
-means that I will always be able to find out which address is causing
-bounces, for example.
- List archive.
-
- Messages sent to the list are archived in HTML. See the mailing list home
-page at <URL url="http://www.gbar.dtu.dk/~c948374/Amiga/Samba/mailinglist/">
-
-<sect1>Issues specific to Novell IntraNetware systems<p><label id="NetwareIssues">
-
-<sect1>Issues specific to Stratos VOS systems<p><label id="NetwareIssues">
-
-<url url="ftp://ftp.stratus.com/pub/vos/tools/" name="Samba for Stratus VOS">
-
-</article>
diff --git a/docs/faq/Samba-meta-FAQ-1.html b/docs/faq/Samba-meta-FAQ-1.html
deleted file mode 100644
index 80610fb59ed..00000000000
--- a/docs/faq/Samba-meta-FAQ-1.html
+++ /dev/null
@@ -1,160 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: Quick Reference Guides to Samba Documentation</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="Samba-meta-FAQ-2.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc1">Table of Contents</A>
-<HR>
-<H2><A NAME="s1">1. Quick Reference Guides to Samba Documentation</A></H2>
-
-<P>
-<A NAME="quickref"></A>
-</P>
-<P>We are endeavouring to provide links here to every major class of
-information about Samba or things related to Samba. We cannot list every
-document, but we are aiming for all documents to be at most two
-referrals from those listed here. This needs constant maintaining, so
-please send the author your feedback.</P>
-
-<H2><A NAME="ss1.1">1.1 Samba for the Impatient</A></H2>
-
-<P>
-<A NAME="impatient"></A>
-</P>
-<P>You know you should read the documentation but can't wait to start? What
-you need to do then is follow the instructions in the following
-documents in the order given. This should be enough to get a fairly
-simple site going quickly. If you have any problems, refer back to this
-meta-FAQ and follow the links to find more reading material.</P>
-<P>
-<DL>
-<P>
-<A NAME="ImpGet"></A>
-</P>
-<DT><B>Getting Samba:</B><DD><P>The fastest way to get Samba
-going is and install it is to have an operating system for which the
-Samba team has put together an installation package. To see if your OS
-is included have a look at the directory
-/pub/samba/Binary_Packages/"OS_Vendor" on your nearest
-<A HREF="../MIRRORS">mirror site</A>. If it is included follow the
-installation instructions in the README file there and then do some
-<A HREF="#ImpTest">basic testing</A>. If you are not so fortunate, follow the normal
-<A HREF="Samba-meta-FAQ-2.html#WhereFrom">download instructions</A> and then continue with
-<A HREF="#ImpInst">building and installing Samba</A>.</P>
-<P>
-<A NAME="ImpInst"></A>
-</P>
-<DT><B>Building and Installing Samba:</B><DD><P>At the moment
-there are two kinds of Samba server installs besides the prepackaged
-binaries mentioned in the previous step. You need to decide if you have a
-<A HREF="../UNIX_INSTALL.txt">Unix or close relative</A> or
-<A HREF="Samba-Server-FAQ.html#PortInfo">other supported operating system</A>.</P>
-<P>
-<A NAME="ImpTest"></A>
-</P>
-<DT><B>Basic Testing:</B><DD><P>Try to connect using the
-supplied smbclient command-line program. You need to know the IP
-hostname of your server. A service name must be defined in smb.conf, as
-given in the examples (under many operating systems if there is a
-<F>homes</F> service you can just use a valid username.) Then type
-<CODE>smbclient \\hostname\servicename</CODE>
-Under most Unixes you will need to put the parameters within quotation
-marks. If this works, try connecting from one of the SMB clients you
-were planning to use with Samba.</P>
-<P>
-<A NAME="ImpDebug"></A>
-</P>
-<DT><B>Debug sequence:</B><DD><P>If you think you have completed the
-previous step and things aren't working properly work through
-<A HREF="../DIAGNOSIS.txt">the diagnosis recipe.</A></P>
-<P>
-<A NAME="ImpExp"></A>
-</P>
-<DT><B>Exporting files to SMB clients:</B><DD><P>You should read the manual pages
-for smb.conf, but here is a
-<A HREF="Samba-Server-FAQ.html#Exporting">quick answer guide.</A></P>
-<P>
-<A NAME="ImpControl"></A>
-</P>
-<DT><B>Controlling user access:</B><DD><P>the quickest and dirtiest way of sharing
-resources is to use
-<A HREF="Samba-meta-FAQ-4.html#ShareModeSecurity">share level security.</A> If you want to spend more time and have a proper username
-and password database you must read the paragraph on
-<A HREF="Samba-meta-FAQ-4.html#DomainModeSecurity">domain mode security.</A> If you want
-encryption (eg you are using Windows NT clients) follow the
-<A HREF="Samba-Server-FAQ.html#SMBEncryptionSteps">SMB encryption instructions.</A></P>
-<P>
-<A NAME="ImpBrowse"></A>
-</P>
-<DT><B>Browsing:</B><DD><P>if you are happy to type in "\\samba-server\sharename"
-at the client end then do not read any further. Otherwise you need to
-understand the
-browsing terminology</A>
-and read
-<A HREF="Samba-Server-FAQ.html#NameBrowsing">Samba-Server-FAQ.html#NameBrowsing</A>. </P>
-<P>
-<A NAME="ImpPrint"></A>
-</P>
-<DT><B>Printing:</B><DD><P>See the
-<A HREF="Samba-Server-FAQ.html#Printing">printing quick answer guide.</A></P>
-
-</DL>
-</P>
-<P>If you have got everything working to this point, you can expect Samba
-to be stable and secure: these are its greatest strengths. However Samba
-has a great deal to offer and to go further you must do some more
-reading. Speed and security optimisations, printer accounting, network
-logons, roving profiles, browsing across multiple subnets and so on are
-all covered either in this document or in those it refers to.</P>
-
-
-<H2><A NAME="ss1.2">1.2 All Samba Documentation</A></H2>
-
-<P>
-<A NAME="AllDocs"></A>
-</P>
-<P>
-<UL>
-<LI> Meta-FAQ. This is the mother of all documents, and is the one you
-are reading now. The latest version is always at
-<A HREF="http://samba.anu.edu.au/[.....]">http://samba.anu.edu.au/[.....]</A> but there is probably a much
-nearer
-<A HREF="../MIRRORS">mirror site</A> which you should use
-instead.
-</LI>
-<LI>
-<A HREF="Samba-Server-FAQ.html">Samba-Server-FAQ.html</A> is the best starting point for
-information about server-side issues. Includes configuration tips and
-pointers for Samba on particular operating systems (with 40 to choose
-from...)
-</LI>
-<LI>
-<A HREF="Samba-Client-FAQ.html">Samba-Client-FAQ.html</A> is the best starting point for
-information about client-side issues, includes a list of all clients
-that are known to work with Samba.
-</LI>
-<LI>
-<A HREF="samba-man-index.html">manual pages</A> contains
-descriptions of and links to all the Samba manual pages, in Unix man and
-postscript format.
-</LI>
-<LI>
-<A HREF="samba-txt-index.html">samba-txt-index.html</A> has descriptions of and links to
-a large number of text files have been contributed to samba covering
-many topics. These are gradually being absorbed into the FAQs and HOWTOs
-but in the meantime you might find helpful answers here.
-</LI>
-<LI>
-</LI>
-</UL>
-</P>
-
-
-<HR>
-Previous
-<A HREF="Samba-meta-FAQ-2.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc1">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ-2.html b/docs/faq/Samba-meta-FAQ-2.html
deleted file mode 100644
index ac760380067..00000000000
--- a/docs/faq/Samba-meta-FAQ-2.html
+++ /dev/null
@@ -1,384 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: General Information</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-meta-FAQ-1.html">Previous</A>
-<A HREF="Samba-meta-FAQ-3.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc2">Table of Contents</A>
-<HR>
-<H2><A NAME="s2">2. General Information</A></H2>
-
-<P>
-<A NAME="general_info"></A>
-</P>
-<P>All about Samba - what it is, how to get it, related sources of
-information, how to understand the numbering scheme, pizza
-details.</P>
-
-<H2><A NAME="ss2.1">2.1 What is Samba?</A></H2>
-
-<P>
-<A NAME="introduction"></A>
-</P>
-<P>Samba is a suite of programs which work together to allow clients to
-access to a server's filespace and printers via the SMB (Server Message
-Block) and CIFS (Common Internet Filesystem) protocols. Initially
-written for Unix, Samba now also runs on Netware, OS/2, VMS, StratOS and
-Amigas. Ports to BeOS and other operating systems are underway. Samba
-gives the capability for these operating systems to behave much like a
-LAN Server, Windows NT Server or Pathworks machine, only with added
-functionality and flexibility designed to make life easier for
-administrators. </P>
-<P>This means that using Samba you can share a server's disks and printers
-to many sorts of network clients, including Lan Manager, Windows for
-Workgroups, Windows NT, Linux, OS/2, and AIX. There is also a generic
-client program supplied as part of the Samba suite which gives a user on
-the server an ftp-like interface to access filespace and printers on any
-other SMB/CIFS servers.</P>
-<P>SMB has been implemented over many protocols, including XNS, NBT, IPX,
-NetBEUI and TCP/IP. Samba only uses TCP/IP. This is not likely to change
-although there have been some requests for NetBEUI support.</P>
-<P>Many users report that compared to other SMB implementations Samba is
-more stable, faster, and compatible with more clients. Administrators of
-some large installations say that Samba is the only SMB server available
-which will scale to many tens of thousands of users without crashing.
-The easy way to test these claims is to download it and try it for
-yourself!</P>
-<P>The suite is supplied with full source code under the
-<A HREF="../COPYING">GNU Public License</A>. The GPL means that you can
-use Samba for whatever purpose you wish (including changing the source
-or selling it for money) but under all circumstances the source code
-must be made freely available. A copy of the GPL must always be included
-in any copy of the package.</P>
-<P>The primary creator of the Samba suite is Andrew Tridgell. Later
-versions incorporate much effort by many net.helpers. The man pages
-and this FAQ were originally written by Karl Auer.</P>
-
-
-<H2><A NAME="ss2.2">2.2 What is the current version of Samba?</A></H2>
-
-<P>
-<A NAME="current_version"></A>
-</P>
-<P>At time of writing, the current version was 1.9.17. If you want to be
-sure check the bottom of the change-log file.
-<A HREF="ftp://samba.anu.edu.au/pub/samba/alpha/change-log">ftp://samba.anu.edu.au/pub/samba/alpha/change-log</A></P>
-<P>For more information see
-<A HREF="#version_nums">What do the version numbers mean?</A></P>
-
-
-<H2><A NAME="ss2.3">2.3 Where can I get it? </A></H2>
-
-<P>
-<A NAME="WhereFrom"></A>
-</P>
-<P>The Samba suite is available via anonymous ftp from samba.anu.edu.au and
-many
-<A HREF="../MIRRORS">mirror</A> sites. You will get much
-faster performance if you use a mirror site. The latest and greatest
-versions of the suite are in the directory:</P>
-<P>/pub/samba/</P>
-<P>Development (read "alpha") versions, which are NOT necessarily stable
-and which do NOT necessarily have accurate documentation, are available
-in the directory:</P>
-<P>/pub/samba/alpha</P>
-<P>Note that binaries are NOT included in any of the above. Samba is
-distributed ONLY in source form, though binaries may be available from
-other sites. Most Linux distributions, for example, do contain Samba
-binaries for that platform. The VMS, OS/2, Netware and Amiga and other
-ports typically have binaries made available.</P>
-<P>A special case is vendor-provided binary packages. Samba binaries and
-default configuration files are put into packages for a specific
-operating system. RedHat Linux and Sun Solaris (Sparc and x86) is
-already included, and others such as OS/2 may follow. All packages are
-in the directory:</P>
-<P>/pub/samba/Binary_Packages/"OS_Vendor"</P>
-
-
-<H2><A NAME="ss2.4">2.4 What do the version numbers mean?</A></H2>
-
-<P>
-<A NAME="version_nums"></A>
-</P>
-<P>It is not recommended that you run a version of Samba with the word
-"alpha" in its name unless you know what you are doing and are willing
-to do some debugging. Many, many people just get the latest
-recommended stable release version and are happy. If you are brave, by
-all means take the plunge and help with the testing and development -
-but don't install it on your departmental server. Samba is typically
-very stable and safe, and this is mostly due to the policy of many
-public releases.</P>
-<P>How the scheme works:</P>
-<P>
-<OL>
-<LI>When major changes are made the version number is increased. For
-example, the transition from 1.9.16 to 1.9.17. However, this version
-number will not appear immediately and people should continue to use
-1.9.15 for production systems (see next point.)
-</LI>
-<LI>Just after major changes are made the software is considered
-unstable, and a series of alpha releases are distributed, for example
-1.9.16alpha1. These are for testing by those who know what they are
-doing. The "alpha" in the filename will hopefully scare off those who
-are just looking for the latest version to install.
-</LI>
-<LI>When Andrew thinks that the alphas have stabilised to the point
-where he would recommend new users install it, he renames it to the
-same version number without the alpha, for example 1.9.17.
-</LI>
-<LI>Inevitably bugs are found in the "stable" releases and minor patch
-levels are released which give us the pXX series, for example 1.9.17p2.
-</LI>
-</OL>
-</P>
-<P>So the progression goes:</P>
-<P>
-<PRE>
- 1.9.16p10 (production)
- 1.9.16p11 (production)
- 1.9.17alpha1 (test sites only)
- :
- 1.9.17alpha20 (test sites only)
- 1.9.17 (production)
- 1.9.17p1 (production)
-</PRE>
-</P>
-<P>The above system means that whenever someone looks at the samba ftp
-site they will be able to grab the highest numbered release without an
-alpha in the name and be sure of getting the current recommended
-version.</P>
-
-
-<H2><A NAME="ss2.5">2.5 Where can I go for further information?</A></H2>
-
-<P>
-<A NAME="more"></A>
-</P>
-<P>There are a number of places to look for more information on Samba,
-including:</P>
-<P>
-<UL>
-<LI>Two mailing lists devoted to discussion of Samba-related matters.
-See below for subscription information.
-</LI>
-<LI>The newsgroup comp.protocols.smb, which has a great deal of
-discussion about Samba.
-</LI>
-<LI>The WWW site 'SAMBA Web Pages' at
-<A HREF="http://samba.anu.edu.au/samba/">http://samba.anu.edu.au/samba/</A> includes:
-
-<UL>
-<LI>Links to man pages and documentation, including this FAQ</LI>
-<LI>A comprehensive survey of Samba users</LI>
-<LI>A searchable hypertext archive of the Samba mailing list</LI>
-<LI>Links to Samba source code, binaries, and mirrors of both</LI>
-<LI>This FAQ and the rest in its family</LI>
-</UL>
-
-</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss2.6">2.6 How do I subscribe to the Samba Mailing Lists?</A></H2>
-
-<P>
-<A NAME="mailinglist"></A>
-</P>
-<P>Send email to
-<A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>. Make sure the subject line is blank,
-and include the following two lines in the body of the message:</P>
-<P>
-<BLOCKQUOTE><CODE>
-<PRE>
-subscribe samba Firstname Lastname
-subscribe samba-announce Firstname Lastname
-</PRE>
-</CODE></BLOCKQUOTE>
-</P>
-<P>Obviously you should substitute YOUR first name for "Firstname" and
-YOUR last name for "Lastname"! Try not to send any signature, it
-sometimes confuses the list processor.</P>
-<P>The samba list is a digest list - every eight hours or so it sends a
-single message containing all the messages that have been received by
-the list since the last time and sends a copy of this message to all
-subscribers. There are thousands of people on this list.</P>
-<P>If you stop being interested in Samba, please send another email to
-<A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>. Make sure the subject line is blank, and
-include the following two lines in the body of the message:</P>
-<P>
-<BLOCKQUOTE><CODE>
-<PRE>
-unsubscribe samba
-unsubscribe samba-announce
-</PRE>
-</CODE></BLOCKQUOTE>
-</P>
-<P>The <B>From:</B> line in your message <EM>MUST</EM> be the same
-address you used when you subscribed.</P>
-
-
-<H2><A NAME="ss2.7">2.7 Something's gone wrong - what should I do?</A></H2>
-
-<P>
-<A NAME="wrong"></A>
-</P>
-<P><B><F>#</F> *** IMPORTANT! *** <F>#</F></B></P>
-
-<P>DO NOT post messages on mailing lists or in newsgroups until you have
-carried out the first three steps given here!</P>
-<P>
-<OL>
-<LI> See if there are any likely looking entries in this FAQ!
-If you have just installed Samba, have you run through the checklist in
-<A HREF="ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt">DIAGNOSIS.txt</A>? It can save you a lot of time and effort.
-DIAGNOSIS.txt can also be found in the docs directory of the Samba
-distribution.
-</LI>
-<LI> Read the man pages for smbd, nmbd and smb.conf, looking for
-topics that relate to what you are trying to do.
-</LI>
-<LI> If there is no obvious solution to hand, try to get a look at
-the log files for smbd and/or nmbd for the period during which you
-were having problems. You may need to reconfigure the servers to
-provide more extensive debugging information - usually level 2 or
-level 3 provide ample debugging info. Inspect these logs closely,
-looking particularly for the string "Error:".
-</LI>
-<LI> If you need urgent help and are willing to pay for it see
-<A HREF="#PaidSupport">Paid Support</A>.
-</LI>
-</OL>
-</P>
-<P>If you still haven't got anywhere, ask the mailing list or newsgroup. In
-general nobody minds answering questions provided you have followed the
-preceding steps. It might be a good idea to scan the archives of the
-mailing list, which are available through the Samba web site described
-in the previous section. When you post be sure to include a good
-description of your environment and your problem.</P>
-<P>If you successfully solve a problem, please mail the FAQ maintainer a
-succinct description of the symptom, the problem and the solution, so
-that an explanation can be incorporated into the next version.</P>
-
-
-<H2><A NAME="ss2.8">2.8 How do I submit patches or bug reports?</A></H2>
-
-
-<P>If you make changes to the source code, <EM>please</EM> submit these patches
-so that everyone else gets the benefit of your work. This is one of
-the most important aspects to the maintainence of Samba. Send all
-patches to
-<A HREF="mailto:samba-bugs@samba.anu.edu.au">samba-bugs@samba.anu.edu.au</A>. Do not send patches to Andrew Tridgell or any
-other individual, they may be lost if you do.</P>
-<P>Patch format
-------------</P>
-<P>If you are sending a patch to fix a problem then please don't just use
-standard diff format. As an example, samba-bugs received this patch from
-someone:</P>
-<P>382a
-#endif
-..
-381a
-#if !defined(NEWS61)</P>
-<P>How are we supposed to work out what this does and where it goes? These
-sort of patches only work if we both have identical files in the first
-place. The Samba sources are constantly changing at the hands of multiple
-developers, so it doesn't work.</P>
-<P>Please use either context diffs or (even better) unified diffs. You
-get these using "diff -c4" or "diff -u". If you don't have a diff that
-can generate these then please send manualy commented patches to I
-know what is being changed and where. Most patches are applied by hand so
-the info must be clear.</P>
-<P>This is a basic guideline that will assist us with assessing your problem
-more efficiently :</P>
-<P>Machine Arch:
-Machine OS:
-OS Version:
-Kernel:</P>
-<P>Compiler:
-Libc Version:</P>
-<P>Samba Version:</P>
-<P>Network Layout (description):</P>
-<P>What else is on machine (services, etc):</P>
-<P>Some extras :</P>
-<P>
-<UL>
-<LI> what you did and what happened
-</LI>
-<LI> relevant parts of a debugging output file with debuglevel higher.
-If you can't find the relevant parts, please ask before mailing
-huge files.
-</LI>
-<LI> anything else you think is useful to trace down the bug
-</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss2.9">2.9 What if I have an URGENT message for the developers?</A></H2>
-
-
-<P>If you have spotted something very serious and believe that it is
-important to contact the developers quickly send a message to
-samba-urgent@samba.anu.edu.au. This will be processed more quickly than
-mail to samba-bugs. Please think carefully before using this address. An
-example of its use might be to report a security hole.</P>
-<P>Examples of things <EM>not</EM> to send to samba-urgent include problems
-getting Samba to work at all and bugs that cannot potentially cause damage.</P>
-
-
-<H2><A NAME="ss2.10">2.10 What if I need paid-for support?</A></H2>
-
-<P>
-<A NAME="PaidSupport"></A>
-</P>
-<P>Samba has a large network of consultants who provide Samba support on a
-commercial basis. The list is included in the package in
-<A HREF="../Support.txt">../Support.txt</A>, and the latest version will always be on the main
-samba ftp site. Any company in the world can request that the samba team
-include their details in Support.txt so we can give no guarantee of
-their services.</P>
-
-
-<H2><A NAME="ss2.11">2.11 Pizza supply details</A></H2>
-
-<P>
-<A NAME="pizza"></A>
-
-Those who have registered in the Samba survey as "Pizza Factory" will
-already know this, but the rest may need some help. Andrew doesn't ask
-for payment, but he does appreciate it when people give him
-pizza. This calls for a little organisation when the pizza donor is
-twenty thousand kilometres away, but it has been done.</P>
-<P>
-<OL>
-<LI> Ring up your local branch of an international pizza chain
-and see if they honour their vouchers internationally. Pizza Hut do,
-which is how the entire Canberra Linux Users Group got to eat pizza
-one night, courtesy of someone in the US.
-</LI>
-<LI>Ring up a local pizza shop in Canberra and quote a credit
-card number for a certain amount, and tell them that Andrew will be
-collecting it (don't forget to tell him.) One kind soul from Germany
-did this.
-</LI>
-<LI>Purchase a pizza voucher from your local pizza shop that has
-no international affiliations and send it to Andrew. It is completely
-useless but he can hang it on the wall next to the one he already has
-from Germany :-)
-</LI>
-<LI>Air freight him a pizza with your favourite regional
-flavours. It will probably get stuck in customs or torn apart by
-hungry sniffer dogs but it will have been a noble gesture.
-</LI>
-</OL>
-</P>
-
-
-<HR>
-<A HREF="Samba-meta-FAQ-1.html">Previous</A>
-<A HREF="Samba-meta-FAQ-3.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc2">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ-3.html b/docs/faq/Samba-meta-FAQ-3.html
deleted file mode 100644
index 63adff35f92..00000000000
--- a/docs/faq/Samba-meta-FAQ-3.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: About the CIFS and SMB Protocols</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-meta-FAQ-2.html">Previous</A>
-<A HREF="Samba-meta-FAQ-4.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc3">Table of Contents</A>
-<HR>
-<H2><A NAME="s3">3. About the CIFS and SMB Protocols</A></H2>
-
-<P>
-<A NAME="CifsSmb"></A>
-</P>
-
-<H2><A NAME="ss3.1">3.1 What is the Server Message Block (SMB) Protocol?</A></H2>
-
-<P>SMB is a filesharing protocol that has had several maintainers and
-contributors over the years including Xerox, 3Com and most recently
-Microsoft. Names for this protocol include LAN Manager and Microsoft
-Networking. Parts of the specification has been made public at several
-versions including in an X/Open document, as listed at
-<A HREF="ftp://ftp.microsoft.com/developr/drg/CIFS/">ftp://ftp.microsoft.com/developr/drg/CIFS/</A>. No specification
-releases were made between 1992 and 1996, and during that period
-Microsoft became the SMB implementor with the largest market share.
-Microsoft developed the specification further for its products but for
-various reasons connected with developer's workload rather than market
-strategy did not make the changes public. This culminated with the
-"Windows NT 0.12" version released with NT 3.5 in 1995 which had significant
-improvements and bugs. Because Microsoft client systems are so popular,
-it is fair to say that what Microsoft with Windows affects all suppliers
-of SMB server products.</P>
-<P>From 1994 Andrew Tridgell began doing some serious work on his
-Smbserver (now Samba) product and with some helpers started to
-implement more and more of these protocols. Samba began to take
-a significant share of the SMB server market.</P>
-
-
-<H2><A NAME="ss3.2">3.2 What is the Common Internet Filesystem (CIFS)?</A></H2>
-
-<P>The initial pressure for Microsoft to document their current SMB
-implementation came from the Samba team, who kept coming across things
-on the wire that Microsoft either didn't know about or hadn't documented
-anywhere (even in the sourcecode to Windows NT.) Then Sun Microsystems
-came out with their WebNFS initiative, designed to replace FTP for file
-transfers on the Internet. There are many drawbacks to WebNFS (including
-its scope - it aims to replace HTTP as well!) but the concept was
-attractive. FTP is not very clever, and why should it be harder to get
-files from across the world than across the room? </P>
-<P>Some hasty revisions were made and an Internet Draft for the Common
-Internet Filesystem (CIFS) was released. Note that CIFS is not an
-Internet standard and is a very long way from becoming one, BUT the
-protocol specification is in the public domain and ongoing discussions
-concerning the spec take place on a public mailing list according to the
-rules of the Internet Engineering Task Force. For more information and
-pointers see
-<A HREF="http://samba.anu.edu.au/cifs/">http://samba.anu.edu.au/cifs/</A></P>
-<P>The following is taken from
-<A HREF="http://www.microsoft.com/intdev/cifs/">http://www.microsoft.com/intdev/cifs/</A></P>
-<P>
-<PRE>
- CIFS defines a standard remote file system access protocol for use
- over the Internet, enabling groups of users to work together and
- share documents across the Internet or within their corporate
- intranets. CIFS is an open, cross-platform technology based on the
- native file-sharing protocols built into Microsoft® Windows® and
- other popular PC operating systems, and supported on dozens of
- other platforms, including UNIX®. With CIFS, millions of computer
- users can open and share remote files on the Internet without having
- to install new software or change the way they work.&quot;
-</PRE>
-</P>
-<P>If you consider CIFS as a backwardsly-compatible refinement of SMB that
-will work reasonably efficiently over the Internet you won't be too far
-wrong.</P>
-<P>The net effect is that Microsoft is now documenting large parts of their
-Windows NT fileserver protocols. The security concepts embodied in
-Windows NT are part of the specification, which is why Samba
-documentation often talks in terms of Windows NT. However there is no
-reason why a site shouldn't conduct all its file and printer sharing
-with CIFS and yet have no Microsoft products at all.</P>
-
-
-<H2><A NAME="ss3.3">3.3 What is Browsing? </A></H2>
-
-<P>The term "Browsing" causes a lot of confusion. It is the part of the
-SMB/CIFS protocol which allows for resource discovery. For example, in
-the Windows NT Explorer it is possible to see a "Network Neighbourhood"
-of computers in the same SMB workgroup. Clicking on the name of one of
-these machines brings up a list of file and printer resources for
-connecting to. In this way you can cruise the network, seeing what
-things are available. How this scales to the Internet is a subject for
-debate. Look at the CIFS list archives to see what the experts think.</P>
-
-
-<HR>
-<A HREF="Samba-meta-FAQ-2.html">Previous</A>
-<A HREF="Samba-meta-FAQ-4.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc3">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ-4.html b/docs/faq/Samba-meta-FAQ-4.html
deleted file mode 100644
index 73a9eea8471..00000000000
--- a/docs/faq/Samba-meta-FAQ-4.html
+++ /dev/null
@@ -1,215 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: Designing A SMB and CIFS Network</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-meta-FAQ-3.html">Previous</A>
-<A HREF="Samba-meta-FAQ-5.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc4">Table of Contents</A>
-<HR>
-<H2><A NAME="s4">4. Designing A SMB and CIFS Network</A></H2>
-
-
-<P>The big issues for installing any network of LAN or WAN file and print
-servers are </P>
-<P>
-<UL>
-<LI>How and where usernames, passwords and other security information
-is stored
-</LI>
-<LI>What method can be used for locating the resources that users have
-permission to use
-</LI>
-<LI>What protocols the clients can converse with
-</LI>
-</UL>
- </P>
-<P>If you buy Netware, Windows NT or just about any other LAN fileserver
-product you are expected to lock yourself into the product's preferred
-answers to these questions. This tendancy is restrictive and often very
-expensive for a site where there is only one kind of client or server,
-and for sites with a mixture of operating systems it often makes it
-impossible to share resources between some sets of users.</P>
-<P>The Samba philosophy is to make things as easy as possible for
-administators, which means allowing as many combinations of clients,
-servers, operating systems and protocols as possible.</P>
-
-<H2><A NAME="ss4.1">4.1 Workgroups, Domains, Authentication and Browsing</A></H2>
-
-
-<P>From the point of view of networking implementation, Domains and
-Workgroups are <EM>exactly</EM> the same, except for the client logon
-sequence. Some kind of distributed authentication database is associated
-with a domain (there are quite a few choices) and this adds so much
-flexibility that many people think of a domain as a completely different
-entity to a workgroup. From Samba's point of view a client connecting to
-a service presents an authentication token, and it if it is valid they
-have access. Samba does not care what mechanism was used to generate
-that token in the first place.</P>
-<P>The SMB client logging on to a domain has an expectation that every other
-server in the domain should accept the same authentication information.
-However the network browsing functionality of domains and workgroups is
-identical and is explained in
-<A HREF="../BROWSING.txt">../BROWSING.txt</A>.</P>
-<P>There are some implementation differences: Windows 95 can be a member of
-both a workgroup and a domain, but Windows NT cannot. Windows 95 also
-has the concept of an "alternative workgroup". Samba can only be a
-member of a single workgroup or domain, although this is due to change
-with a future version when nmbd will be split into two daemons, one for
-WINS and the other for browsing (
-<A HREF="../NetBIOS.txt">../NetBIOS.txt</A> explains
-what WINS is.)</P>
-
-<H3>Defining the Terms</H3>
-
-<P>
-<A NAME="BrowseAndDomainDefs"></A>
-</P>
-<P>
-<DL>
-
-<DT><B>Workgroup</B><DD><P>means a collection of machines that maintain a common
-browsing database containing information about their shared resources.
-They do not necessarily have any security information in common (if they
-do, it gets called a Domain.) The browsing database is dynamic, modified
-as servers come and go on the network and as resources are added or
-deleted. The term "browsing" refers to a user accessing the database via
-whatever interface the client provides, eg the OS/2 Workplace Shell or
-Windows 95 Explorer. SMB servers agree between themselves as to which
-ones will maintain the browsing database. Workgroups can be anywhere on
-a connected TCP/IP network, including on different subnets or even on
-the Interet. This is a very tricky part of SMB to implement.</P>
-
-<DT><B>Master Browsers</B><DD><P>are machines which holds the master browsing
-database for a workgroup or domain. There are two kinds of Master Browser:</P>
-<P>
-<UL>
-<LI> Domain Master Browser, which holds the master browsing
-information for an entire domain, which may well cross multiple TCP/IP
-subnets.
-</LI>
-<LI> Local Master Browser, which holds the master browsing database
-for a particular subnet and communicates with the Domain Master Browser
-to get information on other subnets.
-</LI>
-</UL>
-</P>
-<P>Subnets are differentiated because browsing is based on broadcasts, and
-broadcasts do not pass through routers. Subnets are not routed: while it
-is possible to have more than one subnet on a single network segment
-this is regarded as very bad practice.</P>
-<P>Master Browsers (both Domain and Local) are elected dynamically
-according to an algorithm which is supposed to take into account the
-machine's ability to sustain the browsing load. Samba can be configured
-to always act as a master browser, ie it always wins elections under all
-circumstances, even against systems such as a Windows NT Primary Domain
-Controller which themselves expect to win. </P>
-<P>There are also Backup Browsers which are promoted to Master Browsers in
-the event of a Master Browser disappearing from the network.</P>
-<P>Alternative terms include confusing variations such as "Browse Master",
-and "Master Browser" which we are trying to eliminate from the Samba
-documentation. </P>
-
-<DT><B>Domain Controller</B><DD><P>is a term which comes from the Microsoft and IBM
-etc implementation of the LAN Manager protocols. It is tied to
-authentication. There are other ways of doing domain authentication, but
-the Windows NT method has a large market share. The general issues are
-discussed in
-<A HREF="../DOMAIN.txt">../DOMAIN.txt</A> and a Windows NT-specific
-discussion is in
-<A HREF="../DOMAIN_CONTROL.txt">../DOMAIN_CONTROL.txt</A>.</P>
-
-</DL>
-</P>
-
-<H3>Sharelevel (Workgroup) Security Services</H3>
-
-<P>
-<A NAME="ShareModeSecurity"></A>
-</P>
-<P>With the Samba setting "security = SHARE", all shared resources
-information about what password is associated with them but only hints
-as to what usernames might be valid (the hint can be 'all users', in
-which case any username will work. This is usually a bad idea, but
-reflects both the initial implementations of SMB in the mid-80s and
-its reincarnation with Windows for Workgroups in 1992. The idea behind
-workgroup security was that small independant groups of people could
-share information on an ad-hoc basis without there being an
-authentication infrastructure present or requiring them to do more than
-fill in a dialogue box.</P>
-
-<H3>Authentication Domain Mode Services</H3>
-
-<P>
-<A NAME="DomainModeSecurity"></A>
-</P>
-<P>With the Samba settings "security = USER" or "security = SERVER"
-accesses to all resources are checked for username/password pair matches
-in a more rigorous manner. To the client, this has the effect of
-emulating a Microsoft Domain. The client is not concerned whether or not
-Samba looks up a Windows NT SAM or does it in some other way.</P>
-
-
-<H2><A NAME="ss4.2">4.2 Authentication Schemes</A></H2>
-
-
-<P>In the simple case authentication information is stored on a single
-server and the user types a password on connecting for the first time.
-However client operating systems often require a password before they
-can be used at all, and in addition users usually want access to more
-than one server. Asking users to remember many different passwords in
-different contexts just does not work. Some kind of distributed
-authentication database is needed. It must cope with password changes
-and provide for assigning groups of users the same level of access
-permissions. This is why Samba installations often choose to implement a
-Domain model straight away.</P>
-<P>Authentication decisions are some of the biggest in designing a network.
-Are you going to use a scheme native to the client operating system,
-native to the server operating system, or newly installed on both? A
-list of options relevant to Samba (ie that make sense in the context of
-the SMB protocol) follows. Any experiences with other setups would be
-appreciated. <F>refer to server FAQ for "passwd chat" passwd program
-password server etc etc...</F></P>
-
-<H3>NIS</H3>
-
-
-<P>For Windows 95, Windows for Workgroups and most other clients Samba can
-be a domain controller and share the password database via NIS
-transparently. Windows NT is different.
-<A HREF="http://www.dcs.qmw.ac.uk/~williams">Free NIS NT client</A></P>
-
-<H3>Kerberos</H3>
-
-
-<P>Kerberos for US users only:
-<A HREF="http://www.cygnus.com/product/unifying-security.html">Kerberos overview</A>
-<A HREF="http://www.cygnus.com/product/kerbnet-download.html">Download Kerberos</A></P>
-
-<H3>FTP</H3>
-
-
-<P>Other NT w/s logon hack via NT</P>
-
-<H3>Default Server Method</H3>
-
-
-
-<H3>Client-side Database Only</H3>
-
-
-
-
-<H2><A NAME="ss4.3">4.3 Post-Authentication: Netlogon, Logon Scripts, Profiles</A></H2>
-
-
-<P>See
-<A HREF="../DOMAIN.txt">../DOMAIN.txt</A></P>
-
-
-<HR>
-<A HREF="Samba-meta-FAQ-3.html">Previous</A>
-<A HREF="Samba-meta-FAQ-5.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc4">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ-5.html b/docs/faq/Samba-meta-FAQ-5.html
deleted file mode 100644
index ad528b0a975..00000000000
--- a/docs/faq/Samba-meta-FAQ-5.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: Cross-Protocol File Sharing</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-meta-FAQ-4.html">Previous</A>
-<A HREF="Samba-meta-FAQ-6.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc5">Table of Contents</A>
-<HR>
-<H2><A NAME="s5">5. Cross-Protocol File Sharing</A></H2>
-
-
-<P>Samba is an important tool for...</P>
-<P>It is possible to...</P>
-<P>File protocol gateways...</P>
-<P>"Setting up a Linux File Server" http://vetrec.mit.edu/people/narf/linux.html</P>
-<P>Two free implementations of Appletalk for Unix are Netatalk,
-<A HREF="http://www.umich.edu/~rsug/netatalk/">http://www.umich.edu/~rsug/netatalk/</A>, and CAP,
-<A HREF="http://www.cs.mu.oz.au/appletalk/atalk.html">http://www.cs.mu.oz.au/appletalk/atalk.html</A>. What Samba offers MS
-Windows users, these packages offer to Macs. For more info on these
-packages, Samba, and Linux (and other UNIX-based systems) see
-<A HREF="http://www.eats.com/linux_mac_win.html">http://www.eats.com/linux_mac_win.html</A> 3.5) Sniffing your nework</P>
-
-
-<HR>
-<A HREF="Samba-meta-FAQ-4.html">Previous</A>
-<A HREF="Samba-meta-FAQ-6.html">Next</A>
-<A HREF="Samba-meta-FAQ.html#toc5">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ-6.html b/docs/faq/Samba-meta-FAQ-6.html
deleted file mode 100644
index f8cd7817d69..00000000000
--- a/docs/faq/Samba-meta-FAQ-6.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ: Miscellaneous</TITLE>
-</HEAD>
-<BODY>
-<A HREF="Samba-meta-FAQ-5.html">Previous</A>
-Next
-<A HREF="Samba-meta-FAQ.html#toc6">Table of Contents</A>
-<HR>
-<H2><A NAME="s6">6. Miscellaneous</A></H2>
-
-<P>
-<A NAME="miscellaneous"></A>
-</P>
-<H2><A NAME="ss6.1">6.1 Is Samba Year 2000 compliant?</A></H2>
-
-<P>
-<A NAME="Year2000Compliant"></A>
-
-The CIFS protocol that Samba implements
-negotiates times in various formats, all of which
-are able to cope with dates beyond 2000.</P>
-
-
-<HR>
-<A HREF="Samba-meta-FAQ-5.html">Previous</A>
-Next
-<A HREF="Samba-meta-FAQ.html#toc6">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ.html b/docs/faq/Samba-meta-FAQ.html
deleted file mode 100644
index 5a70808867b..00000000000
--- a/docs/faq/Samba-meta-FAQ.html
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<HTML>
-<HEAD>
-<TITLE> Samba meta FAQ</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="Samba-meta-FAQ-1.html">Next</A>
-Table of Contents
-<HR>
-<H1> Samba meta FAQ</H1>
-
-<H2>Dan Shearer & Paul Blackman, <CODE>ictinus@samba.anu.edu.au</CODE></H2>v 0.3, 7 Oct '97
-<P><HR><EM> This is the meta-Frequently Asked Questions (FAQ) document
-for Samba, the free and very popular SMB and CIFS server product. It
-contains overview information for the Samba suite of programs, a
-quick-start guide, and pointers to all other Samba documentation. Other
-FAQs exist for specific client and server issues, and HOWTO documents
-for more extended topics to do with Samba software. Current to version
-Samba 1.9.17. Please send any corrections to the author. </EM><HR></P>
-<P>
-<H2><A NAME="toc1">1.</A> <A HREF="Samba-meta-FAQ-1.html">Quick Reference Guides to Samba Documentation</A></H2>
-<UL>
-<LI><A HREF="Samba-meta-FAQ-1.html#ss1.1">1.1 Samba for the Impatient</A>
-<LI><A HREF="Samba-meta-FAQ-1.html#ss1.2">1.2 All Samba Documentation</A>
-</UL>
-
-<P>
-<H2><A NAME="toc2">2.</A> <A HREF="Samba-meta-FAQ-2.html">General Information</A></H2>
-<UL>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.1">2.1 What is Samba?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.2">2.2 What is the current version of Samba?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.3">2.3 Where can I get it? </A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.4">2.4 What do the version numbers mean?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.5">2.5 Where can I go for further information?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.6">2.6 How do I subscribe to the Samba Mailing Lists?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.7">2.7 Something's gone wrong - what should I do?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.8">2.8 How do I submit patches or bug reports?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.9">2.9 What if I have an URGENT message for the developers?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.10">2.10 What if I need paid-for support?</A>
-<LI><A HREF="Samba-meta-FAQ-2.html#ss2.11">2.11 Pizza supply details</A>
-</UL>
-
-<P>
-<H2><A NAME="toc3">3.</A> <A HREF="Samba-meta-FAQ-3.html">About the CIFS and SMB Protocols</A></H2>
-<UL>
-<LI><A HREF="Samba-meta-FAQ-3.html#ss3.1">3.1 What is the Server Message Block (SMB) Protocol?</A>
-<LI><A HREF="Samba-meta-FAQ-3.html#ss3.2">3.2 What is the Common Internet Filesystem (CIFS)?</A>
-<LI><A HREF="Samba-meta-FAQ-3.html#ss3.3">3.3 What is Browsing? </A>
-</UL>
-
-<P>
-<H2><A NAME="toc4">4.</A> <A HREF="Samba-meta-FAQ-4.html">Designing A SMB and CIFS Network</A></H2>
-<UL>
-<LI><A HREF="Samba-meta-FAQ-4.html#ss4.1">4.1 Workgroups, Domains, Authentication and Browsing</A>
-<LI><A HREF="Samba-meta-FAQ-4.html#ss4.2">4.2 Authentication Schemes</A>
-<LI><A HREF="Samba-meta-FAQ-4.html#ss4.3">4.3 Post-Authentication: Netlogon, Logon Scripts, Profiles</A>
-</UL>
-
-<P>
-<H2><A NAME="toc5">5.</A> <A HREF="Samba-meta-FAQ-5.html">Cross-Protocol File Sharing</A></H2>
-
-<P>
-<H2><A NAME="toc6">6.</A> <A HREF="Samba-meta-FAQ-6.html">Miscellaneous</A></H2>
-<UL>
-<LI><A HREF="Samba-meta-FAQ-6.html#ss6.1">6.1 Is Samba Year 2000 compliant?</A>
-</UL>
-
-
-<HR>
-Previous
-<A HREF="Samba-meta-FAQ-1.html">Next</A>
-Table of Contents
-</BODY>
-</HTML>
diff --git a/docs/faq/Samba-meta-FAQ.sgml b/docs/faq/Samba-meta-FAQ.sgml
deleted file mode 100644
index 75038f19f53..00000000000
--- a/docs/faq/Samba-meta-FAQ.sgml
+++ /dev/null
@@ -1,771 +0,0 @@
-<!doctype linuxdoc system> <!-- -*- SGML -*- -->
-<!--
- v 0.1 23 Aug 1997 Dan Shearer
- Original Samba-meta-FAQ.sgml from Paul's sambafaq.sgml
- v 0.2 25 Aug 1997 Dan
- v 0.3 7 Oct 1997 Paul
- Changed samba.canberra refs to samba.anu.../samba/
--->
-
-<article>
-
-<title> Samba meta FAQ
-
-<author>Dan Shearer & Paul Blackman, <tt>ictinus@samba.anu.edu.au</tt>
-
-<date>v 0.3, 7 Oct '97
-
-<abstract> This is the meta-Frequently Asked Questions (FAQ) document
-for Samba, the free and very popular SMB and CIFS server product. It
-contains overview information for the Samba suite of programs, a
-quick-start guide, and pointers to all other Samba documentation. Other
-FAQs exist for specific client and server issues, and HOWTO documents
-for more extended topics to do with Samba software. Current to version
-Samba 1.9.17. Please send any corrections to the author.
-</abstract>
-
-<toc>
-
-<sect> Quick Reference Guides to Samba Documentation<p><label id=quickref>
-
-We are endeavouring to provide links here to every major class of
-information about Samba or things related to Samba. We cannot list every
-document, but we are aiming for all documents to be at most two
-referrals from those listed here. This needs constant maintaining, so
-please send the author your feedback.
-
-<sect1> Samba for the Impatient<p><label id="impatient">
-
-You know you should read the documentation but can't wait to start? What
-you need to do then is follow the instructions in the following
-documents in the order given. This should be enough to get a fairly
-simple site going quickly. If you have any problems, refer back to this
-meta-FAQ and follow the links to find more reading material.
-
-<descrip>
-
-<label id="ImpGet"><tag/Getting Samba:/ The fastest way to get Samba
-going is and install it is to have an operating system for which the
-Samba team has put together an installation package. To see if your OS
-is included have a look at the directory
-/pub/samba/Binary_Packages/"OS_Vendor" on your nearest <url
-url="../MIRRORS" name="mirror site">. If it is included follow the
-installation instructions in the README file there and then do some <ref id="ImpTest"
-name="basic testing">. If you are not so fortunate, follow the normal <ref
-id="WhereFrom" name="download instructions"> and then continue with <ref
-id="ImpInst" name="building and installing Samba">.
-
-<label id="ImpInst"><tag/Building and Installing Samba:/ At the moment
-there are two kinds of Samba server installs besides the prepackaged
-binaries mentioned in the previous step. You need to decide if you have a <url url="../UNIX_INSTALL.txt"
-name="Unix or close relative"> or <url
-url="Samba-Server-FAQ.html#PortInfo" name="other supported operating system">.
-
-<label id="ImpTest"><tag/Basic Testing:/ Try to connect using the
-supplied smbclient command-line program. You need to know the IP
-hostname of your server. A service name must be defined in smb.conf, as
-given in the examples (under many operating systems if there is a
-[homes] service you can just use a valid username.) Then type
-<tt>
- smbclient \\hostname\servicename
-</tt>
-Under most Unixes you will need to put the parameters within quotation
-marks. If this works, try connecting from one of the SMB clients you
-were planning to use with Samba.
-
-<label id="ImpDebug"><tag/Debug sequence:/ If you think you have completed the
-previous step and things aren't working properly work through
-<url url="../DIAGNOSIS.txt" name="the diagnosis recipe.">
-
-<label id="ImpExp"><tag/Exporting files to SMB clients:/ You should read the manual pages
-for smb.conf, but here is a <url url="Samba-Server-FAQ.html#Exporting"
-name="quick answer guide.">
-
-<label id="ImpControl"><tag/Controlling user access:/ the quickest and dirtiest way of sharing
-resources is to use <ref id="ShareModeSecurity" name="share level
-security."> If you want to spend more time and have a proper username
-and password database you must read the paragraph on <ref
-id="DomainModeSecurity" name="domain mode security."> If you want
-encryption (eg you are using Windows NT clients) follow the <url
-url="Samba-Server-FAQ.html#SMBEncryptionSteps" name="SMB encryption
-instructions.">
-
-<label id="ImpBrowse"><tag/Browsing:/ if you are happy to type in "\\samba-server\sharename"
-at the client end then do not read any further. Otherwise you need to
-understand the <ref id="BrowsingDefinitions" name="browsing terminology">
-and read <url url="Samba-Server-FAQ.html#NameBrowsing">.
-
-<label id="ImpPrint"><tag/Printing:/ See the <url url="Samba-Server-FAQ.html#Printing"
-name="printing quick answer guide.">
-
-</descrip>
-
-If you have got everything working to this point, you can expect Samba
-to be stable and secure: these are its greatest strengths. However Samba
-has a great deal to offer and to go further you must do some more
-reading. Speed and security optimisations, printer accounting, network
-logons, roving profiles, browsing across multiple subnets and so on are
-all covered either in this document or in those it refers to.
-
-<sect1> All Samba Documentation<p><label id=AllDocs>
-
-<itemize>
-
-<item> Meta-FAQ. This is the mother of all documents, and is the one you
-are reading now. The latest version is always at <url
-url="http://samba.anu.edu.au/[.....]"> but there is probably a much
-nearer <url url="../MIRRORS" name="mirror site"> which you should use
-instead.
-
-<item> <url url="Samba-Server-FAQ.html"> is the best starting point for
-information about server-side issues. Includes configuration tips and
-pointers for Samba on particular operating systems (with 40 to choose
-from...)
-
-<item> <url url="Samba-Client-FAQ.html"> is the best starting point for
-information about client-side issues, includes a list of all clients
-that are known to work with Samba.
-
-<item> <url url="samba-man-index.html" name="manual pages"> contains
-descriptions of and links to all the Samba manual pages, in Unix man and
-postscript format.
-
-<item> <url url="samba-txt-index.html"> has descriptions of and links to
-a large number of text files have been contributed to samba covering
-many topics. These are gradually being absorbed into the FAQs and HOWTOs
-but in the meantime you might find helpful answers here.
-
-<item>
-
-</itemize>
-
-<sect> General Information<p><label id="general_info">
-
-All about Samba - what it is, how to get it, related sources of
-information, how to understand the numbering scheme, pizza
-details.
-
-<sect1> What is Samba?<p><label id="introduction">
-
-Samba is a suite of programs which work together to allow clients to
-access to a server's filespace and printers via the SMB (Server Message
-Block) and CIFS (Common Internet Filesystem) protocols. Initially
-written for Unix, Samba now also runs on Netware, OS/2, VMS, StratOS and
-Amigas. Ports to BeOS and other operating systems are underway. Samba
-gives the capability for these operating systems to behave much like a
-LAN Server, Windows NT Server or Pathworks machine, only with added
-functionality and flexibility designed to make life easier for
-administrators.
-
-This means that using Samba you can share a server's disks and printers
-to many sorts of network clients, including Lan Manager, Windows for
-Workgroups, Windows NT, Linux, OS/2, and AIX. There is also a generic
-client program supplied as part of the Samba suite which gives a user on
-the server an ftp-like interface to access filespace and printers on any
-other SMB/CIFS servers.
-
-SMB has been implemented over many protocols, including XNS, NBT, IPX,
-NetBEUI and TCP/IP. Samba only uses TCP/IP. This is not likely to change
-although there have been some requests for NetBEUI support.
-
-Many users report that compared to other SMB implementations Samba is
-more stable, faster, and compatible with more clients. Administrators of
-some large installations say that Samba is the only SMB server available
-which will scale to many tens of thousands of users without crashing.
-The easy way to test these claims is to download it and try it for
-yourself!
-
-The suite is supplied with full source code under the <url
-url="../COPYING" name="GNU Public License">. The GPL means that you can
-use Samba for whatever purpose you wish (including changing the source
-or selling it for money) but under all circumstances the source code
-must be made freely available. A copy of the GPL must always be included
-in any copy of the package.
-
-The primary creator of the Samba suite is Andrew Tridgell. Later
-versions incorporate much effort by many net.helpers. The man pages
-and this FAQ were originally written by Karl Auer.
-
-<sect1> What is the current version of Samba?<p><label id="current_version">
-
-At time of writing, the current version was 1.9.17. If you want to be
-sure check the bottom of the change-log file. <url url="ftp://samba.anu.edu.au/pub/samba/alpha/change-log">
-
-For more information see <ref id="version_nums" name="What do the version numbers mean?">
-
-<sect1> Where can I get it? <p><label id="WhereFrom">
-
-The Samba suite is available via anonymous ftp from samba.anu.edu.au and
-many <url url="../MIRRORS" name="mirror"> sites. You will get much
-faster performance if you use a mirror site. The latest and greatest
-versions of the suite are in the directory:
-
-/pub/samba/
-
-Development (read "alpha") versions, which are NOT necessarily stable
-and which do NOT necessarily have accurate documentation, are available
-in the directory:
-
-/pub/samba/alpha
-
-Note that binaries are NOT included in any of the above. Samba is
-distributed ONLY in source form, though binaries may be available from
-other sites. Most Linux distributions, for example, do contain Samba
-binaries for that platform. The VMS, OS/2, Netware and Amiga and other
-ports typically have binaries made available.
-
-A special case is vendor-provided binary packages. Samba binaries and
-default configuration files are put into packages for a specific
-operating system. RedHat Linux and Sun Solaris (Sparc and x86) is
-already included, and others such as OS/2 may follow. All packages are
-in the directory:
-
-/pub/samba/Binary_Packages/"OS_Vendor"
-
-<sect1>What do the version numbers mean?<p><label id="version_nums">
-
-It is not recommended that you run a version of Samba with the word
-"alpha" in its name unless you know what you are doing and are willing
-to do some debugging. Many, many people just get the latest
-recommended stable release version and are happy. If you are brave, by
-all means take the plunge and help with the testing and development -
-but don't install it on your departmental server. Samba is typically
-very stable and safe, and this is mostly due to the policy of many
-public releases.
-
-How the scheme works:
-
-<enum>
-
-<item>When major changes are made the version number is increased. For
-example, the transition from 1.9.16 to 1.9.17. However, this version
-number will not appear immediately and people should continue to use
-1.9.15 for production systems (see next point.)
-
-<item>Just after major changes are made the software is considered
-unstable, and a series of alpha releases are distributed, for example
-1.9.16alpha1. These are for testing by those who know what they are
-doing. The "alpha" in the filename will hopefully scare off those who
-are just looking for the latest version to install.
-
-<item>When Andrew thinks that the alphas have stabilised to the point
-where he would recommend new users install it, he renames it to the
-same version number without the alpha, for example 1.9.17.
-
-<item>Inevitably bugs are found in the "stable" releases and minor patch
-levels are released which give us the pXX series, for example 1.9.17p2.
-
-</enum>
-
-So the progression goes:
-
-<verb>
- 1.9.16p10 (production)
- 1.9.16p11 (production)
- 1.9.17alpha1 (test sites only)
- :
- 1.9.17alpha20 (test sites only)
- 1.9.17 (production)
- 1.9.17p1 (production)
-</verb>
-
-The above system means that whenever someone looks at the samba ftp
-site they will be able to grab the highest numbered release without an
-alpha in the name and be sure of getting the current recommended
-version.
-
-<sect1> Where can I go for further information?<p><label id="more">
-
-There are a number of places to look for more information on Samba,
-including:
-
-<itemize>
-
-<item>Two mailing lists devoted to discussion of Samba-related matters.
-See below for subscription information.
-
-<item>The newsgroup comp.protocols.smb, which has a great deal of
-discussion about Samba.
-
-<item>The WWW site 'SAMBA Web Pages' at <url
-url="http://samba.anu.edu.au/samba/"> includes:
-
- <itemize>
- <item>Links to man pages and documentation, including this FAQ
- <item>A comprehensive survey of Samba users
- <item>A searchable hypertext archive of the Samba mailing list
- <item>Links to Samba source code, binaries, and mirrors of both
- <item>This FAQ and the rest in its family
- </itemize>
-
-</itemize>
-
-<sect1>How do I subscribe to the Samba Mailing Lists?<p><label id="mailinglist">
-
-Send email to <htmlurl url="mailto:listproc@samba.anu.edu.au"
-name="listproc@samba.anu.edu.au">. Make sure the subject line is blank,
-and include the following two lines in the body of the message:
-
-<tscreen><verb>
-subscribe samba Firstname Lastname
-subscribe samba-announce Firstname Lastname
-</verb></tscreen>
-
-Obviously you should substitute YOUR first name for "Firstname" and
-YOUR last name for "Lastname"! Try not to send any signature, it
-sometimes confuses the list processor.
-
-The samba list is a digest list - every eight hours or so it sends a
-single message containing all the messages that have been received by
-the list since the last time and sends a copy of this message to all
-subscribers. There are thousands of people on this list.
-
-If you stop being interested in Samba, please send another email to
-<htmlurl url="mailto:listproc@samba.anu.edu.au" name="listproc@samba.anu.edu.au">. Make sure the subject line is blank, and
-include the following two lines in the body of the message:
-
-<tscreen><verb>
-unsubscribe samba
-unsubscribe samba-announce
-</verb></tscreen>
-
-The <bf>From:</bf> line in your message <em>MUST</em> be the same
-address you used when you subscribed.
-
-<sect1> Something's gone wrong - what should I do?<p><label id="wrong">
-
-<bf>[#] *** IMPORTANT! *** [#]</bf>
-<p>
-
-DO NOT post messages on mailing lists or in newsgroups until you have
-carried out the first three steps given here!
-
-<enum> <item> See if there are any likely looking entries in this FAQ!
-If you have just installed Samba, have you run through the checklist in
-<url url="ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt"
-name="DIAGNOSIS.txt">? It can save you a lot of time and effort.
-DIAGNOSIS.txt can also be found in the docs directory of the Samba
-distribution.
-
-<item> Read the man pages for smbd, nmbd and smb.conf, looking for
-topics that relate to what you are trying to do.
-
-<item> If there is no obvious solution to hand, try to get a look at
-the log files for smbd and/or nmbd for the period during which you
-were having problems. You may need to reconfigure the servers to
-provide more extensive debugging information - usually level 2 or
-level 3 provide ample debugging info. Inspect these logs closely,
-looking particularly for the string "Error:".
-
-<item> If you need urgent help and are willing to pay for it see
-<ref id="PaidSupport" name="Paid Support">.
-
-</enum>
-
-If you still haven't got anywhere, ask the mailing list or newsgroup. In
-general nobody minds answering questions provided you have followed the
-preceding steps. It might be a good idea to scan the archives of the
-mailing list, which are available through the Samba web site described
-in the previous section. When you post be sure to include a good
-description of your environment and your problem.
-
-If you successfully solve a problem, please mail the FAQ maintainer a
-succinct description of the symptom, the problem and the solution, so
-that an explanation can be incorporated into the next version.
-
-<sect1> How do I submit patches or bug reports?<p>
-
-If you make changes to the source code, <em>please</em> submit these patches
-so that everyone else gets the benefit of your work. This is one of
-the most important aspects to the maintainence of Samba. Send all
-patches to <htmlurl url="mailto:samba-bugs@samba.anu.edu.au" name="samba-bugs@samba.anu.edu.au">. Do not send patches to Andrew Tridgell or any
-other individual, they may be lost if you do.
-
-Patch format
-------------
-
-If you are sending a patch to fix a problem then please don't just use
-standard diff format. As an example, samba-bugs received this patch from
-someone:
-
-382a
-#endif
-..
-381a
-#if !defined(NEWS61)
-
-How are we supposed to work out what this does and where it goes? These
-sort of patches only work if we both have identical files in the first
-place. The Samba sources are constantly changing at the hands of multiple
-developers, so it doesn't work.
-
-Please use either context diffs or (even better) unified diffs. You
-get these using "diff -c4" or "diff -u". If you don't have a diff that
-can generate these then please send manualy commented patches to I
-know what is being changed and where. Most patches are applied by hand so
-the info must be clear.
-
-This is a basic guideline that will assist us with assessing your problem
-more efficiently :
-
-Machine Arch:
-Machine OS:
-OS Version:
-Kernel:
-
-Compiler:
-Libc Version:
-
-Samba Version:
-
-Network Layout (description):
-
-What else is on machine (services, etc):
-
-Some extras :
-
-<itemize>
-
-<item> what you did and what happened
-
-<item> relevant parts of a debugging output file with debuglevel higher.
- If you can't find the relevant parts, please ask before mailing
- huge files.
-
-<item> anything else you think is useful to trace down the bug
-
-</itemize>
-
-<sect1> What if I have an URGENT message for the developers?<p>
-
-If you have spotted something very serious and believe that it is
-important to contact the developers quickly send a message to
-samba-urgent@samba.anu.edu.au. This will be processed more quickly than
-mail to samba-bugs. Please think carefully before using this address. An
-example of its use might be to report a security hole.
-
-Examples of things <em>not</em> to send to samba-urgent include problems
-getting Samba to work at all and bugs that cannot potentially cause damage.
-
-<sect1> What if I need paid-for support?<p><label id=PaidSupport>
-
-Samba has a large network of consultants who provide Samba support on a
-commercial basis. The list is included in the package in <url
-url="../Support.txt">, and the latest version will always be on the main
-samba ftp site. Any company in the world can request that the samba team
-include their details in Support.txt so we can give no guarantee of
-their services.
-
-<sect1> Pizza supply details<p><label id="pizza">
-Those who have registered in the Samba survey as "Pizza Factory" will
-already know this, but the rest may need some help. Andrew doesn't ask
-for payment, but he does appreciate it when people give him
-pizza. This calls for a little organisation when the pizza donor is
-twenty thousand kilometres away, but it has been done.
-
-<enum>
-<item> Ring up your local branch of an international pizza chain
-and see if they honour their vouchers internationally. Pizza Hut do,
-which is how the entire Canberra Linux Users Group got to eat pizza
-one night, courtesy of someone in the US.
-
-<item>Ring up a local pizza shop in Canberra and quote a credit
-card number for a certain amount, and tell them that Andrew will be
-collecting it (don't forget to tell him.) One kind soul from Germany
-did this.
-
-<item>Purchase a pizza voucher from your local pizza shop that has
-no international affiliations and send it to Andrew. It is completely
-useless but he can hang it on the wall next to the one he already has
-from Germany :-)
-
-<item>Air freight him a pizza with your favourite regional
-flavours. It will probably get stuck in customs or torn apart by
-hungry sniffer dogs but it will have been a noble gesture.
-
-</enum>
-
-<sect>About the CIFS and SMB Protocols<p><label id="CifsSmb">
-
-<sect1> What is the Server Message Block (SMB) Protocol?<p>
-SMB is a filesharing protocol that has had several maintainers and
-contributors over the years including Xerox, 3Com and most recently
-Microsoft. Names for this protocol include LAN Manager and Microsoft
-Networking. Parts of the specification has been made public at several
-versions including in an X/Open document, as listed at
-<url url="ftp://ftp.microsoft.com/developr/drg/CIFS/">. No specification
-releases were made between 1992 and 1996, and during that period
-Microsoft became the SMB implementor with the largest market share.
-Microsoft developed the specification further for its products but for
-various reasons connected with developer's workload rather than market
-strategy did not make the changes public. This culminated with the
-"Windows NT 0.12" version released with NT 3.5 in 1995 which had significant
-improvements and bugs. Because Microsoft client systems are so popular,
-it is fair to say that what Microsoft with Windows affects all suppliers
-of SMB server products.
-
-From 1994 Andrew Tridgell began doing some serious work on his
-Smbserver (now Samba) product and with some helpers started to
-implement more and more of these protocols. Samba began to take
-a significant share of the SMB server market.
-
-<sect1> What is the Common Internet Filesystem (CIFS)?<p>
-The initial pressure for Microsoft to document their current SMB
-implementation came from the Samba team, who kept coming across things
-on the wire that Microsoft either didn't know about or hadn't documented
-anywhere (even in the sourcecode to Windows NT.) Then Sun Microsystems
-came out with their WebNFS initiative, designed to replace FTP for file
-transfers on the Internet. There are many drawbacks to WebNFS (including
-its scope - it aims to replace HTTP as well!) but the concept was
-attractive. FTP is not very clever, and why should it be harder to get
-files from across the world than across the room?
-
-Some hasty revisions were made and an Internet Draft for the Common
-Internet Filesystem (CIFS) was released. Note that CIFS is not an
-Internet standard and is a very long way from becoming one, BUT the
-protocol specification is in the public domain and ongoing discussions
-concerning the spec take place on a public mailing list according to the
-rules of the Internet Engineering Task Force. For more information and
-pointers see <url url="http://samba.anu.edu.au/cifs/">
-
-The following is taken from <url url="http://www.microsoft.com/intdev/cifs/">
-
-<verb>
- CIFS defines a standard remote file system access protocol for use
- over the Internet, enabling groups of users to work together and
- share documents across the Internet or within their corporate
- intranets. CIFS is an open, cross-platform technology based on the
- native file-sharing protocols built into Microsoft® Windows® and
- other popular PC operating systems, and supported on dozens of
- other platforms, including UNIX®. With CIFS, millions of computer
- users can open and share remote files on the Internet without having
- to install new software or change the way they work."
-</verb>
-
-If you consider CIFS as a backwardsly-compatible refinement of SMB that
-will work reasonably efficiently over the Internet you won't be too far
-wrong.
-
-The net effect is that Microsoft is now documenting large parts of their
-Windows NT fileserver protocols. The security concepts embodied in
-Windows NT are part of the specification, which is why Samba
-documentation often talks in terms of Windows NT. However there is no
-reason why a site shouldn't conduct all its file and printer sharing
-with CIFS and yet have no Microsoft products at all.
-
-<sect1> What is Browsing? <p>
-The term "Browsing" causes a lot of confusion. It is the part of the
-SMB/CIFS protocol which allows for resource discovery. For example, in
-the Windows NT Explorer it is possible to see a "Network Neighbourhood"
-of computers in the same SMB workgroup. Clicking on the name of one of
-these machines brings up a list of file and printer resources for
-connecting to. In this way you can cruise the network, seeing what
-things are available. How this scales to the Internet is a subject for
-debate. Look at the CIFS list archives to see what the experts think.
-
-<sect>Designing A SMB and CIFS Network<p>
-
-The big issues for installing any network of LAN or WAN file and print
-servers are
-
-<itemize>
-
-<item>How and where usernames, passwords and other security information
-is stored
-
-<item>What method can be used for locating the resources that users have
-permission to use
-
-<item>What protocols the clients can converse with
-
-</itemize>
-
-If you buy Netware, Windows NT or just about any other LAN fileserver
-product you are expected to lock yourself into the product's preferred
-answers to these questions. This tendancy is restrictive and often very
-expensive for a site where there is only one kind of client or server,
-and for sites with a mixture of operating systems it often makes it
-impossible to share resources between some sets of users.
-
-The Samba philosophy is to make things as easy as possible for
-administators, which means allowing as many combinations of clients,
-servers, operating systems and protocols as possible.
-
-<sect1>Workgroups, Domains, Authentication and Browsing<p>
-
-From the point of view of networking implementation, Domains and
-Workgroups are <em>exactly</em> the same, except for the client logon
-sequence. Some kind of distributed authentication database is associated
-with a domain (there are quite a few choices) and this adds so much
-flexibility that many people think of a domain as a completely different
-entity to a workgroup. From Samba's point of view a client connecting to
-a service presents an authentication token, and it if it is valid they
-have access. Samba does not care what mechanism was used to generate
-that token in the first place.
-
-The SMB client logging on to a domain has an expectation that every other
-server in the domain should accept the same authentication information.
-However the network browsing functionality of domains and workgroups is
-identical and is explained in <url url="../BROWSING.txt">.
-
-There are some implementation differences: Windows 95 can be a member of
-both a workgroup and a domain, but Windows NT cannot. Windows 95 also
-has the concept of an "alternative workgroup". Samba can only be a
-member of a single workgroup or domain, although this is due to change
-with a future version when nmbd will be split into two daemons, one for
-WINS and the other for browsing (<url url="../NetBIOS.txt"> explains
-what WINS is.)
-
-<sect2> Defining the Terms<p><label id="BrowseAndDomainDefs">
-
-<descrip>
-
-<tag/Workgroup/ means a collection of machines that maintain a common
-browsing database containing information about their shared resources.
-They do not necessarily have any security information in common (if they
-do, it gets called a Domain.) The browsing database is dynamic, modified
-as servers come and go on the network and as resources are added or
-deleted. The term "browsing" refers to a user accessing the database via
-whatever interface the client provides, eg the OS/2 Workplace Shell or
-Windows 95 Explorer. SMB servers agree between themselves as to which
-ones will maintain the browsing database. Workgroups can be anywhere on
-a connected TCP/IP network, including on different subnets or even on
-the Interet. This is a very tricky part of SMB to implement.
-
-<tag/Master Browsers/ are machines which holds the master browsing
-database for a workgroup or domain. There are two kinds of Master Browser:
-
-<itemize>
-
-<item> Domain Master Browser, which holds the master browsing
-information for an entire domain, which may well cross multiple TCP/IP
-subnets.
-
-<item> Local Master Browser, which holds the master browsing database
-for a particular subnet and communicates with the Domain Master Browser
-to get information on other subnets.
-
-</itemize>
-
-Subnets are differentiated because browsing is based on broadcasts, and
-broadcasts do not pass through routers. Subnets are not routed: while it
-is possible to have more than one subnet on a single network segment
-this is regarded as very bad practice.
-
-Master Browsers (both Domain and Local) are elected dynamically
-according to an algorithm which is supposed to take into account the
-machine's ability to sustain the browsing load. Samba can be configured
-to always act as a master browser, ie it always wins elections under all
-circumstances, even against systems such as a Windows NT Primary Domain
-Controller which themselves expect to win.
-
-There are also Backup Browsers which are promoted to Master Browsers in
-the event of a Master Browser disappearing from the network.
-
-Alternative terms include confusing variations such as "Browse Master",
-and "Master Browser" which we are trying to eliminate from the Samba
-documentation.
-
-<tag/Domain Controller/ is a term which comes from the Microsoft and IBM
-etc implementation of the LAN Manager protocols. It is tied to
-authentication. There are other ways of doing domain authentication, but
-the Windows NT method has a large market share. The general issues are
-discussed in <url url="../DOMAIN.txt"> and a Windows NT-specific
-discussion is in <url url="../DOMAIN_CONTROL.txt">.
-
-</descrip>
-
-<sect2>Sharelevel (Workgroup) Security Services<p><label id="ShareModeSecurity">
-
-With the Samba setting "security = SHARE", all shared resources
-information about what password is associated with them but only hints
-as to what usernames might be valid (the hint can be 'all users', in
-which case any username will work. This is usually a bad idea, but
-reflects both the initial implementations of SMB in the mid-80s and
-its reincarnation with Windows for Workgroups in 1992. The idea behind
-workgroup security was that small independant groups of people could
-share information on an ad-hoc basis without there being an
-authentication infrastructure present or requiring them to do more than
-fill in a dialogue box.
-
-<sect2>Authentication Domain Mode Services<p><label id="DomainModeSecurity">
-
-With the Samba settings "security = USER" or "security = SERVER"
-accesses to all resources are checked for username/password pair matches
-in a more rigorous manner. To the client, this has the effect of
-emulating a Microsoft Domain. The client is not concerned whether or not
-Samba looks up a Windows NT SAM or does it in some other way.
-
-<sect1>Authentication Schemes<p>
-
-In the simple case authentication information is stored on a single
-server and the user types a password on connecting for the first time.
-However client operating systems often require a password before they
-can be used at all, and in addition users usually want access to more
-than one server. Asking users to remember many different passwords in
-different contexts just does not work. Some kind of distributed
-authentication database is needed. It must cope with password changes
-and provide for assigning groups of users the same level of access
-permissions. This is why Samba installations often choose to implement a
-Domain model straight away.
-
-Authentication decisions are some of the biggest in designing a network.
-Are you going to use a scheme native to the client operating system,
-native to the server operating system, or newly installed on both? A
-list of options relevant to Samba (ie that make sense in the context of
-the SMB protocol) follows. Any experiences with other setups would be
-appreciated. [refer to server FAQ for "passwd chat" passwd program
-password server etc etc...]
-
-<sect2>NIS<p>
-
-For Windows 95, Windows for Workgroups and most other clients Samba can
-be a domain controller and share the password database via NIS
-transparently. Windows NT is different.
-<url url="http://www.dcs.qmw.ac.uk/~williams" name="Free NIS NT client">
-
-<sect2>Kerberos<p>
-
-Kerberos for US users only:
-<url url="http://www.cygnus.com/product/unifying-security.html"
-name="Kerberos overview">
-<url url="http://www.cygnus.com/product/kerbnet-download.html"
-name="Download Kerberos">
-
-<sect2>FTP<p>
-
-Other NT w/s logon hack via NT
-
-<sect2>Default Server Method<p>
-
-<sect2>Client-side Database Only<p>
-
-<sect1>Post-Authentication: Netlogon, Logon Scripts, Profiles<p>
-
-See <url url="../DOMAIN.txt">
-
-<sect>Cross-Protocol File Sharing<p>
-
-Samba is an important tool for...
-
-It is possible to...
-
-File protocol gateways...
-
-"Setting up a Linux File Server" http://vetrec.mit.edu/people/narf/linux.html
-
-Two free implementations of Appletalk for Unix are Netatalk, <url
-url="http://www.umich.edu/~rsug/netatalk/">, and CAP, <url
-url="http://www.cs.mu.oz.au/appletalk/atalk.html">. What Samba offers MS
-Windows users, these packages offer to Macs. For more info on these
-packages, Samba, and Linux (and other UNIX-based systems) see <url
-url="http://www.eats.com/linux_mac_win.html"> 3.5) Sniffing your nework
-
-
-<sect>Miscellaneous<p><label id="miscellaneous">
-<sect1>Is Samba Year 2000 compliant?<p><label id="Year2000Compliant">
-The CIFS protocol that Samba implements
-negotiates times in various formats, all of which
-are able to cope with dates beyond 2000.
-
-</article>
diff --git a/docs/faq/Samba-meta-FAQ.txt b/docs/faq/Samba-meta-FAQ.txt
deleted file mode 100644
index 65d9a57ff62..00000000000
--- a/docs/faq/Samba-meta-FAQ.txt
+++ /dev/null
@@ -1,924 +0,0 @@
- Samba meta FAQ
- Dan Shearer & Paul Blackman, ictinus@samba.anu.edu.au
- v 0.3, 7 Oct '97
-
- This is the meta-Frequently Asked Questions (FAQ) document for Samba,
- the free and very popular SMB and CIFS server product. It contains
- overview information for the Samba suite of programs, a quick-start
- guide, and pointers to all other Samba documentation. Other FAQs exist
- for specific client and server issues, and HOWTO documents for more
- extended topics to do with Samba software. Current to version Samba
- 1.9.17. Please send any corrections to the author.
- ______________________________________________________________________
-
- Table of Contents:
-
- 1. Quick Reference Guides to Samba Documentation
-
- 1.1. Samba for the Impatient
-
- 1.2. All Samba Documentation
-
- 2. General Information
-
- 2.1. What is Samba?
-
- 2.2. What is the current version of Samba?
-
- 2.3. Where can I get it?
-
- 2.4. What do the version numbers mean?
-
- 2.5. Where can I go for further information?
-
- 2.6. How do I subscribe to the Samba Mailing Lists?
-
- 2.7. Something's gone wrong - what should I do?
-
- 2.8. How do I submit patches or bug reports?
-
- 2.9. What if I have an URGENT message for the developers?
-
- 2.10. What if I need paid-for support?
-
- 2.11. Pizza supply details
-
- 3. About the CIFS and SMB Protocols
-
- 3.1. What is the Server Message Block (SMB) Protocol?
-
- 3.2. What is the Common Internet Filesystem (CIFS)?
-
- 3.3. What is Browsing?
-
- 4. Designing A SMB and CIFS Network
-
- 4.1. Workgroups, Domains, Authentication and Browsing
-
- 4.1.1. Defining the Terms
-
- 4.1.2. Sharelevel (Workgroup) Security Services
-
- 4.1.3. Authentication Domain Mode Services
-
- 4.2. Authentication Schemes
-
-
- 4.2.1. NIS
-
- 4.2.2. Kerberos
-
- 4.2.3. FTP
-
- 4.2.4. Default Server Method
-
- 4.2.5. Client-side Database Only
-
- 4.3. Post-Authentication: Netlogon, Logon Scripts, Profiles
-
- 5. Cross-Protocol File Sharing
-
- 6. Miscellaneous
-
- 6.1. Is Samba Year 2000 compliant?
- ______________________________________________________________________
-
- 11.. QQuuiicckk RReeffeerreennccee GGuuiiddeess ttoo SSaammbbaa DDooccuummeennttaattiioonn
-
-
- We are endeavouring to provide links here to every major class of
- information about Samba or things related to Samba. We cannot list
- every document, but we are aiming for all documents to be at most two
- referrals from those listed here. This needs constant maintaining, so
- please send the author your feedback.
-
-
- 11..11.. SSaammbbaa ffoorr tthhee IImmppaattiieenntt
-
-
- You know you should read the documentation but can't wait to start?
- What you need to do then is follow the instructions in the following
- documents in the order given. This should be enough to get a fairly
- simple site going quickly. If you have any problems, refer back to
- this meta-FAQ and follow the links to find more reading material.
-
-
-
- GGeettttiinngg SSaammbbaa::
- The fastest way to get Samba going is and install it is to have
- an operating system for which the Samba team has put together an
- installation package. To see if your OS is included have a look
- at the directory /pub/samba/Binary_Packages/"OS_Vendor" on your
- nearest mirror site <../MIRRORS>. If it is included follow the
- installation instructions in the README file there and then do
- some ``basic testing''. If you are not so fortunate, follow the
- normal ``download instructions'' and then continue with
- ``building and installing Samba''.
-
-
- BBuuiillddiinngg aanndd IInnssttaalllliinngg SSaammbbaa::
- At the moment there are two kinds of Samba server installs
- besides the prepackaged binaries mentioned in the previous step.
- You need to decide if you have a Unix or close relative
- <../UNIX_INSTALL.txt> or other supported operating system
- <Samba-Server-FAQ.html#PortInfo>.
-
-
- BBaassiicc TTeessttiinngg::
- Try to connect using the supplied smbclient command-line
- program. You need to know the IP hostname of your server. A
- service name must be defined in smb.conf, as given in the
- examples (under many operating systems if there is a homes
- service you can just use a valid username.) Then type smbclient
- \hostnamevicename Under most Unixes you will need to put the
- parameters within quotation marks. If this works, try connecting
- from one of the SMB clients you were planning to use with Samba.
-
-
- DDeebbuugg sseeqquueennccee::
- If you think you have completed the previous step and things
- aren't working properly work through the diagnosis recipe.
- <../DIAGNOSIS.txt>
-
-
- EExxppoorrttiinngg ffiilleess ttoo SSMMBB cclliieennttss::
- You should read the manual pages for smb.conf, but here is a
- quick answer guide. <Samba-Server-FAQ.html#Exporting>
-
-
- CCoonnttrroolllliinngg uusseerr aacccceessss::
- the quickest and dirtiest way of sharing resources is to use
- ``share level security.'' If you want to spend more time and
- have a proper username and password database you must read the
- paragraph on ``domain mode security.'' If you want encryption
- (eg you are using Windows NT clients) follow the SMB encryption
- instructions. <Samba-Server-FAQ.html#SMBEncryptionSteps>
-
-
- BBrroowwssiinngg::
- if you are happy to type in "\samba-serverrename" at the client
- end then do not read any further. Otherwise you need to
- understand the ``browsing terminology'' and read <Samba-Server-
- FAQ.html#NameBrowsing>.
-
-
- PPrriinnttiinngg::
- See the printing quick answer guide. <Samba-Server-
- FAQ.html#Printing>
-
-
- If you have got everything working to this point, you can expect Samba
- to be stable and secure: these are its greatest strengths. However
- Samba has a great deal to offer and to go further you must do some
- more reading. Speed and security optimisations, printer accounting,
- network logons, roving profiles, browsing across multiple subnets and
- so on are all covered either in this document or in those it refers
- to.
-
-
- 11..22.. AAllll SSaammbbaa DDooccuummeennttaattiioonn
-
-
-
- +o Meta-FAQ. This is the mother of all documents, and is the one you
- are reading now. The latest version is always at
- <http://samba.anu.edu.au/[.....]> but there is probably a much
- nearer mirror site <../MIRRORS> which you should use instead.
-
- +o <Samba-Server-FAQ.html> is the best starting point for information
- about server-side issues. Includes configuration tips and pointers
- for Samba on particular operating systems (with 40 to choose
- from...)
-
- +o <Samba-Client-FAQ.html> is the best starting point for information
- about client-side issues, includes a list of all clients that are
- known to work with Samba.
-
- +o manual pages <samba-man-index.html> contains descriptions of and
- links to all the Samba manual pages, in Unix man and postscript
- format.
-
- +o <samba-txt-index.html> has descriptions of and links to a large
- number of text files have been contributed to samba covering many
- topics. These are gradually being absorbed into the FAQs and HOWTOs
- but in the meantime you might find helpful answers here.
-
- +o
-
-
- 22.. GGeenneerraall IInnffoorrmmaattiioonn
-
-
- All about Samba - what it is, how to get it, related sources of
- information, how to understand the numbering scheme, pizza details.
-
-
- 22..11.. WWhhaatt iiss SSaammbbaa??
-
-
- Samba is a suite of programs which work together to allow clients to
- access to a server's filespace and printers via the SMB (Server
- Message Block) and CIFS (Common Internet Filesystem) protocols.
- Initially written for Unix, Samba now also runs on Netware, OS/2, VMS,
- StratOS and Amigas. Ports to BeOS and other operating systems are
- underway. Samba gives the capability for these operating systems to
- behave much like a LAN Server, Windows NT Server or Pathworks machine,
- only with added functionality and flexibility designed to make life
- easier for administrators.
-
- This means that using Samba you can share a server's disks and
- printers to many sorts of network clients, including Lan Manager,
- Windows for Workgroups, Windows NT, Linux, OS/2, and AIX. There is
- also a generic client program supplied as part of the Samba suite
- which gives a user on the server an ftp-like interface to access
- filespace and printers on any other SMB/CIFS servers.
-
- SMB has been implemented over many protocols, including XNS, NBT, IPX,
- NetBEUI and TCP/IP. Samba only uses TCP/IP. This is not likely to
- change although there have been some requests for NetBEUI support.
-
- Many users report that compared to other SMB implementations Samba is
- more stable, faster, and compatible with more clients. Administrators
- of some large installations say that Samba is the only SMB server
- available which will scale to many tens of thousands of users without
- crashing. The easy way to test these claims is to download it and try
- it for yourself!
-
- The suite is supplied with full source code under the GNU Public
- License <../COPYING>. The GPL means that you can use Samba for
- whatever purpose you wish (including changing the source or selling it
- for money) but under all circumstances the source code must be made
- freely available. A copy of the GPL must always be included in any
- copy of the package.
-
- The primary creator of the Samba suite is Andrew Tridgell. Later
- versions incorporate much effort by many net.helpers. The man pages
- and this FAQ were originally written by Karl Auer.
-
-
- 22..22.. WWhhaatt iiss tthhee ccuurrrreenntt vveerrssiioonn ooff SSaammbbaa??
-
-
- At time of writing, the current version was 1.9.17. If you want to be
- sure check the bottom of the change-log file.
- <ftp://samba.anu.edu.au/pub/samba/alpha/change-log>
- For more information see ``What do the version numbers mean?''
-
-
- 22..33.. WWhheerree ccaann II ggeett iitt??
-
-
- The Samba suite is available via anonymous ftp from samba.anu.edu.au
- and many mirror <../MIRRORS> sites. You will get much faster
- performance if you use a mirror site. The latest and greatest versions
- of the suite are in the directory:
-
- /pub/samba/
-
- Development (read "alpha") versions, which are NOT necessarily stable
- and which do NOT necessarily have accurate documentation, are
- available in the directory:
-
- /pub/samba/alpha
-
- Note that binaries are NOT included in any of the above. Samba is
- distributed ONLY in source form, though binaries may be available from
- other sites. Most Linux distributions, for example, do contain Samba
- binaries for that platform. The VMS, OS/2, Netware and Amiga and other
- ports typically have binaries made available.
-
- A special case is vendor-provided binary packages. Samba binaries and
- default configuration files are put into packages for a specific
- operating system. RedHat Linux and Sun Solaris (Sparc and x86) is
- already included, and others such as OS/2 may follow. All packages are
- in the directory:
-
- /pub/samba/Binary_Packages/"OS_Vendor"
-
-
- 22..44.. WWhhaatt ddoo tthhee vveerrssiioonn nnuummbbeerrss mmeeaann??
-
-
- It is not recommended that you run a version of Samba with the word
- "alpha" in its name unless you know what you are doing and are willing
- to do some debugging. Many, many people just get the latest
- recommended stable release version and are happy. If you are brave, by
- all means take the plunge and help with the testing and development -
- but don't install it on your departmental server. Samba is typically
- very stable and safe, and this is mostly due to the policy of many
- public releases.
-
- How the scheme works:
-
-
- 1. When major changes are made the version number is increased. For
- example, the transition from 1.9.16 to 1.9.17. However, this
- version number will not appear immediately and people should
- continue to use 1.9.15 for production systems (see next point.)
-
- 2. Just after major changes are made the software is considered
- unstable, and a series of alpha releases are distributed, for
- example 1.9.16alpha1. These are for testing by those who know what
- they are doing. The "alpha" in the filename will hopefully scare
- off those who are just looking for the latest version to install.
-
- 3. When Andrew thinks that the alphas have stabilised to the point
- where he would recommend new users install it, he renames it to the
- same version number without the alpha, for example 1.9.17.
-
- 4. Inevitably bugs are found in the "stable" releases and minor patch
- levels are released which give us the pXX series, for example
- 1.9.17p2.
-
- So the progression goes:
-
-
- 1.9.16p10 (production)
- 1.9.16p11 (production)
- 1.9.17alpha1 (test sites only)
- :
- 1.9.17alpha20 (test sites only)
- 1.9.17 (production)
- 1.9.17p1 (production)
-
-
-
- The above system means that whenever someone looks at the samba ftp
- site they will be able to grab the highest numbered release without an
- alpha in the name and be sure of getting the current recommended
- version.
-
-
- 22..55.. WWhheerree ccaann II ggoo ffoorr ffuurrtthheerr iinnffoorrmmaattiioonn??
-
-
- There are a number of places to look for more information on Samba,
- including:
-
-
- +o Two mailing lists devoted to discussion of Samba-related matters.
- See below for subscription information.
-
- +o The newsgroup comp.protocols.smb, which has a great deal of
- discussion about Samba.
-
- +o The WWW site 'SAMBA Web Pages' at <http://samba.anu.edu.au/samba/>
- includes:
-
-
- +o Links to man pages and documentation, including this FAQ
-
- +o A comprehensive survey of Samba users
-
- +o A searchable hypertext archive of the Samba mailing list
-
- +o Links to Samba source code, binaries, and mirrors of both
-
- +o This FAQ and the rest in its family
-
-
-
- 22..66.. HHooww ddoo II ssuubbssccrriibbee ttoo tthhee SSaammbbaa MMaaiilliinngg LLiissttss??
-
-
- Send email to listproc@samba.anu.edu.au. Make sure the subject line is
- blank, and include the following two lines in the body of the message:
-
-
-
- subscribe samba Firstname Lastname
- subscribe samba-announce Firstname Lastname
-
-
-
-
- Obviously you should substitute YOUR first name for "Firstname" and
- YOUR last name for "Lastname"! Try not to send any signature, it
- sometimes confuses the list processor.
-
- The samba list is a digest list - every eight hours or so it sends a
- single message containing all the messages that have been received by
- the list since the last time and sends a copy of this message to all
- subscribers. There are thousands of people on this list.
-
- If you stop being interested in Samba, please send another email to
- listproc@samba.anu.edu.au. Make sure the subject line is blank, and
- include the following two lines in the body of the message:
-
-
-
- unsubscribe samba
- unsubscribe samba-announce
-
-
-
-
- The FFrroomm:: line in your message _M_U_S_T be the same address you used when
- you subscribed.
-
-
- 22..77.. SSoommeetthhiinngg''ss ggoonnee wwrroonngg -- wwhhaatt sshhoouulldd II ddoo??
-
-
- ## ****** IIMMPPOORRTTAANNTT!! ****** ##
-
-
- DO NOT post messages on mailing lists or in newsgroups until you have
- carried out the first three steps given here!
-
-
- 1. See if there are any likely looking entries in this FAQ! If you
- have just installed Samba, have you run through the checklist in
- DIAGNOSIS.txt <ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt>? It
- can save you a lot of time and effort. DIAGNOSIS.txt can also be
- found in the docs directory of the Samba distribution.
-
- 2. Read the man pages for smbd, nmbd and smb.conf, looking for topics
- that relate to what you are trying to do.
-
- 3. If there is no obvious solution to hand, try to get a look at the
- log files for smbd and/or nmbd for the period during which you were
- having problems. You may need to reconfigure the servers to provide
- more extensive debugging information - usually level 2 or level 3
- provide ample debugging info. Inspect these logs closely, looking
- particularly for the string "Error:".
-
- 4. If you need urgent help and are willing to pay for it see ``Paid
- Support''.
-
- If you still haven't got anywhere, ask the mailing list or newsgroup.
- In general nobody minds answering questions provided you have followed
- the preceding steps. It might be a good idea to scan the archives of
- the mailing list, which are available through the Samba web site
- described in the previous section. When you post be sure to include a
- good description of your environment and your problem.
-
- If you successfully solve a problem, please mail the FAQ maintainer a
- succinct description of the symptom, the problem and the solution, so
- that an explanation can be incorporated into the next version.
-
-
-
-
- 22..88.. HHooww ddoo II ssuubbmmiitt ppaattcchheess oorr bbuugg rreeppoorrttss??
-
-
- If you make changes to the source code, _p_l_e_a_s_e submit these patches so
- that everyone else gets the benefit of your work. This is one of the
- most important aspects to the maintainence of Samba. Send all patches
- to samba-bugs@samba.anu.edu.au. Do not send patches to Andrew Tridgell
- or any other individual, they may be lost if you do.
-
- Patch format ------------
-
- If you are sending a patch to fix a problem then please don't just use
- standard diff format. As an example, samba-bugs received this patch
- from someone:
-
- 382a #endif 381a #if !defined(NEWS61)
-
- How are we supposed to work out what this does and where it goes?
- These sort of patches only work if we both have identical files in the
- first place. The Samba sources are constantly changing at the hands of
- multiple developers, so it doesn't work.
-
- Please use either context diffs or (even better) unified diffs. You
- get these using "diff -c4" or "diff -u". If you don't have a diff that
- can generate these then please send manualy commented patches to I
- know what is being changed and where. Most patches are applied by hand
- so the info must be clear.
-
- This is a basic guideline that will assist us with assessing your
- problem more efficiently :
-
- Machine Arch: Machine OS: OS Version: Kernel:
-
- Compiler: Libc Version:
-
- Samba Version:
-
- Network Layout (description):
-
- What else is on machine (services, etc):
-
- Some extras :
-
-
- +o what you did and what happened
-
- +o relevant parts of a debugging output file with debuglevel higher.
- If you can't find the relevant parts, please ask before mailing
- huge files.
-
- +o anything else you think is useful to trace down the bug
-
-
- 22..99.. WWhhaatt iiff II hhaavvee aann UURRGGEENNTT mmeessssaaggee ffoorr tthhee ddeevveellooppeerrss??
-
-
- If you have spotted something very serious and believe that it is
- important to contact the developers quickly send a message to samba-
- urgent@samba.anu.edu.au. This will be processed more quickly than mail
- to samba-bugs. Please think carefully before using this address. An
- example of its use might be to report a security hole.
-
- Examples of things _n_o_t to send to samba-urgent include problems
- getting Samba to work at all and bugs that cannot potentially cause
- damage.
-
- 22..1100.. WWhhaatt iiff II nneeeedd ppaaiidd--ffoorr ssuuppppoorrtt??
-
-
- Samba has a large network of consultants who provide Samba support on
- a commercial basis. The list is included in the package in
- <../Support.txt>, and the latest version will always be on the main
- samba ftp site. Any company in the world can request that the samba
- team include their details in Support.txt so we can give no guarantee
- of their services.
-
-
- 22..1111.. PPiizzzzaa ssuuppppllyy ddeettaaiillss
-
-
- Those who have registered in the Samba survey as "Pizza Factory" will
- already know this, but the rest may need some help. Andrew doesn't ask
- for payment, but he does appreciate it when people give him pizza.
- This calls for a little organisation when the pizza donor is twenty
- thousand kilometres away, but it has been done.
-
-
- 1. Ring up your local branch of an international pizza chain and see
- if they honour their vouchers internationally. Pizza Hut do, which
- is how the entire Canberra Linux Users Group got to eat pizza one
- night, courtesy of someone in the US.
-
- 2. Ring up a local pizza shop in Canberra and quote a credit card
- number for a certain amount, and tell them that Andrew will be
- collecting it (don't forget to tell him.) One kind soul from
- Germany did this.
-
- 3. Purchase a pizza voucher from your local pizza shop that has no
- international affiliations and send it to Andrew. It is completely
- useless but he can hang it on the wall next to the one he already
- has from Germany :-)
-
- 4. Air freight him a pizza with your favourite regional flavours. It
- will probably get stuck in customs or torn apart by hungry sniffer
- dogs but it will have been a noble gesture.
-
-
- 33.. AAbboouutt tthhee CCIIFFSS aanndd SSMMBB PPrroottooccoollss
-
-
-
- 33..11.. WWhhaatt iiss tthhee SSeerrvveerr MMeessssaaggee BBlloocckk ((SSMMBB)) PPrroottooccooll??
-
- SMB is a filesharing protocol that has had several maintainers and
- contributors over the years including Xerox, 3Com and most recently
- Microsoft. Names for this protocol include LAN Manager and Microsoft
- Networking. Parts of the specification has been made public at several
- versions including in an X/Open document, as listed at
- <ftp://ftp.microsoft.com/developr/drg/CIFS/>. No specification
- releases were made between 1992 and 1996, and during that period
- Microsoft became the SMB implementor with the largest market share.
- Microsoft developed the specification further for its products but for
- various reasons connected with developer's workload rather than market
- strategy did not make the changes public. This culminated with the
- "Windows NT 0.12" version released with NT 3.5 in 1995 which had
- significant improvements and bugs. Because Microsoft client systems
- are so popular, it is fair to say that what Microsoft with Windows
- affects all suppliers of SMB server products.
-
- From 1994 Andrew Tridgell began doing some serious work on his
- Smbserver (now Samba) product and with some helpers started to
- implement more and more of these protocols. Samba began to take a
- significant share of the SMB server market.
-
-
- 33..22.. WWhhaatt iiss tthhee CCoommmmoonn IInntteerrnneett FFiilleessyysstteemm ((CCIIFFSS))??
-
- The initial pressure for Microsoft to document their current SMB
- implementation came from the Samba team, who kept coming across things
- on the wire that Microsoft either didn't know about or hadn't
- documented anywhere (even in the sourcecode to Windows NT.) Then Sun
- Microsystems came out with their WebNFS initiative, designed to
- replace FTP for file transfers on the Internet. There are many
- drawbacks to WebNFS (including its scope - it aims to replace HTTP as
- well!) but the concept was attractive. FTP is not very clever, and why
- should it be harder to get files from across the world than across the
- room?
-
- Some hasty revisions were made and an Internet Draft for the Common
- Internet Filesystem (CIFS) was released. Note that CIFS is not an
- Internet standard and is a very long way from becoming one, BUT the
- protocol specification is in the public domain and ongoing discussions
- concerning the spec take place on a public mailing list according to
- the rules of the Internet Engineering Task Force. For more information
- and pointers see <http://samba.anu.edu.au/cifs/>
-
- The following is taken from <http://www.microsoft.com/intdev/cifs/>
-
-
- CIFS defines a standard remote file system access protocol for use
- over the Internet, enabling groups of users to work together and
- share documents across the Internet or within their corporate
- intranets. CIFS is an open, cross-platform technology based on the
- native file-sharing protocols built into Microsoft Windows and
- other popular PC operating systems, and supported on dozens of
- other platforms, including UNIX. With CIFS, millions of computer
- users can open and share remote files on the Internet without having
- to install new software or change the way they work."
-
-
-
- If you consider CIFS as a backwardsly-compatible refinement of SMB
- that will work reasonably efficiently over the Internet you won't be
- too far wrong.
-
- The net effect is that Microsoft is now documenting large parts of
- their Windows NT fileserver protocols. The security concepts embodied
- in Windows NT are part of the specification, which is why Samba
- documentation often talks in terms of Windows NT. However there is no
- reason why a site shouldn't conduct all its file and printer sharing
- with CIFS and yet have no Microsoft products at all.
-
-
- 33..33.. WWhhaatt iiss BBrroowwssiinngg??
-
- The term "Browsing" causes a lot of confusion. It is the part of the
- SMB/CIFS protocol which allows for resource discovery. For example, in
- the Windows NT Explorer it is possible to see a "Network
- Neighbourhood" of computers in the same SMB workgroup. Clicking on the
- name of one of these machines brings up a list of file and printer
- resources for connecting to. In this way you can cruise the network,
- seeing what things are available. How this scales to the Internet is a
- subject for debate. Look at the CIFS list archives to see what the
- experts think.
-
-
-
-
- 44.. DDeessiiggnniinngg AA SSMMBB aanndd CCIIFFSS NNeettwwoorrkk
-
-
- The big issues for installing any network of LAN or WAN file and print
- servers are
-
-
- +o How and where usernames, passwords and other security information
- is stored
-
- +o What method can be used for locating the resources that users have
- permission to use
-
- +o What protocols the clients can converse with
-
-
- If you buy Netware, Windows NT or just about any other LAN fileserver
- product you are expected to lock yourself into the product's preferred
- answers to these questions. This tendancy is restrictive and often
- very expensive for a site where there is only one kind of client or
- server, and for sites with a mixture of operating systems it often
- makes it impossible to share resources between some sets of users.
-
- The Samba philosophy is to make things as easy as possible for
- administators, which means allowing as many combinations of clients,
- servers, operating systems and protocols as possible.
-
-
- 44..11.. WWoorrkkggrroouuppss,, DDoommaaiinnss,, AAuutthheennttiiccaattiioonn aanndd BBrroowwssiinngg
-
-
- From the point of view of networking implementation, Domains and
- Workgroups are _e_x_a_c_t_l_y the same, except for the client logon sequence.
- Some kind of distributed authentication database is associated with a
- domain (there are quite a few choices) and this adds so much
- flexibility that many people think of a domain as a completely
- different entity to a workgroup. From Samba's point of view a client
- connecting to a service presents an authentication token, and it if it
- is valid they have access. Samba does not care what mechanism was used
- to generate that token in the first place.
-
- The SMB client logging on to a domain has an expectation that every
- other server in the domain should accept the same authentication
- information. However the network browsing functionality of domains
- and workgroups is identical and is explained in <../BROWSING.txt>.
-
- There are some implementation differences: Windows 95 can be a member
- of both a workgroup and a domain, but Windows NT cannot. Windows 95
- also has the concept of an "alternative workgroup". Samba can only be
- a member of a single workgroup or domain, although this is due to
- change with a future version when nmbd will be split into two daemons,
- one for WINS and the other for browsing ( <../NetBIOS.txt> explains
- what WINS is.)
-
-
- 44..11..11.. DDeeffiinniinngg tthhee TTeerrmmss
-
-
-
-
- WWoorrkkggrroouupp
- means a collection of machines that maintain a common browsing
- database containing information about their shared resources.
- They do not necessarily have any security information in common
- (if they do, it gets called a Domain.) The browsing database is
- dynamic, modified as servers come and go on the network and as
- resources are added or deleted. The term "browsing" refers to a
- user accessing the database via whatever interface the client
- provides, eg the OS/2 Workplace Shell or Windows 95 Explorer.
- SMB servers agree between themselves as to which ones will
- maintain the browsing database. Workgroups can be anywhere on a
- connected TCP/IP network, including on different subnets or even
- on the Interet. This is a very tricky part of SMB to implement.
-
-
- MMaasstteerr BBrroowwsseerrss
- are machines which holds the master browsing database for a
- workgroup or domain. There are two kinds of Master Browser:
-
-
- +o Domain Master Browser, which holds the master browsing
- information for an entire domain, which may well cross multiple
- TCP/IP subnets.
-
- +o Local Master Browser, which holds the master browsing database
- for a particular subnet and communicates with the Domain Master
- Browser to get information on other subnets.
-
- Subnets are differentiated because browsing is based on
- broadcasts, and broadcasts do not pass through routers. Subnets
- are not routed: while it is possible to have more than one
- subnet on a single network segment this is regarded as very bad
- practice.
-
- Master Browsers (both Domain and Local) are elected dynamically
- according to an algorithm which is supposed to take into account
- the machine's ability to sustain the browsing load. Samba can be
- configured to always act as a master browser, ie it always wins
- elections under all circumstances, even against systems such as
- a Windows NT Primary Domain Controller which themselves expect
- to win.
-
- There are also Backup Browsers which are promoted to Master
- Browsers in the event of a Master Browser disappearing from the
- network.
-
- Alternative terms include confusing variations such as "Browse
- Master", and "Master Browser" which we are trying to eliminate
- from the Samba documentation.
-
-
- DDoommaaiinn CCoonnttrroolllleerr
- is a term which comes from the Microsoft and IBM etc
- implementation of the LAN Manager protocols. It is tied to
- authentication. There are other ways of doing domain
- authentication, but the Windows NT method has a large market
- share. The general issues are discussed in <../DOMAIN.txt> and
- a Windows NT-specific discussion is in <../DOMAIN_CONTROL.txt>.
-
-
-
- 44..11..22.. SShhaarreelleevveell ((WWoorrkkggrroouupp)) SSeeccuurriittyy SSeerrvviicceess
-
-
- With the Samba setting "security = SHARE", all shared resources
- information about what password is associated with them but only hints
- as to what usernames might be valid (the hint can be 'all users', in
- which case any username will work. This is usually a bad idea, but
- reflects both the initial implementations of SMB in the mid-80s and
- its reincarnation with Windows for Workgroups in 1992. The idea behind
- workgroup security was that small independant groups of people could
- share information on an ad-hoc basis without there being an
- authentication infrastructure present or requiring them to do more
- than fill in a dialogue box.
-
-
- 44..11..33.. AAuutthheennttiiccaattiioonn DDoommaaiinn MMooddee SSeerrvviicceess
-
-
- With the Samba settings "security = USER" or "security = SERVER"
- accesses to all resources are checked for username/password pair
- matches in a more rigorous manner. To the client, this has the effect
- of emulating a Microsoft Domain. The client is not concerned whether
- or not Samba looks up a Windows NT SAM or does it in some other way.
-
-
- 44..22.. AAuutthheennttiiccaattiioonn SScchheemmeess
-
-
- In the simple case authentication information is stored on a single
- server and the user types a password on connecting for the first time.
- However client operating systems often require a password before they
- can be used at all, and in addition users usually want access to more
- than one server. Asking users to remember many different passwords in
- different contexts just does not work. Some kind of distributed
- authentication database is needed. It must cope with password changes
- and provide for assigning groups of users the same level of access
- permissions. This is why Samba installations often choose to implement
- a Domain model straight away.
-
- Authentication decisions are some of the biggest in designing a
- network. Are you going to use a scheme native to the client operating
- system, native to the server operating system, or newly installed on
- both? A list of options relevant to Samba (ie that make sense in the
- context of the SMB protocol) follows. Any experiences with other
- setups would be appreciated. refer to server FAQ for "passwd chat"
- passwd program password server etc etc...
-
-
- 44..22..11.. NNIISS
-
-
- For Windows 95, Windows for Workgroups and most other clients Samba
- can be a domain controller and share the password database via NIS
- transparently. Windows NT is different. Free NIS NT client
- <http://www.dcs.qmw.ac.uk/~williams>
-
-
- 44..22..22.. KKeerrbbeerrooss
-
-
- Kerberos for US users only: Kerberos overview
- <http://www.cygnus.com/product/unifying-security.html> Download
- Kerberos <http://www.cygnus.com/product/kerbnet-download.html>
-
-
- 44..22..33.. FFTTPP
-
-
- Other NT w/s logon hack via NT
-
-
- 44..22..44.. DDeeffaauulltt SSeerrvveerr MMeetthhoodd
-
-
-
-
-
- 44..22..55.. CClliieenntt--ssiiddee DDaattaabbaassee OOnnllyy
-
-
-
- 44..33.. PPoosstt--AAuutthheennttiiccaattiioonn:: NNeettllooggoonn,, LLooggoonn SSccrriippttss,, PPrrooffiilleess
-
-
- See <../DOMAIN.txt>
-
-
- 55.. CCrroossss--PPrroottooccooll FFiillee SShhaarriinngg
-
-
- Samba is an important tool for...
-
- It is possible to...
-
- File protocol gateways...
-
- "Setting up a Linux File Server"
- http://vetrec.mit.edu/people/narf/linux.html
-
- Two free implementations of Appletalk for Unix are Netatalk,
- <http://www.umich.edu/~rsug/netatalk/>, and CAP,
- <http://www.cs.mu.oz.au/appletalk/atalk.html>. What Samba offers MS
- Windows users, these packages offer to Macs. For more info on these
- packages, Samba, and Linux (and other UNIX-based systems) see
- <http://www.eats.com/linux_mac_win.html> 3.5) Sniffing your nework
-
-
-
- 66.. MMiisscceellllaanneeoouuss
-
-
- 66..11.. IIss SSaammbbaa YYeeaarr 22000000 ccoommpplliiaanntt??
-
-
- The CIFS protocol that Samba implements negotiates times in various
- formats, all of which are able to cope with dates beyond 2000.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/faq/sambafaq-1.html b/docs/faq/sambafaq-1.html
deleted file mode 100644
index c010e50e011..00000000000
--- a/docs/faq/sambafaq-1.html
+++ /dev/null
@@ -1,392 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ: General Information</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="sambafaq-2.html">Next</A>
-<A HREF="sambafaq.html#toc1">Table of Contents</A>
-<HR>
-<H2><A NAME="s1">1. General Information</A></H2>
-
-<P>
-<A NAME="general_info"></A>
-</P>
-<P>All about Samba - what it is, how to get it, related sources of
-information, how to understand the version numbering scheme, pizza
-details</P>
-
-<H2><A NAME="ss1.1">1.1 What is Samba? </A></H2>
-
-<P>
-<A NAME="introduction"></A>
-
-Samba is a suite of programs which work together to allow clients to
-access to a server's filespace and printers via the SMB (Server
-Message Block) protocol. Initially written for Unix, Samba now also
-runs on Netware, OS/2 and VMS.</P>
-<P>In practice, this means that you can redirect disks and printers to
-Unix disks and printers from Lan Manager clients, Windows for
-Workgroups 3.11 clients, Windows NT clients, Linux clients and OS/2
-clients. There is also a generic Unix client program supplied as part
-of the suite which allows Unix users to use an ftp-like interface to
-access filespace and printers on any other SMB servers. This gives the
-capability for these operating systems to behave much like a LAN
-Server or Windows NT Server machine, only with added functionality and
-flexibility designed to make life easier for administrators.</P>
-<P>The components of the suite are (in summary):</P>
-<P>
-<UL>
-<LI><B>smbd</B>, the SMB server. This handles actual connections from clients, doing all the file, permission and username work</LI>
-<LI><B>nmbd</B>, the Netbios name server, which helps clients locate servers, doing the browsing work and managing domains as this capability is being built into Samba</LI>
-<LI><B>smbclient</B>, the Unix-hosted client program</LI>
-<LI><B>smbrun</B>, a little 'glue' program to help the server run external programs</LI>
-<LI><B>testprns</B>, a program to test server access to printers</LI>
-<LI><B>testparms</B>, a program to test the Samba configuration file for correctness</LI>
-<LI><B>smb.conf</B>, the Samba configuration file</LI>
-<LI><B>smbprint</B>, a sample script to allow a Unix host to use smbclient to print to an SMB server</LI>
-<LI><B>Documentation!</B> DON'T neglect to read it - you will save a great deal of time!</LI>
-</UL>
-</P>
-<P>The suite is supplied with full source (of course!) and is GPLed.</P>
-<P>The primary creator of the Samba suite is Andrew Tridgell. Later
-versions incorporate much effort by many net.helpers. The man pages
-and this FAQ were originally written by Karl Auer.</P>
-
-
-<H2><A NAME="ss1.2">1.2 What is the current version of Samba? </A></H2>
-
-<P>
-<A NAME="current_version"></A>
-
-At time of writing, the current version was 1.9.17. If you want to be
-sure check the bottom of the change-log file.
-<A HREF="ftp://samba.anu.edu.au/pub/samba/alpha/change-log">ftp://samba.anu.edu.au/pub/samba/alpha/change-log</A></P>
-<P>For more information see
-<A HREF="#version_nums">What do the version numbers mean?</A></P>
-
-
-<H2><A NAME="ss1.3">1.3 Where can I get it? </A></H2>
-
-<P>
-<A NAME="where"></A>
-
-The Samba suite is available via anonymous ftp from
-samba.anu.edu.au. The latest and greatest versions of the suite are in
-the directory:</P>
-<P>/pub/samba/</P>
-<P>Development (read "alpha") versions, which are NOT necessarily stable
-and which do NOT necessarily have accurate documentation, are
-available in the directory:</P>
-<P>/pub/samba/alpha</P>
-<P>Note that binaries are NOT included in any of the above. Samba is
-distributed ONLY in source form, though binaries may be available from
-other sites. Recent versions of some Linux distributions, for example,
-do contain Samba binaries for that platform.</P>
-
-
-<H2><A NAME="ss1.4">1.4 What do the version numbers mean? </A></H2>
-
-<P>
-<A NAME="version_nums"></A>
-
-It is not recommended that you run a version of Samba with the word
-"alpha" in its name unless you know what you are doing and are willing
-to do some debugging. Many, many people just get the latest
-recommended stable release version and are happy. If you are brave, by
-all means take the plunge and help with the testing and development -
-but don't install it on your departmental server. Samba is typically
-very stable and safe, and this is mostly due to the policy of many
-public releases.</P>
-<P>How the scheme works:
-<OL>
-<LI>When major changes are made the version number is increased. For
-example, the transition from 1.9.15 to 1.9.16. However, this version
-number will not appear immediately and people should continue to use
-1.9.15 for production systems (see next point.)
-</LI>
-<LI>Just after major changes are made the software is considered
-unstable, and a series of alpha releases are distributed, for example
-1.9.16alpha1. These are for testing by those who know what they are
-doing. The "alpha" in the filename will hopefully scare off those who
-are just looking for the latest version to install.
-</LI>
-<LI>When Andrew thinks that the alphas have stabilised to the point
-where he would recommend new users install it, he renames it to the
-same version number without the alpha, for example 1.9.16.
-</LI>
-<LI>Inevitably bugs are found in the "stable" releases and minor patch
-levels are released which give us the pXX series, for example 1.9.16p2.</LI>
-</OL>
-
-So the progression goes:
-<PRE>
- 1.9.15p7 (production)
- 1.9.15p8 (production)
- 1.9.16alpha1 (test sites only)
- :
- 1.9.16alpha20 (test sites only)
- 1.9.16 (production)
- 1.9.16p1 (production)
-</PRE>
-
-The above system means that whenever someone looks at the samba ftp
-site they will be able to grab the highest numbered release without an
-alpha in the name and be sure of getting the current recommended
-version.</P>
-
-
-<H2><A NAME="ss1.5">1.5 What platforms are supported? </A></H2>
-
-<P>
-<A NAME="platforms"></A>
-
-Many different platforms have run Samba successfully. The platforms
-most widely used and thus best tested are Linux and SunOS.</P>
-<P>At time of writing, the Makefile claimed support for:
-<UL>
-<LI> A/UX 3.0</LI>
-<LI> AIX</LI>
-<LI> Altos Series 386/1000</LI>
-<LI> Amiga</LI>
-<LI> Apollo Domain/OS sr10.3</LI>
-<LI> BSDI </LI>
-<LI> B.O.S. (Bull Operating System)</LI>
-<LI> Cray, Unicos 8.0</LI>
-<LI> Convex</LI>
-<LI> DGUX. </LI>
-<LI> DNIX.</LI>
-<LI> FreeBSD</LI>
-<LI> HP-UX</LI>
-<LI> Intergraph. </LI>
-<LI> Linux with/without shadow passwords and quota</LI>
-<LI> LYNX 2.3.0</LI>
-<LI> MachTen (a unix like system for Macintoshes)</LI>
-<LI> Motorola 88xxx/9xx range of machines</LI>
-<LI> NetBSD</LI>
-<LI> NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for Mach).</LI>
-<LI> OS/2 using EMX 0.9b</LI>
-<LI> OSF1</LI>
-<LI> QNX 4.22</LI>
-<LI> RiscIX. </LI>
-<LI> RISCOs 5.0B</LI>
-<LI> SEQUENT. </LI>
-<LI> SCO (including: 3.2v2, European dist., OpenServer 5)</LI>
-<LI> SGI.</LI>
-<LI> SMP_DC.OSx v1.1-94c079 on Pyramid S series</LI>
-<LI> SONY NEWS, NEWS-OS (4.2.x and 6.1.x)</LI>
-<LI> SUNOS 4</LI>
-<LI> SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')</LI>
-<LI> Sunsoft ISC SVR3V4</LI>
-<LI> SVR4</LI>
-<LI> System V with some berkely extensions (Motorola 88k R32V3.2).</LI>
-<LI> ULTRIX.</LI>
-<LI> UNIXWARE</LI>
-<LI> UXP/DS</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss1.6">1.6 How can I find out more about Samba? </A></H2>
-
-<P>
-<A NAME="more"></A>
-
-There are a number of places to look for more information on Samba, including:
-<UL>
-<LI>Two mailing lists devoted to discussion of Samba-related matters. </LI>
-<LI>The newsgroup, comp.protocols.smb, which has a great deal of discussion on Samba. </LI>
-<LI>The WWW site 'SAMBA Web Pages' at
-<A HREF="http://samba.edu.au/samba/">http://samba.edu.au/samba/</A> includes:
-<UL>
-<LI>Links to man pages and documentation, including this FAQ</LI>
-<LI>A comprehensive survey of Samba users.</LI>
-<LI>A searchable hypertext archive of the Samba mailing list.</LI>
-<LI>Links to Samba source code, binaries, and mirrors of both.</LI>
-</UL>
-</LI>
-<LI>The long list of topic documentation. These files can be found in the 'docs' directory of the Samba source, or at
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/">ftp://samba.anu.edu.au/pub/samba/docs/</A>
-<UL>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Application_Serving.txt">Application_Serving.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt">BROWSING.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/BUGS.txt">BUGS.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/DIAGNOSIS.txt">DIAGNOSIS.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/DNIX.txt">DNIX.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN.txt">DOMAIN.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN_CONTROL.txt">CONTROL.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt">ENCRYPTION.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Faxing.txt">Faxing.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/GOTCHAS.txt">GOTCHAS.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/HINTS.txt">HINTS.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.sambatar">INSTALL.sambatar</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.txt">INSTALL.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/MIRRORS">MIRRORS</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/NetBIOS.txt">NetBIOS.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/OS2.txt">OS2.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/PROJECTS">PROJECTS</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Passwords.txt">Passwords.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Printing.txt">Printing.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/README.DCEDFS">README.DCEDFS</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/README.OS2">README.OS2</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/README.jis">README.jis</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/README.sambatar">README.sambatar</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/SCO.txt">SCO.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/SMBTAR.notes">SMBTAR.notes</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Speed.txt">Speed.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Support.txt">Support.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/THANKS">THANKS</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Tracing.txt">Tracing.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/UNIX-SMB.txt">SMB.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/Warp.txt">Warp.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/WinNT.txt">WinNT.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/history">history</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt">level.txt</A></LI>
-<LI>
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/wfw_slip.htm">slip.htm</A></LI>
-</UL>
-</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss1.7">1.7 How do I subscribe to the Samba Mailing Lists?</A></H2>
-
-<P>
-<A NAME="mailinglist"></A>
-
-Send email to
-<A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>. Make sure the subject line is
-blank, and include the following two lines in the body of the message:
-<BLOCKQUOTE><CODE>
-<PRE>
-subscribe samba Firstname Lastname
-subscribe samba-announce Firstname Lastname
-</PRE>
-</CODE></BLOCKQUOTE>
-
-Obviously you should substitute YOUR first name for "Firstname" and
-YOUR last name for "Lastname"! Try not to send any signature stuff, it
-sometimes confuses the list processor.</P>
-<P>The samba list is a digest list - every eight hours or so it
-regurgitates a single message containing all the messages that have
-been received by the list since the last time and sends a copy of this
-message to all subscribers.</P>
-<P>If you stop being interested in Samba, please send another email to
-<A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>. Make sure the subject line is blank, and
-include the following two lines in the body of the message:
-<BLOCKQUOTE><CODE>
-<PRE>
-unsubscribe samba
-unsubscribe samba-announce
-</PRE>
-</CODE></BLOCKQUOTE>
-
-The <B>From:</B> line in your message <EM>MUST</EM> be the same address you used when
-you subscribed.</P>
-
-
-<H2><A NAME="ss1.8">1.8 Something's gone wrong - what should I do? </A></H2>
-
-<P>
-<A NAME="wrong"></A>
-
-<B><F>#</F> *** IMPORTANT! *** <F>#</F></B></P>
-<P>DO NOT post messages on mailing lists or in newsgroups until you have
-carried out the first three steps given here!</P>
-<P>Firstly, see if there are any likely looking entries in this FAQ! If
-you have just installed Samba, have you run through the checklist in
-<A HREF="ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt">DIAGNOSIS.txt</A>? It can save you a lot of time and effort.
-DIAGNOSIS.txt can also be found in the docs directory of the Samba distribution.</P>
-<P>Secondly, read the man pages for smbd, nmbd and smb.conf, looking for
-topics that relate to what you are trying to do.</P>
-<P>Thirdly, if there is no obvious solution to hand, try to get a look at
-the log files for smbd and/or nmbd for the period during which you
-were having problems. You may need to reconfigure the servers to
-provide more extensive debugging information - usually level 2 or
-level 3 provide ample debugging info. Inspect these logs closely,
-looking particularly for the string "Error:".</P>
-<P>Fourthly, if you still haven't got anywhere, ask the mailing list or
-newsgroup. In general nobody minds answering questions provided you
-have followed the preceding steps. It might be a good idea to scan the
-archives of the mailing list, which are available through the Samba
-web site described in the previous
-section.</P>
-<P>If you successfully solve a problem, please mail the FAQ maintainer a
-succinct description of the symptom, the problem and the solution, so
-I can incorporate it in the next version.</P>
-<P>If you make changes to the source code, _please_ submit these patches
-so that everyone else gets the benefit of your work. This is one of
-the most important aspects to the maintainence of Samba. Send all
-patches to
-<A HREF="mailto:samba-bugs@samba.anu.edu.au">samba-bugs@samba.anu.edu.au</A>. Do not send patches to Andrew Tridgell or any
-other individual, they may be lost if you do.</P>
-
-
-<H2><A NAME="ss1.9">1.9 Pizza supply details </A></H2>
-
-<P>
-<A NAME="pizza"></A>
-
-Those who have registered in the Samba survey as "Pizza Factory" will
-already know this, but the rest may need some help. Andrew doesn't ask
-for payment, but he does appreciate it when people give him
-pizza. This calls for a little organisation when the pizza donor is
-twenty thousand kilometres away, but it has been done.</P>
-<P>Method 1: Ring up your local branch of an international pizza chain
-and see if they honour their vouchers internationally. Pizza Hut do,
-which is how the entire Canberra Linux Users Group got to eat pizza
-one night, courtesy of someone in the US</P>
-<P>Method 2: Ring up a local pizza shop in Canberra and quote a credit
-card number for a certain amount, and tell them that Andrew will be
-collecting it (don't forget to tell him.) One kind soul from Germany
-did this.</P>
-<P>Method 3: Purchase a pizza voucher from your local pizza shop that has
-no international affiliations and send it to Andrew. It is completely
-useless but he can hang it on the wall next to the one he already has
-from Germany :-)</P>
-<P>Method 4: Air freight him a pizza with your favourite regional
-flavours. It will probably get stuck in customs or torn apart by
-hungry sniffer dogs but it will have been a noble gesture.</P>
-
-
-<HR>
-Previous
-<A HREF="sambafaq-2.html">Next</A>
-<A HREF="sambafaq.html#toc1">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq-2.html b/docs/faq/sambafaq-2.html
deleted file mode 100644
index b92a1e2fcd1..00000000000
--- a/docs/faq/sambafaq-2.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ: Compiling and installing Samba on a Unix host</TITLE>
-</HEAD>
-<BODY>
-<A HREF="sambafaq-1.html">Previous</A>
-<A HREF="sambafaq-3.html">Next</A>
-<A HREF="sambafaq.html#toc2">Table of Contents</A>
-<HR>
-<H2><A NAME="s2">2. Compiling and installing Samba on a Unix host</A></H2>
-
-<P>
-<A NAME="unix_install"></A>
-</P>
-
-<H2><A NAME="ss2.1">2.1 I can't see the Samba server in any browse lists!</A></H2>
-
-<P>
-<A NAME="no_browse"></A>
-
-See
-<A HREF="ftp://samba.anu.edu.au/pub/samba/BROWSING.txt">BROWSING.txt</A>
-for more information on browsing. Browsing.txt can also be found
-in the docs directory of the Samba source.</P>
-<P>If your GUI client does not permit you to select non-browsable
-servers, you may need to do so on the command line. For example, under
-Lan Manager you might connect to the above service as disk drive M:
-thusly:
-<BLOCKQUOTE><CODE>
-<PRE>
- net use M: \\mary\fred
-</PRE>
-</CODE></BLOCKQUOTE>
-
-The details of how to do this and the specific syntax varies from
-client to client - check your client's documentation.</P>
-
-
-<H2><A NAME="ss2.2">2.2 Some files that I KNOW are on the server doesn't show up when I view the files from my client! </A></H2>
-
-<P>
-<A NAME="missing_files"></A>
-
-See the next question.</P>
-
-<H2><A NAME="ss2.3">2.3 Some files on the server show up with really wierd filenames when I view the files from my client! </A></H2>
-
-<P>
-<A NAME="strange_filenames"></A>
-
-If you check what files are not showing up, you will note that they
-are files which contain upper case letters or which are otherwise not
-DOS-compatible (ie, they are not legal DOS filenames for some reason).</P>
-<P>The Samba server can be configured either to ignore such files
-completely, or to present them to the client in "mangled" form. If you
-are not seeing the files at all, the Samba server has most likely been
-configured to ignore them. Consult the man page smb.conf(5) for
-details of how to change this - the parameter you need to set is
-"mangled names = yes".</P>
-
-
-<H2><A NAME="ss2.4">2.4 My client reports "cannot locate specified computer" or similar</A></H2>
-
-<P>
-<A NAME="cant_see_server"></A>
-
-This indicates one of three things: You supplied an incorrect server
-name, the underlying TCP/IP layer is not working correctly, or the
-name you specified cannot be resolved.</P>
-<P>After carefully checking that the name you typed is the name you
-should have typed, try doing things like pinging a host or telnetting
-to somewhere on your network to see if TCP/IP is functioning OK. If it
-is, the problem is most likely name resolution.</P>
-<P>If your client has a facility to do so, hardcode a mapping between the
-hosts IP and the name you want to use. For example, with Man Manager
-or Windows for Workgroups you would put a suitable entry in the file
-LMHOSTS. If this works, the problem is in the communication between
-your client and the netbios name server. If it does not work, then
-there is something fundamental wrong with your naming and the solution
-is beyond the scope of this document.</P>
-<P>If you do not have any server on your subnet supplying netbios name
-resolution, hardcoded mappings are your only option. If you DO have a
-netbios name server running (such as the Samba suite's nmbd program),
-the problem probably lies in the way it is set up. Refer to Section
-Two of this FAQ for more ideas.</P>
-<P>By the way, remember to REMOVE the hardcoded mapping before further
-tests :-) </P>
-
-
-<H2><A NAME="ss2.5">2.5 My client reports "cannot locate specified share name" or similar</A></H2>
-
-<P>
-<A NAME="cant_see_share"></A>
-
-This message indicates that your client CAN locate the specified
-server, which is a good start, but that it cannot find a service of
-the name you gave.</P>
-<P>The first step is to check the exact name of the service you are
-trying to connect to (consult your system administrator). Assuming it
-exists and you specified it correctly (read your client's doco on how
-to specify a service name correctly), read on:</P>
-<P>
-<UL>
-<LI> Many clients cannot accept or use service names longer than eight characters.</LI>
-<LI> Many clients cannot accept or use service names containing spaces.</LI>
-<LI> Some servers (not Samba though) are case sensitive with service names.</LI>
-<LI> Some clients force service names into upper case.</LI>
-</UL>
-</P>
-
-
-<H2><A NAME="ss2.6">2.6 My client reports "cannot find domain controller", "cannot log on to the network" or similar </A></H2>
-
-<P>
-<A NAME="cant_see_net"></A>
-
-Nothing is wrong - Samba does not implement the primary domain name
-controller stuff for several reasons, including the fact that the
-whole concept of a primary domain controller and "logging in to a
-network" doesn't fit well with clients possibly running on multiuser
-machines (such as users of smbclient under Unix). Having said that,
-several developers are working hard on building it in to the next
-major version of Samba. If you can contribute, send a message to
-<A HREF="mailto:samba-bugs@samba.anu.edu.au">samba-bugs@samba.anu.edu.au</A> !</P>
-<P>Seeing this message should not affect your ability to mount redirected
-disks and printers, which is really what all this is about.</P>
-<P>For many clients (including Windows for Workgroups and Lan Manager),
-setting the domain to STANDALONE at least gets rid of the message.</P>
-
-
-<H2><A NAME="ss2.7">2.7 Printing doesn't work :-(</A></H2>
-
-<P>
-<A NAME="no_printing"></A>
-
-Make sure that the specified print command for the service you are
-connecting to is correct and that it has a fully-qualified path (eg.,
-use "/usr/bin/lpr" rather than just "lpr").</P>
-<P>Make sure that the spool directory specified for the service is
-writable by the user connected to the service. In particular the user
-"nobody" often has problems with printing, even if it worked with an
-earlier version of Samba. Try creating another guest user other than
-"nobody".</P>
-<P>Make sure that the user specified in the service is permitted to use
-the printer.</P>
-<P>Check the debug log produced by smbd. Search for the printer name and
-see if the log turns up any clues. Note that error messages to do with
-a service ipc$ are meaningless - they relate to the way the client
-attempts to retrieve status information when using the LANMAN1
-protocol.</P>
-<P>If using WfWg then you need to set the default protocol to TCP/IP, not
-Netbeui. This is a WfWg bug.</P>
-<P>If using the Lanman1 protocol (the default) then try switching to
-coreplus. Also not that print status error messages don't mean
-printing won't work. The print status is received by a different
-mechanism.</P>
-
-
-<H2><A NAME="ss2.8">2.8 My programs install on the server OK, but refuse to work properly</A></H2>
-
-<P>
-<A NAME="programs_wont_run"></A>
-
-There are numerous possible reasons for this, but one MAJOR
-possibility is that your software uses locking. Make sure you are
-using Samba 1.6.11 or later. It may also be possible to work around
-the problem by setting "locking=no" in the Samba configuration file
-for the service the software is installed on. This should be regarded
-as a strictly temporary solution.</P>
-<P>In earlier Samba versions there were some difficulties with the very
-latest Microsoft products, particularly Excel 5 and Word for Windows
-6. These should have all been solved. If not then please let Andrew
-Tridgell know via email at
-<A HREF="mailto:samba-bugs@samba.anu.edu.au">samba-bugs@samba.anu.edu.au</A>.</P>
-
-
-<H2><A NAME="ss2.9">2.9 My "server string" doesn't seem to be recognised</A></H2>
-
-<P>
-<A NAME="bad_server_string"></A>
-
-OR My client reports the default setting, eg. "Samba 1.9.15p4", instead
-of what I have changed it to in the smb.conf file.</P>
-<P>You need to use the -C option in nmbd. The "server string" affects
-what smbd puts out and -C affects what nmbd puts out.</P>
-<P>Current versions of Samba (1.9.16 +) have combined these options into
-the "server string" field of smb.conf, -C for nmbd is now obsolete.</P>
-
-
-<H2><A NAME="ss2.10">2.10 My client reports "This server is not configured to list shared resources" </A></H2>
-
-<P>
-<A NAME="cant_list_shares"></A>
-
-Your guest account is probably invalid for some reason. Samba uses the
-guest account for browsing in smbd. Check that your guest account is
-valid.</P>
-<P>See also 'guest account' in smb.conf man page.</P>
-
-
-<H2><A NAME="ss2.11">2.11 Log message "you appear to have a trapdoor uid system" </A></H2>
-
-<P>
-<A NAME="trapdoor_uid"></A>
-
-This can have several causes. It might be because you are using a uid
-or gid of 65535 or -1. This is a VERY bad idea, and is a big security
-hole. Check carefully in your /etc/passwd file and make sure that no
-user has uid 65535 or -1. Especially check the "nobody" user, as many
-broken systems are shipped with nobody setup with a uid of 65535.</P>
-<P>It might also mean that your OS has a trapdoor uid/gid system :-)</P>
-<P>This means that once a process changes effective uid from root to
-another user it can't go back to root. Unfortunately Samba relies on
-being able to change effective uid from root to non-root and back
-again to implement its security policy. If your OS has a trapdoor uid
-system this won't work, and several things in Samba may break. Less
-things will break if you use user or server level security instead of
-the default share level security, but you may still strike
-problems.</P>
-<P>The problems don't give rise to any security holes, so don't panic,
-but it does mean some of Samba's capabilities will be unavailable.
-In particular you will not be able to connect to the Samba server as
-two different uids at once. This may happen if you try to print as a
-"guest" while accessing a share as a normal user. It may also affect
-your ability to list the available shares as this is normally done as
-the guest user.</P>
-<P>Complain to your OS vendor and ask them to fix their system.</P>
-<P>Note: the reason why 65535 is a VERY bad choice of uid and gid is that
-it casts to -1 as a uid, and the setreuid() system call ignores (with
-no error) uid changes to -1. This means any daemon attempting to run
-as uid 65535 will actually run as root. This is not good!</P>
-
-
-<HR>
-<A HREF="sambafaq-1.html">Previous</A>
-<A HREF="sambafaq-3.html">Next</A>
-<A HREF="sambafaq.html#toc2">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq-3.html b/docs/faq/sambafaq-3.html
deleted file mode 100644
index 1b5dcf4d9aa..00000000000
--- a/docs/faq/sambafaq-3.html
+++ /dev/null
@@ -1,322 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ: Common client questions</TITLE>
-</HEAD>
-<BODY>
-<A HREF="sambafaq-2.html">Previous</A>
-<A HREF="sambafaq-4.html">Next</A>
-<A HREF="sambafaq.html#toc3">Table of Contents</A>
-<HR>
-<H2><A NAME="s3">3. Common client questions</A></H2>
-
-<P>
-<A NAME="client_questions"></A>
-</P>
-
-<H2><A NAME="ss3.1">3.1 Are there any Macintosh clients for Samba?</A></H2>
-
-<P>
-<A NAME="mac_clients"></A>
-
-Yes! Thursby now have a CIFS Client / Server called DAVE - see
-<A HREF="http://www.thursby.com/">http://www.thursby.com/</A>.
-They test it against Windows 95, Windows NT and samba for compatibility issues.
-At the time of writing, DAVE was at version 1.0.1. The 1.0.0 to 1.0.1 update is available
-as a free download from the Thursby web site (the speed of finder copies has
-been greatly enhanced, and there are bug-fixes included).</P>
-<P>Alternatives - There are two free implementations of AppleTalk for
-several kinds of UNIX machnes, and several more commercial ones.
-These products allow you to run file services and print services
-natively to Macintosh users, with no additional support required on
-the Macintosh. The two free omplementations are Netatalk,
-<A HREF="http://www.umich.edu/~rsug/netatalk/">http://www.umich.edu/~rsug/netatalk/</A>, and CAP,
-<A HREF="http://www.cs.mu.oz.au/appletalk/atalk.html">http://www.cs.mu.oz.au/appletalk/atalk.html</A>. What Samba offers
-MS Windows users, these packages offer to Macs. For more info on
-these packages, Samba, and Linux (and other UNIX-based systems)
-see
-<A HREF="http://www.eats.com/linux_mac_win.html">http://www.eats.com/linux_mac_win.html</A></P>
-
-
-<H2><A NAME="ss3.2">3.2 "Session request failed (131,130)" error</A></H2>
-
-<P>
-<A NAME="sess_req_fail"></A>
-
-The following answer is provided by John E. Miller:</P>
-<P>I'll assume that you're able to ping back and forth between the
-machines by IP address and name, and that you're using some security
-model where you're confident that you've got user IDs and passwords
-right. The logging options (-d3 or greater) can help a lot with that.
-DNS and WINS configuration can also impact connectivity as well.</P>
-<P>Now, on to 'scope id's. Somewhere in your Win95 TCP/IP network
-configuration (I'm too much of an NT bigot to know where it's located
-in the Win95 setup, but I'll have to learn someday since I teach for a
-Microsoft Solution Provider Authorized Tech Education Center - what an
-acronym...) <F>Note: It's under Control Panel | Network | TCP/IP | WINS
-Configuration</F> there's a little text entry field called something like
-'Scope ID'.</P>
-<P>This field essentially creates 'invisible' sub-workgroups on the same
-wire. Boxes can only see other boxes whose Scope IDs are set to the
-exact same value - it's sometimes used by OEMs to configure their
-boxes to browse only other boxes from the same vendor and, in most
-environments, this field should be left blank. If you, in fact, have
-something in this box that EXACT value (case-sensitive!) needs to be
-provided to smbclient and nmbd as the -i (lowercase) parameter. So, if
-your Scope ID is configured as the string 'SomeStr' in Win95 then
-you'd have to use smbclient -iSomeStr <F>otherparms</F> in connecting to
-it.</P>
-
-
-<H2><A NAME="ss3.3">3.3 How do I synchronise my PC's clock with my Samba server? </A></H2>
-
-<P>
-<A NAME="synchronise_clock"></A>
-
-To syncronize your PC's clock with your Samba server:
-<UL>
-<LI> Copy timesync.pif to your windows directory</LI>
-<LI> timesync.pif can be found at:
-<A HREF="http://samba.anu.edu.au/samba/binaries/miscellaneous/timesync.pif">http://samba.anu.edu.au/samba/binaries/miscellaneous/timesync.pif</A></LI>
-<LI> Add timesync.pif to your 'Start Up' group/folder</LI>
-<LI> Open the properties dialog box for the program/icon</LI>
-<LI> Make sure the 'Run Minimized' option is set in program 'Properties'</LI>
-<LI> Change the command line section that reads <F>\\sambahost</F> to reflect the name of your server.</LI>
-<LI> Close the properties dialog box by choosing 'OK'</LI>
-</UL>
-
-Each time you start your computer (or login for Win95) your PC will
-synchronize its clock with your Samba server.</P>
-<P>Alternativley, if you clients support Domain Logons, you can setup Domain Logons with Samba
-- see:
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt">BROWSING.txt</A> *** for more information.</P>
-<P>Then add
-<BLOCKQUOTE><CODE>
-<PRE>
-NET TIME \\%L /SET /YES
-</PRE>
-</CODE></BLOCKQUOTE>
-
-as one of the lines in the logon script.</P>
-
-<H2><A NAME="ss3.4">3.4 Problems with WinDD, NTrigue, WinCenterPro etc</A></H2>
-
-<P>
-<A NAME="multiple_session_clients"></A>
-</P>
-<P>All of the above programs are applications that sit on an NT box and
-allow multiple users to access the NT GUI applications from remote
-workstations (often over X).</P>
-<P>What has this got to do with Samba? The problem comes when these users
-use filemanager to mount shares from a Samba server. The most common
-symptom is that the first user to connect get correct file permissions
-and has a nice day, but subsequent connections get logged in as the
-same user as the first person to login. They find that they cannot
-access files in their own home directory, but that they can access
-files in the first users home directory (maybe not such a nice day
-after all?)</P>
-<P>Why does this happen? The above products all share a common heritage
-(and code base I believe). They all open just a single TCP based SMB
-connection to the Samba server, and requests from all users are piped
-over this connection. This is unfortunate, but not fatal.</P>
-<P>It means that if you run your Samba server in share level security
-(the default) then things will definately break as described
-above. The share level SMB security model has no provision for
-multiple user IDs on the one SMB connection. See
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt">security_level.txt</A> in
-the docs for more info on share/user/server level security.</P>
-<P>If you run in user or server level security then you have a chance,
-but only if you have a recent version of Samba (at least 1.9.15p6). In
-older versions bugs in Samba meant you still would have had problems.</P>
-<P>If you have a trapdoor uid system in your OS then it will never work
-properly. Samba needs to be able to switch uids on the connection and
-it can't if your OS has a trapdoor uid system. You'll know this
-because Samba will note it in your logs.</P>
-<P>Also note that you should not use the magic "homes" share name with
-products like these, as otherwise all users will end up with the same
-home directory. Use <F>\\server\username</F> instead.</P>
-
-
-<H2><A NAME="ss3.5">3.5 Problem with printers under NT</A></H2>
-
-<P>
-<A NAME="nt_printers"></A>
-
-This info from Stefan Hergeth
-hergeth@f7axp1.informatik.fh-muenchen.de may be useful:</P>
-<P>A network-printer (with ethernetcard) is connected to the NT-Clients
-via our UNIX-Fileserver (SAMBA-Server), like the configuration told by
-Matthew Harrell harrell@leech.nrl.navy.mil (see WinNT.txt)
-<OL>
-<LI>If a user has choosen this printer as the default printer in his
-NT-Session and this printer is not connected to the network
-(e.g. switched off) than this user has a problem with the SAMBA-
-connection of his filesystems. It's very slow.
-</LI>
-<LI>If the printer is connected to the network everything works fine.
-</LI>
-<LI>When the smbd ist started with debug level 3, you can see that the
-NT spooling system try to connect to the printer many times. If the
-printer ist not connected to the network this request fails and the
-NT spooler is wasting a lot of time to connect to the printer service.
-This seems to be the reason for the slow network connection.
-</LI>
-<LI>Maybe it's possible to change this behaviour by setting different
-printer properties in the Print-Manager-Menu of NT, but i didn't try it yet.</LI>
-</OL>
-</P>
-
-
-<H2><A NAME="ss3.6">3.6 Why are my file's timestamps off by an hour, or by a few hours?</A></H2>
-
-<P>
-<A NAME="dst_bugs"></A>
-
-This is from Paul Eggert eggert@twinsun.com.</P>
-<P>Most likely it's a problem with your time zone settings.</P>
-<P>Internally, Samba maintains time in traditional Unix format,
-namely, the number of seconds since 1970-01-01 00:00:00 Universal Time
-(or ``GMT''), not counting leap seconds.</P>
-<P>On the server side, Samba uses the Unix TZ variable to convert
-internal timestamps to and from local time. So on the server side, there are
-two things to get right.
-<OL>
-<LI>The Unix system clock must have the correct Universal time.
-Use the shell command "sh -c 'TZ=UTC0 date'" to check this.
-</LI>
-<LI>The TZ environment variable must be set on the server
-before Samba is invoked. The details of this depend on the
-server OS, but typically you must edit a file whose name is
-/etc/TIMEZONE or /etc/default/init, or run the command `zic -l'.
-</LI>
-<LI>TZ must have the correct value.
-<OL>
-<LI>If possible, use geographical time zone settings
-(e.g. TZ='America/Los_Angeles' or perhaps
-TZ=':US/Pacific'). These are supported by most
-popular Unix OSes, are easier to get right, and are
-more accurate for historical timestamps. If your
-operating system has out-of-date tables, you should be
-able to update them from the public domain time zone
-tables at
-<A HREF="ftp://elsie.nci.nih.gov/pub/">ftp://elsie.nci.nih.gov/pub/</A>.
-</LI>
-<LI>If your system does not support geographical timezone
-settings, you must use a Posix-style TZ strings, e.g.
-TZ='PST8PDT,M4.1.0/2,M10.5.0/2' for US Pacific time.
-Posix TZ strings can take the following form (with optional
-items in brackets):
-<PRE>
- StdOffset[Dst[Offset],Date/Time,Date/Time]
-</PRE>
-
-where:
-<UL>
-<LI> `Std' is the standard time designation (e.g. `PST').
-</LI>
-<LI> `Offset' is the number of hours behind UTC (e.g. `8').
-Prepend a `-' if you are ahead of UTC, and
-append `:30' if you are at a half-hour offset.
-Omit all the remaining items if you do not use
-daylight-saving time.
-</LI>
-<LI> `Dst' is the daylight-saving time designation
-(e.g. `PDT').
-
-The optional second `Offset' is the number of
-hours that daylight-saving time is behind UTC.
-The default is 1 hour ahead of standard time.
-</LI>
-<LI> `Date/Time,Date/Time' specify when daylight-saving
-time starts and ends. The format for a date is
-`Mm.n.d', which specifies the dth day (0 is Sunday)
-of the nth week of the mth month, where week 5 means
-the last such day in the month. The format for a
-time is <F>h</F>h<F>:mm[:ss</F>], using a 24-hour clock.</LI>
-</UL>
-
-Other Posix string formats are allowed but you don't want
-to know about them.</LI>
-</OL>
-</LI>
-</OL>
-
-On the client side, you must make sure that your client's clock and
-time zone is also set appropriately. <F>[I don't know how to do this.</F>]
-Samba traditionally has had many problems dealing with time zones, due
-to the bizarre ways that Microsoft network protocols handle time
-zones. A common symptom is for file timestamps to be off by an hour.
-To work around the problem, try disconnecting from your Samba server
-and then reconnecting to it; or upgrade your Samba server to
-1.9.16alpha10 or later.</P>
-
-
-<H2><A NAME="ss3.7">3.7 How do I set the printer driver name correctly? </A></H2>
-
-<P>
-<A NAME="printer_driver_name"></A>
-
-Question:
-On NT, I opened "Printer Manager" and "Connect to Printer".
-Enter <F>"\\ptdi270\ps1"</F> in the box of printer. I got the
-following error message:
-<BLOCKQUOTE><CODE>
-<PRE>
- You do not have sufficient access to your machine
- to connect to the selected printer, since a driver
- needs to be installed locally.
-</PRE>
-</CODE></BLOCKQUOTE>
-
-Answer:</P>
-<P>In the more recent versions of Samba you can now set the "printer
-driver" in smb.conf. This tells the client what driver to use. For
-example:
-<BLOCKQUOTE><CODE>
-<PRE>
- printer driver = HP LaserJet 4L
-</PRE>
-</CODE></BLOCKQUOTE>
-
-with this, NT knows to use the right driver. You have to get this string
-exactly right.</P>
-<P>To find the exact string to use, you need to get to the dialog box in
-your client where you select which printer driver to install. The
-correct strings for all the different printers are shown in a listbox
-in that dialog box.</P>
-<P>You could also try setting the driver to NULL like this:
-<BLOCKQUOTE><CODE>
-<PRE>
- printer driver = NULL
-</PRE>
-</CODE></BLOCKQUOTE>
-
-this is effectively what older versions of Samba did, so if that
-worked for you then give it a go. If this does work then let us know via
-<A HREF="mailto:samba-bugs@samba.anu.edu.au">samba-bugs@samba.anu.edu.au</A>,
-and we'll make it the default. Currently the default is a 0 length
-string.</P>
-
-
-<H2><A NAME="ss3.8">3.8 I've applied NT 4.0 SP3, and now I can't access Samba shares, Why?</A></H2>
-
-<P>
-<A NAME="NT_SP3_FIX"></A>
-
-As of SP3, Microsoft has decided that they will no longer default to
-passing clear text passwords over the network. To enable access to
-Samba shares from NT 4.0 SP3, you must do <B>ONE</B> of two things:
-<OL>
-<LI> Set the Samba configuration option 'security = user' and implement all of the stuff detailed in
-<A HREF="ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt">ENCRYPTION.txt</A>.</LI>
-<LI> Follow Microsoft's directions for setting your NT box to allow plain text passwords. see
-<A HREF="http://www.microsoft.com/kb/articles/q166/7/30.htm">Knowledge Base Article Q166730</A></LI>
-</OL>
-</P>
-
-
-<HR>
-<A HREF="sambafaq-2.html">Previous</A>
-<A HREF="sambafaq-4.html">Next</A>
-<A HREF="sambafaq.html#toc3">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq-4.html b/docs/faq/sambafaq-4.html
deleted file mode 100644
index 94d5c419906..00000000000
--- a/docs/faq/sambafaq-4.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ: Specific client application problems</TITLE>
-</HEAD>
-<BODY>
-<A HREF="sambafaq-3.html">Previous</A>
-<A HREF="sambafaq-5.html">Next</A>
-<A HREF="sambafaq.html#toc4">Table of Contents</A>
-<HR>
-<H2><A NAME="s4">4. Specific client application problems</A></H2>
-
-<P>
-<A NAME="client_problems"></A>
-</P>
-
-<H2><A NAME="ss4.1">4.1 MS Office Setup reports "Cannot change properties of '\MSOFFICE\SETUP.INI'"</A></H2>
-
-<P>
-<A NAME="cant_change_properties"></A>
-
-When installing MS Office on a Samba drive for which you have admin
-user permissions, ie. admin users = username, you will find the
-setup program unable to complete the installation.</P>
-<P>To get around this problem, do the installation without admin user
-permissions The problem is that MS Office Setup checks that a file is
-rdonly by trying to open it for writing.</P>
-<P>Admin users can always open a file for writing, as they run as root.
-You just have to install as a non-admin user and then use "chown -R"
-to fix the owner.</P>
-
-
-<HR>
-<A HREF="sambafaq-3.html">Previous</A>
-<A HREF="sambafaq-5.html">Next</A>
-<A HREF="sambafaq.html#toc4">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq-5.html b/docs/faq/sambafaq-5.html
deleted file mode 100644
index 0a6e9d08f03..00000000000
--- a/docs/faq/sambafaq-5.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ: Miscellaneous</TITLE>
-</HEAD>
-<BODY>
-<A HREF="sambafaq-4.html">Previous</A>
-Next
-<A HREF="sambafaq.html#toc5">Table of Contents</A>
-<HR>
-<H2><A NAME="s5">5. Miscellaneous</A></H2>
-
-<P>
-<A NAME="miscellaneous"></A>
-</P>
-<H2><A NAME="ss5.1">5.1 Is Samba Year 2000 compliant?</A></H2>
-
-<P>
-<A NAME="Year2000Compliant"></A>
-
-The CIFS protocol that Samba implements
-negotiates times in various formats, all of which
-are able to cope with dates beyond 2000.</P>
-
-
-<HR>
-<A HREF="sambafaq-4.html">Previous</A>
-Next
-<A HREF="sambafaq.html#toc5">Table of Contents</A>
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq.html b/docs/faq/sambafaq.html
deleted file mode 100644
index 9c45d524dd3..00000000000
--- a/docs/faq/sambafaq.html
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<HTML>
-<HEAD>
-<TITLE> Samba FAQ</TITLE>
-</HEAD>
-<BODY>
-Previous
-<A HREF="sambafaq-1.html">Next</A>
-Table of Contents
-<HR>
-<H1> Samba FAQ</H1>
-
-<H2>Paul Blackman, <CODE>ictinus@samba.anu.edu.au</CODE></H2>v 0.8, June '97
-<P><HR><EM> This is the Frequently Asked Questions (FAQ) document for
-Samba, the free and very popular SMB server product. An SMB server
-allows file and printer connections from clients such as Windows,
-OS/2, Linux and others. Current to version 1.9.17. Please send any
-corrections to the author.</EM><HR></P>
-<P>
-<H2><A NAME="toc1">1.</A> <A HREF="sambafaq-1.html">General Information</A></H2>
-<UL>
-<LI><A HREF="sambafaq-1.html#ss1.1">1.1 What is Samba? </A>
-<LI><A HREF="sambafaq-1.html#ss1.2">1.2 What is the current version of Samba? </A>
-<LI><A HREF="sambafaq-1.html#ss1.3">1.3 Where can I get it? </A>
-<LI><A HREF="sambafaq-1.html#ss1.4">1.4 What do the version numbers mean? </A>
-<LI><A HREF="sambafaq-1.html#ss1.5">1.5 What platforms are supported? </A>
-<LI><A HREF="sambafaq-1.html#ss1.6">1.6 How can I find out more about Samba? </A>
-<LI><A HREF="sambafaq-1.html#ss1.7">1.7 How do I subscribe to the Samba Mailing Lists?</A>
-<LI><A HREF="sambafaq-1.html#ss1.8">1.8 Something's gone wrong - what should I do? </A>
-<LI><A HREF="sambafaq-1.html#ss1.9">1.9 Pizza supply details </A>
-</UL>
-
-<P>
-<H2><A NAME="toc2">2.</A> <A HREF="sambafaq-2.html">Compiling and installing Samba on a Unix host</A></H2>
-<UL>
-<LI><A HREF="sambafaq-2.html#ss2.1">2.1 I can't see the Samba server in any browse lists!</A>
-<LI><A HREF="sambafaq-2.html#ss2.2">2.2 Some files that I KNOW are on the server doesn't show up when I view the files from my client! </A>
-<LI><A HREF="sambafaq-2.html#ss2.3">2.3 Some files on the server show up with really wierd filenames when I view the files from my client! </A>
-<LI><A HREF="sambafaq-2.html#ss2.4">2.4 My client reports "cannot locate specified computer" or similar</A>
-<LI><A HREF="sambafaq-2.html#ss2.5">2.5 My client reports "cannot locate specified share name" or similar</A>
-<LI><A HREF="sambafaq-2.html#ss2.6">2.6 My client reports "cannot find domain controller", "cannot log on to the network" or similar </A>
-<LI><A HREF="sambafaq-2.html#ss2.7">2.7 Printing doesn't work :-(</A>
-<LI><A HREF="sambafaq-2.html#ss2.8">2.8 My programs install on the server OK, but refuse to work properly</A>
-<LI><A HREF="sambafaq-2.html#ss2.9">2.9 My "server string" doesn't seem to be recognised</A>
-<LI><A HREF="sambafaq-2.html#ss2.10">2.10 My client reports "This server is not configured to list shared resources" </A>
-<LI><A HREF="sambafaq-2.html#ss2.11">2.11 Log message "you appear to have a trapdoor uid system" </A>
-</UL>
-
-<P>
-<H2><A NAME="toc3">3.</A> <A HREF="sambafaq-3.html">Common client questions</A></H2>
-<UL>
-<LI><A HREF="sambafaq-3.html#ss3.1">3.1 Are there any Macintosh clients for Samba?</A>
-<LI><A HREF="sambafaq-3.html#ss3.2">3.2 "Session request failed (131,130)" error</A>
-<LI><A HREF="sambafaq-3.html#ss3.3">3.3 How do I synchronise my PC's clock with my Samba server? </A>
-<LI><A HREF="sambafaq-3.html#ss3.4">3.4 Problems with WinDD, NTrigue, WinCenterPro etc</A>
-<LI><A HREF="sambafaq-3.html#ss3.5">3.5 Problem with printers under NT</A>
-<LI><A HREF="sambafaq-3.html#ss3.6">3.6 Why are my file's timestamps off by an hour, or by a few hours?</A>
-<LI><A HREF="sambafaq-3.html#ss3.7">3.7 How do I set the printer driver name correctly? </A>
-<LI><A HREF="sambafaq-3.html#ss3.8">3.8 I've applied NT 4.0 SP3, and now I can't access Samba shares, Why?</A>
-</UL>
-
-<P>
-<H2><A NAME="toc4">4.</A> <A HREF="sambafaq-4.html">Specific client application problems</A></H2>
-<UL>
-<LI><A HREF="sambafaq-4.html#ss4.1">4.1 MS Office Setup reports "Cannot change properties of '\MSOFFICE\SETUP.INI'"</A>
-</UL>
-
-<P>
-<H2><A NAME="toc5">5.</A> <A HREF="sambafaq-5.html">Miscellaneous</A></H2>
-<UL>
-<LI><A HREF="sambafaq-5.html#ss5.1">5.1 Is Samba Year 2000 compliant?</A>
-</UL>
-
-
-<HR>
-Previous
-<A HREF="sambafaq-1.html">Next</A>
-Table of Contents
-</BODY>
-</HTML>
diff --git a/docs/faq/sambafaq.sgml b/docs/faq/sambafaq.sgml
deleted file mode 100644
index d306881b56b..00000000000
--- a/docs/faq/sambafaq.sgml
+++ /dev/null
@@ -1,792 +0,0 @@
-<!doctype linuxdoc system> <!-- -*- SGML -*- -->
-<!--
- v 0.5 18 Oct 1996 Dan Shearer Dan.Shearer@unisa.edu.au
- First linuxdoc-sgml version, outline only
- v 0.6 25 Oct 1996 Dan
- Filled in from current text faq
- v 0.7 1 June 1997 Paul
- Replicated changes in txt faq to sgml faq
- 9 June 1997 Paul
- Lots of changes, added doco list, updated compatible systems list
- added NT SP3 entry, added Year 2000 entry, Getting ready for 1.9.17
- v 0.8 7th Oct 97 Paul
- changed samba.canberra entries to samba.anu.../samba/
--->
-
-<article>
-
-<title> Samba FAQ
-
-<author>Paul Blackman, <tt>ictinus@samba.anu.edu.au</tt>
-
-<date>v 0.8, June '97
-
-<abstract> This is the Frequently Asked Questions (FAQ) document for
-Samba, the free and very popular SMB server product. An SMB server
-allows file and printer connections from clients such as Windows,
-OS/2, Linux and others. Current to version 1.9.17. Please send any
-corrections to the author.
-</abstract>
-
-<toc>
-
-<sect> General Information<p> <label id="general_info">
-
-All about Samba - what it is, how to get it, related sources of
-information, how to understand the version numbering scheme, pizza
-details
-
-<sect1> What is Samba? <p> <label id="introduction">
-Samba is a suite of programs which work together to allow clients to
-access to a server's filespace and printers via the SMB (Server
-Message Block) protocol. Initially written for Unix, Samba now also
-runs on Netware, OS/2 and VMS.
-
-In practice, this means that you can redirect disks and printers to
-Unix disks and printers from Lan Manager clients, Windows for
-Workgroups 3.11 clients, Windows NT clients, Linux clients and OS/2
-clients. There is also a generic Unix client program supplied as part
-of the suite which allows Unix users to use an ftp-like interface to
-access filespace and printers on any other SMB servers. This gives the
-capability for these operating systems to behave much like a LAN
-Server or Windows NT Server machine, only with added functionality and
-flexibility designed to make life easier for administrators.
-
-The components of the suite are (in summary):
-
-<itemize>
-<item><bf>smbd</bf>, the SMB server. This handles actual connections from clients, doing all the file, permission and username work
-<item><bf>nmbd</bf>, the Netbios name server, which helps clients locate servers, doing the browsing work and managing domains as this capability is being built into Samba
-<item><bf>smbclient</bf>, the Unix-hosted client program
-<item><bf>smbrun</bf>, a little 'glue' program to help the server run external programs
-<item><bf>testprns</bf>, a program to test server access to printers
-<item><bf>testparms</bf>, a program to test the Samba configuration file for correctness
-<item><bf>smb.conf</bf>, the Samba configuration file
-<item><bf>smbprint</bf>, a sample script to allow a Unix host to use smbclient to print to an SMB server
-<item><bf>Documentation!</bf> DON'T neglect to read it - you will save a great deal of time!
-</itemize>
-
-The suite is supplied with full source (of course!) and is GPLed.
-
-The primary creator of the Samba suite is Andrew Tridgell. Later
-versions incorporate much effort by many net.helpers. The man pages
-and this FAQ were originally written by Karl Auer.
-
-<sect1> What is the current version of Samba? <p><label id="current_version">
-At time of writing, the current version was 1.9.17. If you want to be
-sure check the bottom of the change-log file. <url url="ftp://samba.anu.edu.au/pub/samba/alpha/change-log">
-
-For more information see <ref id="version_nums" name="What do the
-version numbers mean?">
-
-<sect1> Where can I get it? <p> <label id="where">
-The Samba suite is available via anonymous ftp from
-samba.anu.edu.au. The latest and greatest versions of the suite are in
-the directory:
-
-/pub/samba/
-
-Development (read "alpha") versions, which are NOT necessarily stable
-and which do NOT necessarily have accurate documentation, are
-available in the directory:
-
-/pub/samba/alpha
-
-Note that binaries are NOT included in any of the above. Samba is
-distributed ONLY in source form, though binaries may be available from
-other sites. Recent versions of some Linux distributions, for example,
-do contain Samba binaries for that platform.
-
-<sect1> What do the version numbers mean? <p> <label id="version_nums">
-It is not recommended that you run a version of Samba with the word
-"alpha" in its name unless you know what you are doing and are willing
-to do some debugging. Many, many people just get the latest
-recommended stable release version and are happy. If you are brave, by
-all means take the plunge and help with the testing and development -
-but don't install it on your departmental server. Samba is typically
-very stable and safe, and this is mostly due to the policy of many
-public releases.
-
-How the scheme works:
-<enum>
-<item>When major changes are made the version number is increased. For
-example, the transition from 1.9.15 to 1.9.16. However, this version
-number will not appear immediately and people should continue to use
-1.9.15 for production systems (see next point.)
-
-<item>Just after major changes are made the software is considered
-unstable, and a series of alpha releases are distributed, for example
-1.9.16alpha1. These are for testing by those who know what they are
-doing. The "alpha" in the filename will hopefully scare off those who
-are just looking for the latest version to install.
-
-<item>When Andrew thinks that the alphas have stabilised to the point
-where he would recommend new users install it, he renames it to the
-same version number without the alpha, for example 1.9.16.
-
-<item>Inevitably bugs are found in the "stable" releases and minor patch
-levels are released which give us the pXX series, for example 1.9.16p2.
-</enum>
-So the progression goes:
-<verb>
- 1.9.15p7 (production)
- 1.9.15p8 (production)
- 1.9.16alpha1 (test sites only)
- :
- 1.9.16alpha20 (test sites only)
- 1.9.16 (production)
- 1.9.16p1 (production)
-</verb>
-The above system means that whenever someone looks at the samba ftp
-site they will be able to grab the highest numbered release without an
-alpha in the name and be sure of getting the current recommended
-version.
-
-<sect1> What platforms are supported? <p> <label id="platforms">
-Many different platforms have run Samba successfully. The platforms
-most widely used and thus best tested are Linux and SunOS.
-
-At time of writing, the Makefile claimed support for:
-<itemize>
-<item> A/UX 3.0
-<item> AIX
-<item> Altos Series 386/1000
-<item> Amiga
-<item> Apollo Domain/OS sr10.3
-<item> BSDI
-<item> B.O.S. (Bull Operating System)
-<item> Cray, Unicos 8.0
-<item> Convex
-<item> DGUX.
-<item> DNIX.
-<item> FreeBSD
-<item> HP-UX
-<item> Intergraph.
-<item> Linux with/without shadow passwords and quota
-<item> LYNX 2.3.0
-<item> MachTen (a unix like system for Macintoshes)
-<item> Motorola 88xxx/9xx range of machines
-<item> NetBSD
-<item> NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for Mach).
-<item> OS/2 using EMX 0.9b
-<item> OSF1
-<item> QNX 4.22
-<item> RiscIX.
-<item> RISCOs 5.0B
-<item> SEQUENT.
-<item> SCO (including: 3.2v2, European dist., OpenServer 5)
-<item> SGI.
-<item> SMP_DC.OSx v1.1-94c079 on Pyramid S series
-<item> SONY NEWS, NEWS-OS (4.2.x and 6.1.x)
-<item> SUNOS 4
-<item> SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')
-<item> Sunsoft ISC SVR3V4
-<item> SVR4
-<item> System V with some berkely extensions (Motorola 88k R32V3.2).
-<item> ULTRIX.
-<item> UNIXWARE
-<item> UXP/DS
-</itemize>
-
-<sect1> How can I find out more about Samba? <p> <label id="more">
-There are a number of places to look for more information on Samba, including:
-<itemize>
-<item>Two mailing lists devoted to discussion of Samba-related matters.
-<item>The newsgroup, comp.protocols.smb, which has a great deal of discussion on Samba.
-<item>The WWW site 'SAMBA Web Pages' at <url url="http://samba.edu.au/samba/"> includes:
- <itemize>
- <item>Links to man pages and documentation, including this FAQ
- <item>A comprehensive survey of Samba users.
- <item>A searchable hypertext archive of the Samba mailing list.
- <item>Links to Samba source code, binaries, and mirrors of both.
- </itemize>
-<item>The long list of topic documentation. These files can be found in the 'docs' directory of the Samba source, or at <url url="ftp://samba.anu.edu.au/pub/samba/docs/">
- <itemize>
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Application_Serving.txt" name="Application_Serving.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt" name="BROWSING.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/BUGS.txt" name="BUGS.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/DIAGNOSIS.txt" name="DIAGNOSIS.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/DNIX.txt" name="DNIX.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN.txt" name="DOMAIN.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN_CONTROL.txt" name="CONTROL.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt" name="ENCRYPTION.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Faxing.txt" name="Faxing.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/GOTCHAS.txt" name="GOTCHAS.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/HINTS.txt" name="HINTS.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.sambatar" name="INSTALL.sambatar">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.txt" name="INSTALL.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/MIRRORS" name="MIRRORS">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/NetBIOS.txt" name="NetBIOS.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/OS2.txt" name="OS2.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/PROJECTS" name="PROJECTS">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Passwords.txt" name="Passwords.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Printing.txt" name="Printing.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/README.DCEDFS" name="README.DCEDFS">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/README.OS2" name="README.OS2">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/README.jis" name="README.jis">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/README.sambatar" name="README.sambatar">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/SCO.txt" name="SCO.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/SMBTAR.notes" name="SMBTAR.notes">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Speed.txt" name="Speed.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Support.txt" name="Support.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/THANKS" name="THANKS">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Tracing.txt" name="Tracing.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/UNIX-SMB.txt" name="SMB.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/Warp.txt" name="Warp.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/WinNT.txt" name="WinNT.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/history" name="history">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt" name="level.txt">
- <item><url url="ftp://samba.anu.edu.au/pub/samba/docs/wfw_slip.htm" name="slip.htm">
- </itemize>
-</itemize>
-
-<sect1>How do I subscribe to the Samba Mailing Lists?<p><label id="mailinglist">
-Send email to <htmlurl url="mailto:listproc@samba.anu.edu.au" name="listproc@samba.anu.edu.au">. Make sure the subject line is
-blank, and include the following two lines in the body of the message:
-<tscreen><verb>
-subscribe samba Firstname Lastname
-subscribe samba-announce Firstname Lastname
-</verb></tscreen>
-Obviously you should substitute YOUR first name for "Firstname" and
-YOUR last name for "Lastname"! Try not to send any signature stuff, it
-sometimes confuses the list processor.
-
-The samba list is a digest list - every eight hours or so it
-regurgitates a single message containing all the messages that have
-been received by the list since the last time and sends a copy of this
-message to all subscribers.
-
-If you stop being interested in Samba, please send another email to
-<htmlurl url="mailto:listproc@samba.anu.edu.au" name="listproc@samba.anu.edu.au">. Make sure the subject line is blank, and
-include the following two lines in the body of the message:
-<tscreen><verb>
-unsubscribe samba
-unsubscribe samba-announce
-</verb></tscreen>
-The <bf>From:</bf> line in your message <em>MUST</em> be the same address you used when
-you subscribed.
-
-<sect1> Something's gone wrong - what should I do? <p> <label id="wrong">
-<bf>[#] *** IMPORTANT! *** [#]</bf>
-<p>DO NOT post messages on mailing lists or in newsgroups until you have
-carried out the first three steps given here!
-
-Firstly, see if there are any likely looking entries in this FAQ! If
-you have just installed Samba, have you run through the checklist in
-<url url="ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt" name="DIAGNOSIS.txt">? It can save you a lot of time and effort.
-DIAGNOSIS.txt can also be found in the docs directory of the Samba distribution.
-
-Secondly, read the man pages for smbd, nmbd and smb.conf, looking for
-topics that relate to what you are trying to do.
-
-Thirdly, if there is no obvious solution to hand, try to get a look at
-the log files for smbd and/or nmbd for the period during which you
-were having problems. You may need to reconfigure the servers to
-provide more extensive debugging information - usually level 2 or
-level 3 provide ample debugging info. Inspect these logs closely,
-looking particularly for the string "Error:".
-
-Fourthly, if you still haven't got anywhere, ask the mailing list or
-newsgroup. In general nobody minds answering questions provided you
-have followed the preceding steps. It might be a good idea to scan the
-archives of the mailing list, which are available through the Samba
-web site described in the previous
-section.
-
-If you successfully solve a problem, please mail the FAQ maintainer a
-succinct description of the symptom, the problem and the solution, so
-I can incorporate it in the next version.
-
-If you make changes to the source code, _please_ submit these patches
-so that everyone else gets the benefit of your work. This is one of
-the most important aspects to the maintainence of Samba. Send all
-patches to <htmlurl url="mailto:samba-bugs@samba.anu.edu.au" name="samba-bugs@samba.anu.edu.au">. Do not send patches to Andrew Tridgell or any
-other individual, they may be lost if you do.
-
-<sect1> Pizza supply details <p> <label id="pizza">
-Those who have registered in the Samba survey as "Pizza Factory" will
-already know this, but the rest may need some help. Andrew doesn't ask
-for payment, but he does appreciate it when people give him
-pizza. This calls for a little organisation when the pizza donor is
-twenty thousand kilometres away, but it has been done.
-
-Method 1: Ring up your local branch of an international pizza chain
-and see if they honour their vouchers internationally. Pizza Hut do,
-which is how the entire Canberra Linux Users Group got to eat pizza
-one night, courtesy of someone in the US
-
-Method 2: Ring up a local pizza shop in Canberra and quote a credit
-card number for a certain amount, and tell them that Andrew will be
-collecting it (don't forget to tell him.) One kind soul from Germany
-did this.
-
-Method 3: Purchase a pizza voucher from your local pizza shop that has
-no international affiliations and send it to Andrew. It is completely
-useless but he can hang it on the wall next to the one he already has
-from Germany :-)
-
-Method 4: Air freight him a pizza with your favourite regional
-flavours. It will probably get stuck in customs or torn apart by
-hungry sniffer dogs but it will have been a noble gesture.
-
-<sect>Compiling and installing Samba on a Unix host<p><label id="unix_install">
-
-<sect1>I can't see the Samba server in any browse lists!<p><label id="no_browse">
- See <url url="ftp://samba.anu.edu.au/pub/samba/BROWSING.txt" name="BROWSING.txt">
- for more information on browsing. Browsing.txt can also be found
- in the docs directory of the Samba source.
-
-If your GUI client does not permit you to select non-browsable
-servers, you may need to do so on the command line. For example, under
-Lan Manager you might connect to the above service as disk drive M:
-thusly:
-<tscreen><verb>
- net use M: \\mary\fred
-</verb></tscreen>
-The details of how to do this and the specific syntax varies from
-client to client - check your client's documentation.
-
-<sect1>Some files that I KNOW are on the server doesn't show up when I view the files from my client! <p> <label id="missing_files">
-See the next question.
-<sect1>Some files on the server show up with really wierd filenames when I view the files from my client! <p> <label id="strange_filenames">
-If you check what files are not showing up, you will note that they
-are files which contain upper case letters or which are otherwise not
-DOS-compatible (ie, they are not legal DOS filenames for some reason).
-
-The Samba server can be configured either to ignore such files
-completely, or to present them to the client in "mangled" form. If you
-are not seeing the files at all, the Samba server has most likely been
-configured to ignore them. Consult the man page smb.conf(5) for
-details of how to change this - the parameter you need to set is
-"mangled names = yes".
-
-<sect1>My client reports "cannot locate specified computer" or similar<p><label id="cant_see_server">
-This indicates one of three things: You supplied an incorrect server
-name, the underlying TCP/IP layer is not working correctly, or the
-name you specified cannot be resolved.
-
-After carefully checking that the name you typed is the name you
-should have typed, try doing things like pinging a host or telnetting
-to somewhere on your network to see if TCP/IP is functioning OK. If it
-is, the problem is most likely name resolution.
-
-If your client has a facility to do so, hardcode a mapping between the
-hosts IP and the name you want to use. For example, with Man Manager
-or Windows for Workgroups you would put a suitable entry in the file
-LMHOSTS. If this works, the problem is in the communication between
-your client and the netbios name server. If it does not work, then
-there is something fundamental wrong with your naming and the solution
-is beyond the scope of this document.
-
-If you do not have any server on your subnet supplying netbios name
-resolution, hardcoded mappings are your only option. If you DO have a
-netbios name server running (such as the Samba suite's nmbd program),
-the problem probably lies in the way it is set up. Refer to Section
-Two of this FAQ for more ideas.
-
-By the way, remember to REMOVE the hardcoded mapping before further
-tests :-)
-
-<sect1>My client reports "cannot locate specified share name" or similar<p> <label id="cant_see_share">
-This message indicates that your client CAN locate the specified
-server, which is a good start, but that it cannot find a service of
-the name you gave.
-
-The first step is to check the exact name of the service you are
-trying to connect to (consult your system administrator). Assuming it
-exists and you specified it correctly (read your client's doco on how
-to specify a service name correctly), read on:
-
-<itemize>
-<item> Many clients cannot accept or use service names longer than eight characters.
-<item> Many clients cannot accept or use service names containing spaces.
-<item> Some servers (not Samba though) are case sensitive with service names.
-<item> Some clients force service names into upper case.
-</itemize>
-
-<sect1>My client reports "cannot find domain controller", "cannot log on to the network" or similar <p> <label id="cant_see_net">
-Nothing is wrong - Samba does not implement the primary domain name
-controller stuff for several reasons, including the fact that the
-whole concept of a primary domain controller and "logging in to a
-network" doesn't fit well with clients possibly running on multiuser
-machines (such as users of smbclient under Unix). Having said that,
-several developers are working hard on building it in to the next
-major version of Samba. If you can contribute, send a message to
-<htmlurl url="mailto:samba-bugs@samba.anu.edu.au" name="samba-bugs@samba.anu.edu.au"> !
-
-Seeing this message should not affect your ability to mount redirected
-disks and printers, which is really what all this is about.
-
-For many clients (including Windows for Workgroups and Lan Manager),
-setting the domain to STANDALONE at least gets rid of the message.
-
-<sect1>Printing doesn't work :-(<p> <label id="no_printing">
-Make sure that the specified print command for the service you are
-connecting to is correct and that it has a fully-qualified path (eg.,
-use "/usr/bin/lpr" rather than just "lpr").
-
-Make sure that the spool directory specified for the service is
-writable by the user connected to the service. In particular the user
-"nobody" often has problems with printing, even if it worked with an
-earlier version of Samba. Try creating another guest user other than
-"nobody".
-
-Make sure that the user specified in the service is permitted to use
-the printer.
-
-Check the debug log produced by smbd. Search for the printer name and
-see if the log turns up any clues. Note that error messages to do with
-a service ipc$ are meaningless - they relate to the way the client
-attempts to retrieve status information when using the LANMAN1
-protocol.
-
-If using WfWg then you need to set the default protocol to TCP/IP, not
-Netbeui. This is a WfWg bug.
-
-If using the Lanman1 protocol (the default) then try switching to
-coreplus. Also not that print status error messages don't mean
-printing won't work. The print status is received by a different
-mechanism.
-
-<sect1>My programs install on the server OK, but refuse to work properly<p><label id="programs_wont_run">
-There are numerous possible reasons for this, but one MAJOR
-possibility is that your software uses locking. Make sure you are
-using Samba 1.6.11 or later. It may also be possible to work around
-the problem by setting "locking=no" in the Samba configuration file
-for the service the software is installed on. This should be regarded
-as a strictly temporary solution.
-
-In earlier Samba versions there were some difficulties with the very
-latest Microsoft products, particularly Excel 5 and Word for Windows
-6. These should have all been solved. If not then please let Andrew
-Tridgell know via email at <htmlurl url="mailto:samba-bugs@samba.anu.edu.au" name="samba-bugs@samba.anu.edu.au">.
-
-<sect1>My "server string" doesn't seem to be recognised<p><label id="bad_server_string">
-OR My client reports the default setting, eg. "Samba 1.9.15p4", instead
-of what I have changed it to in the smb.conf file.
-
-You need to use the -C option in nmbd. The "server string" affects
-what smbd puts out and -C affects what nmbd puts out.
-
-Current versions of Samba (1.9.16 +) have combined these options into
-the "server string" field of smb.conf, -C for nmbd is now obsolete.
-
-<sect1>My client reports "This server is not configured to list shared resources" <p> <label id="cant_list_shares">
-Your guest account is probably invalid for some reason. Samba uses the
-guest account for browsing in smbd. Check that your guest account is
-valid.
-
-See also 'guest account' in smb.conf man page.
-
-<sect1>Log message "you appear to have a trapdoor uid system" <p><label id="trapdoor_uid">
-This can have several causes. It might be because you are using a uid
-or gid of 65535 or -1. This is a VERY bad idea, and is a big security
-hole. Check carefully in your /etc/passwd file and make sure that no
-user has uid 65535 or -1. Especially check the "nobody" user, as many
-broken systems are shipped with nobody setup with a uid of 65535.
-
-It might also mean that your OS has a trapdoor uid/gid system :-)
-
-This means that once a process changes effective uid from root to
-another user it can't go back to root. Unfortunately Samba relies on
-being able to change effective uid from root to non-root and back
-again to implement its security policy. If your OS has a trapdoor uid
-system this won't work, and several things in Samba may break. Less
-things will break if you use user or server level security instead of
-the default share level security, but you may still strike
-problems.
-
-The problems don't give rise to any security holes, so don't panic,
-but it does mean some of Samba's capabilities will be unavailable.
-In particular you will not be able to connect to the Samba server as
-two different uids at once. This may happen if you try to print as a
-"guest" while accessing a share as a normal user. It may also affect
-your ability to list the available shares as this is normally done as
-the guest user.
-
-Complain to your OS vendor and ask them to fix their system.
-
-Note: the reason why 65535 is a VERY bad choice of uid and gid is that
-it casts to -1 as a uid, and the setreuid() system call ignores (with
-no error) uid changes to -1. This means any daemon attempting to run
-as uid 65535 will actually run as root. This is not good!
-
-<sect>Common client questions<p> <label id="client_questions">
-
-<sect1>Are there any Macintosh clients for Samba?<p> <label id="mac_clients">
-Yes! Thursby now have a CIFS Client / Server called DAVE - see <url url="http://www.thursby.com/">.
-They test it against Windows 95, Windows NT and samba for compatibility issues.
-At the time of writing, DAVE was at version 1.0.1. The 1.0.0 to 1.0.1 update is available
-as a free download from the Thursby web site (the speed of finder copies has
-been greatly enhanced, and there are bug-fixes included).
-
-Alternatives - There are two free implementations of AppleTalk for
-several kinds of UNIX machnes, and several more commercial ones.
-These products allow you to run file services and print services
-natively to Macintosh users, with no additional support required on
-the Macintosh. The two free omplementations are Netatalk,
-<url url="http://www.umich.edu/~rsug/netatalk/">, and CAP,
-<url url="http://www.cs.mu.oz.au/appletalk/atalk.html">. What Samba offers
-MS Windows users, these packages offer to Macs. For more info on
-these packages, Samba, and Linux (and other UNIX-based systems)
-see <url url="http://www.eats.com/linux_mac_win.html">
-
-<sect1>"Session request failed (131,130)" error<p> <label id="sess_req_fail">
-The following answer is provided by John E. Miller:
-
-I'll assume that you're able to ping back and forth between the
-machines by IP address and name, and that you're using some security
-model where you're confident that you've got user IDs and passwords
-right. The logging options (-d3 or greater) can help a lot with that.
-DNS and WINS configuration can also impact connectivity as well.
-
-Now, on to 'scope id's. Somewhere in your Win95 TCP/IP network
-configuration (I'm too much of an NT bigot to know where it's located
-in the Win95 setup, but I'll have to learn someday since I teach for a
-Microsoft Solution Provider Authorized Tech Education Center - what an
-acronym...) [Note: It's under Control Panel | Network | TCP/IP | WINS
-Configuration] there's a little text entry field called something like
-'Scope ID'.
-
-This field essentially creates 'invisible' sub-workgroups on the same
-wire. Boxes can only see other boxes whose Scope IDs are set to the
-exact same value - it's sometimes used by OEMs to configure their
-boxes to browse only other boxes from the same vendor and, in most
-environments, this field should be left blank. If you, in fact, have
-something in this box that EXACT value (case-sensitive!) needs to be
-provided to smbclient and nmbd as the -i (lowercase) parameter. So, if
-your Scope ID is configured as the string 'SomeStr' in Win95 then
-you'd have to use smbclient -iSomeStr [otherparms] in connecting to
-it.
-
-<sect1>How do I synchronise my PC's clock with my Samba server? <p><label id="synchronise_clock">
-To syncronize your PC's clock with your Samba server:
-<itemize>
-<item> Copy timesync.pif to your windows directory
- <item> timesync.pif can be found at:
- <url
-url="http://samba.anu.edu.au/samba/binaries/miscellaneous/timesync.pif">
-<item> Add timesync.pif to your 'Start Up' group/folder
-<item> Open the properties dialog box for the program/icon
-<item> Make sure the 'Run Minimized' option is set in program 'Properties'
-<iteM> Change the command line section that reads [\\sambahost] to reflect the name of your server.
-<item> Close the properties dialog box by choosing 'OK'
-</itemize>
-Each time you start your computer (or login for Win95) your PC will
-synchronize its clock with your Samba server.
-
-Alternativley, if you clients support Domain Logons, you can setup Domain Logons with Samba
- - see: <url url="ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt" name="BROWSING.txt"> *** for more information.
-<p>Then add
-<tscreen><verb>
-NET TIME \\%L /SET /YES
-</verb></tscreen>
-as one of the lines in the logon script.
-<sect1>Problems with WinDD, NTrigue, WinCenterPro etc<p>
-<label id="multiple_session_clients">
-
-All of the above programs are applications that sit on an NT box and
-allow multiple users to access the NT GUI applications from remote
-workstations (often over X).
-
-What has this got to do with Samba? The problem comes when these users
-use filemanager to mount shares from a Samba server. The most common
-symptom is that the first user to connect get correct file permissions
-and has a nice day, but subsequent connections get logged in as the
-same user as the first person to login. They find that they cannot
-access files in their own home directory, but that they can access
-files in the first users home directory (maybe not such a nice day
-after all?)
-
-Why does this happen? The above products all share a common heritage
-(and code base I believe). They all open just a single TCP based SMB
-connection to the Samba server, and requests from all users are piped
-over this connection. This is unfortunate, but not fatal.
-
-It means that if you run your Samba server in share level security
-(the default) then things will definately break as described
-above. The share level SMB security model has no provision for
-multiple user IDs on the one SMB connection. See <url url="ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt" name="security_level.txt"> in
-the docs for more info on share/user/server level security.
-
-If you run in user or server level security then you have a chance,
-but only if you have a recent version of Samba (at least 1.9.15p6). In
-older versions bugs in Samba meant you still would have had problems.
-
-If you have a trapdoor uid system in your OS then it will never work
-properly. Samba needs to be able to switch uids on the connection and
-it can't if your OS has a trapdoor uid system. You'll know this
-because Samba will note it in your logs.
-
-Also note that you should not use the magic "homes" share name with
-products like these, as otherwise all users will end up with the same
-home directory. Use [\\server\username] instead.
-
-<sect1>Problem with printers under NT<p> <label id="nt_printers">
-This info from Stefan Hergeth
-hergeth@f7axp1.informatik.fh-muenchen.de may be useful:
-
- A network-printer (with ethernetcard) is connected to the NT-Clients
-via our UNIX-Fileserver (SAMBA-Server), like the configuration told by
- Matthew Harrell harrell@leech.nrl.navy.mil (see WinNT.txt)
-<enum>
-<item>If a user has choosen this printer as the default printer in his
- NT-Session and this printer is not connected to the network
- (e.g. switched off) than this user has a problem with the SAMBA-
- connection of his filesystems. It's very slow.
-
-<item>If the printer is connected to the network everything works fine.
-
-<item>When the smbd ist started with debug level 3, you can see that the
- NT spooling system try to connect to the printer many times. If the
- printer ist not connected to the network this request fails and the
- NT spooler is wasting a lot of time to connect to the printer service.
- This seems to be the reason for the slow network connection.
-
-<item>Maybe it's possible to change this behaviour by setting different
- printer properties in the Print-Manager-Menu of NT, but i didn't try it yet.
-</enum>
-
-<sect1>Why are my file's timestamps off by an hour, or by a few hours?<p><label id="dst_bugs">
-This is from Paul Eggert eggert@twinsun.com.
-
-Most likely it's a problem with your time zone settings.
-
-Internally, Samba maintains time in traditional Unix format,
-namely, the number of seconds since 1970-01-01 00:00:00 Universal Time
-(or ``GMT''), not counting leap seconds.
-
-On the server side, Samba uses the Unix TZ variable to convert
-internal timestamps to and from local time. So on the server side, there are
-two things to get right.
-<enum>
-<item>The Unix system clock must have the correct Universal time.
- Use the shell command "sh -c 'TZ=UTC0 date'" to check this.
-
-<item>The TZ environment variable must be set on the server
- before Samba is invoked. The details of this depend on the
- server OS, but typically you must edit a file whose name is
- /etc/TIMEZONE or /etc/default/init, or run the command `zic -l'.
-
-<item>TZ must have the correct value.
-<enum>
- <item>If possible, use geographical time zone settings
- (e.g. TZ='America/Los_Angeles' or perhaps
- TZ=':US/Pacific'). These are supported by most
- popular Unix OSes, are easier to get right, and are
- more accurate for historical timestamps. If your
- operating system has out-of-date tables, you should be
- able to update them from the public domain time zone
- tables at <url url="ftp://elsie.nci.nih.gov/pub/">.
-
- <item>If your system does not support geographical timezone
- settings, you must use a Posix-style TZ strings, e.g.
- TZ='PST8PDT,M4.1.0/2,M10.5.0/2' for US Pacific time.
- Posix TZ strings can take the following form (with optional
- items in brackets):
-<verb>
- StdOffset[Dst[Offset],Date/Time,Date/Time]
-</verb>
- where:
-<itemize>
-<item> `Std' is the standard time designation (e.g. `PST').
-
-<item> `Offset' is the number of hours behind UTC (e.g. `8').
- Prepend a `-' if you are ahead of UTC, and
- append `:30' if you are at a half-hour offset.
- Omit all the remaining items if you do not use
- daylight-saving time.
-
-<item> `Dst' is the daylight-saving time designation
- (e.g. `PDT').
-
- The optional second `Offset' is the number of
- hours that daylight-saving time is behind UTC.
- The default is 1 hour ahead of standard time.
-
-<item> `Date/Time,Date/Time' specify when daylight-saving
- time starts and ends. The format for a date is
- `Mm.n.d', which specifies the dth day (0 is Sunday)
- of the nth week of the mth month, where week 5 means
- the last such day in the month. The format for a
- time is [h]h[:mm[:ss]], using a 24-hour clock.
-</itemize>
- Other Posix string formats are allowed but you don't want
- to know about them.
-</enum>
-</enum>
-On the client side, you must make sure that your client's clock and
-time zone is also set appropriately. [[I don't know how to do this.]]
-Samba traditionally has had many problems dealing with time zones, due
-to the bizarre ways that Microsoft network protocols handle time
-zones. A common symptom is for file timestamps to be off by an hour.
-To work around the problem, try disconnecting from your Samba server
-and then reconnecting to it; or upgrade your Samba server to
-1.9.16alpha10 or later.
-
-<sect1> How do I set the printer driver name correctly? <p><label id="printer_driver_name">
-Question:
- On NT, I opened "Printer Manager" and "Connect to Printer".
- Enter ["\\ptdi270\ps1"] in the box of printer. I got the
- following error message:
-<tscreen><verb>
- You do not have sufficient access to your machine
- to connect to the selected printer, since a driver
- needs to be installed locally.
-</verb></tscreen>
-Answer:
-
-In the more recent versions of Samba you can now set the "printer
-driver" in smb.conf. This tells the client what driver to use. For
-example:
-<tscreen><verb>
- printer driver = HP LaserJet 4L
-</verb></tscreen>
-with this, NT knows to use the right driver. You have to get this string
-exactly right.
-
-To find the exact string to use, you need to get to the dialog box in
-your client where you select which printer driver to install. The
-correct strings for all the different printers are shown in a listbox
-in that dialog box.
-
-You could also try setting the driver to NULL like this:
-<tscreen><verb>
- printer driver = NULL
-</verb></tscreen>
-this is effectively what older versions of Samba did, so if that
-worked for you then give it a go. If this does work then let us know via <htmlurl url="mailto:samba-bugs@samba.anu.edu.au" name="samba-bugs@samba.anu.edu.au">,
-and we'll make it the default. Currently the default is a 0 length
-string.
-
-<sect1>I've applied NT 4.0 SP3, and now I can't access Samba shares, Why?<p><label id="NT_SP3_FIX">
-As of SP3, Microsoft has decided that they will no longer default to
-passing clear text passwords over the network. To enable access to
-Samba shares from NT 4.0 SP3, you must do <bf>ONE</bf> of two things:
-<enum>
-<item> Set the Samba configuration option 'security = user' and implement all of the stuff detailed in <url url="ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt" name="ENCRYPTION.txt">.
-<item> Follow Microsoft's directions for setting your NT box to allow plain text passwords. see <url url="http://www.microsoft.com/kb/articles/q166/7/30.htm" name="Knowledge Base Article Q166730">
-</enum>
-
-<sect>Specific client application problems<p> <label id="client_problems">
-
-<sect1>MS Office Setup reports "Cannot change properties of '\MSOFFICE\SETUP.INI'"<p> <label id="cant_change_properties">
-When installing MS Office on a Samba drive for which you have admin
-user permissions, ie. admin users = username, you will find the
-setup program unable to complete the installation.
-
-To get around this problem, do the installation without admin user
-permissions The problem is that MS Office Setup checks that a file is
-rdonly by trying to open it for writing.
-
-Admin users can always open a file for writing, as they run as root.
-You just have to install as a non-admin user and then use "chown -R"
-to fix the owner.
-
-<sect>Miscellaneous<p> <label id="miscellaneous">
-<sect1>Is Samba Year 2000 compliant?<p><label id="Year2000Compliant">
-The CIFS protocol that Samba implements
-negotiates times in various formats, all of which
-are able to cope with dates beyond 2000.
-
-</article>
diff --git a/docs/faq/sambafaq.txt b/docs/faq/sambafaq.txt
deleted file mode 100644
index 7108846ae67..00000000000
--- a/docs/faq/sambafaq.txt
+++ /dev/null
@@ -1,1122 +0,0 @@
- Samba FAQ
- Paul Blackman, ictinus@samba.anu.edu.au
- v 0.8, June '97
-
- This is the Frequently Asked Questions (FAQ) document for Samba, the
- free and very popular SMB server product. An SMB server allows file
- and printer connections from clients such as Windows, OS/2, Linux and
- others. Current to version 1.9.17. Please send any corrections to the
- author.
- ______________________________________________________________________
-
- Table of Contents:
-
- 1. General Information
-
- 1.1. What is Samba?
-
- 1.2. What is the current version of Samba?
-
- 1.3. Where can I get it?
-
- 1.4. What do the version numbers mean?
-
- 1.5. What platforms are supported?
-
- 1.6. How can I find out more about Samba?
-
- 1.7. How do I subscribe to the Samba Mailing Lists?
-
- 1.8. Something's gone wrong - what should I do?
-
- 1.9. Pizza supply details
-
- 2. Compiling and installing Samba on a Unix host
-
- 2.1. I can't see the Samba server in any browse lists!
-
- 2.2. Some files that I KNOW are on the server doesn't show up when
- I view the files from my client!
-
- 2.3. Some files on the server show up with really wierd filenames
- when I view the files from my client!
-
- 2.4. My client reports "cannot locate specified computer" or
- similar
-
- 2.5. My client reports "cannot locate specified share name" or
- similar
-
- 2.6. My client reports "cannot find domain controller", "cannot log
- on to the network" or similar
-
- 2.7. Printing doesn't work :-(
-
- 2.8. My programs install on the server OK, but refuse to work
- properly
-
- 2.9. My "server string" doesn't seem to be recognised
-
- 2.10. My client reports "This server is not configured to list
- shared resources"
-
- 2.11. Log message "you appear to have a trapdoor uid system"
-
- 3. Common client questions
-
- 3.1. Are there any Macintosh clients for Samba?
-
- 3.2. "Session request failed (131,130)" error
-
- 3.3. How do I synchronise my PC's clock with my Samba server?
-
- 3.4. Problems with WinDD, NTrigue, WinCenterPro etc
-
- 3.5. Problem with printers under NT
-
- 3.6. Why are my file's timestamps off by an hour, or by a few
- hours?
-
- 3.7. How do I set the printer driver name correctly?
-
- 3.8. I've applied NT 4.0 SP3, and now I can't access Samba shares,
- Why?
-
- 4. Specific client application problems
-
- 4.1. MS Office Setup reports "Cannot change properties of
- 'MSOFFICEUP.INI'"
-
- 5. Miscellaneous
-
- 5.1. Is Samba Year 2000 compliant?
- ______________________________________________________________________
-
- 11.. GGeenneerraall IInnffoorrmmaattiioonn
-
-
-
- All about Samba - what it is, how to get it, related sources of
- information, how to understand the version numbering scheme, pizza
- details
-
-
- 11..11.. WWhhaatt iiss SSaammbbaa??
-
-
- Samba is a suite of programs which work together to allow clients to
- access to a server's filespace and printers via the SMB (Server
- Message Block) protocol. Initially written for Unix, Samba now also
- runs on Netware, OS/2 and VMS.
-
- In practice, this means that you can redirect disks and printers to
- Unix disks and printers from Lan Manager clients, Windows for
- Workgroups 3.11 clients, Windows NT clients, Linux clients and OS/2
- clients. There is also a generic Unix client program supplied as part
- of the suite which allows Unix users to use an ftp-like interface to
- access filespace and printers on any other SMB servers. This gives the
- capability for these operating systems to behave much like a LAN
- Server or Windows NT Server machine, only with added functionality and
- flexibility designed to make life easier for administrators.
-
- The components of the suite are (in summary):
-
-
- +o ssmmbbdd, the SMB server. This handles actual connections from clients,
- doing all the file, permission and username work
-
- +o nnmmbbdd, the Netbios name server, which helps clients locate servers,
- doing the browsing work and managing domains as this capability is
- being built into Samba
-
-
- +o ssmmbbcclliieenntt, the Unix-hosted client program
-
- +o ssmmbbrruunn, a little 'glue' program to help the server run external
- programs
-
- +o tteessttpprrnnss, a program to test server access to printers
-
- +o tteessttppaarrmmss, a program to test the Samba configuration file for
- correctness
-
- +o ssmmbb..ccoonnff, the Samba configuration file
-
- +o ssmmbbpprriinntt, a sample script to allow a Unix host to use smbclient to
- print to an SMB server
-
- +o DDooccuummeennttaattiioonn!! DON'T neglect to read it - you will save a great
- deal of time!
-
- The suite is supplied with full source (of course!) and is GPLed.
-
- The primary creator of the Samba suite is Andrew Tridgell. Later
- versions incorporate much effort by many net.helpers. The man pages
- and this FAQ were originally written by Karl Auer.
-
-
- 11..22.. WWhhaatt iiss tthhee ccuurrrreenntt vveerrssiioonn ooff SSaammbbaa??
-
-
- At time of writing, the current version was 1.9.17. If you want to be
- sure check the bottom of the change-log file.
- <ftp://samba.anu.edu.au/pub/samba/alpha/change-log>
-
- For more information see ``What do the version numbers mean?''
-
-
- 11..33.. WWhheerree ccaann II ggeett iitt??
-
-
- The Samba suite is available via anonymous ftp from samba.anu.edu.au.
- The latest and greatest versions of the suite are in the directory:
-
- /pub/samba/
-
- Development (read "alpha") versions, which are NOT necessarily stable
- and which do NOT necessarily have accurate documentation, are
- available in the directory:
-
- /pub/samba/alpha
-
- Note that binaries are NOT included in any of the above. Samba is
- distributed ONLY in source form, though binaries may be available from
- other sites. Recent versions of some Linux distributions, for example,
- do contain Samba binaries for that platform.
-
-
- 11..44.. WWhhaatt ddoo tthhee vveerrssiioonn nnuummbbeerrss mmeeaann??
-
-
- It is not recommended that you run a version of Samba with the word
- "alpha" in its name unless you know what you are doing and are willing
- to do some debugging. Many, many people just get the latest
- recommended stable release version and are happy. If you are brave, by
- all means take the plunge and help with the testing and development -
- but don't install it on your departmental server. Samba is typically
- very stable and safe, and this is mostly due to the policy of many
- public releases.
- How the scheme works:
-
- 1. When major changes are made the version number is increased. For
- example, the transition from 1.9.15 to 1.9.16. However, this
- version number will not appear immediately and people should
- continue to use 1.9.15 for production systems (see next point.)
-
- 2. Just after major changes are made the software is considered
- unstable, and a series of alpha releases are distributed, for
- example 1.9.16alpha1. These are for testing by those who know what
- they are doing. The "alpha" in the filename will hopefully scare
- off those who are just looking for the latest version to install.
-
- 3. When Andrew thinks that the alphas have stabilised to the point
- where he would recommend new users install it, he renames it to the
- same version number without the alpha, for example 1.9.16.
-
- 4. Inevitably bugs are found in the "stable" releases and minor patch
- levels are released which give us the pXX series, for example
- 1.9.16p2.
-
- So the progression goes:
-
- 1.9.15p7 (production)
- 1.9.15p8 (production)
- 1.9.16alpha1 (test sites only)
- :
- 1.9.16alpha20 (test sites only)
- 1.9.16 (production)
- 1.9.16p1 (production)
-
-
- The above system means that whenever someone looks at the samba ftp
- site they will be able to grab the highest numbered release without an
- alpha in the name and be sure of getting the current recommended ver-
- sion.
-
-
- 11..55.. WWhhaatt ppllaattffoorrmmss aarree ssuuppppoorrtteedd??
-
-
- Many different platforms have run Samba successfully. The platforms
- most widely used and thus best tested are Linux and SunOS.
-
- At time of writing, the Makefile claimed support for:
-
- +o A/UX 3.0
-
- +o AIX
-
- +o Altos Series 386/1000
-
- +o Amiga
-
- +o Apollo Domain/OS sr10.3
-
- +o BSDI
-
- +o B.O.S. (Bull Operating System)
-
- +o Cray, Unicos 8.0
-
- +o Convex
-
- +o DGUX.
-
- +o DNIX.
-
- +o FreeBSD
-
- +o HP-UX
-
- +o Intergraph.
-
- +o Linux with/without shadow passwords and quota
-
- +o LYNX 2.3.0
-
- +o MachTen (a unix like system for Macintoshes)
-
- +o Motorola 88xxx/9xx range of machines
-
- +o NetBSD
-
- +o NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for
- Mach).
-
- +o OS/2 using EMX 0.9b
-
- +o OSF1
-
- +o QNX 4.22
-
- +o RiscIX.
-
- +o RISCOs 5.0B
-
- +o SEQUENT.
-
- +o SCO (including: 3.2v2, European dist., OpenServer 5)
-
- +o SGI.
-
- +o SMP_DC.OSx v1.1-94c079 on Pyramid S series
-
- +o SONY NEWS, NEWS-OS (4.2.x and 6.1.x)
-
- +o SUNOS 4
-
- +o SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')
-
- +o Sunsoft ISC SVR3V4
-
- +o SVR4
-
- +o System V with some berkely extensions (Motorola 88k R32V3.2).
-
- +o ULTRIX.
-
- +o UNIXWARE
-
- +o UXP/DS
-
-
- 11..66.. HHooww ccaann II ffiinndd oouutt mmoorree aabboouutt SSaammbbaa??
-
-
- There are a number of places to look for more information on Samba,
- including:
-
- +o Two mailing lists devoted to discussion of Samba-related matters.
-
- +o The newsgroup, comp.protocols.smb, which has a great deal of
- discussion on Samba.
-
- +o The WWW site 'SAMBA Web Pages' at <http://samba.edu.au/samba/>
- includes:
-
- +o Links to man pages and documentation, including this FAQ
-
- +o A comprehensive survey of Samba users.
-
- +o A searchable hypertext archive of the Samba mailing list.
-
- +o Links to Samba source code, binaries, and mirrors of both.
-
- +o The long list of topic documentation. These files can be found in
- the 'docs' directory of the Samba source, or at
- <ftp://samba.anu.edu.au/pub/samba/docs/>
-
- +o Application_Serving.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/Application_Serving.txt>
-
- +o BROWSING.txt <ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt>
-
- +o BUGS.txt <ftp://samba.anu.edu.au/pub/samba/docs/BUGS.txt>
-
- +o DIAGNOSIS.txt <ftp://samba.anu.edu.au/pub/samba/docs/DIAGNOSIS.txt>
-
- +o DNIX.txt <ftp://samba.anu.edu.au/pub/samba/docs/DNIX.txt>
-
- +o DOMAIN.txt <ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN.txt>
-
- +o CONTROL.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/DOMAIN_CONTROL.txt>
-
- +o ENCRYPTION.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt>
-
- +o Faxing.txt <ftp://samba.anu.edu.au/pub/samba/docs/Faxing.txt>
-
- +o GOTCHAS.txt <ftp://samba.anu.edu.au/pub/samba/docs/GOTCHAS.txt>
-
- +o HINTS.txt <ftp://samba.anu.edu.au/pub/samba/docs/HINTS.txt>
-
- +o INSTALL.sambatar
- <ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.sambatar>
-
- +o INSTALL.txt <ftp://samba.anu.edu.au/pub/samba/docs/INSTALL.txt>
-
- +o MIRRORS <ftp://samba.anu.edu.au/pub/samba/docs/MIRRORS>
-
- +o NetBIOS.txt <ftp://samba.anu.edu.au/pub/samba/docs/NetBIOS.txt>
-
- +o OS2.txt <ftp://samba.anu.edu.au/pub/samba/docs/OS2.txt>
-
- +o PROJECTS <ftp://samba.anu.edu.au/pub/samba/docs/PROJECTS>
-
- +o Passwords.txt <ftp://samba.anu.edu.au/pub/samba/docs/Passwords.txt>
-
- +o Printing.txt <ftp://samba.anu.edu.au/pub/samba/docs/Printing.txt>
-
- +o README.DCEDFS <ftp://samba.anu.edu.au/pub/samba/docs/README.DCEDFS>
-
- +o README.OS2 <ftp://samba.anu.edu.au/pub/samba/docs/README.OS2>
-
- +o README.jis <ftp://samba.anu.edu.au/pub/samba/docs/README.jis>
-
- +o README.sambatar
- <ftp://samba.anu.edu.au/pub/samba/docs/README.sambatar>
-
- +o SCO.txt <ftp://samba.anu.edu.au/pub/samba/docs/SCO.txt>
-
- +o SMBTAR.notes <ftp://samba.anu.edu.au/pub/samba/docs/SMBTAR.notes>
-
- +o Speed.txt <ftp://samba.anu.edu.au/pub/samba/docs/Speed.txt>
-
- +o Support.txt <ftp://samba.anu.edu.au/pub/samba/docs/Support.txt>
-
- +o THANKS <ftp://samba.anu.edu.au/pub/samba/docs/THANKS>
-
- +o Tracing.txt <ftp://samba.anu.edu.au/pub/samba/docs/Tracing.txt>
-
- +o SMB.txt <ftp://samba.anu.edu.au/pub/samba/docs/UNIX-SMB.txt>
-
- +o Warp.txt <ftp://samba.anu.edu.au/pub/samba/docs/Warp.txt>
-
- +o WinNT.txt <ftp://samba.anu.edu.au/pub/samba/docs/WinNT.txt>
-
- +o history <ftp://samba.anu.edu.au/pub/samba/docs/history>
-
- +o level.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt>
-
- +o slip.htm <ftp://samba.anu.edu.au/pub/samba/docs/wfw_slip.htm>
-
-
- 11..77.. HHooww ddoo II ssuubbssccrriibbee ttoo tthhee SSaammbbaa MMaaiilliinngg LLiissttss??
-
-
- Send email to listproc@samba.anu.edu.au. Make sure the subject line is
- blank, and include the following two lines in the body of the message:
-
-
- subscribe samba Firstname Lastname
- subscribe samba-announce Firstname Lastname
-
-
-
-
- Obviously you should substitute YOUR first name for "Firstname" and
- YOUR last name for "Lastname"! Try not to send any signature stuff, it
- sometimes confuses the list processor.
-
- The samba list is a digest list - every eight hours or so it
- regurgitates a single message containing all the messages that have
- been received by the list since the last time and sends a copy of this
- message to all subscribers.
-
- If you stop being interested in Samba, please send another email to
- listproc@samba.anu.edu.au. Make sure the subject line is blank, and
- include the following two lines in the body of the message:
-
-
- unsubscribe samba
- unsubscribe samba-announce
-
-
-
-
- The FFrroomm:: line in your message _M_U_S_T be the same address you used when
- you subscribed.
-
-
- 11..88.. SSoommeetthhiinngg''ss ggoonnee wwrroonngg -- wwhhaatt sshhoouulldd II ddoo??
-
-
- ## ****** IIMMPPOORRTTAANNTT!! ****** ##
-
- DO NOT post messages on mailing lists or in newsgroups until you have
- carried out the first three steps given here!
-
- Firstly, see if there are any likely looking entries in this FAQ! If
- you have just installed Samba, have you run through the checklist in
- DIAGNOSIS.txt <ftp://samba.anu.edu.au/pub/samba/DIAGNOSIS.txt>? It can
- save you a lot of time and effort. DIAGNOSIS.txt can also be found in
- the docs directory of the Samba distribution.
-
- Secondly, read the man pages for smbd, nmbd and smb.conf, looking for
- topics that relate to what you are trying to do.
-
- Thirdly, if there is no obvious solution to hand, try to get a look at
- the log files for smbd and/or nmbd for the period during which you
- were having problems. You may need to reconfigure the servers to
- provide more extensive debugging information - usually level 2 or
- level 3 provide ample debugging info. Inspect these logs closely,
- looking particularly for the string "Error:".
-
- Fourthly, if you still haven't got anywhere, ask the mailing list or
- newsgroup. In general nobody minds answering questions provided you
- have followed the preceding steps. It might be a good idea to scan the
- archives of the mailing list, which are available through the Samba
- web site described in the previous section.
-
- If you successfully solve a problem, please mail the FAQ maintainer a
- succinct description of the symptom, the problem and the solution, so
- I can incorporate it in the next version.
-
- If you make changes to the source code, _please_ submit these patches
- so that everyone else gets the benefit of your work. This is one of
- the most important aspects to the maintainence of Samba. Send all
- patches to samba-bugs@samba.anu.edu.au. Do not send patches to Andrew
- Tridgell or any other individual, they may be lost if you do.
-
-
- 11..99.. PPiizzzzaa ssuuppppllyy ddeettaaiillss
-
-
- Those who have registered in the Samba survey as "Pizza Factory" will
- already know this, but the rest may need some help. Andrew doesn't ask
- for payment, but he does appreciate it when people give him pizza.
- This calls for a little organisation when the pizza donor is twenty
- thousand kilometres away, but it has been done.
-
- Method 1: Ring up your local branch of an international pizza chain
- and see if they honour their vouchers internationally. Pizza Hut do,
- which is how the entire Canberra Linux Users Group got to eat pizza
- one night, courtesy of someone in the US
-
- Method 2: Ring up a local pizza shop in Canberra and quote a credit
- card number for a certain amount, and tell them that Andrew will be
- collecting it (don't forget to tell him.) One kind soul from Germany
- did this.
-
- Method 3: Purchase a pizza voucher from your local pizza shop that has
- no international affiliations and send it to Andrew. It is completely
- useless but he can hang it on the wall next to the one he already has
- from Germany :-)
-
-
- Method 4: Air freight him a pizza with your favourite regional
- flavours. It will probably get stuck in customs or torn apart by
- hungry sniffer dogs but it will have been a noble gesture.
-
-
- 22.. CCoommppiilliinngg aanndd iinnssttaalllliinngg SSaammbbaa oonn aa UUnniixx hhoosstt
-
-
-
- 22..11.. II ccaann''tt sseeee tthhee SSaammbbaa sseerrvveerr iinn aannyy bbrroowwssee lliissttss!!
-
-
- See BROWSING.txt <ftp://samba.anu.edu.au/pub/samba/BROWSING.txt> for
- more information on browsing. Browsing.txt can also be found in the
- docs directory of the Samba source.
-
- If your GUI client does not permit you to select non-browsable
- servers, you may need to do so on the command line. For example, under
- Lan Manager you might connect to the above service as disk drive M:
- thusly:
-
-
- net use M: \\mary\fred
-
-
-
-
- The details of how to do this and the specific syntax varies from
- client to client - check your client's documentation.
-
-
- 22..22.. SSoommee ffiilleess tthhaatt II KKNNOOWW aarree oonn tthhee sseerrvveerr ddooeessnn''tt sshhooww uupp wwhheenn II
- vviieeww tthhee ffiilleess ffrroomm mmyy cclliieenntt!!
-
-
- See the next question.
-
- 22..33.. SSoommee ffiilleess oonn tthhee sseerrvveerr sshhooww uupp wwiitthh rreeaallllyy wwiieerrdd ffiilleennaammeess
- wwhheenn II vviieeww tthhee ffiilleess ffrroomm mmyy cclliieenntt!!
-
-
- If you check what files are not showing up, you will note that they
- are files which contain upper case letters or which are otherwise not
- DOS-compatible (ie, they are not legal DOS filenames for some reason).
-
- The Samba server can be configured either to ignore such files
- completely, or to present them to the client in "mangled" form. If you
- are not seeing the files at all, the Samba server has most likely been
- configured to ignore them. Consult the man page smb.conf(5) for
- details of how to change this - the parameter you need to set is
- "mangled names = yes".
-
-
- 22..44.. MMyy cclliieenntt rreeppoorrttss ""ccaannnnoott llooccaattee ssppeecciiffiieedd ccoommppuutteerr"" oorr ssiimmiillaarr
-
-
- This indicates one of three things: You supplied an incorrect server
- name, the underlying TCP/IP layer is not working correctly, or the
- name you specified cannot be resolved.
-
- After carefully checking that the name you typed is the name you
- should have typed, try doing things like pinging a host or telnetting
- to somewhere on your network to see if TCP/IP is functioning OK. If it
- is, the problem is most likely name resolution.
-
-
- If your client has a facility to do so, hardcode a mapping between the
- hosts IP and the name you want to use. For example, with Man Manager
- or Windows for Workgroups you would put a suitable entry in the file
- LMHOSTS. If this works, the problem is in the communication between
- your client and the netbios name server. If it does not work, then
- there is something fundamental wrong with your naming and the solution
- is beyond the scope of this document.
-
- If you do not have any server on your subnet supplying netbios name
- resolution, hardcoded mappings are your only option. If you DO have a
- netbios name server running (such as the Samba suite's nmbd program),
- the problem probably lies in the way it is set up. Refer to Section
- Two of this FAQ for more ideas.
-
- By the way, remember to REMOVE the hardcoded mapping before further
- tests :-)
-
-
- 22..55.. MMyy cclliieenntt rreeppoorrttss ""ccaannnnoott llooccaattee ssppeecciiffiieedd sshhaarree nnaammee"" oorr ssiimmii--
- llaarr
-
-
- This message indicates that your client CAN locate the specified
- server, which is a good start, but that it cannot find a service of
- the name you gave.
-
- The first step is to check the exact name of the service you are
- trying to connect to (consult your system administrator). Assuming it
- exists and you specified it correctly (read your client's doco on how
- to specify a service name correctly), read on:
-
-
- +o Many clients cannot accept or use service names longer than eight
- characters.
-
- +o Many clients cannot accept or use service names containing spaces.
-
- +o Some servers (not Samba though) are case sensitive with service
- names.
-
- +o Some clients force service names into upper case.
-
-
- 22..66.. MMyy cclliieenntt rreeppoorrttss ""ccaannnnoott ffiinndd ddoommaaiinn ccoonnttrroolllleerr"",, ""ccaannnnoott lloogg
- oonn ttoo tthhee nneettwwoorrkk"" oorr ssiimmiillaarr
-
-
- Nothing is wrong - Samba does not implement the primary domain name
- controller stuff for several reasons, including the fact that the
- whole concept of a primary domain controller and "logging in to a
- network" doesn't fit well with clients possibly running on multiuser
- machines (such as users of smbclient under Unix). Having said that,
- several developers are working hard on building it in to the next
- major version of Samba. If you can contribute, send a message to
- samba-bugs@samba.anu.edu.au !
-
- Seeing this message should not affect your ability to mount redirected
- disks and printers, which is really what all this is about.
-
- For many clients (including Windows for Workgroups and Lan Manager),
- setting the domain to STANDALONE at least gets rid of the message.
-
-
-
-
-
- 22..77.. PPrriinnttiinngg ddooeessnn''tt wwoorrkk ::--((
-
-
- Make sure that the specified print command for the service you are
- connecting to is correct and that it has a fully-qualified path (eg.,
- use "/usr/bin/lpr" rather than just "lpr").
-
- Make sure that the spool directory specified for the service is
- writable by the user connected to the service. In particular the user
- "nobody" often has problems with printing, even if it worked with an
- earlier version of Samba. Try creating another guest user other than
- "nobody".
-
- Make sure that the user specified in the service is permitted to use
- the printer.
-
- Check the debug log produced by smbd. Search for the printer name and
- see if the log turns up any clues. Note that error messages to do with
- a service ipc$ are meaningless - they relate to the way the client
- attempts to retrieve status information when using the LANMAN1
- protocol.
-
- If using WfWg then you need to set the default protocol to TCP/IP, not
- Netbeui. This is a WfWg bug.
-
- If using the Lanman1 protocol (the default) then try switching to
- coreplus. Also not that print status error messages don't mean
- printing won't work. The print status is received by a different
- mechanism.
-
-
- 22..88.. MMyy pprrooggrraammss iinnssttaallll oonn tthhee sseerrvveerr OOKK,, bbuutt rreeffuussee ttoo wwoorrkk pprroopp--
- eerrllyy
-
-
- There are numerous possible reasons for this, but one MAJOR
- possibility is that your software uses locking. Make sure you are
- using Samba 1.6.11 or later. It may also be possible to work around
- the problem by setting "locking=no" in the Samba configuration file
- for the service the software is installed on. This should be regarded
- as a strictly temporary solution.
-
- In earlier Samba versions there were some difficulties with the very
- latest Microsoft products, particularly Excel 5 and Word for Windows
- 6. These should have all been solved. If not then please let Andrew
- Tridgell know via email at samba-bugs@samba.anu.edu.au.
-
-
- 22..99.. MMyy ""sseerrvveerr ssttrriinngg"" ddooeessnn''tt sseeeemm ttoo bbee rreeccooggnniisseedd
-
-
- OR My client reports the default setting, eg. "Samba 1.9.15p4",
- instead of what I have changed it to in the smb.conf file.
-
- You need to use the -C option in nmbd. The "server string" affects
- what smbd puts out and -C affects what nmbd puts out.
-
- Current versions of Samba (1.9.16 +) have combined these options into
- the "server string" field of smb.conf, -C for nmbd is now obsolete.
-
-
- 22..1100.. MMyy cclliieenntt rreeppoorrttss ""TThhiiss sseerrvveerr iiss nnoott ccoonnffiigguurreedd ttoo lliisstt sshhaarreedd
- rreessoouurrcceess""
-
-
- Your guest account is probably invalid for some reason. Samba uses the
- guest account for browsing in smbd. Check that your guest account is
- valid.
-
- See also 'guest account' in smb.conf man page.
-
-
- 22..1111.. LLoogg mmeessssaaggee ""yyoouu aappppeeaarr ttoo hhaavvee aa ttrraappddoooorr uuiidd ssyysstteemm""
-
-
- This can have several causes. It might be because you are using a uid
- or gid of 65535 or -1. This is a VERY bad idea, and is a big security
- hole. Check carefully in your /etc/passwd file and make sure that no
- user has uid 65535 or -1. Especially check the "nobody" user, as many
- broken systems are shipped with nobody setup with a uid of 65535.
-
- It might also mean that your OS has a trapdoor uid/gid system :-)
-
- This means that once a process changes effective uid from root to
- another user it can't go back to root. Unfortunately Samba relies on
- being able to change effective uid from root to non-root and back
- again to implement its security policy. If your OS has a trapdoor uid
- system this won't work, and several things in Samba may break. Less
- things will break if you use user or server level security instead of
- the default share level security, but you may still strike problems.
-
- The problems don't give rise to any security holes, so don't panic,
- but it does mean some of Samba's capabilities will be unavailable. In
- particular you will not be able to connect to the Samba server as two
- different uids at once. This may happen if you try to print as a
- "guest" while accessing a share as a normal user. It may also affect
- your ability to list the available shares as this is normally done as
- the guest user.
-
- Complain to your OS vendor and ask them to fix their system.
-
- Note: the reason why 65535 is a VERY bad choice of uid and gid is that
- it casts to -1 as a uid, and the setreuid() system call ignores (with
- no error) uid changes to -1. This means any daemon attempting to run
- as uid 65535 will actually run as root. This is not good!
-
-
- 33.. CCoommmmoonn cclliieenntt qquueessttiioonnss
-
-
-
-
- 33..11.. AArree tthheerree aannyy MMaacciinnttoosshh cclliieennttss ffoorr SSaammbbaa??
-
-
- Yes! Thursby now have a CIFS Client / Server called DAVE - see
- <http://www.thursby.com/>. They test it against Windows 95, Windows
- NT and samba for compatibility issues. At the time of writing, DAVE
- was at version 1.0.1. The 1.0.0 to 1.0.1 update is available as a free
- download from the Thursby web site (the speed of finder copies has
- been greatly enhanced, and there are bug-fixes included).
-
- Alternatives - There are two free implementations of AppleTalk for
- several kinds of UNIX machnes, and several more commercial ones.
- These products allow you to run file services and print services
- natively to Macintosh users, with no additional support required on
- the Macintosh. The two free omplementations are Netatalk,
- <http://www.umich.edu/~rsug/netatalk/>, and CAP,
- <http://www.cs.mu.oz.au/appletalk/atalk.html>. What Samba offers MS
- Windows users, these packages offer to Macs. For more info on these
- packages, Samba, and Linux (and other UNIX-based systems) see
- <http://www.eats.com/linux_mac_win.html>
- 33..22.. SSeessssiioonn rreeqquueesstt ffaaiilleedd ((113311,,113300))"" eerrrroorr
-
-
- The following answer is provided by John E. Miller:
-
- I'll assume that you're able to ping back and forth between the
- machines by IP address and name, and that you're using some security
- model where you're confident that you've got user IDs and passwords
- right. The logging options (-d3 or greater) can help a lot with that.
- DNS and WINS configuration can also impact connectivity as well.
-
- Now, on to 'scope id's. Somewhere in your Win95 TCP/IP network
- configuration (I'm too much of an NT bigot to know where it's located
- in the Win95 setup, but I'll have to learn someday since I teach for a
- Microsoft Solution Provider Authorized Tech Education Center - what an
- acronym...) Note: It's under Control Panel | Network | TCP/IP | WINS
- Configuration there's a little text entry field called something like
-
- This field essentially creates 'invisible' sub-workgroups on the same
- wire. Boxes can only see other boxes whose Scope IDs are set to the
- exact same value - it's sometimes used by OEMs to configure their
- boxes to browse only other boxes from the same vendor and, in most
- environments, this field should be left blank. If you, in fact, have
- something in this box that EXACT value (case-sensitive!) needs to be
- provided to smbclient and nmbd as the -i (lowercase) parameter. So, if
- your Scope ID is configured as the string 'SomeStr' in Win95 then
- you'd have to use smbclient -iSomeStr otherparms in connecting to it.
-
-
- 33..33.. HHooww ddoo II ssyynncchhrroonniissee mmyy PPCC''ss cclloocckk wwiitthh mmyy SSaammbbaa sseerrvveerr??
-
-
- To syncronize your PC's clock with your Samba server:
-
- +o Copy timesync.pif to your windows directory
-
- +o timesync.pif can be found at:
- <http://samba.anu.edu.au/samba/binaries/miscellaneous/timesync.pif>
-
- +o Add timesync.pif to your 'Start Up' group/folder
-
- +o Open the properties dialog box for the program/icon
-
- +o Make sure the 'Run Minimized' option is set in program 'Properties'
-
- +o Change the command line section that reads \sambahost to reflect
- the name of your server.
-
- +o Close the properties dialog box by choosing 'OK'
-
- Each time you start your computer (or login for Win95) your PC will
- synchronize its clock with your Samba server.
-
- Alternativley, if you clients support Domain Logons, you can setup
- Domain Logons with Samba - see: BROWSING.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/BROWSING.txt> *** for more
- information.
-
- Then add
-
-
- NET TIME \\%L /SET /YES
-
-
-
-
- as one of the lines in the logon script.
-
- 33..44.. PPrroobblleemmss wwiitthh WWiinnDDDD,, NNTTrriigguuee,, WWiinnCCeenntteerrPPrroo eettcc
-
-
- All of the above programs are applications that sit on an NT box and
- allow multiple users to access the NT GUI applications from remote
- workstations (often over X).
-
- What has this got to do with Samba? The problem comes when these users
- use filemanager to mount shares from a Samba server. The most common
- symptom is that the first user to connect get correct file permissions
- and has a nice day, but subsequent connections get logged in as the
- same user as the first person to login. They find that they cannot
- access files in their own home directory, but that they can access
- files in the first users home directory (maybe not such a nice day
- after all?)
-
- Why does this happen? The above products all share a common heritage
- (and code base I believe). They all open just a single TCP based SMB
- connection to the Samba server, and requests from all users are piped
- over this connection. This is unfortunate, but not fatal.
-
- It means that if you run your Samba server in share level security
- (the default) then things will definately break as described above.
- The share level SMB security model has no provision for multiple user
- IDs on the one SMB connection. See security_level.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/security_level.txt> in the docs
- for more info on share/user/server level security.
-
- If you run in user or server level security then you have a chance,
- but only if you have a recent version of Samba (at least 1.9.15p6). In
- older versions bugs in Samba meant you still would have had problems.
-
- If you have a trapdoor uid system in your OS then it will never work
- properly. Samba needs to be able to switch uids on the connection and
- it can't if your OS has a trapdoor uid system. You'll know this
- because Samba will note it in your logs.
-
- Also note that you should not use the magic "homes" share name with
- products like these, as otherwise all users will end up with the same
- home directory. Use \serversername instead.
-
-
- 33..55.. PPrroobblleemm wwiitthh pprriinntteerrss uunnddeerr NNTT
-
-
- This info from Stefan Hergeth hergeth@f7axp1.informatik.fh-muenchen.de
- may be useful:
-
- A network-printer (with ethernetcard) is connected to the NT-Clients
- via our UNIX-Fileserver (SAMBA-Server), like the configuration told by
- Matthew Harrell harrell@leech.nrl.navy.mil (see WinNT.txt)
-
- 1. If a user has choosen this printer as the default printer in his
- NT-Session and this printer is not connected to the network (e.g.
- switched off) than this user has a problem with the SAMBA-
- connection of his filesystems. It's very slow.
-
- 2. If the printer is connected to the network everything works fine.
-
- 3. When the smbd ist started with debug level 3, you can see that the
- NT spooling system try to connect to the printer many times. If the
- printer ist not connected to the network this request fails and the
- NT spooler is wasting a lot of time to connect to the printer
- service. This seems to be the reason for the slow network
- connection.
-
- 4. Maybe it's possible to change this behaviour by setting different
- printer properties in the Print-Manager-Menu of NT, but i didn't
- try it yet.
-
-
- 33..66.. WWhhyy aarree mmyy ffiillee''ss ttiimmeessttaammppss ooffff bbyy aann hhoouurr,, oorr bbyy aa ffeeww hhoouurrss??
-
-
- This is from Paul Eggert eggert@twinsun.com.
-
- Most likely it's a problem with your time zone settings.
-
- Internally, Samba maintains time in traditional Unix format, namely,
- the number of seconds since 1970-01-01 00:00:00 Universal Time (or
- ``GMT''), not counting leap seconds.
-
- On the server side, Samba uses the Unix TZ variable to convert
- internal timestamps to and from local time. So on the server side,
- there are two things to get right.
-
- 1. The Unix system clock must have the correct Universal time. Use
- the shell command "sh -c 'TZ=UTC0 date'" to check this.
-
- 2. The TZ environment variable must be set on the server before Samba
- is invoked. The details of this depend on the server OS, but
- typically you must edit a file whose name is /etc/TIMEZONE or
- /etc/default/init, or run the command `zic -l'.
-
- 3. TZ must have the correct value.
-
- a. If possible, use geographical time zone settings (e.g.
- TZ='America/Los_Angeles' or perhaps TZ=':US/Pacific'). These
- are supported by most popular Unix OSes, are easier to get
- right, and are more accurate for historical timestamps. If your
- operating system has out-of-date tables, you should be able to
- update them from the public domain time zone tables at
- <ftp://elsie.nci.nih.gov/pub/>.
-
- b. If your system does not support geographical timezone settings,
- you must use a Posix-style TZ strings, e.g.
- TZ='PST8PDT,M4.1.0/2,M10.5.0/2' for US Pacific time. Posix TZ
- strings can take the following form (with optional items in
- brackets):
-
- StdOffset[Dst[Offset],Date/Time,Date/Time]
-
-
- where:
-
- +o `Std' is the standard time designation (e.g. `PST').
-
- +o `Offset' is the number of hours behind UTC (e.g. `8'). Prepend
- a `-' if you are ahead of UTC, and append `:30' if you are at a
- half-hour offset. Omit all the remaining items if you do not
- use daylight-saving time.
-
- +o `Dst' is the daylight-saving time designation (e.g. `PDT').
-
- The optional second `Offset' is the number of hours that
- daylight-saving time is behind UTC. The default is 1 hour ahead
- of standard time.
-
- +o `Date/Time,Date/Time' specify when daylight-saving time starts
- and ends. The format for a date is `Mm.n.d', which specifies
- the dth day (0 is Sunday) of the nth week of the mth month,
- where week 5 means the last such day in the month. The format
- for a time is hh:mm[:ss], using a 24-hour clock.
-
- Other Posix string formats are allowed but you don't want to
- know about them.
-
- On the client side, you must make sure that your client's clock and
- time zone is also set appropriately. [I don't know how to do
- this.] Samba traditionally has had many problems dealing with time
- zones, due to the bizarre ways that Microsoft network protocols
- handle time zones. A common symptom is for file timestamps to be
- off by an hour. To work around the problem, try disconnecting from
- your Samba server and then reconnecting to it; or upgrade your
- Samba server to 1.9.16alpha10 or later.
-
-
- 33..77.. HHooww ddoo II sseett tthhee pprriinntteerr ddrriivveerr nnaammee ccoorrrreeccttllyy??
-
-
- Question: On NT, I opened "Printer Manager" and "Connect to Printer".
- Enter "\ptdi270s1"
- in the box of printer. I got the following error message:
-
-
- You do not have sufficient access to your machine
- to connect to the selected printer, since a driver
- needs to be installed locally.
-
-
-
-
- Answer:
-
- In the more recent versions of Samba you can now set the "printer
- driver" in smb.conf. This tells the client what driver to use. For
- example:
-
-
- printer driver = HP LaserJet 4L
-
-
-
-
- with this, NT knows to use the right driver. You have to get this
- string exactly right.
-
- To find the exact string to use, you need to get to the dialog box in
- your client where you select which printer driver to install. The
- correct strings for all the different printers are shown in a listbox
- in that dialog box.
-
- You could also try setting the driver to NULL like this:
-
-
- printer driver = NULL
-
-
-
-
- this is effectively what older versions of Samba did, so if that
- worked for you then give it a go. If this does work then let us know
- via samba-bugs@samba.anu.edu.au, and we'll make it the default. Cur-
- rently the default is a 0 length string.
-
-
- 33..88.. II''vvee aapppplliieedd NNTT 44..00 SSPP33,, aanndd nnooww II ccaann''tt aacccceessss SSaammbbaa sshhaarreess,,
- WWhhyy??
-
-
- As of SP3, Microsoft has decided that they will no longer default to
- passing clear text passwords over the network. To enable access to
- Samba shares from NT 4.0 SP3, you must do OONNEE of two things:
-
- 1. Set the Samba configuration option 'security = user' and implement
- all of the stuff detailed in ENCRYPTION.txt
- <ftp://samba.anu.edu.au/pub/samba/docs/ENCRYPTION.txt>.
-
- 2. Follow Microsoft's directions for setting your NT box to allow
- plain text passwords. see Knowledge Base Article Q166730
- <http://www.microsoft.com/kb/articles/q166/7/30.htm>
-
-
- 44.. SSppeecciiffiicc cclliieenntt aapppplliiccaattiioonn pprroobblleemmss
-
-
-
-
- 44..11.. MMSS OOffffiiccee SSeettuupp rreeppoorrttss ""CCaannnnoott cchhaannggee pprrooppeerrttiieess ooff ''MMSSOOFF--
- FFIICCEEUUPP..IINNII''""
-
-
- When installing MS Office on a Samba drive for which you have admin
- user permissions, ie. admin users = username, you will find the setup
- program unable to complete the installation.
-
- To get around this problem, do the installation without admin user
- permissions The problem is that MS Office Setup checks that a file is
- rdonly by trying to open it for writing.
-
- Admin users can always open a file for writing, as they run as root.
- You just have to install as a non-admin user and then use "chown -R"
- to fix the owner.
-
-
- 55.. MMiisscceellllaanneeoouuss
-
-
-
- 55..11.. IIss SSaammbbaa YYeeaarr 22000000 ccoommpplliiaanntt??
-
-
- The CIFS protocol that Samba implements negotiates times in various
- formats, all of which are able to cope with dates beyond 2000.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/history b/docs/history
deleted file mode 100644
index dd9e83719ff..00000000000
--- a/docs/history
+++ /dev/null
@@ -1,196 +0,0 @@
-Contributor: Andrew Tridgell and the Samba Team
-Date: June 27, 1997
-Satus: Always out of date! (Would not be the same without it!)
-
-Subject: A bit of history and a bit of fun
-============================================================================
-
-This is a short history of this project. It's not supposed to be
-comprehensive, just enough so that new users can get a feel for where
-this project has come from and maybe where it's going to.
-
-The whole thing really started in December 1991. I was (and still am)
-a PhD student in the Computer Sciences Laboratory at the Australian
-National University, in Canberra, Australia. We had just got a
-beta copy of eXcursion from Digital, and I was testing it on my PC. At
-this stage I was a MS-DOS user, dabbling in windows.
-
-eXcursion ran (at the time) only with Dec's `Pathworks' network for
-DOS. I had up till then been using PC-NFS to connect to our local sun
-workstations, and was reasonably happy with it. In order to run
-pathworks I had to stop using PC-NFS and try using pathworks to mount
-disk space. Unfortunately pathworks was only available for digital
-workstations running VMS or Ultrix so I couldn't mount from the suns
-anymore.
-
-I had access to a a decstation 3100 running Ultrix that I used to
-administer, and I got the crazy notion that the protocol that
-pathworks used to talk to ultrix couldn't be that hard, and maybe I
-could work it out. I had never written a network program before, and
-certainly didn't know what a socket was.
-
-In a few days, after looking at some example code for sockets, I
-discovered it was pretty easy to write a program to "spy" on the file
-sharing protocol. I wrote and installed this program (the sockspy.c
-program supplied with this package) and captured everything that the
-pathworks client said to the pathworks server.
-
-I then tried writing short C programs (using Turbo C under DOS) to do
-simple file operations on the network drive (open, read, cd etc) and
-looked at the packets that the server and client exchanged. From this
-I worked out what some of the bytes in the packets meant, and started
-to write my own program to do the same thing on a sun.
-
-After a day or so more I had my first successes and actually managed
-to get a connection and to read a file. From there it was all
-downhill, and a week later I was happily (if a little unreliably)
-mounting disk space from a sun to my PC running pathworks. The server
-code had a lot of `magic' values in it, which seemed to be always
-present with the ultrix server. It was not till 2 years later that I
-found out what all these values meant.
-
-Anyway, I thought other people might be interested in what I had done,
-so I asked a few people at uni, and noone seemed much interested. I
-also spoke to a person at Digital in Canberra (the person who had
-organised a beta test of eXcursion) and asked if I could distribute
-what I'd done, or was it illegal. It was then that I first heard the
-word "netbios" when he told me that he thought it was all covered by a
-spec of some sort (the netbios spec) and thus what I'd done was not
-only legal, but silly.
-
-I found the netbios spec after asking around a bit (the RFC1001 and
-RFC1002 specs) and found they looked nothing like what I'd written, so
-I thought maybe the Digital person was mistaken. I didn't realise RFCs
-referred to the name negotiation and packet encapsulation over TCP/IP,
-and what I'd written was really a SMB implementation.
-
-Anyway, he encouraged me to release it so I put out "Server 0.1" in
-January 1992. I got quite a good response from people wanting to use
-pathworks with non-digital unix workstations, and I soon fixed a few
-bugs, and released "Server 0.5" closely followed by "Server 1.0". All
-three releases came out within about a month of each other.
-
-At this point I got an X Terminal on my desk, and I no longer needed eXcursion
-and I prompty forgot about the whole project, apart from a few people
-who e-mailed me occasionally about it.
-
-Nearly two years then passed with just occasional e-mails asking about
-new versions and bugs. I even added a note to the ftp site asking for
-a volunteer to take over the code as I no longer used it. No one
-volunteered.
-
-During this time I did hear from a couple of people who said it should
-be possible to use my code with Lanmanager, but I never got any
-definite confirmation.
-
-One e-mail I got about the code did, however, make an impression. It
-was from Dan Shearer at the university of South Australia, and he said
-this:
-
-
- I heard a hint about a free Pathworks server for Unix in the
- Net channel of the Linux list. After quite a bit of chasing
- (and lots of interested followups from other Linux people) I
- got hold of a release news article from you, posted in Jan 92,
- from someone in the UK.
-
- Can you tell me what the latest status is? I think you might
- suddenly find a whole lot of interested hackers in the Linux
- world at least, which is a place where things tend to happen
- fast (and even some reliable code gets written, BION!)
-
-I asked him what Linux was, and he told me it was a free Unix for PCs.
-This was in November 1992 and a few months later I was a Linux
-convert! I still didn't need a pathworks server though, so I didn't do
-the port, but I think Dan did.
-
-At about this time I got an e-mail from Digital, from a person working
-on the Alpha software distribution. He asked if I would mind if they
-included my server with the "contributed" cd-rom. This was a bit of a
-shock to me as I never expected Dec to ask me if they could use my
-code! I wrote back saying it was OK, but never heard from him again. I
-don't know if it went on the cd-rom.
-
-Anyway, the next big event was in December 1993, when Dan again sent
-me an e-mail saying my server had "raised its ugly head" on
-comp.protocols.tcpip.ibmpc. I had a quick look on the group, and was
-surprised to see that there were people interested in this thing.
-
-At this time a person from our computer center offered me a couple of
-cheap ethernet cards (3c505s for $15 each) and coincidentially someone
-announced on one of the Linux channels that he had written a 3c505
-driver for Linux. I bought the cards, hacked the driver a little and
-setup a home network between my wifes PC and my Linux box. I then
-needed some way to connect the two, and I didn't own PC-NFS at home,
-so I thought maybe my server could be useful. On the newsgroup among
-the discussions of my server someone had mentioned that there was a
-free client that might work with my server that Microsoft had put up
-for ftp. I downloaded it and found to my surprise that it worked first
-time with my `pathworks' server!
-
-Well, I then did a bit of hacking, asked around a bit and found (I
-think from Dan) that the spec I needed was for the "SMB" protocol, and
-that it was available via ftp. I grabbed it and started removing all
-those ugly constants from the code, now that all was explained.
-
-On December 1st 1993 I announced the start of the "Netbios for Unix"
-project, seeding the mailing list with all the people who had e-mailed
-me over the years asking about the server.
-
-About 35 versions (and two months) later I wrote a short history of
-the project, which you have just read. There are now over a hundred
-people on the mailing list, and lots of people report that they use
-the code and like it. In a few days I will be announcing the release
-of version 1.6 to some of the more popular (and relevant) newsgroups.
-
-
-Andrew Tridgell
-6th February 1994
-
----------------------
-
-It is now May 1995 and there are about 1400 people on the mailing
-list. I got downloads from the main Samba ftp site from around 5000
-unique hosts in a two month period. There are several mirror
-sites as well. The current version number is 1.9.13.
-
----------------------
-
-
----------------------
-It's now March 1996 and version 1.9.16alpha1 has just been
-released. There have been lots of changes recently with master browser
-support and the ability to do domain logons etc. Samba has also been
-ported to OS/2, the amiga and NetWare. There are now 3000 people on
-the samba mailing list.
----------------------
-
-
----------------------
-It's now June 1997 and samba-1.9.17 is due out soon. My how time passes!
-Please refer to the WHATSNEW.txt for an update on new features. Just when
-you think you understand what is happening the ground rules change - this
-is a real world after all. Since the heady days of March 1996 there has
-been a concerted effort within the SMB protocol using community to document
-and standardize the protocols. The CIFS initiative has helped a long way
-towards creating a better understood and more interoperable environment.
-The Samba Team has grown in number and have been very active in the standards
-formation and documentation process.
-
-The net effect has been that we have had to do a lot of work to bring Samba
-into line with new features and capabilities in the SMB protocols.
-
-The past year has been a productive one with the following releases:
- 1.9.16, 1.9.16p2, 1.9.16p6, 1.9.16p9, 1.9.16p10, 1.9.16p11
-
-There are some who believe that 1.9.15p8 was the best release and others
-who would not want to be without the latest. Whatever your perception we
-hope that 1.9.17 will close the gap and convince you all that the long
-wait and the rolling changes really were worth it. Here is functionality
-and a level of code maturity that ..., well - you can be the judge!
-
-Happy SMB networking!
-Samba Team
-
-ps: The bugs are ours, so please report any you find.
----------------------
diff --git a/docs/htmldocs/wfw_slip.htm b/docs/htmldocs/wfw_slip.htm
deleted file mode 100644
index 5b4a0a5e539..00000000000
--- a/docs/htmldocs/wfw_slip.htm
+++ /dev/null
@@ -1,175 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>Peter Karrer Announces SLIP for WFW</TITLE>
-</HEAD>
-<BODY>
-<H1><I>Winserve</I></H1>
-<HR>
-<H2><I>Peter Karrer Announces SLIP for WFW</I></H2>
-[NEW 03-22-95)
-<HR>
-<B>Hello,</B>
-<P>
-I've discovered a way to run WfW's TCP/IP-32 over a SLIP packet driver. This
-allows WfW users to do Windows networking over dialup lines just like it is
-possible with NT and the Windows 95 beta!
-<P>
-For instance, you can mount Microsoft's FTP server as a network drive in File
-Manager or connect to an MS Mail post office over the Internet. Of course,
-the usual Internet stuff works as well. Another interesting site is
-WINSERVE.001; check out www.winserve.com.
-<HR>
-This method should work with any class 1 (Ethernet II) packet driver. However,
-I'm not in a position to try anything else than SLIPPER/CSLIPPER.
-<HR>
-<H3>Files you need:</H3>
-<B>WFWT32.EXE:</B> ftp://ftp.microsoft.com/bussys/msclient/wfw/wfwt32.exe
-<P>
- Microsoft's free TCP/IP for WfW. It's a self-extracting archive which
- should be executed in an empty directory.
-<P>
-<B>SLIPPER.EXE:</B> ftp://biocserver.bioc.cwru.edu/pub/dos/slipper/slippr15.zip
-<P>
- Peter Tattam's SLIP packet driver. CSLIPPER.EXE is a variant which supports
- VJ header compression.
-<P>
-<B>PDETHER.EXE:</B> ftp://sjf-lwp.idz.sjf.novell.com/odi/pdether/pde105.zip
-<P>
- Don Provan's ODI-over-Packet Driver shim. This *must* be version 1.05 (or
- above).
-<P>
-<B>LSL.COM:</B>
-<P>
- Novell's LAN Support Layer. If you're an owner of Windows 3.10, you'll
- have it on one of your install disks. Use "expand a:lsl.co_ lsl.com" to
- expand it. Microsoft has stopped bundling LSL.COM with WfW 3.11, though.
- The newest version of LSL.COM can be downloaded as part of
- ftp://ftp.novell.com/pub/netware/nwos/dosclnt12/vlms/vlmup2.exe.
- However, it's not clear if this one may be legally used outside Netware
- environments.
-<P>
-<B>NET.CFG:</B>
-<P>
- A configuration file for LSL and PDETHER. It should contain the following
- text:
-<P>
-<PRE>
-Link Support
- Buffers 8 1600
-Link Driver PDETHER
- Int 60
- Frame Ethernet_II
- Protocol IP 800 Ethernet_II
- Protocol ARP 806 Ethernet_II
- Protocol RARP 8035 Ethernet_II
-</PRE>
-<P>
-<B>DISCOMX.COM:</B>
-<P>
- A little hack of mine to disable the COM port used by the SLIP packet driver.
- Usage is e.g. "discomx 2" to disable COM2. This should be run before
- starting WfW, otherwise you'll get "device conflict" messages. Here it is:
-<P><PRE>
-begin 644 discomx.com
-F,=N)V8H.@`"P(+^!`/.N3XH="=MT!DN`XP/1XS')!R:)CP`$S2``
-`
-end
- </PRE>
- (Save this text to disk as <I>filename</I>, then run "uudecode <I>filename</I>".
- uudecode can be found, for instance, at
- ftp://ftp.switch.ch/mirror/simtel/msdos/starter/uudecode.com )
-<P>
-<B>LMHOSTS:</B>
- <P>
- An optional file which should be stored in your Windows subdirectory. It is
- used to map NetBIOS computer names to IP addresses. Example:
-<P>
-<PRE>
-198.105.232.1 ftp #PRE # ftp.microsoft.com
-204.118.34.11 winserve.001 #PRE # Winserve
-</PRE>
-<HR>
-<H3>How to install it:</H3>
-<P>
-<UL>
-<LI>Put the files mentioned above into a directory, e.g. C:\SLIP.
-<P>
-<LI>Put the following lines into AUTOEXEC.BAT:
-<P><PRE>
- cd \slip
- slipper com1 vec=60 baud=57600 ether (may vary with your modem setup)
- lsl
- pdether
- discomx 1 (must correspond to SLIPPER's COM port)
-</PRE>
- (If you use another vec= setting, you must update that in NET.CFG as well.)
- Use CSLIPPER instead of SLIPPER if your SLIP provider supports VJC.
-<P>
-<LI>Start WfW.
-<UL>
-<LI>Under Windows Setup, choose "Change Network Settings".
-<LI>Select "Install Microsoft Windows Network".
-<LI>In "Drivers...", choose "Add Adapter"
- and install the "IPXODI Support driver (Ethernet) [ODI/NDIS3]".
-<LI>In "Add Protocols...", select "Unlisted or Updated Protocol". When asked for a
- driver disk, enter the directory where you expanded WFWT32.EXE.
-<LI>Configure TCP/IP (IP address, enable LMHOSTS lookup, try 204.118.34.11 as primary
- WINS server). Remove all other protocols (NetBEUI, IPX/SPX).
-</UL>
-<P>
-<LI>Windows will probably update the first lines of AUTOEXEC.BAT with
-<P>
-<PRE>
- c:\windows\net start
- c:\windows\odihlp.exe.
-</PRE>
- The "odihlp" line must be moved behind the "pdether" line.
-<P>
-<LI>Windows will also update NET.CFG with some "Frame" lines. These must
- be removed (except "Frame Ethernet_II").
-<P>
-<LI>Somehow, you will have to dial in to your SLIP provider. I do it manually
- before slipper (or cslipper) gets loaded, using a DOS-based terminal program.
- But there are some automatic dialers around. I've seen recommendations for
- ftp://mvmpc9.ciw.uni-karlsruhe.de/x-slip/slip_it.exe.
-<P>
-<LI>To connect to Microsoft's FTP server (or Winserve) go into File Manager,
- choose "Connect Network drive" and enter "\\ftp" or "\\winserve.001" into
- the "Path:" field.
-</UL>
-<HR>
-<H3>How it works:</H3>
-<P>
-Microsoft's TCP/IP-32 requires an NDIS3 interface. NDIS is Microsoft's way
-to interface with a network.
-<P>
-WfW also contains an NDIS3-over-ODI "shim", whose real mode component is
-ODIHLP.EXE. ODI is Novell's way to interface with a network.
-<P>
-SLIPPER is a Packet Driver (PD) for use over serial lines. PDs are everybody
-else's way to interface with a network. SLIPPER's "ether" option makes it
-look like an Ethernet PD to applications using it.
-<P>
-A "shim" is a program which simulates a network application programming
-interface on top of another.
-<P>
-There is no NDIS SLIP driver which would work with WfW.
-<P>
-There is no NDIS-over-PD shim.
-<P>
-However, there's an ODI-over-PD shim (PDETHER) and an NDIS-over-ODI shim
-(ODIHLP etc.)
-<P>
-OK, so let's do NDIS-over-ODI-over-PD!
- <P>
-This should have worked all the time; however, a non-feature in PDETHER
-versions < 1.05 has prevented the method from functioning until now.
-<HR>
-<B>Questions, suggestions etc. please to
-<P>
-<PRE>
-Peter Karrer pkarrer@ife.ee.ethz.ch
-</PRE>
-</B>
-</BODY>
-</HTML>
diff --git a/docs/manpages/nmbd.8 b/docs/manpages/nmbd.8
deleted file mode 100644
index 148e53478c2..00000000000
--- a/docs/manpages/nmbd.8
+++ /dev/null
@@ -1,231 +0,0 @@
-.TH NMBD 8 nmbd nmbd
-.SH NAME
-nmbd \- provide netbios nameserver support to clients
-.SH SYNOPSIS
-.B nmbd
-[
-.B \-D
-] [
-.B \-H
-.I netbios hosts file
-] [
-.B \-d
-.I debuglevel
-] [
-.B \-l
-.I log basename
-] [
-.B \-n
-.I netbios name
-] [
-.B \-p
-.I port number
-] [
-.B \-s
-.I configuration file
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B nmbd
-is a server that understands and can reply to netbios
-name service requests, like those produced by LanManager
-clients. It also controls browsing.
-
-LanManager clients, when they start up, may wish to locate a LanManager server.
-That is, they wish to know what IP number a specified host is using.
-
-This program simply listens for such requests, and if its own name is specified
-it will respond with the IP number of the host it is running on.
-Its "own name" is by default the name of the host it is running on,
-but this can be overriden with the
-.B \-n
-option (see "OPTIONS" below).
-
-.B nmbd
-can also be used as a WINS (Windows Internet Name Server) server.
-What this basically means is that it will respond to all name requests that
-it receives that are not broadcasts, as long as it can resolve the name.
-Resolvable names include all names in the netbios hosts file (if any, see
-.B \-H
-below), its own name, and any other names that it may have learned about
-from other browsers on the network.
-A change to previous versions is that nmbd will now no longer
-do this automatically by default.
-.SH OPTIONS
-.B \-B
-
-.RS 3
-This option is obsolete. Please use the "interfaces" option in smb.conf instead.
-.RE
-
-.B \-I
-
-.RS 3
-This option is obsolete. Please use the "interfaces" option in smb.conf instead.
-.RE
-
-.B \-D
-
-.RS 3
-If specified, this parameter causes the server to operate as a daemon. That is,
-it detaches itself and runs in the background, fielding requests on the
-appropriate port.
-
-By default, the server will NOT operate as a daemon.
-.RE
-
-.B \-C comment string
-
-.RS 3
-This option is obsolete. Please use the "server string" option in smb.conf
-instead.
-.RE
-
-.B \-G
-
-.RS 3
-This option is obsolete. Please use the "workgroup" option in smb.conf instead.
-.RE
-
-.B \-H
-.I netbios hosts file
-
-.RS 3
-It may be useful in some situations to be able to specify a list of
-netbios names for which the server should send a reply if queried.
-This option allows you to specify a file containing such a list.
-The syntax of the hosts file is similar to the standard /etc/hosts file
-format, but has some extensions.
-
-The file contains three columns. Lines beginning with a # are ignored
-as comments. The first column is an IP address, or a hostname. If it
-is a hostname then it is interpreted as the IP address returned by
-gethostbyname() when read. An IP address of 0.0.0.0 will be
-interpreted as the server's own IP address.
-
-The second column is a netbios name. This is the name that the server
-will respond to. It must be less than 20 characters long.
-
-The third column is optional, and is intended for flags. Currently the
-only flag supported is M, which means that this name is the default
-netbios name for this machine. This has the same effect as specifying the
-.B \-n
-option to
-.BR nmbd .
-
-NOTE: The G and S flags are now obsolete and are replaced by the
-"interfaces" and "remote announce" options in smb.conf.
-
-The default hosts file name is set at compile time, typically as
-.I /etc/lmhosts,
-but this may be changed in the Samba Makefile.
-
-After startup the server waits for queries, and will answer queries for
-any name known to it. This includes all names in the netbios hosts file,
-its own name, and any other names it may have learned about from other
-browsers on the network.
-
-The primary intention of the
-.B \-H
-option is to allow a mapping from netbios names to internet domain names.
-
-.B Example:
-
- # This is a sample netbios hosts file
-
- # DO NOT USE THIS FILE AS-IS
- # YOU MAY INCONVENIENCE THE OWNERS OF THESE IPs
- # if you want to include a name with a space in it then
- # use double quotes.
-
- # next add a netbios alias for a faraway host
- arvidsjaur.anu.edu.au ARVIDSJAUR
-
- # finally put in an IP for a hard to find host
- 130.45.3.213 FREDDY
-
-.RE
-.B \-N
-
-.RS 3
-This option is obsolete. Please use the "interfaces" option in smb.conf instead.
-.RE
-
-.B \-d
-.I debuglevel
-
-.RS 3
-This option sets the debug level. See
-.BR smb.conf (5).
-.RE
-
-.B \-l
-.I log file
-
-.RS 3
-The
-.I log file
-parameter specifies a path and base filename into which operational data
-from the running
-.B nmbd
-server will be logged.
-The actual log file name is generated by appending the extension ".nmb" to
-the specified base name.
-For example, if the name specified was "log" then the file log.nmb would
-contain the debugging data.
-
-The default log file is specified at compile time, typically as
-.I /var/log/log.nmb.
-.RE
-
-.B \-n
-.I netbios name
-
-.RS 3
-This option allows you to override the Netbios name that Samba uses for itself.
-.RE
-
-.B \-p
-.I port number
-.RS 3
-
-port number is a positive integer value.
-
-Don't use this option unless you are an expert, in which case you
-won't need help!
-.RE
-
-.B \-s
-.I configuration file
-
-.RS 3
-The default configuration file name is set at compile time, typically as
-.I /etc/smb.conf,
-but this may be changed in the Samba Makefile.
-
-The file specified contains the configuration details required by the server.
-See
-.BR smb.conf (5)
-for more information.
-.RE
-.SH VERSION
-
-This man page is (mostly) correct for version 1.9.16 of the Samba
-suite, plus some of the recent patches to it. These notes will
-necessarily lag behind development of the software, so it is possible
-that your version of the server has extensions or parameter semantics
-that differ from or are not covered by this man page. Please notify
-these to the address below for rectification.
-.SH SEE ALSO
-.BR inetd (8),
-.BR smbd (8),
-.BR smb.conf (5),
-.BR smbclient (1),
-.BR testparm (1),
-.BR testprns (1)
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
diff --git a/docs/manpages/samba.7 b/docs/manpages/samba.7
deleted file mode 100644
index 7260cbad396..00000000000
--- a/docs/manpages/samba.7
+++ /dev/null
@@ -1,202 +0,0 @@
-.TH SAMBA 7 Samba Samba
-.SH NAME
-Samba \- a LanManager like fileserver for UNIX
-.SH SYNOPSIS
-.B Samba
-.SH DESCRIPTION
-The
-.B Samba
-software suite is a collection of programs that implements the SMB
-protocol for UNIX systems. This protocol is sometimes also referred to
-as the LanManager or Netbios protocol.
-.SH COMPONENTS
-
-The Samba suite is made up of several components. Each component is
-described in a separate manual page. It is strongly recommended that
-you read the documentation that comes with Samba and the manual pages
-of those components that you use. If the manual pages aren't clear
-enough then please send me a patch!
-
-The
-.BR smbd (8)
-daemon provides the file and print services to SMB clients,
-such as Windows for Workgroups, Windows NT or LanManager. The
-configuration file for this daemon is described in
-.BR smb.conf (5).
-
-The
-.BR nmbd (8)
-daemon provides Netbios nameserving and browsing
-support. It can also be run interactively to query other name service
-daemons.
-
-The
-.BR smbclient (1)
-program implements a simple ftp-like client. This is
-useful for accessing SMB shares on other compatible servers (such as
-WfWg), and can also be used to allow a UNIX box to print to a printer
-attached to any SMB server (such as a PC running WfWg).
-
-The
-.BR testparm (1)
-utility allows you to test your
-.BR smb.conf (5)
-configuration file.
-
-The
-.BR smbstatus (1)
-utility allows you to tell who is currently using the
-.BR smbd (8)
-server.
-.SH AVAILABILITY
-
-The Samba software suite is licensed under the Gnu Public License. A
-copy of that license should have come with the package. You are
-encouraged to distribute copies of the Samba suite, but please keep it
-intact.
-
-The latest version of the Samba suite can be obtained via anonymous
-ftp from samba.anu.edu.au in the directory pub/samba/. It is
-also available on several mirror sites worldwide.
-
-You may also find useful information about Samba on the newsgroup
-comp.protocols.smb and the Samba mailing list. Details on how to join
-the mailing list are given in the README file that comes with Samba.
-
-If you have access to a WWW viewer (such as Netscape or Mosaic) then
-you will also find lots of useful information, including back issues
-of the Samba mailing list, at http://samba.anu.edu.au/samba/
-.SH AUTHOR
-
-The main author of the Samba suite is Andrew Tridgell. He may be
-contacted via e-mail at samba-bugs@samba.anu.edu.au.
-
-There have also been an enormous number of contributors to Samba from
-all over the world. A partial list of these contributors is included
-in the CREDITS section below. The list is, however, badly out of
-date. More up to date info may be obtained from the change-log that
-comes with the Samba source code.
-.SH CONTRIBUTIONS
-
-If you wish to contribute to the Samba project, then I suggest you
-join the Samba mailing list.
-
-If you have patches to submit or bugs to report then you may mail them
-directly to samba-bugs@samba.anu.edu.au. Note, however, that due to the
-enormous popularity of this package I may take some time to repond to
-mail. I prefer patches in "diff \-u" format.
-.SH CREDITS
-
-Contributors to the project are (in alphabetical order by email address):
-
-(NOTE: This list is very out of date)
-
- Adams, Graham
- (gadams@ddrive.demon.co.uk)
- Allison, Jeremy
- (jeremy@netcom.com)
- Andrus, Ross
- (ross@augie.insci.com)
- Auer, Karl
- (Karl.Auer@anu.edu.au)
- Bogstad, Bill
- (bogstad@cs.jhu.edu)
- Boreham, Bryan
- (Bryan@alex.com)
- Boreham, David
- (davidb@ndl.co.uk)
- Butler, Michael
- (imb@asstdc.scgt.oz.au)
- ???
- (charlie@edina.demon.co.uk)
- Chua, Michael
- (lpc@solomon.technet.sg)
- Cochran, Marc
- (mcochran@wellfleet.com)
- Dey, Martin N
- (mnd@netmgrs.co.uk)
- Errath, Maximilian
- (errath@balu.kfunigraz.ac.at)
- Fisher, Lee
- (leefi@microsoft.com)
- Foderaro, Sean
- (jkf@frisky.Franz.COM)
- Greer, Brad
- (brad@cac.washington.edu)
- Griffith, Michael A
- (grif@cs.ucr.edu)
- Grosen, Mark
- (MDGrosen@spectron.COM)
- ????
- (gunjkoa@dep.sa.gov.au)
- Haapanen, Tom
- (tomh@metrics.com)
- Hench, Mike
- (hench@cae.uwm.edu)
- Horstman, Mark A
- (mh2620@sarek.sbc.com)
- Hudson, Tim
- (tim.hudson@gslmail.mincom.oz.au)
- Hulthen, Erik Magnus
- (magnus@axiom.se)
- ???
- (imb@asstdc.scgt.oz.au)
- Iversen, Per Steinar
- (iversen@dsfys1.fi.uib.no)
- Kaara, Pasi
- (ppk@atk.tpo.fi)
- Karman, Merik
- (merik@blackadder.dsh.oz.au)
- Kiff, Martin
- (mgk@newton.npl.co.uk)
- Kiick, Chris
- (cjkiick@flinx.b11.ingr.com)
- Kukulies, Christoph
- (kuku@acds.physik.rwth-aachen.de)
- ???
- (lance@fox.com)
- Leighton, Luke
- (lkcl@pires.co.uk)
- Lendecke, Volker
- (lendecke@namu01.gwdg.de)
- ???
- (lonnie@itg.ti.com)
- Mahoney, Paul Thomas
- (ptm@xact1.xact.com)
- Mauelshagen, Heinz
- (mauelsha@ez.da.telekom.de)
- Merrick, Barry G
- (bgm@atml.co.uk)
- Mol, Marcel
- (marcel@fanout.et.tudeflt.nl)
- ???
- (njw@cpsg.com.au)
- ???
- (noses@oink.rhein.de)
- Owens, John
- (john@micros.com)
- Pierson, Jacques
- (pierson@ketje.enet.dec.com)
- Powell, Mark
- (mark@scot1.ucsalf.ac.uk)
- Reiz, Steven
- (sreiz@aie.nl)
- Schlaeger, Joerg
- (joergs@toppoint.de)
- S{rkel{, Vesa
- (vesku@rankki.kcl.fi)
- Terpstra, John
- (jht@aquasoft.com.au)
- Tridgell, Andrew
- (samba-bugs@samba.anu.edu.au)
- Troyer, Dean
- (troyer@saifr00.ateng.az.honeywell.com)
- Wakelin, Ross
- (rossw@march.co.uk)
- Wessels, Stefan
- (SWESSELS@dos-lan.cs.up.ac.za)
- Young, Ian A
- (iay@threel.co.uk)
- van der Zwan, Paul
- (paulzn@olivetti.nl)
-
diff --git a/docs/manpages/smb.conf.5 b/docs/manpages/smb.conf.5
deleted file mode 100644
index bb43941439a..00000000000
--- a/docs/manpages/smb.conf.5
+++ /dev/null
@@ -1,3643 +0,0 @@
-.TH SMB.CONF 5 smb.conf smb.conf
-.SH NAME
-smb.conf \- configuration file for smbd
-.SH SYNOPSIS
-.B smb.conf
-.SH DESCRIPTION
-The
-.B smb.conf
-file is a configuration file for the Samba suite.
-
-.B smb.conf
-contains runtime configuration information for the
-.B smbd
-program. The
-.B smbd
-program provides LanManager-like services to clients
-using the SMB protocol.
-.SH FILE FORMAT
-The file consists of sections and parameters. A section begins with the
-name of the section in square brackets and continues until the next
-section begins. Sections contain parameters of the form 'name = value'.
-
-The file is line-based - that is, each newline-terminated line represents
-either a comment, a section name or a parameter.
-
-Section and parameter names are not case sensitive.
-
-Only the first equals sign in a parameter is significant. Whitespace before
-or after the first equals sign is discarded. Leading, trailing and internal
-whitespace in section and parameter names is irrelevant. Leading and
-trailing whitespace in a parameter value is discarded. Internal whitespace
-within a parameter value is retained verbatim.
-
-Any line beginning with a semicolon is ignored, as are lines containing
-only whitespace.
-
-Any line ending in a \e is "continued" on the next line in the
-customary UNIX fashion.
-
-The values following the equals sign in parameters are all either a string
-(no quotes needed) or a boolean, which may be given as yes/no, 0/1 or
-true/false. Case is not significant in boolean values, but is preserved
-in string values. Some items such as create modes are numeric.
-.SH SERVICE DESCRIPTIONS
-Each section in the configuration file describes a service. The section name
-is the service name and the parameters within the section define the service's
-attributes.
-
-There are three special sections, [global], [homes] and [printers], which are
-described under 'special sections'. The following notes apply to ordinary
-service descriptions.
-
-A service consists of a directory to which access is being given plus a
-description of the access rights which are granted to the user of the
-service. Some housekeeping options are also specifiable.
-
-Services are either filespace services (used by the client as an extension of
-their native file systems) or printable services (used by the client to access
-print services on the host running the server).
-
-Services may be guest services, in which case no password is required to
-access them. A specified guest account is used to define access privileges
-in this case.
-
-Services other than guest services will require a password to access
-them. The client provides the username. As many clients only provide
-passwords and not usernames, you may specify a list of usernames to
-check against the password using the "user=" option in the service
-definition.
-
-Note that the access rights granted by the server are masked by the access
-rights granted to the specified or guest user by the host system. The
-server does not grant more access than the host system grants.
-
-The following sample section defines a file space service. The user has write
-access to the path /home/bar. The service is accessed via the service name
-"foo":
-
- [foo]
- path = /home/bar
- writable = true
-
-The following sample section defines a printable service. The service is
-readonly, but printable. That is, the only write access permitted is via
-calls to open, write to and close a spool file. The 'guest ok' parameter
-means access will be permitted as the default guest user (specified elsewhere):
-
- [aprinter]
- path = /usr/spool/public
- read only = true
- printable = true
- public = true
-.SH SPECIAL SECTIONS
-
-.SS The [global] section
-.RS 3
-Parameters in this section apply to the server as a whole, or are defaults
-for services which do not specifically define certain items. See the notes
-under 'Parameters' for more information.
-.RE
-
-.SS The [homes] section
-.RS 3
-If a section called 'homes' is included in the configuration file, services
-connecting clients to their home directories can be created on the fly by the
-server.
-
-When the connection request is made, the existing services are scanned. If a
-match is found, it is used. If no match is found, the requested service name is
-treated as a user name and looked up in the local passwords file. If the
-name exists and the correct password has been given, a service is created
-by cloning the [homes] section.
-
-Some modifications are then made to the newly created section:
-
-.RS 3
-The service name is changed from 'homes' to the located username
-
-If no path was given, the path is set to the user's home directory.
-.RE
-
-If you decide to use a path= line in your [homes] section then you may
-find it useful to use the %S macro. For example path=/data/pchome/%S
-would be useful if you have different home directories for your PCs
-than for UNIX access.
-
-This is a fast and simple way to give a large number of clients access to
-their home directories with a minimum of fuss.
-
-A similar process occurs if the requested service name is "homes", except that
-the service name is not changed to that of the requesting user. This method
-of using the [homes] section works well if different users share a client PC.
-
-The [homes] section can specify all the parameters a normal service section
-can specify, though some make more sense than others. The following is a
-typical and suitable [homes] section:
-
- [homes]
- writable = yes
-
-An important point:
-
-.RS 3
-If guest access is specified in the [homes] section, all home directories will
-be accessible to all clients
-.B without a password.
-In the very unlikely event
-that this is actually desirable, it would be wise to also specify read only
-access.
-.RE
-.RE
-
-Note that the browseable flag for auto home directories will be
-inherited from the global browseable flag, not the [homes] browseable
-flag. This is useful as it means setting browseable=no in the [homes]
-section will hide the [homes] service but make any auto home
-directories visible.
-
-.SS The [printers] section
-.RS 3
-This section works like [homes], but for printers.
-
-If a [printers] section occurs in the configuration file, users are able
-to connect to any printer specified in the local host's printcap file.
-
-When a connection request is made, the existing services are scanned. If a
-match is found, it is used. If no match is found, but a [homes] section
-exists, it is used as described above. Otherwise, the requested service name is
-treated as a printer name and the appropriate printcap file is scanned to
-see if the requested service name is a valid printer name. If a match is
-found, a new service is created by cloning the [printers] section.
-
-A few modifications are then made to the newly created section:
-
-.RS 3
-The service name is set to the located printer name
-
-If no printer name was given, the printer name is set to the located printer
-name
-
-If the service does not permit guest access and no username was given, the
-username is set to the located printer name.
-.RE
-
-Note that the [printers] service MUST be printable - if you specify otherwise,
-the server will refuse to load the configuration file.
-
-Typically the path specified would be that of a world-writable spool directory
-with the sticky bit set on it. A typical [printers] entry would look like this:
-
- [printers]
- path = /usr/spool/public
- writable = no
- public = yes
- printable = yes
-
-All aliases given for a printer in the printcap file are legitimate printer
-names as far as the server is concerned. If your printing subsystem doesn't
-work like that, you will have to set up a pseudo-printcap. This is a file
-consisting of one or more lines like this:
-
- alias|alias|alias|alias...
-
-Each alias should be an acceptable printer name for your printing
-subsystem. In the [global] section, specify the new file as your printcap.
-The server will then only recognise names found in your pseudo-printcap,
-which of course can contain whatever aliases you like. The same technique
-could be used simply to limit access to a subset of your local printers.
-
-An alias, by the way, is defined as any component of the first entry of a
-printcap record. Records are separated by newlines, components (if there are
-more than one) are separated by vertical bar symbols ("|").
-.RE
-.SH PARAMETERS
-Parameters define the specific attributes of services.
-
-Some parameters are specific to the [global] section (eg., security).
-Some parameters are usable in all sections (eg., create mode). All others are
-permissible only in normal sections. For the purposes of the following
-descriptions the [homes] and [printers] sections will be considered normal.
-The letter 'G' in parentheses indicates that a parameter is specific to the
-[global] section. The letter 'S' indicates that a parameter can be
-specified in a service specific section. Note that all S parameters
-can also be specified in the [global] section - in which case they
-will define the default behaviour for all services.
-
-Parameters are arranged here in alphabetical order - this may not create
-best bedfellows, but at least you can find them! Where there are synonyms,
-the preferred synonym is described, others refer to the preferred synonym.
-
-.SS VARIABLE SUBSTITUTIONS
-
-Many of the strings that are settable in the config file can take
-substitutions. For example the option "path = /tmp/%u" would be
-interpreted as "path = /tmp/john" if the user connected with the
-username john.
-
-These substitutions are mostly noted in the descriptions below, but
-there are some general substitutions which apply whenever they might be
-relevant. These are:
-
-%S = the name of the current service, if any
-
-%P = the root directory of the current service, if any
-
-%u = user name of the current service, if any
-
-%g = primary group name of %u
-
-%U = session user name (the user name that the client wanted, not
-necessarily the same as the one they got)
-
-%G = primary group name of %U
-
-%H = the home directory of the user given by %u
-
-%v = the Samba version
-
-%h = the hostname that Samba is running on
-
-%m = the netbios name of the client machine (very useful)
-
-%L = the netbios name of the server. This allows you to change your
-config based on what the client calls you. Your server can have a "dual
-personality".
-
-%M = the internet name of the client machine
-
-%d = The process id of the current server process
-
-%a = the architecture of the remote machine. Only some are recognised,
-and those may not be 100% reliable. It currently recognises Samba,
-WfWg, WinNT and Win95. Anything else will be known as "UNKNOWN". If it
-gets it wrong then sending me a level 3 log should allow me to fix it.
-
-%I = The IP address of the client machine
-
-%T = the current date and time
-
-There are some quite creative things that can be done with these
-substitutions and other smb.conf options.
-
-.SS NAME MANGLING
-
-Samba supports "name mangling" so that DOS and Windows clients can use
-files that don't conform to the 8.3 format. It can also be set to adjust
-the case of 8.3 format filenames.
-
-There are several options that control the way mangling is performed,
-and they are grouped here rather than listed separately. For the
-defaults look at the output of the testparm program.
-
-All of these options can be set separately for each service (or
-globally, of course).
-
-The options are:
-
-"mangle case = yes/no" controls if names that have characters that
-aren't of the "default" case are mangled. For example, if this is yes
-then a name like "Mail" would be mangled. Default no.
-
-"case sensitive = yes/no" controls whether filenames are case
-sensitive. If they aren't then Samba must do a filename search and
-match on passed names. Default no.
-
-"default case = upper/lower" controls what the default case is for new
-filenames. Default lower.
-
-"preserve case = yes/no" controls if new files are created with the
-case that the client passes, or if they are forced to be the "default"
-case. Default no.
-
-"short preserve case = yes/no" controls if new files which conform to 8.3
-syntax, that is all in upper case and of suitable length, are created
-upper case, or if they are forced to be the "default" case. This option can
-be use with "preserve case = yes" to permit long filenames to retain their
-case, while short names are lowered. Default no.
-
-.SS COMPLETE LIST OF GLOBAL PARAMETERS
-
-Here is a list of all global parameters. See the section of each
-parameter for details. Note that some are synonyms.
-
-announce as
-
-announce version
-
-auto services
-
-browse list
-
-character set
-
-client code page
-
-config file
-
-deadtime
-
-debuglevel
-
-default
-
-default service
-
-dfree command
-
-dns proxy
-
-domain controller
-
-domain logons
-
-domain master
-
-encrypt passwords
-
-getwd cache
-
-hide files
-
-hide dot files
-
-homedir map
-
-hosts equiv
-
-include
-
-keepalive
-
-lock dir
-
-load printers
-
-local master
-
-lock directory
-
-log file
-
-log level
-
-logon path
-
-logon script
-
-lpq cache time
-
-mangled stack
-
-max log size
-
-max mux
-
-max packet
-
-max ttl
-
-max xmit
-
-message command
-
-netbios aliases
-
-netbios name
-
-nis homedir
-
-null passwords
-
-os level
-
-packet size
-
-passwd chat
-
-passwd program
-
-password level
-
-password server
-
-preferred master
-
-preload
-
-printing
-
-printcap name
-
-protocol
-
-read bmpx
-
-read prediction
-
-read raw
-
-read size
-
-remote announce
-
-root
-
-root dir
-
-root directory
-
-security
-
-server string
-
-shared file entries
-
-shared mem size
-
-smb passwd file
-
-smbrun
-
-socket address
-
-socket options
-
-status
-
-strip dot
-
-syslog
-
-syslog only
-
-time offset
-
-time server
-
-unix realname
-
-username level
-
-username map
-
-use rhosts
-
-valid chars
-
-veto files
-
-workgroup
-
-write raw
-
-.SS COMPLETE LIST OF SERVICE PARAMETERS
-
-Here is a list of all service parameters. See the section of each
-parameter for details. Note that some are synonyms.
-
-admin users
-
-allow hosts
-
-alternate permissions
-
-available
-
-browseable
-
-case sensitive
-
-case sig names
-
-copy
-
-create mask
-
-create mode
-
-comment
-
-default case
-
-delete readonly
-
-delete veto files
-
-deny hosts
-
-directory
-
-directory mask
-
-directory mode
-
-dont descend
-
-exec
-
-fake oplocks
-
-follow symlinks
-
-force create mode
-
-force directory mode
-
-force group
-
-force user
-
-guest account
-
-guest ok
-
-guest only
-
-hide dot files
-
-hosts allow
-
-hosts deny
-
-invalid users
-
-locking
-
-lppause command
-
-lpq command
-
-lpresume command
-
-lprm command
-
-magic output
-
-magic script
-
-mangle case
-
-mangled names
-
-mangling char
-
-map archive
-
-map hidden
-
-map system
-
-max connections
-
-min print space
-
-only guest
-
-only user
-
-oplocks
-
-path
-
-postexec
-
-postscript
-
-preserve case
-
-print command
-
-printer driver
-
-print ok
-
-printable
-
-printer
-
-printer name
-
-public
-
-read only
-
-read list
-
-revalidate
-
-root postexec
-
-root preexec
-
-set directory
-
-share modes
-
-short preserve case
-
-strict locking
-
-sync always
-
-user
-
-username
-
-users
-
-valid users
-
-volume
-
-wide links
-
-writable
-
-write ok
-
-writeable
-
-write list
-
-.SS EXPLANATION OF EACH PARAMETER
-.RS 3
-
-.SS admin users (S)
-
-This is a list of users who will be granted administrative privileges
-on the share. This means that they will do all file operations as the
-super-user (root).
-
-You should use this option very carefully, as any user in this list
-will be able to do anything they like on the share, irrespective of
-file permissions.
-
-.B Default:
- no admin users
-
-.B Example:
- admin users = jason
-
-.SS announce as (G)
-
-This specifies what type of server nmbd will announce itself as in
-browse lists. By default this is set to Windows NT. The valid options
-are "NT", "Win95" or "WfW" meaining Windows NT, Windows 95 and
-Windows for Workgroups respectively. Do not change this parameter
-unless you have a specific need to stop Samba appearing as an NT
-server as this may prevent Samba servers from participating as
-browser servers correctly.
-
-.B Default:
- announce as = NT
-
-.B Example
- announce as = Win95
-
-.SS announce version (G)
-
-This specifies the major and minor version numbers that nmbd
-will use when announcing itself as a server. The default is 4.2.
-Do not change this parameter unless you have a specific need to
-set a Samba server to be a downlevel server.
-
-.B Default:
- announce version = 4.2
-
-.B Example:
- announce version = 2.0
-
-.SS auto services (G)
-This is a list of services that you want to be automatically added to
-the browse lists. This is most useful for homes and printers services
-that would otherwise not be visible.
-
-Note that if you just want all printers in your printcap file loaded
-then the "load printers" option is easier.
-
-.B Default:
- no auto services
-
-.B Example:
- auto services = fred lp colorlp
-
-.SS allow hosts (S)
-A synonym for this parameter is 'hosts allow'.
-
-This parameter is a comma delimited set of hosts which are permitted to access
-a service.
-
-If specified in the [global] section then it will apply to all
-services, regardless of whether the individual service has a different
-setting.
-
-You can specify the hosts by name or IP number. For example, you could
-restrict access to only the hosts on a Class C subnet with something like
-"allow hosts = 150.203.5.". The full syntax of the list is described in
-the man page
-.BR hosts_access (5).
-
-You can also specify hosts by network/netmask pairs and by netgroup
-names if your system supports netgroups. The EXCEPT keyword can also
-be used to limit a wildcard list. The following examples may provide
-some help:
-
-Example 1: allow all IPs in 150.203.*.* except one
-
- hosts allow = 150.203. EXCEPT 150.203.6.66
-
-Example 2: allow hosts that match the given network/netmask
-
- hosts allow = 150.203.15.0/255.255.255.0
-
-Example 3: allow a couple of hosts
-
- hosts allow = lapland, arvidsjaur
-
-Example 4: allow only hosts in netgroup "foonet" or localhost, but
-deny access from one particular host
-
- hosts allow = @foonet, localhost
- hosts deny = pirate
-
-Note that access still requires suitable user-level passwords.
-
-See
-.BR testparm (1)
-for a way of testing your host access to see if it
-does what you expect.
-
-.B Default:
- none (i.e., all hosts permitted access)
-
-.B Example:
- allow hosts = 150.203.5. myhost.mynet.edu.au
-
-.SS alternate permissions (S)
-
-This option affects the way the "read only" DOS attribute is produced
-for UNIX files. If this is false then the read only bit is set for
-files on writeable shares which the user cannot write to.
-
-If this is true then it is set for files whos user write bit is not set.
-
-The latter behaviour is useful for when users copy files from each
-others directories, and use a file manager that preserves
-permissions. Without this option they may get annoyed as all copied
-files will have the "read only" bit set.
-
-.B Default:
- alternate permissions = no
-
-.B Example:
- alternate permissions = yes
-
-.SS available (S)
-This parameter lets you 'turn off' a service. If 'available = no', then
-ALL attempts to connect to the service will fail. Such failures are logged.
-
-.B Default:
- available = yes
-
-.B Example:
- available = no
-.SS browseable (S)
-This controls whether this share is seen in the list of available
-shares in a net view and in the browse list.
-
-.B Default:
- browseable = Yes
-
-.B Example:
- browseable = No
-.SS browse list(G)
-This controls whether the smbd will serve a browse list to a client
-doing a NetServerEnum call. Normally set to true. You should never
-need to change this.
-
-.B Default:
- browse list = Yes
-
-.SS case sensitive (G)
-See the discussion on NAME MANGLING.
-
-.SS case sig names (G)
-See "case sensitive"
-
-.SS character set (G)
-This allows a smbd to map incoming characters from a DOS 850 Code page
-to either a Western European (ISO8859-1) or Easter European (ISO8859-2)
-code page. Normally not set, meaning no filename translation is done.
-
-.B Default
-
- character set =
-
-.B Example
-
- character set = iso8859-1
-
-.SS client code page (G)
-Currently (Samba 1.9.17 and above) this may be set to one of two
-values, 850 or 437. It specifies the base DOS code page that the
-clients accessing Samba are using. To determine this, open a DOS
-command prompt and type the command "chcp". This will output the
-code page. The default for USA MS-DOS, Windows 95, and Windows NT
-releases is code page 437. The default for western european
-releases of the above operating systems is code page 850.
-
-This parameter co-operates with the "valid chars" parameter in
-determining what characters are valid in filenames and how
-capitalization is done. It has been added as a convenience for
-clients whose code page is either 437 or 850 so a convoluted
-"valid chars" string does not have to be determined. If you
-set both this parameter and the "valid chars" parameter the
-"client code page" parameter MUST be set before the "valid chars"
-in the smb.conf file. The "valid chars" string will then augment
-the character settings in the "client code page" parameter.
-
-If "client code page" is set to a value other than 850 or 437
-it will default to 850.
-
-See also : "valid chars".
-
-.B Default
-
- client code page = 850
-
-.B Example
-
- client code page = 437
-
-.SS comment (S)
-This is a text field that is seen when a client does a net view to
-list what shares are available. It will also be used when browsing is
-fully supported.
-
-.B Default:
- No comment string
-
-.B Example:
- comment = Fred's Files
-
-.SS config file (G)
-
-This allows you to override the config file to use, instead of the
-default (usually smb.conf). There is a chicken and egg problem here as
-this option is set in the config file!
-
-For this reason, if the name of the config file has changed when the
-parameters are loaded then it will reload them from the new config
-file.
-
-This option takes the usual substitutions, which can be very useful.
-
-If the config file doesn't exist then it won't be loaded (allowing
-you to special case the config files of just a few clients).
-
-.B Example:
- config file = /usr/local/samba/lib/smb.conf.%m
-
-.SS copy (S)
-This parameter allows you to 'clone' service entries. The specified
-service is simply duplicated under the current service's name. Any
-parameters specified in the current section will override those in the
-section being copied.
-
-This feature lets you set up a 'template' service and create similar
-services easily. Note that the service being copied must occur earlier
-in the configuration file than the service doing the copying.
-
-.B Default:
- none
-
-.B Example:
- copy = otherservice
-.SS create mask (S)
-A synonym for this parameter is 'create mode'.
-
-When a file is created, the neccessary permissions are calculated
-according to the mapping from DOS modes to UNIX permissions, and
-the resulting UNIX mode is then bit-wise 'AND'ed with this parameter.
-This parameter may be thought of as a bit-wise MASK for the UNIX
-modes of a file. Any bit *not* set here will be removed from the
-modes set on a file when it is created.
-
-The default value of this parameter removes the 'group' and 'other'
-write and execute bits from the UNIX modes.
-
-Following this Samba will bit-wise 'OR' the UNIX mode created from
-this parameter with the value of the "force create mode" parameter
-which is set to 000 by default.
-
-For Samba 1.9.17 and above this parameter no longer affects directory
-modes. See the parameter 'directory mode' for details.
-
-See also the "force create mode" parameter for forcing particular
-mode bits to be set on created files.
-See also the "directory mode" parameter for masking mode bits on created
-directories.
-
-.B Default:
- create mask = 0744
-
-.B Example:
- create mask = 0775
-.SS create mode (S)
-See
-.B create mask.
-
-.SS dead time (G)
-The value of the parameter (a decimal integer) represents the number of
-minutes of inactivity before a connection is considered dead, and it
-is disconnected. The deadtime only takes effect if the number of open files
-is zero.
-
-This is useful to stop a server's resources being exhausted by a large
-number of inactive connections.
-
-Most clients have an auto-reconnect feature when a connection is broken so
-in most cases this parameter should be transparent to users.
-
-Using this parameter with a timeout of a few minutes is recommended
-for most systems.
-
-A deadtime of zero indicates that no auto-disconnection should be performed.
-
-.B Default:
- dead time = 0
-
-.B Example:
- dead time = 15
-.SS debug level (G)
-The value of the parameter (an integer) allows the debug level
-(logging level) to be specified in the
-.B smb.conf
-file. This is to give
-greater flexibility in the configuration of the system.
-
-The default will be the debug level specified on the command line.
-
-.B Example:
- debug level = 3
-.SS default (G)
-See
-.B default service.
-.SS default case (S)
-
-See the section on "NAME MANGLING" Also note the addition of "short
-preserve case"
-
-.SS default service (G)
-A synonym for this parameter is 'default'.
-
-This parameter specifies the name of a service which will be connected to
-if the service actually requested cannot be found. Note that the square
-brackets are NOT given in the parameter value (see example below).
-
-There is no default value for this parameter. If this parameter is not given,
-attempting to connect to a nonexistent service results in an error.
-
-Typically the default service would be a public, read-only service.
-
-Also note that as of 1.9.14 the apparent service name will be changed to
-equal that of the requested service, this is very useful as it allows
-you to use macros like %S to make a wildcard service.
-
-Note also that any _ characters in the name of the service used in the
-default service will get mapped to a /. This allows for interesting
-things.
-
-
-.B Example:
- default service = pub
-
- [pub]
- path = /%S
-
-
-.SS delete readonly (S)
-This parameter allows readonly files to be deleted. This is not normal DOS
-semantics, but is allowed by UNIX.
-
-This option may be useful for running applications such as rcs, where UNIX
-file ownership prevents changing file permissions, and DOS semantics prevent
-deletion of a read only file.
-
-.B Default:
- delete readonly = No
-
-.B Example:
- delete readonly = Yes
-.SS deny hosts (S)
-A synonym for this parameter is 'hosts deny'.
-
-The opposite of 'allow hosts' - hosts listed here are NOT permitted
-access to services unless the specific services have their own lists to
-override this one. Where the lists conflict, the 'allow' list takes precedence.
-
-.B Default:
- none (i.e., no hosts specifically excluded)
-
-.B Example:
- deny hosts = 150.203.4. badhost.mynet.edu.au
-
-.SS delete veto files (S)
-
-This option is used when Samba is attempting to delete a directory
-that contains one or more vetoed directories (see the 'veto files' option).
-If this option is set to False (the default) then if a vetoed directory
-contains any non-vetoed files or directories then the directory delete
-will fail. This is usually what you want.
-
-If this option is set to True, then Samba will attempt
-to recursively delete any files and directories within the vetoed
-directory. This can be useful for integration with file serving
-systems such as Netatalk, which create meta-files within directories
-you might normally veto DOS/Windows users from seeing (eg. .AppleDouble)
-
-Setting 'delete veto files = True' allows these directories to be
-transparently deleted when the parent directory is deleted (so long
-as the user has permissions to do so).
-
-.B Default:
- delete veto files = False
-
-.B Example:
- delete veto files = True
-
-See
-.B veto files
-
-.SS dfree command (G)
-The dfree command setting should only be used on systems where a
-problem occurs with the internal disk space calculations. This has
-been known to happen with Ultrix, but may occur with other operating
-systems. The symptom that was seen was an error of "Abort Retry
-Ignore" at the end of each directory listing.
-
-This setting allows the replacement of the internal routines to
-calculate the total disk space and amount available with an external
-routine. The example below gives a possible script that might fulfill
-this function.
-
-The external program will be passed a single parameter indicating a
-directory in the filesystem being queried. This will typically consist
-of the string "./". The script should return two integers in ascii. The
-first should be the total disk space in blocks, and the second should
-be the number of available blocks. An optional third return value
-can give the block size in bytes. The default blocksize is 1024 bytes.
-
-Note: Your script should NOT be setuid or setgid and should be owned by
-(and writable only by) root!
-
-.B Default:
- By default internal routines for determining the disk capacity
-and remaining space will be used.
-
-.B Example:
- dfree command = /usr/local/samba/bin/dfree
-
- Where the script dfree (which must be made executable) could be
-
-.nf
- #!/bin/sh
- df $1 | tail -1 | awk '{print $2" "$4}'
-.fi
-
- or perhaps (on Sys V)
-
-.nf
- #!/bin/sh
- /usr/bin/df -k $1 | tail -1 | awk '{print $3" "$5}'
-.fi
-
- Note that you may have to replace the command names with full
-path names on some systems.
-.SS directory (S)
-See
-.B path.
-
-.SS directory mask (S)
-A synonym for this parameter is 'directory mode'.
-
-This parameter is the octal modes which are used when converting DOS modes
-to UNIX modes when creating UNIX directories.
-
-When a directory is created, the neccessary permissions are calculated
-according to the mapping from DOS modes to UNIX permissions, and
-the resulting UNIX mode is then bit-wise 'AND'ed with this parameter.
-This parameter may be thought of as a bit-wise MASK for the UNIX
-modes of a directory. Any bit *not* set here will be removed from the
-modes set on a directory when it is created.
-
-The default value of this parameter removes the 'group' and 'other'
-write bits from the UNIX mode, allowing only the user who owns the
-directory to modify it.
-
-Following this Samba will bit-wise 'OR' the UNIX mode created from
-this parameter with the value of the "force directory mode" parameter.
-This parameter is set to 000 by default (ie. no extra mode bits are added).
-
-See the "force directory mode" parameter to cause particular mode
-bits to always be set on created directories.
-
-See also the "create mode" parameter for masking mode bits on created
-files.
-
-.B Default:
- directory mask = 0755
-
-.B Example:
- directory mask = 0775
-.SS directory mode (S)
-See
-.B directory mask.
-
-.SS dns proxy (G)
-
-Specifies that nmbd should (as a WINS server), on finding that a NetBIOS
-name has not been registered, treat the NetBIOS name word-for-word as
-a DNS name.
-
-Note that the maximum length for a NetBIOS name is 15
-characters, so the DNS name (or DNS alias) can likewise only be 15
-characters, maximum.
-
-Note also that nmbd will block completely until the DNS name is resolved.
-This will result in temporary loss of browsing and WINS services.
-Enable this option only if you are certain that DNS resolution is fast,
-or you can live with the consequences of periodic pauses in nmbd service.
-
-.B Default:
- dns proxy = yes
-
-.SS domain controller (G)
-
-Specifies the DNS name or IP address of the machine to refer domain
-logons from Win95 machines to. You should never need to set this parameter.
-
-.B Default:
- domain controller = no
-
-.SS domain logons (G)
-
-If set to true, the Samba server will serve Windows 95 domain logons
-for the workgroup it is in. For more details on setting up this feature
-see the file DOMAINS.txt in the Samba source documentation directory.
-
-.B Default:
- domain logons = no
-
-.SS domain master (G)
-
-Enable WAN-wide browse list collation. Local master browsers on
-broadcast-isolated subnets will give samba their local browse lists, and
-ask for a complete copy of the browse list for the whole wide area network.
-Browser clients will then contact their local master browser, and will
-receive the domain-wide browse list, instead of just the list for their
-broadcast-isolated subnet.
-
-.B Default:
- domain master = no
-
-.SS dont descend (S)
-There are certain directories on some systems (eg., the /proc tree under
-Linux) that are either not of interest to clients or are infinitely deep
-(recursive). This parameter allows you to specify a comma-delimited list
-of directories that the server should always show as empty.
-
-Note that Samba can be very fussy about the exact format of the "dont
-descend" entries. For example you may need "./proc" instead of just
-"/proc". Experimentation is the best policy :-)
-
-.B Default:
- none (i.e., all directories are OK to descend)
-
-.B Example:
- dont descend = /proc,/dev
-
-.SS encrypt passwords (G)
-
-This boolean controls whether encrypted passwords will be negotiated
-with the client. Note that this option has no effect if you haven't
-compiled in the necessary des libraries and encryption code. It
-defaults to no.
-
-.SS exec (S)
-
-This is an alias for preexec
-
-.SS fake oplocks (S)
-
-Oplocks are the way that SMB clients get permission from a server to
-locally cache file operations. If a server grants an oplock
-(opportunistic lock) then the client is free to assume that it is the
-only one accessing the file and it will aggressively cache file
-data. With some oplock types the client may even cache file open/close
-operations. This can give enormous performance benefits.
-
-Samba does not support opportunistic locks because they are very
-difficult to do under Unix. Samba can fake them, however, by granting
-a oplock whenever a client asks for one. This is controlled using the
-smb.conf option "fake oplocks". If you set "fake oplocks = yes" then
-you are telling the client that it may aggressively cache the file
-data.
-
-By enabling this option on all read-only shares or shares that you know
-will only be accessed from one client at a time you will see a big
-performance improvement on many operations. If you enable this option
-on shares where multiple clients may be accessing the files read-write
-at the same time you can get data corruption. Use this option
-carefully!
-
-This option is disabled by default.
-
-.SS follow symlinks (S)
-
-This parameter allows the Samba administrator to stop smbd from
-following symbolic links in a particular share. Setting this
-parameter to "No" prevents any file or directory that is a
-symbolic link from being followed (the user will get an error).
-This option is very useful to stop users from adding a symbolic
-link to /etc/pasword in their home directory for instance.
-However it will slow filename lookups down slightly.
-
-This option is enabled (ie. smbd will follow symbolic links)
-by default.
-
-.SS force create mode (S)
-This parameter specifies a set of UNIX mode bit permissions that
-will *always* be set on a file created by Samba. This is done
-by bitwise 'OR'ing these bits onto the mode bits of a file that
-is being created. The default for this parameter is (in octel)
-000. The modes in this parameter are bitwise 'OR'ed onto the
-file mode after the mask set in the "create mask" parameter
-is applied.
-
-See also the parameter "create mask" for details on masking mode
-bits on created files.
-
-.B Default:
- force create mode = 000
-
-.B Example:
- force create mode = 0755
-
-would force all created files to have read and execute permissions
-set for 'group' and 'other' as well as the read/write/execute bits
-set for the 'user'.
-
-.SS force directory mode (S)
-This parameter specifies a set of UNIX mode bit permissions that
-will *always* be set on a directory created by Samba. This is done
-by bitwise 'OR'ing these bits onto the mode bits of a directory that
-is being created. The default for this parameter is (in octel)
-0000 which will not add any extra permission bits to a created
-directory. This operation is done after the mode mask in the parameter
-"directory mask" is applied.
-
-See also the parameter "directory mask" for details on masking mode
-bits on created directories.
-
-.B Default:
- force directory mode = 000
-
-.B Example:
- force directory mode = 0755
-
-would force all created directories to have read and execute permissions
-set for 'group' and 'other' as well as the read/write/execute bits
-set for the 'user'.
-
-.SS force group (S)
-This specifies a group name that all connections to this service
-should be made as. This may be useful for sharing files.
-
-.B Default:
- no forced group
-
-.B Example:
- force group = agroup
-
-.SS force user (S)
-This specifies a user name that all connections to this service
-should be made as. This may be useful for sharing files. You should
-also use it carefully as using it incorrectly can cause security
-problems.
-
-This user name only gets used once a connection is established. Thus
-clients still need to connect as a valid user and supply a valid
-password. Once connected, all file operations will be performed as the
-"forced user", not matter what username the client connected as.
-
-.B Default:
- no forced user
-
-.B Example:
- force user = auser
-
-.SS getwd cache (G)
-This is a tuning option. When this is enabled a cacheing algorithm will
-be used to reduce the time taken for getwd() calls. This can have a
-significant impact on performance, especially when widelinks is False.
-
-.B Default:
- getwd cache = No
-
-.B Example:
- getwd cache = Yes
-
-.SS group (S)
-This is an alias for "force group" and is only kept for compatibility
-with old versions of Samba. It may be removed in future versions.
-
-.SS guest account (S)
-This is a username which will be used for access to services which are
-specified as 'guest ok' (see below). Whatever privileges this user has
-will be available to any client connecting to the guest
-service. Typically this user will exist in the password file, but will
-not have a valid login. If a username is specified in a given service,
-the specified username overrides this one.
-
-One some systems the account "nobody" may not be able to print. Use
-another account in this case. You should test this by trying to log in
-as your guest user (perhaps by using the "su \-" command) and trying to
-print using
-.BR lpr .
-
-Note that as of version 1.9 of Samba this option may be set
-differently for each service.
-
-.B Default:
- specified at compile time
-
-.B Example:
- guest account = nobody
-.SS guest ok (S)
-See
-.B public.
-.SS guest only (S)
-If this parameter is 'yes' for a service, then only guest connections to the
-service are permitted. This parameter will have no affect if "guest ok" or
-"public" is not set for the service.
-
-See the section below on user/password validation for more information about
-this option.
-
-.B Default:
- guest only = no
-
-.B Example:
- guest only = yes
-.SS hide dot files (S)
-This is a boolean parameter that controls whether files starting with
-a dot appear as hidden files.
-
-.B Default:
- hide dot files = yes
-
-.B Example:
- hide dot files = no
-
-
-.SS hide files(S)
-This is a list of files or directories that are not visible but are
-accessible. The DOS 'hidden' attribute is applied to any files or
-directories that match.
-
-Each entry in the list must be separated by a "/", which allows spaces
-to be included in the entry. '*' and '?' can be used to specify multiple
-files or directories as in DOS wildcards.
-
-Each entry must be a unix path, not a DOS path and must not include the
-unix directory separator "/".
-
-Note that the case sensitivity option is applicable in hiding files.
-
-Setting this parameter will affect the performance of Samba, as
-it will be forced to check all files and directories for a match
-as they are scanned.
-
-See also "hide dot files", "veto files" and "case sensitive"
-
-.B Default
- No files or directories are hidden by this option (dot files are
- hidden by default because of the "hide dot files" option).
-
-.B Example
- hide files = /.*/DesktopFolderDB/TrashFor%m/resource.frk/
-
-The above example is based on files that the Macintosh client (DAVE)
-creates for internal use, and also still hides all files beginning with
-a dot.
-
-.SS homedir map (G)
-If "nis homedir" is true, this parameter specifies the NIS (or YP) map
-from which the server for the user's home directory should be extracted.
-At present, only the Sun auto.home map format is understood. The form of
-the map is:
-
-username server:/some/file/system
-
-and the program will extract the servername from before the first ':'.
-There should probably be a better parsing system that copes with different
-map formats and also Amd (another automounter) maps.
-
-NB: The -DNETGROUP option is required in the Makefile for option to work
-and on some architectures the line -lrpcsvc needs to be added to the
-LIBSM variable. This is required for Solaris 2, FreeBSD and HPUX.
-
-See also "nis homedir"
-
-.B Default:
- homedir map = auto.home
-
-.B Example:
- homedir map = amd.homedir
-.SS hosts allow (S)
-See
-.B allow hosts.
-.SS hosts deny (S)
-See
-.B deny hosts.
-
-.SS hosts equiv (G)
-If this global parameter is a non-null string, it specifies the name of
-a file to read for the names of hosts and users who will be allowed access
-without specifying a password.
-
-This is not be confused with
-.B allow hosts
-which is about hosts access to services and is more useful for guest services.
-.B hosts equiv
-may be useful for NT clients which will not supply passwords to samba.
-
-NOTE: The use of hosts.equiv can be a major security hole. This is
-because you are trusting the PC to supply the correct username. It is
-very easy to get a PC to supply a false username. I recommend that the
-hosts.equiv option be only used if you really know what you are doing,
-or perhaps on a home network where you trust your wife and kids :-)
-
-.B Default
- No host equivalences
-
-.B Example
- hosts equiv = /etc/hosts.equiv
-
-.SS include (G)
-
-This allows you to include one config file inside another. The file is
-included literally, as though typed in place.
-
-It takes the standard substitutions, except %u, %P and %S
-
-.SS interfaces (G)
-
-This option allows you to setup multiple network interfaces, so that
-Samba can properly handle browsing on all interfaces.
-
-The option takes a list of ip/netmask pairs. The netmask may either be
-a bitmask, or a bitlength.
-
-For example, the following line:
-
-interfaces = 192.168.2.10/24 192.168.3.10/24
-
-would configure two network interfaces with IP addresses 192.168.2.10
-and 192.168.3.10. The netmasks of both interfaces would be set to
-255.255.255.0.
-
-You could produce an equivalent result by using:
-
-interfaces = 192.168.2.10/255.255.255.0 192.168.3.10/255.255.255.0
-
-if you prefer that format.
-
-If this option is not set then Samba will attempt to find a primary
-interface, but won't attempt to configure more than one interface.
-
-.SS invalid users (S)
-This is a list of users that should not be allowed to login to this
-service. This is really a "paranoid" check to absolutely ensure an
-improper setting does not breach your security.
-
-A name starting with @ is interpreted as a UNIX group.
-
-The current servicename is substituted for %S. This is useful in the
-[homes] section.
-
-See also "valid users"
-
-.B Default
- No invalid users
-
-.B Example
- invalid users = root fred admin @wheel
-
-.SS keep alive (G)
-The value of the parameter (an integer) represents the number of seconds
-between 'keepalive' packets. If this parameter is zero, no keepalive packets
-will be sent. Keepalive packets, if sent, allow the server to tell whether a
-client is still present and responding.
-
-Keepalives should, in general, not be needed if the socket being used
-has the SO_KEEPALIVE attribute set on it (see "socket
-options"). Basically you should only use this option if you strike
-difficulties.
-
-.B Default:
- keep alive = 0
-
-.B Example:
- keep alive = 60
-.SS load printers (G)
-A boolean variable that controls whether all printers in the printcap
-will be loaded for browsing by default.
-
-.B Default:
- load printers = yes
-
-.B Example:
- load printers = no
-
-.SS local master (G)
-This option allows the nmbd to become a local master browser on a
-subnet. If set to False then nmbd will not attempt to become a local
-master browser on a subnet and will also lose in all browsing elections.
-By default this value is set to true. Setting this value to true doesn't
-mean that Samba will become the local master browser on a subnet, just
-that the nmbd will participate in elections for local master browser.
-
-.B Default:
- local master = yes
-
-.SS lock directory (G)
-This option specifies the directory where lock files will be placed.
-The lock files are used to implement the "max connections" option.
-
-.B Default:
- lock directory = /tmp/samba
-
-.B Example:
- lock directory = /usr/local/samba/var/locks
-.SS locking (S)
-This controls whether or not locking will be performed by the server in
-response to lock requests from the client.
-
-If "locking = no", all lock and unlock requests will appear to succeed and
-all lock queries will indicate that the queried lock is clear.
-
-If "locking = yes", real locking will be performed by the server.
-
-This option may be particularly useful for read-only filesystems which
-do not need locking (such as cdrom drives).
-
-Be careful about disabling locking either globally or in a specific
-service, as lack of locking may result in data corruption.
-
-.B Default:
- locking = yes
-
-.B Example:
- locking = no
-
-.SS log file (G)
-
-This options allows you to override the name of the Samba log file
-(also known as the debug file).
-
-This option takes the standard substitutions, allowing you to have
-separate log files for each user or machine.
-
-.B Example:
- log file = /usr/local/samba/var/log.%m
-
-.SS log level (G)
-see "debug level"
-
-.SS logon path (G)
-
-This parameter specifies the home directory where roaming profiles
-(USER.DAT / USER.MAN files for Windows 95) are stored.
-
-This option takes the standard substitutions, allowing you to have
-separate logon scripts for each user or machine. It also specifies
-the directory from which the "desktop", "start menu", "nethood" and
-"programs" folders, and their contents, are loaded and displayed
-on your Windows 95 client.
-
-The share and the path must be readable by the user for the preferences
-and directories to be loaded onto the Windows 95 client. The share
-must be writeable when the logs in for the first time, in order that
-the Windows 95 client can create the user.dat and other directories.
-
-Thereafter, the directories and any of contents can, if required,
-be made read-only. It is not adviseable that the USER.DAT file be made
-read-only - rename it to USER.MAN to achieve the desired effect
-(a MANdatory profile).
-
-Windows clients can sometimes maintain a connection to the [homes]
-share, even though there is no user logged in. Therefore, it is
-vital that the logon path does not include a reference to the
-homes share (i.e \\\\%L\\HOMES\profile_path will cause problems).
-
-.B Default:
- logon path = \\\\%L\\%U\\profile
-
-.B Example:
- logon path = \\\\PROFILESERVER\\HOME_DIR\\%U\\PROFILE
-
-.SS logon script (G)
-
-This parameter specifies the batch file (.bat) or NT command file (.cmd)
-to be downloaded and run on a machine when a user successfully logs in.
-The file must contain the DOS style cr/lf line endings. Using a DOS-style
-editor to create the file is recommended.
-
-The script must be a relative path to the [netlogon] service. If the
-[netlogon] service specifies a path of /usr/local/samba/netlogon, and
-logon script = STARTUP.BAT, then file that will be downloaded is:
-
-.B /usr/local/samba/netlogon/STARTUP.BAT
-
-The contents of the batch file is entirely your choice. A suggested
-command would be to add NET TIME \\\\SERVER /SET /YES, to force every
-machine to synchronise clocks with the same time server. Another use
-would be to add NET USE U: \\\\SERVER\\UTILS for commonly used utilities,
-or NET USE Q: \\\\SERVER\\ISO9001_QA.
-
-Note that it is particularly important not to allow write access to
-the [netlogon] share, or to grant users write permission on the
-batch files in a secure environment, as this would allow the batch
-files to be arbitrarily modified.
-
-.B
-This option takes the standard substitutions, allowing you to have
-separate logon scripts for each user or machine.
-
-.B Example:
- logon script = scripts/%U.bat
-
-.SS lppause command (S)
-This parameter specifies the command to be executed on the server host in
-order to stop printing or spooling a specific print job.
-
-This command should be a program or script which takes a printer name and
-job number to pause the print job. Currently I don't know of any print
-spooler system that can do this with a simple option, except for the PPR
-system from Trinity College (ppr\-dist.trincoll.edu/pub/ppr). One way
-of implementing this is by using job priorities, where jobs having a too
-low priority won't be sent to the printer. See also the
-.B lppause
-command.
-
-If a %p is given then the printername is put in its place. A %j is
-replaced with the job number (an integer).
-On HPUX (see printing=hpux), if the -p%p option is added to the lpq
-command, the job will show up with the correct status, i.e. if the job
-priority is lower than the set fence priority it will have the PAUSED
-status, whereas if the priority is equal or higher it will have the
-SPOOLED or PRINTING status.
-
-Note that it is good practice to include the absolute path in the lppause
-command as the PATH may not be available to the server.
-
-.B Default:
- Currently no default value is given to this string
-
-.B Example for HPUX:
- lppause command = /usr/bin/lpalt %p-%j -p0
-
-.SS lpq cache time (G)
-
-This controls how long lpq info will be cached for to prevent the lpq
-command being called too often. A separate cache is kept for each
-variation of the lpq command used by the system, so if you use
-different lpq commands for different users then they won't share cache
-information.
-
-The cache files are stored in /tmp/lpq.xxxx where xxxx is a hash
-of the lpq command in use.
-
-The default is 10 seconds, meaning that the cached results of a
-previous identical lpq command will be used if the cached data is less
-than 10 seconds old. A large value may be advisable if your lpq
-command is very slow.
-
-A value of 0 will disable cacheing completely.
-
-.B Default:
- lpq cache time = 10
-
-.B Example:
- lpq cache time = 30
-
-.SS lpq command (S)
-This parameter specifies the command to be executed on the server host in
-order to obtain "lpq"-style printer status information.
-
-This command should be a program or script which takes a printer name
-as its only parameter and outputs printer status information.
-
-Currently six styles of printer status information are supported; BSD,
-SYSV, AIX, HPUX, QNX, LPRNG and PLP. This covers most UNIX systems. You
-control which type is expected using the "printing =" option.
-
-Some clients (notably Windows for Workgroups) may not correctly send the
-connection number for the printer they are requesting status information
-about. To get around this, the server reports on the first printer service
-connected to by the client. This only happens if the connection number sent
-is invalid.
-
-If a %p is given then the printername is put in its place. Otherwise
-it is placed at the end of the command.
-
-Note that it is good practice to include the absolute path in the lpq
-command as the PATH may not be available to the server.
-
-.B Default:
- depends on the setting of "printing ="
-
-.B Example:
- lpq command = /usr/bin/lpq %p
-
-.SS lpresume command (S)
-This parameter specifies the command to be executed on the server host in
-order to restart or continue printing or spooling a specific print job.
-
-This command should be a program or script which takes a printer name and
-job number to resume the print job. See also the lppause command.
-
-If a %p is given then the printername is put in its place. A %j is
-replaced with the job number (an integer).
-
-Note that it is good practice to include the absolute path in the lpresume
-command as the PATH may not be available to the server.
-
-.B Default:
- Currently no default value is given to this string
-
-.B Example for HPUX:
- lpresume command = /usr/bin/lpalt %p-%j -p2
-
-.SS lprm command (S)
-This parameter specifies the command to be executed on the server host in
-order to delete a print job.
-
-This command should be a program or script which takes a printer name
-and job number, and deletes the print job.
-
-Currently seven styles of printer control are supported; BSD, SYSV, AIX
-HPUX, QNX, LPRNG and PLP. This covers most UNIX systems. You control
-which type is expected using the "printing =" option.
-
-If a %p is given then the printername is put in its place. A %j is
-replaced with the job number (an integer).
-
-Note that it is good practice to include the absolute path in the lprm
-command as the PATH may not be available to the server.
-
-.B Default:
- depends on the setting of "printing ="
-
-.B Example 1:
- lprm command = /usr/bin/lprm -P%p %j
-
-.B Example 2:
- lprm command = /usr/bin/cancel %p-%j
-
-.SS magic output (S)
-This parameter specifies the name of a file which will contain output
-created by a magic script (see
-.I magic script
-below).
-
-Warning: If two clients use the same magic script in the same directory the
-output file content is undefined.
-.B Default:
- magic output = <magic script name>.out
-
-.B Example:
- magic output = myfile.txt
-.SS magic script (S)
-This parameter specifies the name of a file which, if opened, will be
-executed by the server when the file is closed. This allows a UNIX script
-to be sent to the Samba host and executed on behalf of the connected user.
-
-Scripts executed in this way will be deleted upon completion, permissions
-permitting.
-
-If the script generates output, output will be sent to the file specified by
-the
-.I magic output
-parameter (see above).
-
-Note that some shells are unable to interpret scripts containing
-carriage-return-linefeed instead of linefeed as the end-of-line
-marker. Magic scripts must be executable "as is" on the host, which
-for some hosts and some shells will require filtering at the DOS end.
-
-Magic scripts are EXPERIMENTAL and should NOT be relied upon.
-
-.B Default:
- None. Magic scripts disabled.
-
-.B Example:
- magic script = user.csh
-
-.SS mangle case (S)
-
-See the section on "NAME MANGLING"
-
-.SS mangled map (S)
-This is for those who want to directly map UNIX file names which are
-not representable on DOS. The mangling of names is not always what is
-needed. In particular you may have documents with file extensions
-that differ between DOS and UNIX. For example, under UNIX it is common
-to use .html for HTML files, whereas under DOS .htm is more commonly
-used.
-
-So to map 'html' to 'htm' you put:
-
- mangled map = (*.html *.htm)
-
-One very useful case is to remove the annoying ;1 off the ends of
-filenames on some CDROMS (only visible under some UNIXes). To do this
-use a map of (*;1 *)
-
-.B default:
- no mangled map
-
-.B Example:
- mangled map = (*;1 *)
-
-.SS mangled names (S)
-This controls whether non-DOS names under UNIX should be mapped to
-DOS-compatible names ("mangled") and made visible, or whether non-DOS names
-should simply be ignored.
-
-See the section on "NAME MANGLING" for details on how to control the
-mangling process.
-
-If mangling is used then the mangling algorithm is as follows:
-.RS
-- the first (up to) five alphanumeric characters before the rightmost dot of
-the filename are preserved, forced to upper case, and appear as the first (up
-to) five characters of the mangled name.
-
-- a tilde ("~") is appended to the first part of the mangled name, followed
-by a two-character unique sequence, based on the original root name
-(i.e., the original filename minus its final extension). The final
-extension is included in the hash calculation only if it contains any upper
-case characters or is longer than three characters.
-
-Note that the character to use may be specified using the "mangling
-char" option, if you don't like ~.
-
-- the first three alphanumeric characters of the final extension are preserved,
-forced to upper case and appear as the extension of the mangled name. The
-final extension is defined as that part of the original filename after the
-rightmost dot. If there are no dots in the filename, the mangled name will
-have no extension (except in the case of hidden files - see below).
-
-- files whose UNIX name begins with a dot will be presented as DOS hidden
-files. The mangled name will be created as for other filenames, but with the
-leading dot removed and "___" as its extension regardless of actual original
-extension (that's three underscores).
-.RE
-
-The two-digit hash value consists of upper case alphanumeric characters.
-
-This algorithm can cause name collisions only if files in a directory share
-the same first five alphanumeric characters. The probability of such a clash
-is 1/1300.
-
-The name mangling (if enabled) allows a file to be copied between UNIX
-directories from DOS while retaining the long UNIX filename. UNIX files can
-be renamed to a new extension from DOS and will retain the same basename.
-Mangled names do not change between sessions.
-
-.B Default:
- mangled names = yes
-
-.B Example:
- mangled names = no
-.SS mangling char (S)
-This controls what character is used as the "magic" character in name
-mangling. The default is a ~ but this may interfere with some
-software. Use this option to set it to whatever you prefer.
-
-.B Default:
- mangling char = ~
-
-.B Example:
- mangling char = ^
-
-.SS mangled stack (G)
-This parameter controls the number of mangled names that should be cached in
-the Samba server.
-
-This stack is a list of recently mangled base names (extensions are only
-maintained if they are longer than 3 characters or contains upper case
-characters).
-
-The larger this value, the more likely it is that mangled names can be
-successfully converted to correct long UNIX names. However, large stack
-sizes will slow most directory access. Smaller stacks save memory in the
-server (each stack element costs 256 bytes).
-
-It is not possible to absolutely guarantee correct long file names, so
-be prepared for some surprises!
-
-.B Default:
- mangled stack = 50
-
-.B Example:
- mangled stack = 100
-
-.SS map archive (S)
-This controls whether the DOS archive attribute should be mapped to the
-UNIX owner execute bit. The DOS archive bit is set when a file has been modified
-since its last backup. One motivation for this option it to keep Samba/your
-PC from making any file it touches from becoming executable under UNIX.
-This can be quite annoying for shared source code, documents, etc...
-
-Note that this requires the 'create mask' to be set such that owner
-execute bit is not masked out (ie. it must include 100). See the
-parameter "create mask" for details.
-
-.B Default:
- map archive = yes
-
-.B Example:
- map archive = no
-
-.SS map hidden (S)
-This controls whether DOS style hidden files should be mapped to the
-UNIX world execute bit.
-
-Note that this requires the 'create mask' to be set such that the world
-execute bit is not masked out (ie. it must include 001).
-See the parameter "create mask" for details.
-
-.B Default:
- map hidden = no
-
-.B Example:
- map hidden = yes
-.SS map system (S)
-This controls whether DOS style system files should be mapped to the
-UNIX group execute bit.
-
-Note that this requires the 'create mask' to be set such that the group
-execute bit is not masked out (ie. it must include 010). See the parameter
-"create mask" for details.
-
-.B Default:
- map system = no
-
-.B Example:
- map system = yes
-.SS max connections (S)
-This option allows the number of simultaneous connections to a
-service to be limited. If "max connections" is greater than 0 then
-connections will be refused if this number of connections to the
-service are already open. A value of zero mean an unlimited number of
-connections may be made.
-
-Record lock files are used to implement this feature. The lock files
-will be stored in the directory specified by the "lock directory" option.
-
-.B Default:
- max connections = 0
-
-.B Example:
- max connections = 10
-
-.SS max disk size (G)
-This option allows you to put an upper limit on the apparent size of
-disks. If you set this option to 100 then all shares will appear to be
-not larger than 100 MB in size.
-
-Note that this option does not limit the amount of data you can put on
-the disk. In the above case you could still store much more than 100
-MB on the disk, but if a client ever asks for the amount of free disk
-space or the total disk size then the result will be bounded by the
-amount specified in "max disk size".
-
-This option is primarily useful to work around bugs in some pieces of
-software that can't handle very large disks, particularly disks over
-1GB in size.
-
-A "max disk size" of 0 means no limit.
-
-.B Default:
- max disk size = 0
-
-.B Example:
- max disk size = 1000
-
-.SS max log size (G)
-
-This option (an integer in kilobytes) specifies the max size the log
-file should grow to. Samba periodically checks the size and if it is
-exceeded it will rename the file, adding a .old extension.
-
-A size of 0 means no limit.
-
-.B Default:
- max log size = 5000
-
-.B Example:
- max log size = 1000
-
-.SS max mux (G)
-
-This option controls the maximum number of outstanding simultaneous SMB
-operations that samba tells the client it will allow. You should never need
-to set this parameter.
-
-.B Default:
- max mux = 50
-
-.SS max packet (G)
-
-A synonym for this parameter is 'packet size'.
-
-.SS max ttl (G)
-
-This option tells nmbd what the default 'time to live' of NetBIOS
-names should be (in seconds). You should never need to change this parameter.
-
-.B Default:
- max ttl = 14400
-.SS max xmit (G)
-
-This option controls the maximum packet size that will be negotiated
-by Samba. The default is 65535, which is the maximum. In some cases
-you may find you get better performance with a smaller value. A value
-below 2048 is likely to cause problems.
-
-.B Default:
- max xmit = 65535
-
-.B Example:
- max xmit = 8192
-
-.SS message command (G)
-
-This specifies what command to run when the server receives a WinPopup
-style message.
-
-This would normally be a command that would deliver the message
-somehow. How this is to be done is up to your imagination.
-
-What I use is:
-
- message command = csh -c 'xedit %s;rm %s' &
-
-This delivers the message using xedit, then removes it
-afterwards. NOTE THAT IT IS VERY IMPORTANT THAT THIS COMMAND RETURN
-IMMEDIATELY. That's why I have the & on the end. If it doesn't return
-immediately then your PCs may freeze when sending messages (they
-should recover after 30secs, hopefully).
-
-All messages are delivered as the global guest user. The command takes
-the standard substitutions, although %u won't work (%U may be better
-in this case).
-
-Apart from the standard substitutions, some additional ones apply. In
-particular:
-
-%s = the filename containing the message
-
-%t = the destination that the message was sent to (probably the server
-name)
-
-%f = who the message is from
-
-You could make this command send mail, or whatever else takes your
-fancy. Please let me know of any really interesting ideas you have.
-
-Here's a way of sending the messages as mail to root:
-
-message command = /bin/mail -s 'message from %f on %m' root < %s; rm %s
-
-If you don't have a message command then the message won't be
-delivered and Samba will tell the sender there was an
-error. Unfortunately WfWg totally ignores the error code and carries
-on regardless, saying that the message was delivered.
-
-If you want to silently delete it then try "message command = rm %s".
-
-For the really adventurous, try something like this:
-
-message command = csh -c 'csh < %s |& /usr/local/samba/bin/smbclient \e
- -M %m; rm %s' &
-
-this would execute the command as a script on the server, then give
-them the result in a WinPopup message. Note that this could cause a
-loop if you send a message from the server using smbclient! You better
-wrap the above in a script that checks for this :-)
-
-.B Default:
- no message command
-
-.B Example:
- message command = csh -c 'xedit %s;rm %s' &
-
-.SS min print space (S)
-
-This sets the minimum amount of free disk space that must be available
-before a user will be able to spool a print job. It is specified in
-kilobytes. The default is 0, which means no limit.
-
-.B Default:
- min print space = 0
-
-.B Example:
- min print space = 2000
-
-.SS netbios aliases (G)
-
-This is a list of names that nmbd will advertise as additional
-names by which the Samba server is known. This allows one machine
-to appear in browse lists under multiple names. If a machine is
-acting as a browse server or logon server none of these names
-will be advertised as either browse server or logon servers, only
-the primary name of the machine will be advertised with these
-capabilities.
-
-See also 'netbios name'.
-
-.B Example:
- netbios aliases = TEST TEST1 TEST2
-
-.SS netbios name (G)
-
-This sets the NetBIOS name by which a Samba server is known. By
-default it is the same as the first component of the host's DNS name.
-If a machine is a browse server or logon server this name (or the
-first component of the hosts DNS name) will be the name that these
-services are advertised under.
-
-See also 'netbios aliases'.
-
-.B Example:
- netbios name = MYNAME
-
-.SS nis homedir (G)
-Get the home share server from a NIS (or YP) map. For unix systems that
-use an automounter, the user's home directory will often be mounted on
-a workstation on demand from a remote server. When the Samba logon server
-is not the actual home directory server, two network hops are required
-to access the home directory and this can be very slow especially with
-writing via Samba to an NFS mounted directory. This option allows samba
-to return the home share as being on a different server to the logon
-server and as long as a samba daemon is running on the home directory
-server, it will be mounted on the Samba client directly from the directory
-server. When Samba is returning the home share to the client, it will
-consult the NIS (or YP) map specified in "homedir map" and return the
-server listed there.
-
-.B Default:
- nis homedir = false
-
-.B Example:
- nis homedir = true
-
-.SS null passwords (G)
-Allow or disallow access to accounts that have null passwords.
-
-.B Default:
- null passwords = no
-
-.B Example:
- null passwords = yes
-
-.SS only guest (S)
-A synonym for this command is 'guest only'.
-
-.SS only user (S)
-This is a boolean option that controls whether connections with
-usernames not in the user= list will be allowed. By default this
-option is disabled so a client can supply a username to be used by
-the server.
-
-Note that this also means Samba won't try to deduce usernames from the
-service name. This can be annoying for the [homes] section. To get
-around this you could use "user = %S" which means your "user" list
-will be just the service name, which for home directories is the name
-of the user.
-
-.B Default:
- only user = False
-
-.B Example:
- only user = True
-
-.SS oplocks (S)
-This boolean option tells smbd whether to issue oplocks (opportunistic
-locks) to file open requests on this share. The oplock code was introduced in
-Samba 1.9.18 and can dramatically (approx 30% or more) improve the speed
-of access to files on Samba servers. It allows the clients to agressively
-cache files locally and you may want to disable this option for unreliable
-network environments (it is turned on by default in Windows NT Servers).
-For more information see the file Speed.txt in the Samba docs/ directory.
-
-.B Default:
- oplocks = True
-
-.B Example:
- oplocks = False
-
-
-.SS os level (G)
-This integer value controls what level Samba advertises itself as for
-browse elections. See BROWSING.txt for details.
-
-.SS packet size (G)
-The maximum transmit packet size during a raw read. This option is no
-longer implemented as of version 1.7.00, and is kept only so old
-configuration files do not become invalid.
-
-.SS passwd chat (G)
-This string controls the "chat" conversation that takes places
-between smbd and the local password changing program to change the
-users password. The string describes a sequence of response-receive
-pairs that smbd uses to determine what to send to the passwd program
-and what to expect back. If the expected output is not received then
-the password is not changed.
-
-This chat sequence is often quite site specific, depending on what
-local methods are used for password control (such as NIS+ etc).
-
-The string can contain the macros %o and %n which are substituted for
-the old and new passwords respectively. It can also contain the
-standard macros \en \er \et and \es to give line-feed, carriage-return,
-tab and space.
-
-The string can also contain a * which matches any sequence of
-characters.
-
-Double quotes can be used to collect strings with spaces in them into
-a single string.
-
-If the send string in any part of the chat sequence is a fullstop "."
-then no string is sent. Similarly, is the expect string is a fullstop
-then no string is expected.
-
-.B Example:
- passwd chat = "*Enter OLD password*" %o\en "*Enter NEW password*" %n\en \e
- "*Reenter NEW password*" %n\en "*Password changed*"
-
-
-.B Default:
- passwd chat = *old*password* %o\en *new*password* %n\en *new*password* %n\en *changed*
-
-.SS passwd program (G)
-The name of a program that can be used to set user passwords.
-
-This is only necessary if you have enabled remote password changing at
-compile time. Any occurrences of %u will be replaced with the user
-name.
-
-Also note that many passwd programs insist in "reasonable" passwords,
-such as a minimum length, or the inclusion of mixed case chars and
-digits. This can pose a problem as some clients (such as Windows for
-Workgroups) uppercase the password before sending it.
-
-.B Default:
- passwd program = /bin/passwd
-
-.B Example:
- passwd program = /sbin/passwd %u
-
-.SS password level (G)
-Some client/server combinations have difficulty with mixed-case passwords.
-One offending client is Windows for Workgroups, which for some reason forces
-passwords to upper case when using the LANMAN1 protocol, but leaves them alone
-when using COREPLUS!
-
-This parameter defines the maximum number of characters that may be upper case
-in passwords.
-
-For example, say the password given was "FRED". If
-.B password level
-is set to 1 (one), the following combinations would be tried if "FRED" failed:
-"Fred", "fred", "fRed", "frEd", "freD". If
-.B password level was set to 2 (two), the following combinations would also be
-tried: "FRed", "FrEd", "FreD", "fREd", "fReD", "frED". And so on.
-
-The higher value this parameter is set to the more likely it is that a mixed
-case password will be matched against a single case password. However, you
-should be aware that use of this parameter reduces security and increases the
-time taken to process a new connection.
-
-A value of zero will cause only two attempts to be made - the password as is
-and the password in all-lower case.
-
-If you find the connections are taking too long with this option then
-you probably have a slow crypt() routine. Samba now comes with a fast
-"ufc crypt" that you can select in the Makefile. You should also make
-sure the PASSWORD_LENGTH option is correct for your system in local.h
-and includes.h. On most systems only the first 8 chars of a password
-are significant so PASSWORD_LENGTH should be 8, but on some longer
-passwords are significant. The includes.h file tries to select the
-right length for your system.
-
-.B Default:
- password level = 0
-
-.B Example:
- password level = 4
-
-.SS password server (G)
-
-By specifying the name of another SMB server (such as a WinNT box)
-with this option, and using "security = server" you can get Samba to
-do all its username/password validation via a remote server.
-
-This options sets the name of the password server to use. It must be a
-netbios name, so if the machine's netbios name is different from its
-internet name then you may have to add its netbios name to
-/etc/hosts.
-
-The password server much be a machine capable of using the "LM1.2X002"
-or the "LM NT 0.12" protocol, and it must be in user level security
-mode.
-
-NOTE: Using a password server means your UNIX box (running Samba) is
-only as secure as your password server. DO NOT CHOOSE A PASSWORD
-SERVER THAT YOU DON'T COMPLETELY TRUST.
-
-Never point a Samba server at itself for password serving. This will
-cause a loop and could lock up your Samba server!
-
-The name of the password server takes the standard substitutions, but
-probably the only useful one is %m, which means the Samba server will
-use the incoming client as the password server. If you use this then
-you better trust your clients, and you better restrict them with hosts
-allow!
-
-If you list several hosts in the "password server" option then smbd
-will try each in turn till it finds one that responds. This is useful
-in case your primary server goes down.
-
-.SS path (S)
-A synonym for this parameter is 'directory'.
-
-This parameter specifies a directory to which the user of the service is to
-be given access. In the case of printable services, this is where print data
-will spool prior to being submitted to the host for printing.
-
-For a printable service offering guest access, the service should be readonly
-and the path should be world-writable and have the sticky bit set. This is not
-mandatory of course, but you probably won't get the results you expect if you
-do otherwise.
-
-Any occurrences of %u in the path will be replaced with the username
-that the client is connecting as. Any occurrences of %m will be
-replaced by the name of the machine they are connecting from. These
-replacements are very useful for setting up pseudo home directories
-for users.
-
-Note that this path will be based on 'root dir' if one was specified.
-.B Default:
- none
-
-.B Example:
- path = /home/fred+
-
-.SS postexec (S)
-
-This option specifies a command to be run whenever the service is
-disconnected. It takes the usual substitutions. The command may be run
-as the root on some systems.
-
-An interesting example may be do unmount server resources:
-
-postexec = /etc/umount /cdrom
-
-See also preexec
-
-.B Default:
- none (no command executed)
-
-.B Example:
- postexec = echo \e"%u disconnected from %S from %m (%I)\e" >> /tmp/log
-
-.SS postscript (S)
-This parameter forces a printer to interpret the print files as
-postscript. This is done by adding a %! to the start of print output.
-
-This is most useful when you have lots of PCs that persist in putting
-a control-D at the start of print jobs, which then confuses your
-printer.
-
-.B Default:
- postscript = False
-
-.B Example:
- postscript = True
-
-.SS preexec (S)
-
-This option specifies a command to be run whenever the service is
-connected to. It takes the usual substitutions.
-
-An interesting example is to send the users a welcome message every
-time they log in. Maybe a message of the day? Here is an example:
-
-preexec = csh -c 'echo \e"Welcome to %S!\e" | \e
- /usr/local/samba/bin/smbclient -M %m -I %I' &
-
-Of course, this could get annoying after a while :-)
-
-See also postexec
-
-.B Default:
- none (no command executed)
-
-.B Example:
- preexec = echo \e"%u connected to %S from %m (%I)\e" >> /tmp/log
-
-.SS preferred master (G)
-This boolean parameter controls if Samba is a preferred master browser
-for its workgroup.
-If this is set to true, on startup, samba will force an election,
-and it will have a slight advantage in winning the election.
-It is recommended that this parameter is used in conjunction
-with domain master = yes, so that samba can guarantee becoming
-a domain master.
-
-Use this option with caution, because if there are several hosts
-(whether samba servers, Windows 95 or NT) that are preferred master
-browsers on the same subnet, they will each periodically and continuously
-attempt to become the local master browser. This will result in
-unnecessary broadcast traffic and reduced browsing capabilities.
-
-See
-.B os level = nn
-
-.B Default:
- preferred master = no
-
-.SS preload
-This is an alias for "auto services"
-
-.SS preserve case (S)
-
-This controls if new filenames are created with the case that the
-client passes, or if they are forced to be the "default" case.
-
-.B Default:
- preserve case = no
-
-See the section on "NAME MANGLING" for a fuller discussion.
-
-.SS print command (S)
-After a print job has finished spooling to a service, this command will be
-used via a system() call to process the spool file. Typically the command
-specified will submit the spool file to the host's printing subsystem, but
-there is no requirement that this be the case. The server will not remove the
-spool file, so whatever command you specify should remove the spool file when
-it has been processed, otherwise you will need to manually remove old spool
-files.
-
-The print command is simply a text string. It will be used verbatim,
-with two exceptions: All occurrences of "%s" will be replaced by the
-appropriate spool file name, and all occurrences of "%p" will be
-replaced by the appropriate printer name. The spool file name is
-generated automatically by the server, the printer name is discussed
-below.
-
-The full path name will be used for the filename if %s is not preceded
-by a /. If you don't like this (it can stuff up some lpq output) then
-use %f instead. Any occurrences of %f get replaced by the spool
-filename without the full path at the front.
-
-The print command MUST contain at least one occurrence of "%s" or %f -
-the "%p" is optional. At the time a job is submitted, if no printer
-name is supplied the "%p" will be silently removed from the printer
-command.
-
-If specified in the [global] section, the print command given will be used
-for any printable service that does not have its own print command specified.
-
-If there is neither a specified print command for a printable service nor a
-global print command, spool files will be created but not processed and (most
-importantly) not removed.
-
-Note that printing may fail on some UNIXes from the "nobody"
-account. If this happens then create an alternative guest account that
-can print and set the "guest account" in the [global] section.
-
-You can form quite complex print commands by realising that they are
-just passed to a shell. For example the following will log a print
-job, print the file, then remove it. Note that ; is the usual
-separator for command in shell scripts.
-
-print command = echo Printing %s >> /tmp/print.log; lpr -P %p %s; rm %s
-
-You may have to vary this command considerably depending on how you
-normally print files on your system.
-
-.B Default:
- print command = lpr -r -P %p %s
-
-.B Example:
- print command = /usr/local/samba/bin/myprintscript %p %s
-.SS print ok (S)
-See
-.B printable.
-.SS printable (S)
-A synonym for this parameter is 'print ok'.
-
-If this parameter is 'yes', then clients may open, write to and submit spool
-files on the directory specified for the service.
-
-Note that a printable service will ALWAYS allow writing to the service path
-(user privileges permitting) via the spooling of print data. The 'read only'
-parameter controls only non-printing access to the resource.
-
-.B Default:
- printable = no
-
-.B Example:
- printable = yes
-
-.SS printcap name (G)
-This parameter may be used to override the compiled-in default printcap
-name used by the server (usually /etc/printcap). See the discussion of the
-[printers] section above for reasons why you might want to do this.
-
-For those of you without a printcap (say on SysV) you can just create a
-minimal file that looks like a printcap and set "printcap name =" in
-[global] to point at it.
-
-A minimal printcap file would look something like this:
-
-print1|My Printer 1
-.br
-print2|My Printer 2
-.br
-print3|My Printer 3
-.br
-print4|My Printer 4
-.br
-print5|My Printer 5
-
-where the | separates aliases of a printer. The fact that the second
-alias has a space in it gives a hint to Samba that it's a comment.
-
-NOTE: Under AIX the default printcap name is "/etc/qconfig". Samba
-will assume the file is in AIX "qconfig" format if the string
-"/qconfig" appears in the printcap filename.
-
-.B Default:
- printcap name = /etc/printcap
-
-.B Example:
- printcap name = /etc/myprintcap
-.SS printer (S)
-A synonym for this parameter is 'printer name'.
-
-This parameter specifies the name of the printer to which print jobs spooled
-through a printable service will be sent.
-
-If specified in the [global] section, the printer name given will be used
-for any printable service that does not have its own printer name specified.
-
-.B Default:
- none (but may be 'lp' on many systems)
-
-.B Example:
- printer name = laserwriter
-
-.SS printer driver (S)
-This option allows you to control the string that clients receive when
-they ask the server for the printer driver associated with a
-printer. If you are using Windows95 or WindowsNT then you can use this
-to automate the setup of printers on your system.
-
-You need to set this parameter to the exact string (case sensitive)
-that describes the appropriate printer driver for your system.
-If you don't know the exact string to use then you should first try
-with no "printer driver" option set and the client will give you a
-list of printer drivers. The appropriate strings are shown in a
-scrollbox after you have chosen the printer manufacturer.
-
-.B Example:
- printer driver = HP LaserJet 4L
-
-.SS printer name (S)
-See
-.B printer.
-
-.SS printing (G)
-This parameters controls how printer status information is interpreted
-on your system, and also affects the default values for the "print
-command", "lpq command" and "lprm command".
-
-Currently six printing styles are supported. They are "printing =
-bsd", "printing = sysv", "printing = hpux", "printing = aix",
-"printing = qnx" and "printing = plp".
-
-To see what the defaults are for the other print commands when using
-these three options use the "testparm" program.
-
-
-.SS protocol (G)
-The value of the parameter (a string) is the highest protocol level that will
-be supported by the server.
-
-Possible values are CORE, COREPLUS, LANMAN1, LANMAN2 and NT1. The relative
-merits of each are discussed in the README file.
-
-Normally this option should not be set as the automatic negotiation
-phase in the SMB protocol takes care of choosing the appropriate protocol.
-
-.B Default:
- protocol = NT1
-
-.B Example:
- protocol = LANMAN1
-.SS public (S)
-A synonym for this parameter is 'guest ok'.
-
-If this parameter is 'yes' for a service, then no password is required
-to connect to the service. Privileges will be those of the guest
-account.
-
-See the section below on user/password validation for more information about
-this option.
-
-.B Default:
- public = no
-
-.B Example:
- public = yes
-.SS read list (S)
-This is a list of users that are given read-only access to a
-service. If the connecting user is in this list then they will
-not be given write access, no matter what the "read only" option
-is set to. The list can include group names using the @group syntax.
-
-See also the "write list" option
-
-.B Default:
- read list =
-
-.B Example:
- read list = mary, @students
-
-.SS read only (S)
-See
-.B writable
-and
-.B write ok.
-Note that this is an inverted synonym for writable and write ok.
-.SS read prediction (G)
-This options enables or disables the read prediction code used to
-speed up reads from the server. When enabled the server will try to
-pre-read data from the last accessed file that was opened read-only
-while waiting for packets.
-
-.SS Default:
- read prediction = False
-
-.SS Example:
- read prediction = True
-.SS read raw (G)
-This parameter controls whether or not the server will support raw reads when
-transferring data to clients.
-
-If enabled, raw reads allow reads of 65535 bytes in one packet. This
-typically provides a major performance benefit.
-
-However, some clients either negotiate the allowable block size incorrectly
-or are incapable of supporting larger block sizes, and for these clients you
-may need to disable raw reads.
-
-In general this parameter should be viewed as a system tuning tool and left
-severely alone. See also
-.B write raw.
-
-.B Default:
- read raw = yes
-
-.B Example:
- read raw = no
-.SS read size (G)
-
-The option "read size" affects the overlap of disk reads/writes with
-network reads/writes. If the amount of data being transferred in
-several of the SMB commands (currently SMBwrite, SMBwriteX and
-SMBreadbraw) is larger than this value then the server begins writing
-the data before it has received the whole packet from the network, or
-in the case of SMBreadbraw, it begins writing to the network before
-all the data has been read from disk.
-
-This overlapping works best when the speeds of disk and network access
-are similar, having very little effect when the speed of one is much
-greater than the other.
-
-The default value is 2048, but very little experimentation has been
-done yet to determine the optimal value, and it is likely that the best
-value will vary greatly between systems anyway. A value over 65536 is
-pointless and will cause you to allocate memory unnecessarily.
-
-.B Default:
- read size = 2048
-
-.B Example:
- read size = 8192
-
-.SS remote announce (G)
-
-This option allows you to setup nmbd to periodically announce itself
-to arbitrary IP addresses with an arbitrary workgroup name.
-
-This is useful if you want your Samba server to appear in a remote
-workgroup for which the normal browse propagation rules don't
-work. The remote workgroup can be anywhere that you can send IP
-packets to.
-
-For example:
-
- remote announce = 192.168.2.255/SERVERS 192.168.4.255/STAFF
-
-the above line would cause nmbd to announce itself to the two given IP
-addresses using the given workgroup names. If you leave out the
-workgroup name then the one given in the "workgroup" option is used
-instead.
-
-The IP addresses you choose would normally be the broadcast addresses
-of the remote networks, but can also be the IP addresses of known
-browse masters if your network config is that stable.
-
-This option replaces similar functionality from the nmbd lmhosts file.
-
-.SS revalidate (S)
-
-This options controls whether Samba will allow a previously validated
-username/password pair to be used to attach to a share. Thus if you
-connect to \e\eserver\eshare1 then to \e\eserver\eshare2 it won't
-automatically allow the client to request connection to the second
-share as the same username as the first without a password.
-
-If "revalidate" is True then the client will be denied automatic
-access as the same username.
-
-.B Default:
- revalidate = False
-
-.B Example:
- revalidate = True
-
-.SS root (G)
-See
-.B root directory.
-.SS root dir (G)
-See
-.B root directory.
-.SS root directory (G)
-Synonyms for this parameter are 'root dir' and 'root'.
-
-The server will chroot() to this directory on startup. This is not
-strictly necessary for secure operation. Even without it the server
-will deny access to files not in one of the service entries. It may
-also check for, and deny access to, soft links to other parts of the
-filesystem, or attempts to use .. in file names to access other
-directories (depending on the setting of the "wide links" parameter).
-
-Adding a "root dir" entry other than "/" adds an extra level of security,
-but at a price. It absolutely ensures that no access is given to files not
-in the sub-tree specified in the "root dir" option, *including* some files
-needed for complete operation of the server. To maintain full operability
-of the server you will need to mirror some system files into the "root dir"
-tree. In particular you will need to mirror /etc/passwd (or a subset of it),
-and any binaries or configuration files needed for printing (if required).
-The set of files that must be mirrored is operating system dependent.
-
-.B Default:
- root directory = /
-
-.B Example:
- root directory = /homes/smb
-.SS root postexec (S)
-
-This is the same as postexec except that the command is run as
-root. This is useful for unmounting filesystems (such as cdroms) after
-a connection is closed.
-
-.SS root preexec (S)
-
-This is the same as preexec except that the command is run as
-root. This is useful for mounting filesystems (such as cdroms) before
-a connection is finalised.
-
-.SS security (G)
-This option affects how clients respond to Samba.
-
-The option sets the "security mode bit" in replies to protocol negotiations
-to turn share level security on or off. Clients decide based on this bit
-whether (and how) to transfer user and password information to the server.
-
-The default is "security=SHARE", mainly because that was the only
-option at one stage.
-
-The alternatives are "security = user" or "security = server".
-
-If your PCs use usernames that are the same as their usernames on the
-UNIX machine then you will want to use "security = user". If you
-mostly use usernames that don't exist on the UNIX box then use
-"security = share".
-
-There is a bug in WfWg that may affect your decision. When in user
-level security a WfWg client will totally ignore the password you type
-in the "connect drive" dialog box. This makes it very difficult (if
-not impossible) to connect to a Samba service as anyone except the
-user that you are logged into WfWg as.
-
-If you use "security = server" then Samba will try to validate the
-username/password by passing it to another SMB server, such as an NT
-box. If this fails it will revert to "security = USER".
-
-See the "password server" option for more details.
-
-.B Default:
- security = SHARE
-
-.B Example:
- security = USER
-.SS server string (G)
-This controls what string will show up in the printer comment box in
-print manager and next to the IPC connection in "net view". It can be
-any string that you wish to show to your users.
-
-It also sets what will appear in browse lists next to the machine name.
-
-A %v will be replaced with the Samba version number.
-
-A %h will be replaced with the hostname.
-
-.B Default:
- server string = Samba %v
-
-.B Example:
- server string = University of GNUs Samba Server
-
-.SS set directory (S)
-If 'set directory = no', then users of the service may not use the setdir
-command to change directory.
-
-The setdir command is only implemented in the Digital Pathworks client. See the
-Pathworks documentation for details.
-
-.B Default:
- set directory = no
-
-.B Example:
- set directory = yes
-
-.SS shared file entries (G)
-This parameter is only useful when Samba has been compiled with FAST_SHARE_MODES.
-It specifies the number of hash bucket entries used for share file locking.
-You should never change this parameter unless you have studied the source
-and know what you are doing.
-
-.B Default
- shared file entries = 113
-
-.SS shared mem size (G)
-This parameter is only useful when Samba has been compiled with FAST_SHARE_MODES.
-It specifies the size of the shared memory (in bytes) to use between smbd
-processes. You should never change this parameter unless you have studied
-the source and know what you are doing.
-
-.B Default
- shared mem size = 102400
-
-.SS smb passwd file (G)
-This option sets the path to the encrypted smbpasswd file. This is a *VERY
-DANGEROUS OPTION* if the smb.conf is user writable. By default the path
-to the smbpasswd file is compiled into Samba.
-
-.SS smbrun (G)
-This sets the full path to the smbrun binary. This defaults to the
-value in the Makefile.
-
-You must get this path right for many services to work correctly.
-
-.B Default:
-taken from Makefile
-
-.B Example:
- smbrun = /usr/local/samba/bin/smbrun
-
-.SS share modes (S)
-
-This enables or disables the honouring of the "share modes" during a
-file open. These modes are used by clients to gain exclusive read or
-write access to a file.
-
-These open modes are not directly supported by UNIX, so they are
-simulated using lock files in the "lock directory". The "lock
-directory" specified in smb.conf must be readable by all users.
-
-The share modes that are enabled by this option are DENY_DOS,
-DENY_ALL, DENY_READ, DENY_WRITE, DENY_NONE and DENY_FCB.
-
-Enabling this option gives full share compatibility but may cost a bit
-of processing time on the UNIX server. They are enabled by default.
-
-.B Default:
- share modes = yes
-
-.B Example:
- share modes = no
-
-.SS short preserve case (S)
-
-This controls if new short filenames are created with the case that
-the client passes, or if they are forced to be the "default" case.
-
-.B Default:
- short preserve case = no
-
-See the section on "NAME MANGLING" for a fuller discussion.
-
-.SS socket address (G)
-
-This option allows you to control what address Samba will listen for
-connections on. This is used to support multiple virtual interfaces on
-the one server, each with a different configuration.
-
-By default samba will accept connections on any address.
-
-.B Example:
- socket address = 192.168.2.20
-
-.SS socket options (G)
-This option (which can also be invoked with the -O command line
-option) allows you to set socket options to be used when talking with
-the client.
-
-Socket options are controls on the networking layer of the operating
-systems which allow the connection to be tuned.
-
-This option will typically be used to tune your Samba server for
-optimal performance for your local network. There is no way that Samba
-can know what the optimal parameters are for your net, so you must
-experiment and choose them yourself. I strongly suggest you read the
-appropriate documentation for your operating system first (perhaps
-"man setsockopt" will help).
-
-You may find that on some systems Samba will say "Unknown socket
-option" when you supply an option. This means you either mis-typed it
-or you need to add an include file to includes.h for your OS. If the
-latter is the case please send the patch to me
-(samba-bugs@samba.anu.edu.au).
-
-Any of the supported socket options may be combined in any way you
-like, as long as your OS allows it.
-
-This is the list of socket options currently settable using this
-option:
-
- SO_KEEPALIVE
-
- SO_REUSEADDR
-
- SO_BROADCAST
-
- TCP_NODELAY
-
- IPTOS_LOWDELAY
-
- IPTOS_THROUGHPUT
-
- SO_SNDBUF *
-
- SO_RCVBUF *
-
- SO_SNDLOWAT *
-
- SO_RCVLOWAT *
-
-Those marked with a * take an integer argument. The others can
-optionally take a 1 or 0 argument to enable or disable the option, by
-default they will be enabled if you don't specify 1 or 0.
-
-To specify an argument use the syntax SOME_OPTION=VALUE for example
-SO_SNDBUF=8192. Note that you must not have any spaces before or after
-the = sign.
-
-If you are on a local network then a sensible option might be
-
-socket options = IPTOS_LOWDELAY
-
-If you have an almost unloaded local network and you don't mind a lot
-of extra CPU usage in the server then you could try
-
-socket options = IPTOS_LOWDELAY TCP_NODELAY
-
-If you are on a wide area network then perhaps try setting
-IPTOS_THROUGHPUT.
-
-Note that several of the options may cause your Samba server to fail
-completely. Use these options with caution!
-
-.B Default:
- no socket options
-
-.B Example:
- socket options = IPTOS_LOWDELAY
-
-
-
-
-.SS status (G)
-This enables or disables logging of connections to a status file that
-.B smbstatus
-can read.
-
-With this disabled
-.B smbstatus
-won't be able to tell you what
-connections are active.
-
-.B Default:
- status = yes
-
-.B Example:
- status = no
-
-.SS strict locking (S)
-This is a boolean that controls the handling of file locking in the
-server. When this is set to yes the server will check every read and
-write access for file locks, and deny access if locks exist. This can
-be slow on some systems.
-
-When strict locking is "no" the server does file lock checks only when
-the client explicitly asks for them.
-
-Well behaved clients always ask for lock checks when it is important,
-so in the vast majority of cases "strict locking = no" is preferable.
-
-.B Default:
- strict locking = no
-
-.B Example:
- strict locking = yes
-
-.SS strip dot (G)
-This is a boolean that controls whether to strip trailing dots off
-UNIX filenames. This helps with some CDROMs that have filenames ending in a
-single dot.
-
-.B Default:
- strip dot = no
-
-.B Example:
- strip dot = yes
-
-.SS syslog (G)
-This parameter maps how Samba debug messages are logged onto the
-system syslog logging levels. Samba debug level zero maps onto
-syslog LOG_ERR, debug level one maps onto LOG_WARNING, debug
-level two maps to LOG_NOTICE, debug level three maps onto LOG_INFO.
-The paramter sets the threshold for doing the mapping, all Samba
-debug messages above this threashold are mapped to syslog LOG_DEBUG
-messages.
-
-.B Default:
-
- syslog = 1
-
-.SS syslog only (G)
-If this parameter is set then Samba debug messages are logged into
-the system syslog only, and not to the debug log files.
-
-.B Default:
- syslog only = no
-
-.SS sync always (S)
-
-This is a boolean parameter that controls whether writes will always
-be written to stable storage before the write call returns. If this is
-false then the server will be guided by the client's request in each
-write call (clients can set a bit indicating that a particular write
-should be synchronous). If this is true then every write will be
-followed by a fsync() call to ensure the data is written to disk.
-
-.B Default:
- sync always = no
-
-.B Example:
- sync always = yes
-
-.SS time offset (G)
-This parameter is a setting in minutes to add to the normal GMT to
-local time conversion. This is useful if you are serving a lot of PCs
-that have incorrect daylight saving time handling.
-
-.B Default:
- time offset = 0
-
-.B Example:
- time offset = 60
-
-.SS time server (G)
-This parameter determines if nmbd advertises itself as a time server
-to Windows clients. The default is False.
-
-.B Default:
- time server = False
-
-.B Example:
- time server = True
-
-.SS unix realname (G)
-This boolean parameter when set causes samba to supply the real name field
-from the unix password file to the client. This is useful for setting up
-mail clients and WWW browsers on systems used by more than one person.
-
-.B Default:
- unix realname = no
-
-.B Example:
- unix realname = yes
-
-.SS user (S)
-See
-.B username.
-.SS username (S)
-A synonym for this parameter is 'user'.
-
-Multiple users may be specified in a comma-delimited list, in which case the
-supplied password will be tested against each username in turn (left to right).
-
-The username= line is needed only when the PC is unable to supply its own
-username. This is the case for the coreplus protocol or where your
-users have different WfWg usernames to UNIX usernames. In both these
-cases you may also be better using the \e\eserver\eshare%user syntax
-instead.
-
-The username= line is not a great solution in many cases as it means Samba
-will try to validate the supplied password against each of the
-usernames in the username= line in turn. This is slow and a bad idea for
-lots of users in case of duplicate passwords. You may get timeouts or
-security breaches using this parameter unwisely.
-
-Samba relies on the underlying UNIX security. This parameter does not
-restrict who can login, it just offers hints to the Samba server as to
-what usernames might correspond to the supplied password. Users can
-login as whoever they please and they will be able to do no more
-damage than if they started a telnet session. The daemon runs as the
-user that they log in as, so they cannot do anything that user cannot
-do.
-
-To restrict a service to a particular set of users you can use the
-"valid users=" line.
-
-If any of the usernames begin with a @ then the name will be looked up
-in the groups file and will expand to a list of all users in the group
-of that name. Note that searching though a groups file can take quite
-some time, and some clients may time out during the search.
-
-See the section below on username/password validation for more information
-on how this parameter determines access to the services.
-
-.B Default:
- The guest account if a guest service, else the name of the service.
-
-.B Examples:
- username = fred
- username = fred, mary, jack, jane, @users, @pcgroup
-
-.SS username level (G)
-
-This option helps Samba to try and 'guess' at the real UNIX username,
-as many DOS clients send an all-uppercase username. By default Samba
-tries all lowercase, followed by the username with the first letter
-capitalized, and fails if the username is not found on the UNIX machine.
-
-If this parameter is set to non-zero the behaviour changes. This
-parameter is a number that specifies the number of uppercase combinations
-to try whilst trying to determine the UNIX user name. The higher the number
-the more combinations will be tried, but the slower the discovery
-of usernames will be. Use this parameter when you have strange
-usernames on your UNIX machine, such as 'AstrangeUser'.
-
-.B Default:
- username level = 0
-
-.B Example:
- username level = 5
-
-.SS username map (G)
-
-This option allows you to to specify a file containing a mapping of
-usernames from the clients to the server. This can be used for several
-purposes. The most common is to map usernames that users use on DOS or
-Windows machines to those that the UNIX box uses. The other is to map
-multiple users to a single username so that they can more easily share
-files.
-
-The map file is parsed line by line. Each line should contain a single
-UNIX username on the left then a '=' followed by a list of usernames
-on the right. The list of usernames on the right may contain names of
-the form @group in which case they will match any UNIX username in
-that group. The special client name '*' is a wildcard and matches any
-name.
-
-The file is processed on each line by taking the supplied username and
-comparing it with each username on the right hand side of the '='
-signs. If the supplied name matches any of the names on the right
-hand side then it is replaced with the name on the left. Processing
-then continues with the next line.
-
-If any line begins with a '#' or a ';' then it is ignored
-
-For example to map from the name "admin" or "administrator" to the UNIX
-name "root" you would use
-
- root = admin administrator
-
-Or to map anyone in the UNIX group "system" to the UNIX name "sys" you
-would use
-
- sys = @system
-
-You can have as many mappings as you like in a username map file.
-
-Note that the remapping is applied to all occurrences of
-usernames. Thus if you connect to "\e\eserver\efred" and "fred" is
-remapped to "mary" then you will actually be connecting to
-"\e\eserver\emary" and will need to supply a password suitable for
-"mary" not "fred". The only exception to this is the username passed
-to the "password server" (if you have one). The password server will
-receive whatever username the client supplies without modification.
-
-Also note that no reverse mapping is done. The main effect this has is
-with printing. Users who have been mapped may have trouble deleting
-print jobs as PrintManager under WfWg will think they don't own the
-print job.
-
-.B Default
- no username map
-
-.B Example
- username map = /usr/local/samba/lib/users.map
-
-.SS valid chars (S)
-
-The option allows you to specify additional characters that should be
-considered valid by the server in filenames. This is particularly
-useful for national character sets, such as adding u-umlaut or a-ring.
-
-The option takes a list of characters in either integer or character
-form with spaces between them. If you give two characters with a colon
-between them then it will be taken as an lowercase:uppercase pair.
-
-If you have an editor capable of entering the characters into the
-config file then it is probably easiest to use this method. Otherwise
-you can specify the characters in octal, decimal or hexadecimal form
-using the usual C notation.
-
-For example to add the single character 'Z' to the charset (which is a
-pointless thing to do as it's already there) you could do one of the
-following
-
-valid chars = Z
-valid chars = z:Z
-valid chars = 0132:0172
-
-The last two examples above actually add two characters, and alter
-the uppercase and lowercase mappings appropriately.
-
-Note that you MUST specify this parameter after the "client code page"
-parameter if you have both set. If "client code page" is set after
-the "valid chars" parameter the "valid chars" settings will be
-overwritten.
-
-See also the "client code page" parameter.
-
-.B Default
-.br
- Samba defaults to using a reasonable set of valid characters
-.br
- for english systems
-
-.B Example
- valid chars = 0345:0305 0366:0326 0344:0304
-
-The above example allows filenames to have the swedish characters in
-them.
-
-NOTE: It is actually quite difficult to correctly produce a "valid
-chars" line for a particular system. To automate the process
-tino@augsburg.net has written a package called "validchars" which will
-automatically produce a complete "valid chars" line for a given client
-system. Look in the examples subdirectory for this package.
-
-.SS valid users (S)
-This is a list of users that should be allowed to login to this
-service. A name starting with @ is interpreted as a UNIX group.
-
-If this is empty (the default) then any user can login. If a username
-is in both this list and the "invalid users" list then access is
-denied for that user.
-
-The current servicename is substituted for %S. This is useful in the
-[homes] section.
-
-See also "invalid users"
-
-.B Default
- No valid users list. (anyone can login)
-
-.B Example
- valid users = greg, @pcusers
-
-
-.SS veto files(S)
-This is a list of files and directories that are neither visible nor
-accessible. Each entry in the list must be separated by a "/", which
-allows spaces to be included in the entry. '*' and '?' can be used to
-specify multiple files or directories as in DOS wildcards.
-
-Each entry must be a unix path, not a DOS path and must not include the
-unix directory separator "/".
-
-Note that the case sensitivity option is applicable in vetoing files.
-
-One feature of the veto files parameter that it is important to be
-aware of, is that if a directory contains nothing but files that
-match the veto files parameter (which means that Windows/DOS clients
-cannot ever see them) is deleted, the veto files within that directory
-*are automatically deleted* along with it, if the user has UNIX permissions
-to do so.
-
-Setting this parameter will affect the performance of Samba, as
-it will be forced to check all files and directories for a match
-as they are scanned.
-
-See also "hide files" and "case sensitive"
-
-.B Default
- No files or directories are vetoed.
-
-.B Examples
- Example 1.
- Veto any files containing the word Security,
- any ending in .tmp, and any directory containing the
- word root.
-
- veto files = /*Security*/*.tmp/*root*/
-
- Example 2.
- Veto the Apple specific files that a NetAtalk server
- creates.
-
- veto files = /.AppleDouble/.bin/.AppleDesktop/Network Trash Folder/
-
-.SS volume (S)
-This allows you to override the volume label returned for a
-share. Useful for CDROMs with installation programs that insist on a
-particular volume label.
-
-The default is the name of the share
-
-.SS wide links (S)
-This parameter controls whether or not links in the UNIX file system may be
-followed by the server. Links that point to areas within the directory tree
-exported by the server are always allowed; this parameter controls access
-only to areas that are outside the directory tree being exported.
-
-.B Default:
- wide links = yes
-
-.B Example:
- wide links = no
-
-.SS wins proxy (G)
-
-This is a boolean that controls if nmbd will respond to broadcast name
-queries on behalf of other hosts. You may need to set this to no for
-some older clients.
-
-.B Default:
- wins proxy = no
-.SS wins server (G)
-
-This specifies the DNS name (or IP address) of the WINS server that Samba
-should register with. If you have a WINS server on your network then you
-should set this to the WINS servers name.
-
-You should point this at your WINS server if you have a multi-subnetted
-network.
-.B Default:
- wins server =
-
-.SS wins support (G)
-
-This boolean controls if Samba will act as a WINS server. You should
-not set this to true unless you have a multi-subnetted network and
-you wish a particular nmbd to be your WINS server. Note that you
-should *NEVER* set this to true on more than one machine in your
-network.
-
-.B Default:
- wins support = no
-.SS workgroup (G)
-
-This controls what workgroup your server will appear to be in when
-queried by clients.
-
-.B Default:
- set in the Makefile
-
-.B Example:
- workgroup = MYGROUP
-
-.SS writable (S)
-A synonym for this parameter is 'write ok'. An inverted synonym is 'read only'.
-
-If this parameter is 'no', then users of a service may not create or modify
-files in the service's directory.
-
-Note that a printable service ('printable = yes') will ALWAYS allow
-writing to the directory (user privileges permitting), but only via
-spooling operations.
-
-.B Default:
- writable = no
-
-.B Examples:
- read only = no
- writable = yes
- write ok = yes
-.SS write list (S)
-This is a list of users that are given read-write access to a
-service. If the connecting user is in this list then they will be
-given write access, no matter what the "read only" option is set
-to. The list can include group names using the @group syntax.
-
-Note that if a user is in both the read list and the write list then
-they will be given write access.
-
-See also the "read list" option
-
-.B Default:
- write list =
-
-.B Example:
- write list = admin, root, @staff
-
-.SS write ok (S)
-See
-.B writable
-and
-.B read only.
-.SS write raw (G)
-This parameter controls whether or not the server will support raw writes when
-transferring data from clients.
-
-.B Default:
- write raw = yes
-
-.B Example:
- write raw = no
-.SH NOTE ABOUT USERNAME/PASSWORD VALIDATION
-There are a number of ways in which a user can connect to a
-service. The server follows the following steps in determining if it
-will allow a connection to a specified service. If all the steps fail
-then the connection request is rejected. If one of the steps pass then
-the following steps are not checked.
-
-If the service is marked "guest only = yes" then steps 1 to 5 are skipped
-
-Step 1: If the client has passed a username/password pair and that
-username/password pair is validated by the UNIX system's password
-programs then the connection is made as that username. Note that this
-includes the \e\eserver\eservice%username method of passing a username.
-
-Step 2: If the client has previously registered a username with the
-system and now supplies a correct password for that username then the
-connection is allowed.
-
-Step 3: The client's netbios name and any previously used user names
-are checked against the supplied password, if they match then the
-connection is allowed as the corresponding user.
-
-Step 4: If the client has previously validated a username/password
-pair with the server and the client has passed the validation token
-then that username is used. This step is skipped if "revalidate = yes"
-for this service.
-
-Step 5: If a "user = " field is given in the smb.conf file for the
-service and the client has supplied a password, and that password
-matches (according to the UNIX system's password checking) with one of
-the usernames from the user= field then the connection is made as the
-username in the "user=" line. If one of the username in the user= list
-begins with a @ then that name expands to a list of names in the group
-of the same name.
-
-Step 6: If the service is a guest service then a connection is made as
-the username given in the "guest account =" for the service,
-irrespective of the supplied password.
-.SH WARNINGS
-Although the configuration file permits service names to contain spaces,
-your client software may not. Spaces will be ignored in comparisons anyway,
-so it shouldn't be a problem - but be aware of the possibility.
-
-On a similar note, many clients - especially DOS clients - limit service
-names to eight characters. Smbd has no such limitation, but attempts
-to connect from such clients will fail if they truncate the service names.
-For this reason you should probably keep your service names down to eight
-characters in length.
-
-Use of the [homes] and [printers] special sections make life for an
-administrator easy, but the various combinations of default attributes can be
-tricky. Take extreme care when designing these sections. In particular,
-ensure that the permissions on spool directories are correct.
-.SH VERSION
-This man page is (mostly) correct for version 1.9.16 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the server has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-
-Prior to version 1.5.21 of the Samba suite, the configuration file was
-radically different (more primitive). If you are using a version earlier than
-1.8.05, it is STRONGLY recommended that you upgrade.
-.SH OPTIONS
-Not applicable.
-.SH FILES
-Not applicable.
-.SH ENVIRONMENT VARIABLES
-Not applicable.
-.SH SEE ALSO
-.BR smbd (8),
-.BR smbclient (1),
-.BR nmbd (8),
-.BR testparm (1),
-.BR testprns (1),
-.BR lpq (1),
-.BR hosts_access (5)
-.SH DIAGNOSTICS
-[This section under construction]
-
-Most diagnostics issued by the server are logged in a specified log file. The
-log file name is specified at compile time, but may be overridden on the
-smbd command line (see
-.BR smbd (8)).
-
-The number and nature of diagnostics available depends on the debug level used
-by the server. If you have problems, set the debug level to 3 and peruse the
-log files.
-
-Most messages are reasonably self-explanatory. Unfortunately, at time of
-creation of this man page the source code is still too fluid to warrant
-describing each and every diagnostic. At this stage your best bet is still
-to grep the source code and inspect the conditions that gave rise to the
-diagnostics you are seeing.
-.SH BUGS
-None known.
-
-Please send bug reports, comments and so on to:
-
-.RS 3
-.B samba-bugs@samba.anu.edu.au (Andrew Tridgell)
-
-.RS 3
-or to the mailing list:
-.RE
-
-.B samba@listproc.anu.edu.au
-
-.RE
-You may also like to subscribe to the announcement channel:
-
-.RS 3
-.B samba-announce@listproc.anu.edu.au
-.RE
-
-To subscribe to these lists send a message to
-listproc@listproc.anu.edu.au with a body of "subscribe samba Your
-Name" or "subscribe samba-announce Your Name".
-
-Errors or suggestions for improvements to the Samba man pages should be
-mailed to:
-
-.RS 3
-.B samba-bugs@samba.anu.edu.au (Andrew Tridgell)
-.RE
-
diff --git a/docs/manpages/smbclient.1 b/docs/manpages/smbclient.1
deleted file mode 100644
index af36e4a3763..00000000000
--- a/docs/manpages/smbclient.1
+++ /dev/null
@@ -1,1211 +0,0 @@
-.TH SMBCLIENT 1 smbclient smbclient
-.SH NAME
-smbclient \- ftp-like Lan Manager client program
-.SH SYNOPSIS
-.B smbclient
-.B servicename
-[
-.B password
-] [
-.B \-A
-] [
-.B \-E
-] [
-.B \-L
-.I host
-] [
-.B \-M
-.I host
-] [
-.B \-I
-.I IP number
-] [
-.B \-N
-] [
-.B \-P
-] [
-.B \-U
-.I username
-] [
-.B \-d
-.I debuglevel
-] [
-.B \-l
-.I log basename
-] [
-.B \-n
-.I netbios name
-] [
-.B \-W
-.I workgroup
-] [
-.B \-O
-.I socket options
-] [
-.B \-p
-.I port number
-] [
-.B \-c
-.I command string
-] [
-.B \-T
-.I tar options
-] [
-.B \-D
-.I initial directory
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B smbclient
-is a client that can 'talk' to a Lan Manager server. It offers
-an interface similar to that of the
-.B ftp
-program (see
-.BR ftp (1)).
-Operations include things like getting files from the
-server to the local machine, putting files from the local machine to
-the server, retrieving directory information from the server and so on.
-.SH OPTIONS
-.B servicename
-.RS 3
-.B servicename
-is the name of the service you want to use on the server. A service
-name takes the form
-.B "\e\eserver\eservice"
-where
-.B server
-is the netbios name of the Lan Manager server offering the desired service and
-.B service
-is the name of the service offered. Thus to connect to the service "printer"
-on the Lan Manager server "lanman", you would use the servicename
-
-.RS 10
-.B "\e\elanman\eprinter"
-.RE
-
-Note that the server name required is NOT necessarily the host name of the
-server! The name required is a Lan Manager server name, which may or may not
-be the same as the hostname of the machine running the server.
-.RE
-
-.B password
-.RS 3
-.B
-password
-is the password required to access the specified service on the
-specified server. If supplied, the
-.B \-N
-option (suppress password prompt) is assumed.
-
-There is no default password. If no password is supplied on the command line
-(either here or using the
-.B \-U
-option (see below)) and
-.B \-N
-is not specified, the client will prompt for a password, even if the desired
-service does not require one. (If no password is
-required, simply press ENTER to provide a null password.)
-
-Note: Some servers (including OS/2 and Windows for Workgroups) insist
-on an uppercase password. Lowercase or mixed case passwords may be
-rejected by these servers.
-
-Be cautious about including passwords in scripts.
-.RE
-
-.B \-A
-
-.RS 3
-This parameter, if specified, causes the maximum debug level to be selected.
-Be warned that this generates prodigious amounts of debug data. There is also
-a security issue involved, as at the maximum debug level cleartext passwords
-may be written to some log files.
-.RE
-
-.B \-L
-
-.RS 3
-This option allows you to look at what services are available on a
-server. You use it as "smbclient -L host" and a list should appear.
-The
-.B \-I
-option may be useful if your netbios names don't match your
-tcp/ip host names or if you are trying to reach a host on another
-network. For example:
-
-smbclient -L ftp -I ftp.microsoft.com
-
-will list the shares available on Microsoft's public server.
-.RE
-
-.B \-M
-
-.RS 3
-This options allows you to send messages, using the "WinPopup"
-protocol, to another computer. Once a connection is established you
-then type your message, pressing ^D (control-D) to end.
-
-If the receiving computer is running WinPopup the user will receive
-the message and probably a beep. If they are not running WinPopup the
-message will be lost, and no error message will occur.
-
-The message is also automatically truncated if the message is over
-1600 bytes, as this is the limit of the protocol.
-
-One useful trick is to cat the message through
-.BR smbclient .
-For example:
-
-cat mymessage.txt | smbclient -M FRED
-
-will send the message in the file "mymessage.txt" to the machine FRED.
-
-You may also find the
-.B \-U
-and
-.B \-I
-options useful, as they allow you to
-control the FROM and TO parts of the message.
-
-See the message command section of
-.BR smb.conf (5)
-for a description of how to handle incoming WinPopup messages in Samba.
-
-Note: Copy WinPopup into the startup group on your WfWg PCs if you
-want them to always be able to receive messages.
-.RE
-
-.B \-E
-
-.RS 3
-This parameter, if specified, causes the client to write messages to the
-standard error stream (stderr) rather than to the standard output stream.
-
-By default, the client writes messages to standard output - typically the
-user's tty.
-.RE
-
-.B \-I
-.I IP number
-
-.RS 3
-.I IP number
-represents the IP number of the server to connect to. It should
-be specified in standard "a.b.c.d" notation.
-
-Normally the client will attempt to locate the specified Lan Manager server
-by looking it up - that is, broadcasting a request for the given server to
-identify itself. Using this parameter will force the client to assume that
-the server is on the machine with the specified IP number.
-
-There is no default for this parameter. If not supplied, it will be determined
-automatically by the client as described above.
-.RE
-
-.B \-N
-
-.RS 3
-If specified, this parameter suppresses the normal password prompt from the
-client to the user. This is useful when accessing a service that does not
-require a password.
-
-Unless a password is specified on the command line or this parameter is
-specified, the client will request a password.
-.RE
-
-.B \-O
-.I socket options
-
-.RS 3
-See the socket options section of
-.BR smb.conf (5)
-for details.
-.RE
-
-.B \-P
-
-.RS 3
-If specified, the service requested will be connected to as a printer service
-rather than as a normal filespace service. Operations such as put and get
-will not be applicable for such a connection.
-
-By default, services will be connected to as NON-printer services.
-.RE
-
-.B \-U
-.I username
-
-.RS 3
-.I username
-is the user name that will be used by the client to make a connection,
-assuming your server is running a protocol that allows for usernames.
-
-Some servers are fussy about the case of this name, and some insist
-that it must be a valid netbios name.
-
-If no
-.I username
-is supplied, it will default to an uppercase version of the
-environment variable
-.B USER
-or
-.B LOGNAME
-in that order.
-If no
-.I username
-is supplied and neither environment variable exists the user name will
-be empty.
-
-If the USER environment variable containts a '%' character, everything
-after that will be treated as a password. This allows you to set the
-environment variable to be
-.B USER=username%password
-so that a password is not passed on the command line (where it may
-be seen by the ps command).
-
-If the service you are connecting to requires a password, it can be supplied
-using the
-.B \-U
-option, by appending a percent symbol ("%") then the password to
-.I username.
-For example, to attach to a service as user "fred" with password "secret", you
-would specify
-.B \-U
-.I fred%secret
-on the command line. Note that there are no spaces around the percent symbol.
-
-If you specify the password as part of
-.I username
-then the
-.B \-N
-option (suppress password prompt) is assumed.
-
-If you specify the password as a parameter AND as part of
-.I username
-then the password as part of
-.I username
-will take precedence. Putting nothing before or nothing after the percent
-symbol will cause an empty username or an empty password to be used,
-respectively.
-
-Note: Some servers (including OS/2 and Windows for Workgroups) insist
-on an uppercase password. Lowercase or mixed case passwords may be
-rejected by these servers.
-
-Be cautious about including passwords in scripts.
-.RE
-
-.B \-d
-.I debuglevel
-
-.RS 3
-debuglevel is an integer from 0 to 5.
-
-The default value if this parameter is not specified is zero.
-
-The higher this value, the more detail will be logged to the log files about
-the activities of the client. At level 0, only critical errors and serious
-warnings will be logged. Level 1 is a reasonable level for day to day running
-- it generates a small amount of information about operations carried out.
-
-Levels above 1 will generate considerable amounts of log data, and should
-only be used when investigating a problem. Levels above 3 are designed for
-use only by developers and generate HUGE amounts of log data, most of which
-is extremely cryptic.
-.RE
-
-.B \-l
-.I log basename
-
-.RS 3
-If specified,
-.I log basename
-specifies a base filename into which operational data from the running client
-will be logged.
-
-The default base name is specified at compile time.
-
-The base name is used to generate actual log file names. For example, if the
-name specified was "log", the following files would be used for log data:
-
-.RS 3
-log.client.debug (containing debugging information)
-
-log.client.in (containing inbound transaction data)
-
-log.client.out (containing outbound transaction data)
-.RE
-
-The log files generated are never removed by the client.
-.RE
-
-.B \-n
-.I netbios name
-
-.RS 3
-By default, the client will use the local machine's hostname (in
-uppercase) as its netbios name. This parameter allows you to override
-the host name and use whatever netbios name you wish.
-.RE
-
-.B \-W
-.I workgroup
-
-.RS 3
-Override what workgroup is used for the connection. This may be needed
-to connect to some servers.
-.RE
-
-.B \-p
-.I port number
-
-.RS 3
-port number is a positive integer value.
-
-The default value if this parameter is not specified is 139.
-
-This number is the port number that will be used when making connections to
-the server. The standard (well-known) port number for the server is 139,
-hence the default.
-
-This parameter is not normally specified.
-.RE
-
-.B \-T
-.I tar options
-
-.RS 3
-where
-.I tar options
-consists of one or more of
-.BR c ,
-.BR x ,
-.BR I ,
-.BR X ,
-.BR b ,
-.BR g ,
-.BR N
-or
-.BR a ;
-used as:
-.LP
-smbclient
-.B "\e\eserver\eshare"
-\-TcxIXbgNa
-[
-.IR blocksize
-]
-[
-.IR newer-file
-]
-.IR tarfile
-[
-.IR filenames....
-]
-
-.RS 3
-.B c
-Create a tar file on UNIX. Must be followed by the name of a tar file,
-tape device or "\-" for standard output. (May be useful to set debugging
-low
-.RB ( -d0 ))
-to avoid corrupting your tar file if using "\-"). Mutually
-exclusive with the
-.B x
-flag.
-
-.B x
-Extract (restore) a local tar file back to a share. Unless the
-.B \-D
-option is given, the tar files will be restored from the top level of
-the share. Must be followed by the name of the tar file, device or "\-"
-for standard input. Mutually exclusive with the
-.B c
-flag.
-
-.B I
-Include files and directories. Is the default behaviour when
-.IR filenames
-are specified above. Causes tar files to be included in an extract or create
-(and therefore everything else to be excluded). See example below.
-Filename globbing does not work for included files for extractions (yet).
-
-.B X
-Exclude files and directories. Causes tar files to be excluded from
-an extract or create. See example below.
-Filename globbing does not work for excluded files (yet).
-
-.B b
-Blocksize. Must be followed by a valid (greater than zero) blocksize.
-Causes tar file to be written out in blocksize*TBLOCK (usually 512 byte)
-blocks.
-
-.B g
-Incremental. Only back up files that have the archive bit set. Useful
-only with the
-.B c
-flag.
-
-.B N
-Newer than. Must be followed by the name of a file whose date is
-compared against files found on the share during a create. Only files
-newer than the file specified are backed up to the tar file. Useful
-only with the
-.B c
-flag.
-
-.B a
-Set archive bit. Causes the archive bit to be reset when a file is backed
-up. Useful with the
-.B g
-(and
-.BR c )
-flags.
-.LP
-
-.B Examples
-
-smbclient \e\emypc\emyshare "" -N -Tx backup.tar
-
-Restore from tar file backup.tar into myshare on mypc (no password on share).
-
-smbclient \e\emypc\emyshare "" -N -TXx backup.tar users/docs
-
-Restore everything except users/docs
-
-smbclient \e\emypc\emyshare "" -N -Tc backup.tar users/docs
-
-Create a tar file of the files beneath users/docs.
-.RE
-.RE
-
-.B \-D
-.I initial directory
-
-.RS 3
-Change to initial directory before starting. Probably only of any use
-with the tar
-.RB ( \-T )
-option.
-.RE
-
-.B \-c
-.I command string
-
-.RS 3
-command string is a semicolon separated list of commands to be
-executed instead of prompting from stdin.
-.B \-N
-is implied by
-.BR \-c .
-
-This is particularly useful in scripts and for printing stdin to
-the server, e.g. \-c 'print \-'.
-.RE
-.SH OPERATIONS
-Once the client is running, the user is presented with a prompt, "smb: \e>".
-The backslash ("\e") indicates the current working directory on the server,
-and will change if the current working directory is changed.
-
-The prompt indicates that the client is ready and waiting to carry out a user
-command. Each command is a single word, optionally followed by parameters
-specific to that command. Command and parameters are space-delimited unless
-these notes specifically state otherwise. All commands are case-insensitive.
-Parameters to commands may or may not be case sensitive, depending on the
-command.
-
-You can specify file names which have spaces in them by quoting the
-name with double quotes, for example "a long file name".
-
-Parameters shown in square brackets (eg., "[parameter]") are optional. If not
-given, the command will use suitable defaults. Parameters shown in angle
-brackets (eg., "<parameter>") are required.
-
-Note that all commands operating on the server are actually performed by
-issuing a request to the server. Thus the behaviour may vary from server to
-server, depending on how the server was implemented.
-
-The commands available are given here in alphabetical order.
-
-.B ?
-.RS 3
-.B Parameters:
-.RS 3
-.I [command]
-
-.RE
-.B Description:
-.RS 3
-If
-.I command
-is specified, the
-.B ?
-command will display a brief informative message about the specified command.
-
-If no command is specified, a list of available commands will be displayed.
-.RE
-.RE
-
-.B !
-.RS 3
-.B Parameters:
-.RS 3
-.I [shell command]
-
-.RE
-.B Description:
-.RS 3
-If
-.I shell command
-is specified, the
-.B !
-command will execute a shell locally and run the specified shell command. If
-no command is specified, a shell will be run.
-.RE
-.RE
-
-.B cd
-.RS 3
-.B Parameters:
-.RS 3
-.I [directory name]
-
-.RE
-.B Description:
-.RS 3
-If
-.I directory name
-is specified, the current working directory
-.B on the server
-will be changed to the directory specified. This operation will fail if for
-any reason the specified directory is inaccessible.
-
-If no directory name is specified, the current working directory
-.B on the server
-will be reported.
-.RE
-.RE
-
-.B del
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-The client will request that the server attempt to delete all files matching
-.I mask
-from the current working directory
-.B on the server.
-.RE
-.RE
-
-.B dir
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-A list of the files matching
-.I mask
-in the current working directory
-.B on the server
-will be retrieved from the server and displayed.
-.RE
-.RE
-
-.B exit
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-Terminate the connection with the server and exit from the program.
-.RE
-.RE
-
-.B get
-.RS 3
-.B Parameters:
-.RS 3
-.I <remote file name> [local file name]
-
-.RE
-.B Description:
-.RS 3
-Copy the file called
-.I remote file name
-from the server to the machine running the client. If specified, name the
-local copy
-.I local file name.
-Note that all transfers in
-.B smbclient
-are binary. See also the
-.B lowercase
-command.
-.RE
-.RE
-
-.B help
-.RS 3
-.B Parameters:
-.RS 3
-.I [command]
-
-.RE
-.B Description:
-.RS 3
-See the
-.B ?
-command above.
-.RE
-.RE
-
-.B lcd
-.RS 3
-.B Parameters:
-.RS 3
-.I [directory name]
-
-.RE
-.B Description:
-.RS 3
-If
-.I directory name
-is specified, the current working directory
-.B on the local machine
-will be changed to the directory specified. This operation will fail if for
-any reason the specified directory is inaccessible.
-
-If no directory name is specified, the name of the current working directory
-.B on the local machine
-will be reported.
-.RE
-.RE
-
-.B lowercase
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-Toggle lowercasing of filenames for the
-.B get
-and
-.B mget
-commands.
-
-When lowercasing is toggled ON, local filenames are converted to lowercase
-when using the
-.B get
-and
-.B mget
-commands. This is often useful when copying (say) MSDOS files from a server,
-because lowercase filenames are the norm on UNIX systems.
-.RE
-.RE
-
-.B ls
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-See the
-.B dir
-command above.
-.RE
-.RE
-
-.B mask
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-This command allows the user to set up a mask which will be used during
-recursive operation of the
-.B mget
-and
-.B mput
-commands.
-
-The masks specified to the
-.B mget
-and
-.B mput
-commands act as filters for directories
-rather than files when recursion is toggled ON.
-
-The mask specified with the
-.B mask
-command is necessary to filter files within those directories. For example,
-if the mask specified in an
-.B mget
-command is "source*"
-.I and
-the mask specified with the
-.B mask
-command is "*.c"
-.I and
-recursion is toggled ON, the
-.B mget
-command will retrieve all files matching "*.c" in all directories below
-and including all directories matching "source*" in the current working
-directory.
-
-Note that the value for
-.I mask
-defaults to blank (equivalent to "*") and remains so until the
-.B mask
-command is used to change it. It retains the most recently specified value
-indefinitely. To avoid unexpected results it would be wise to change the
-value of
-.I mask
-back to "*" after using the
-.B mget
-or
-.B mput
-commands.
-.RE
-.RE
-
-.B md
-.RS 3
-.B Parameters:
-.RS 3
-.I <directory name>
-
-.RE
-.B Description:
-.RS 3
-See the
-.B mkdir
-command.
-.RE
-.RE
-
-.B mget
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-Copy all files matching
-.I mask
-from the server to the machine running the client.
-
-Note that
-.I mask
-is interpreted differently during recursive operation and non-recursive
-operation - refer to the
-.B recurse
-and
-.B mask
-commands for more information. Note that all transfers in
-.B smbclient
-are binary. See also the
-.B lowercase
-command.
-.RE
-.RE
-
-.B mkdir
-.RS 3
-.B Parameters:
-.RS 3
-.I <directory name>
-
-.RE
-.B Description:
-.RS 3
-Create a new directory
-.B on the server
-(user access privileges permitting) with the specified name.
-.RE
-.RE
-
-.B mput
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-Copy all files matching
-.I mask
-in the current working directory
-.B on the local machine
-to the current working directory on the server.
-
-Note that
-.I mask
-is interpreted differently during recursive operation and non-recursive
-operation - refer to the
-.B recurse
-and
-.B mask
-commands for more information. Note that all transfers in
-.B smbclient
-are binary.
-.RE
-.RE
-
-.B print
-.RS 3
-.B Parameters:
-.RS 3
-.I <file name>
-
-.RE
-.B Description:
-.RS 3
-Print the specified file
-.B from the local machine
-through a printable service on the server.
-
-See also the
-.B printmode
-command.
-.RE
-.RE
-
-.B printmode
-.RS 3
-.B Parameters:
-.RS 3
-.I <graphics or text>
-
-.RE
-.B Description:
-.RS 3
-Set the print mode to suit either binary data (such as graphical information)
-or text. Subsequent
-.B print
-commands will use the currently set print mode.
-.RE
-.RE
-
-.B prompt
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-Toggle prompting for filenames during operation of the
-.B mget
-and
-.B mput
-commands.
-
-When toggled ON, the user will be prompted to confirm the transfer of each
-file during these commands. When toggled OFF, all specified files will be
-transferred without prompting.
-.RE
-.RE
-
-.B put
-.RS 3
-.B Parameters:
-.RS 3
-.I <local file name> [remote file name]
-
-.RE
-.B Description:
-.RS 3
-Copy the file called
-.I local file name
-from the machine running the client to the server. If specified, name the
-remote copy
-.I remote file name.
-Note that all transfers in
-.B smbclient
-are binary. See also the
-.B lowercase
-command.
-.RE
-.RE
-
-.B queue
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-Displays the print queue, showing the job id, name, size and current status.
-.RE
-.RE
-
-.B quit
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-See the
-.B exit
-command.
-.RE
-.RE
-
-.B rd
-.RS 3
-.B Parameters:
-.RS 3
-.I <directory name>
-
-.RE
-.B Description:
-.RS 3
-See the
-.B rmdir
-command.
-.RE
-.RE
-
-.B recurse
-.RS 3
-.B Parameters:
-.RS 3
-None.
-
-.RE
-.B Description:
-.RS 3
-Toggle directory recursion for the commands
-.B mget
-and
-.BR mput .
-
-When toggled ON, these commands will process all directories in the source
-directory (i.e., the directory they are copying
-.IR from )
-and will recurse into any that match the mask specified to the command. Only
-files that match the mask specified using the
-.B mask
-command will be retrieved. See also the
-.B mask
-command.
-
-When recursion is toggled OFF, only files from the current working
-directory on the source machine that match the mask specified to the
-.B mget
-or
-.B mput
-commands will be copied, and any mask specified using the
-.B mask
-command will be ignored.
-.RE
-.RE
-
-.B rm
-.RS 3
-.B Parameters:
-.RS 3
-.I <mask>
-
-.RE
-.B Description:
-.RS 3
-Remove all files matching
-.I mask
-from the current working directory
-.B on the server.
-.RE
-.RE
-
-.B rmdir
-.RS 3
-.B Parameters:
-.RS 3
-.I <directory name>
-
-.RE
-.B Description:
-.RS 3
-Remove the specified directory (user access privileges permitting)
-.B from the server.
-.RE
-.RE
-
-.B tar
-.RS 3
-.B Parameters:
-.RS 3
-.I <c|x>[IXbgNa]
-
-.RE
-.B Description:
-.RS 3
-Performs a tar operation - see the
-.B \-T
-command line option above. Behaviour
-may be affected by the
-.B tarmode
-command (see below). Using g (incremental) and N (newer) will affect
-tarmode settings. Note that using the "\-" option with tar x may not
-work - use the command line option instead.
-.RE
-.RE
-
-.B blocksize
-.RS 3
-.B Parameters
-.RS 3
-.I <blocksize>
-
-.RE
-.B Description
-.RS 3
-Blocksize. Must be followed by a valid (greater than zero) blocksize.
-Causes tar file to be written out in blocksize*TBLOCK (usually 512 byte)
-blocks.
-.RE
-.RE
-
-.B tarmode
-.RS 3
-.B Parameters
-.RS 3
-.I <full|inc|reset|noreset>
-
-.RE
-.B Description
-.RS 3
-Changes tar's behaviour with regard to archive bits. In full mode,
-tar will back up everything regardless of the archive bit setting (this
-is the default mode). In incremental mode, tar will only back up files
-with the archive bit set. In reset mode, tar will reset the archive bit
-on all files it backs up (implies read/write share).
-.RE
-.RE
-
-.B setmode
-.RS 3
-.B Parameters
-.RS 3
-.I <filename> <perm=[+|\-]rsha>
-
-.RE
-.B Description
-.RS 3
-A version of the DOS attrib command to set file permissions. For example,
-
-setmode myfile +r
-
-would make myfile read only.
-.RE
-.RE
-.SH NOTES
-Some servers are fussy about the case of supplied usernames, passwords, share
-names (aka service names) and machine names. If you fail to connect try
-giving all parameters in uppercase.
-
-It is often necessary to use the
-.B \-n
-option when connecting to some types
-of servers. For example OS/2 LanManager insists on a valid netbios name
-being used, so you need to supply a valid name that would be known to
-the server.
-
-.B smbclient
-supports long file names where the server supports the LANMAN2
-protocol.
-.SH FILES
-Not applicable.
-.SH ENVIRONMENT VARIABLES
-.B USER
-.RS 3
-The variable USER may contain the username of the person using the client.
-This information is used only if the protocol level is high enough to support
-session-level passwords.
-.RE
-.SH INSTALLATION
-The location of the client program is a matter for individual system
-administrators. The following are thus suggestions only.
-
-It is recommended that the client software be installed under the
-/usr/local/samba
-hierarchy, in a directory readable by all, writeable only by root. The client
-program itself should be executable by all. The client should NOT be setuid
-or setgid!
-
-The client log files should be put in a directory readable and writable only
-by the user.
-
-To test the client, you will need to know the name of a running Lan manager
-server. It is possible to run
-.B smbd
-(see
-.BR smbd (8))
-as an ordinary user - running that server as a daemon on a
-user-accessible port (typically any port number over 1024) would
-provide a suitable test server.
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the client software, so it is possible that your version of
-the client has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR smbd (8)
-.SH DIAGNOSTICS
-[This section under construction]
-
-Most diagnostics issued by the client are logged in a specified log file. The
-log file name is specified at compile time, but may be overridden on the
-command line.
-
-The number and nature of diagnostics available depends on the debug level used
-by the client. If you have problems, set the debug level to 3 and peruse the
-log files.
-
-Most messages are reasonably self-explanatory. Unfortunately, at time of
-creation of this man page the source code is still too fluid to warrant
-describing each and every diagnostic. At this stage your best bet is still
-to grep the source code and inspect the conditions that gave rise to the
-diagnostics you are seeing.
-.SH BUGS
-None known.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details on how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/smbd.8 b/docs/manpages/smbd.8
deleted file mode 100644
index 434844822a4..00000000000
--- a/docs/manpages/smbd.8
+++ /dev/null
@@ -1,428 +0,0 @@
-.TH SMBD 8 smbd smbd
-.SH NAME
-smbd \- provide SMB (aka LanManager) services to clients
-.SH SYNOPSIS
-.B smbd
-[
-.B \-D
-] [
-.B \-a
-] [
-.B \-d
-.I debuglevel
-] [
-.B \-l
-.I log file
-] [
-.B \-p
-.I port number
-] [
-.B \-O
-.I socket options
-] [
-.B \-s
-.I configuration file
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B smbd
-is a server that can provide most SMB services. The server provides
-filespace and printer services to clients using the SMB protocol. This
-is compatible with the LanManager protocol, and can service LanManager
-clients. These include MSCLIENT 3.0 for DOS, Windows for Workgroups,
-Windows 95, Windows NT, OS/2, DAVE for Macintosh, and smbfs for Linux.
-
-An extensive description of the services that the server can provide is given
-in the man page for the configuration file controlling the attributes of those
-services (see
-.BR smb.conf (5)).
-This man page will not describe the services, but
-will concentrate on the administrative aspects of running the server.
-
-Please note that there are significant security implications to running this
-server, and
-.BR smb.conf (5)
-should be regarded as mandatory reading before proceeding with
-installation.
-
-A session is created whenever a client requests one. Each client gets a copy
-of the server for each session. This copy then services all connections made
-by the client during that session. When all connections from its client are
-are closed, the copy of the server for that client terminates.
-
-The configuration file, and any files that it includes, are automatically
-reloaded every minute, if they change. You can force a reload by sending a
-SIGHUP to the server. Reloading the configuration file will not affect
-connections to any service that is already established. Either the user
-will have to disconnect from the service, or smbd killed and restarted.
-.SH OPTIONS
-.B \-D
-
-.RS 3
-If specified, this parameter causes the server to operate as a daemon. That is,
-it detaches itself and runs in the background, fielding requests on the
-appropriate port.
-
-By default, the server will NOT operate as a daemon.
-.RE
-
-.B \-a
-
-.RS 3
-If this parameter is specified, the log files will be overwritten with each
-new connection. By default, the log files will be appended to.
-.RE
-
-.B \-d
-.I debuglevel
-.RS 3
-
-debuglevel is an integer from 0 to 10.
-
-The default value if this parameter is not specified is zero.
-
-The higher this value, the more detail will be logged to the log files about
-the activities of the server. At level 0, only critical errors and serious
-warnings will be logged. Level 1 is a reasonable level for day to day running
-- it generates a small amount of information about operations carried out.
-
-Levels above 1 will generate considerable amounts of log data, and should
-only be used when investigating a problem. Levels above 3 are designed for
-use only by developers and generate HUGE amounts of log data, most of which
-is extremely cryptic.
-.RE
-
-.B \-l
-.I log file
-
-.RS 3
-If specified,
-.I logfile
-specifies a base filename into which operational data from the running server
-will be logged.
-
-The default base name is specified at compile time.
-
-The base name is used to generate actual log file names. For example, if the
-name specified was "log", the following files would be used for log data:
-
-.RS 3
-log.debug (containing debugging information)
-
-log.in (containing inbound transaction data)
-
-log.out (containing outbound transaction data)
-.RE
-
-The log files generated are never removed by the server.
-.RE
-
-.B \-O
-.I socket options
-.RS 3
-
-See the socket options section of
-.BR smb.conf (5)
-for details
-
-.RE
-.B \-p
-.I port number
-.RS 3
-
-port number is a positive integer value.
-
-The default value if this parameter is not specified is 139.
-
-This number is the port number that will be used when making connections to
-the server from client software. The standard (well-known) port number for the
-server is 139, hence the default. If you wish to run the server as an ordinary
-user rather than as root, most systems will require you to use a port number
-greater than 1024 - ask your system administrator for help if you are in this
-situation.
-
-In order for the server to be useful by most clients, should you configure
-it on a port other than 139, you will require port redirection services
-on port 139, details of which are outlined in rfc1002.txt section 4.3.5.
-
-This parameter is not normally specified except in the above situation.
-.RE
-
-.B \-s
-.I configuration file
-
-.RS 3
-The default configuration file name is determined at compile time.
-
-The file specified contains the configuration details required by the server.
-The information in this file includes server-specific information such as
-what printcap file to use, as well as descriptions of all the services that the
-server is to provide. See
-.BR smb.conf (5)
-for more information.
-.RE
-.SH FILES
-
-.B /etc/inetd.conf
-
-.RS 3
-If the server is to be run by the inetd meta-daemon, this file must contain
-suitable startup information for the meta-daemon. See the section
-"INSTALLATION" below.
-.RE
-
-.B /etc/rc
-
-.RS 3
-(or whatever initialisation script your system uses)
-
-If running the server as a daemon at startup, this file will need to contain
-an appropriate startup sequence for the server. See the section "INSTALLATION"
-below.
-.RE
-
-.B /etc/services
-
-.RS 3
-If running the server via the meta-daemon inetd, this file must contain a
-mapping of service name (eg., netbios-ssn) to service port (eg., 139) and
-protocol type (eg., tcp). See the section "INSTALLATION" below.
-.RE
-
-.B /usr/local/samba/lib/smb.conf
-
-.RS 3
-This file describes all the services the server is to make available to
-clients. See
-.BR smb.conf (5)
-for more information.
-.RE
-.SH LIMITATIONS
-
-On some systems
-.B smbd
-cannot change uid back to root after a setuid() call.
-Such systems are called "trapdoor" uid systems. If you have such a system,
-you will be unable to connect from a client (such as a PC) as two different
-users at once. Attempts to connect the second user will result in "access
-denied" or similar.
-.SH ENVIRONMENT VARIABLES
-
-.B PRINTER
-
-.RS 3
-If no printer name is specified to printable services, most systems will
-use the value of this variable (or "lp" if this variable is not defined)
-as the name of the printer to use. This is not specific to the server,
-however.
-.RE
-.SH INSTALLATION
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the server software be installed under the
-/usr/local/samba hierarchy, in a directory readable by all, writeable only
-by root. The server program itself should be executable by all, as
-users may wish to run the server themselves (in which case it will of
-course run with their privileges). The server should NOT be
-setuid. On some systems it may be worthwhile to make smbd setgid to an
-empty group. This is because some systems may have a security hole where
-daemon processes that become a user can be attached to with a
-debugger. Making the smbd file setgid to an empty group may prevent
-this hole from being exploited. This security hole and the suggested
-fix has only been confirmed on Linux at the time this was written. It
-is possible that this hole only exists in Linux, as testing on other
-systems has thus far shown them to be immune.
-
-The server log files should be put in a directory readable and writable only
-by root, as the log files may contain sensitive information.
-
-The configuration file should be placed in a directory readable and writable
-only by root, as the configuration file controls security for the services
-offered by the server. The configuration file can be made readable by all if
-desired, but this is not necessary for correct operation of the server and
-is not recommended. A sample configuration file "smb.conf.sample" is supplied
-with the source to the server - this may be renamed to "smb.conf" and
-modified to suit your needs.
-
-The remaining notes will assume the following:
-
-.RS 3
-.B smbd
-(the server program) installed in /usr/local/samba/bin
-
-smb.conf (the configuration file) installed in /usr/local/samba/lib
-
-log files stored in /var/adm/smblogs
-.RE
-
-The server may be run either as a daemon by users or at startup, or it may
-be run from a meta-daemon such as inetd upon request. If run as a daemon, the
-server will always be ready, so starting sessions will be faster. If run from
-a meta-daemon some memory will be saved and utilities such as the tcpd
-TCP-wrapper may be used for extra security.
-
-When you've decided, continue with either "RUNNING THE SERVER AS A DAEMON" or
-"RUNNING THE SERVER ON REQUEST".
-.SH RUNNING THE SERVER AS A DAEMON
-To run the server as a daemon from the command line, simply put the
-.B \-D
-option
-on the command line. There is no need to place an ampersand at the end of the
-command line - the
-.B \-D
-option causes the server to detach itself from the
-tty anyway.
-
-Any user can run the server as a daemon (execute permissions permitting, of
-course). This is useful for testing purposes, and may even be useful as a
-temporary substitute for something like ftp. When run this way, however, the
-server will only have the privileges of the user who ran it.
-
-To ensure that the server is run as a daemon whenever the machine is started,
-and to ensure that it runs as root so that it can serve multiple clients, you
-will need to modify the system startup files. Wherever appropriate (for
-example, in /etc/rc), insert the following line, substituting
-port number, log file location, configuration file location and debug level as
-desired:
-
-.RS 3
-/usr/local/samba/bin/smbd -D -l /var/adm/smblogs/log -s /usr/local/samba/lib/smb.conf
-.RE
-
-(The above should appear in your initialisation script as a single line.
-Depending on your terminal characteristics, it may not appear that way in
-this man page. If the above appears as more than one line, please treat any
-newlines or indentation as a single space or TAB character.)
-
-If the options used at compile time are appropriate for your system, all
-parameters except the desired debug level and
-.B \-D
-may be omitted. See the
-section "OPTIONS" above.
-.SH RUNNING THE SERVER ON REQUEST
-If your system uses a meta-daemon such as inetd, you can arrange to have the
-smbd server started whenever a process attempts to connect to it. This requires
-several changes to the startup files on the host machine. If you are
-experimenting as an ordinary user rather than as root, you will need the
-assistance of your system administrator to modify the system files.
-
-You will probably want to set up the name server
-.B nmbd
-at the same time as
-.B smbd
-- refer to the man page
-.BR nmbd (8).
-
-First, ensure that a port is configured in the file /etc/services. The
-well-known port 139 should be used if possible, though any port may be used.
-
-Ensure that a line similar to the following is in /etc/services:
-
-.RS 3
-netbios-ssn 139/tcp
-.RE
-
-Note for NIS/YP users - you may need to rebuild the NIS service maps rather
-than alter your local /etc/services file.
-
-Next, put a suitable line in the file /etc/inetd.conf (in the unlikely event
-that you are using a meta-daemon other than inetd, you are on your own). Note
-that the first item in this line matches the service name in /etc/services.
-Substitute appropriate values for your system in this line (see
-.BR inetd (8)):
-
-.RS 3
-.\" turn off right adjustment
-.ad l
-netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd -d1
--l/var/adm/smblogs/log -s/usr/local/samba/lib/smb.conf
-.ad
-.RE
-
-(The above should appear in /etc/inetd.conf as a single line. Depending on
-your terminal characteristics, it may not appear that way in this man page.
-If the above appears as more than one line, please treat any newlines or
-indentation as a single space or TAB character.)
-
-Note that there is no need to specify a port number here, even if you are
-using a non-standard port number.
-
-Lastly, edit the configuration file to provide suitable services. To start
-with, the following two services should be all you need:
-
-.RS 3
-[homes]
-.RS 3
- writable = yes
-.RE
-
-[printers]
-.RS 3
- writable = no
- printable = yes
- path = /tmp
- public = yes
-.RE
-.RE
-
-This will allow you to connect to your home directory and print to any printer
-supported by the host (user privileges permitting).
-.SH TESTING THE INSTALLATION
-If running the server as a daemon, execute it before proceeding. If
-using a meta-daemon, either restart the system or kill and restart the
-meta-daemon. Some versions of inetd will reread their configuration tables if
-they receive a HUP signal.
-
-If your machine's name is "fred" and your name is "mary", you should now be
-able to connect to the service "\e\efred\emary".
-
-To properly test and experiment with the server, we recommend using the
-smbclient program (see
-.BR smbclient (1)).
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite,
-plus some of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the server has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR hosts_access (5),
-.BR inetd (8),
-.BR nmbd (8),
-.BR smb.conf (5),
-.BR smbclient (1),
-.BR testparm (1),
-.BR testprns (1)
-.BR rfc1001.txt
-.BR rfc1002.txt
-.SH DIAGNOSTICS
-[This section under construction]
-
-Most diagnostics issued by the server are logged in a specified log file. The
-log file name is specified at compile time, but may be overridden on the
-command line.
-
-The number and nature of diagnostics available depends on the debug level used
-by the server. If you have problems, set the debug level to 3 and peruse the
-log files.
-
-Most messages are reasonably self-explanatory. Unfortunately, at time of
-creation of this man page the source code is still too fluid to warrant
-describing each and every diagnostic. At this stage your best bet is still
-to grep the source code and inspect the conditions that gave rise to the
-diagnostics you are seeing.
-.SH BUGS
-None known.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details on how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/smbpasswd.8 b/docs/manpages/smbpasswd.8
deleted file mode 100644
index 176534b04f6..00000000000
--- a/docs/manpages/smbpasswd.8
+++ /dev/null
@@ -1,112 +0,0 @@
-.TH SMBPASSWD 1 smbpasswd smbpasswd
-.SH NAME
-smbpasswd \- change a users smb password in the smbpasswd file.
-.SH SYNOPSIS
-.B smbpasswd
-[
-.B \-add
-] [
-.B username
-]
-.SH DESCRIPTION
-
-This program is part of the Samba suite.
-
-.B smbpasswd
-allows a user to change their encrypted smb password which
-is stored in the smbpasswd file (usually kept in the
-.I private
-directory under the
-.I Samba
-directory hierarchy. Ordinary users can only run the command
-with no options. It will prompt them for their old smb password
-and then ask them for their new password twice, to ensure that
-the new password was typed correctly. No passwords will
-be echoed on the screen whilst being typed. If you have a blank
-smb password (specified by the string "NO PASSWORD" in the
-smbpasswd file) then just press the <Enter> key when asked
-for your old password.
-
-The
-.I \-add
-and
-.I username
-options can only be used by a user running as root.
-
-.SH OPTIONS
-.I \-add
-
-.RS 3
-Specifies that the username following should be added to
-the
-.I smbpasswd
-file, with the new password typed (type <Enter> for the
-old password). This option is ignored if the username
-following already exists in the
-.I smbpasswd
-file and it is treated like a regular change password
-command. Note that the user to be added
-.B must
-already exist in the system password file (usually /etc/passwd)
-else the request to add the user will fail.
-
-.RE
-.I username
-
-.RS 3
-You may only specify a username to the smbpasswd command
-if you are running as root. Only root should have the
-permission to modify other users smb passwords.
-
-.RE
-.RE
-.SH INSTALLATION
-
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the
-.B smbpasswd
-program be installed in the /usr/local/samba/bin directory. This should be
-a directory readable by all, writeable only by root. The program should be
-executable by all. The program
-.B must
-be setuid root. This means the permissions should
-look like -r-sr-xr-x and the program must be owned by root.
-
-.SH VERSION
-
-This man page is correct for version 1.9.17 of the Samba suite.
-These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the program has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR smbd (8),
-.BR smb.conf (5)
-.SH
-.B BUGS
-
-.RE
-The
-.B smbpasswd
-command is only useful if
-.I Samba
-has been compiled with encrypted passwords. See the file
-.I ENCRYPTION.txt
-in the docs directory for details on how to do this.
-
-.SH CREDITS
-.RE
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project. smbpasswd and the encrypted password
-file code was written by Jeremy Allison (samba-bugs@samba.anu.edu.au).
-
-This man page was written by Jeremy Allison. Bug reports to samba-bugs@samba.anu.edu.au.
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details of how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/smbrun.1 b/docs/manpages/smbrun.1
deleted file mode 100644
index bc265ebf7f5..00000000000
--- a/docs/manpages/smbrun.1
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH SMBRUN 1 smbrun smbrun
-.SH NAME
-smbrun \- interface program between smbd and external programs
-.SH SYNOPSIS
-.B smbrun
-.I shell-command
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B smbrun
-is a very small 'glue' program, which runs shell commands for
-the
-.B smbd
-daemon (see
-.BR smbd (8)).
-
-It first changes to the highest effective user and group ID that it can,
-then runs the command line provided using the system() call. This program is
-necessary to allow some operating systems to run external programs as non-root.
-.SH OPTIONS
-.I shell-command
-
-.RS 3
-The shell command to execute.
-
-The command should have a fully-qualified path.
-.RE
-.SH ENVIRONMENT VARIABLES
-The PATH variable set for the environment in which
-.B smbrun
-is executed will affect what executables are located and executed if a
-fully-qualified path is not given in the command.
-.SH INSTALLATION
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the
-.B smbrun
-program be installed under the /usr/local/samba hierarchy, in a directory readable
-by all, writeable only by root. The program should be executable by all.
-The program should NOT be setuid or setgid!
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the program has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR smbd (8),
-.BR smb.conf (8)
-.SH DIAGNOSTICS
-If
-.B smbrun
-cannot be located or cannot be executed by
-.B smbd
-then appropriate messages will be found in the
-.B smbd
-logs. Other diagnostics are
-dependent on the shell-command being run. It is advisable for your shell
-commands to issue suitable diagnostics to aid trouble-shooting.
-.SH BUGS
-None known.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-This man page was written by Karl Auer. Bug reports to samba-bugs@samba.anu.edu.au.
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details of how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/smbstatus.1 b/docs/manpages/smbstatus.1
deleted file mode 100644
index e59f815b78b..00000000000
--- a/docs/manpages/smbstatus.1
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH SMBSTATUS 1 smbstatus smbstatus
-.SH NAME
-smbstatus \- report on current Samba connections
-.SH SYNOPSIS
-.B smbstatus
-[
-.B \-b
-] [
-.B \-d
-] [
-.B \-p
-] [
-.B \-s
-.I configuration file
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B smbstatus
-is a very simple program to list the current Samba connections.
-
-Just run the program and the output is self explanatory.
-.SH OPTIONS
-.B \-b
-gives brief output.
-
-.B \-d
-gives verbose output.
-
-.B \-p
-print a list of
-.B smbd
-processes and exit. Useful for scripting.
-
-.B \-s
-.I configuration file
-
-.RS 3
-The default configuration file name is determined at compile time.
-
-The file specified contains the configuration details required by the server.
-See
-.BR smb.conf (5)
-for more information.
-.RE
-.SH ENVIRONMENT VARIABLES
-Not applicable.
-.SH INSTALLATION
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the
-.B smbstatus
-program be installed under the /usr/local/samba hierarchy, in a directory readable
-by all, writeable only by root. The program itself should be executable by all.
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the program has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR smb.conf (5),
-.BR smbd (8)
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details on how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/smbtar.1 b/docs/manpages/smbtar.1
deleted file mode 100644
index a03b8a6a668..00000000000
--- a/docs/manpages/smbtar.1
+++ /dev/null
@@ -1,179 +0,0 @@
-.TH SMBTAR 1 smbtar smbtar
-.SH NAME
-smbtar \- shell script for backing up SMB shares directly to UNIX tape drive
-.SH SYNOPSIS
-.B smbtar
-.B \-s
-.I server
-[
-.B \-p
-.I password
-] [
-.B \-x
-.I service
-] [
-.B \-X
-] [
-.B \-d
-.I directory
-] [
-.B \-u
-.I user
-] [
-.B \-t
-.I tape
-] [
-.B \-b
-.I blocksize
-] [
-.B \-N
-.I filename
-] [
-.B \-i
-] [
-.B \-r
-] [
-.B \-l
-.I log level
-] [
-.B \-v
-]
-.I filenames...
-.SH DESCRIPTION
-This program is an extension to the Samba suite.
-
-.B smbtar
-is a very small shell script on top of
-.BR smbclient ,
-which dumps SMB shares directly to tape.
-.SH OPTIONS
-.B \-s
-.I server
-.RS 3
-The PC that the share resides upon.
-.RE
-
-.B \-x
-.I service
-.RS 3
-The share name on the PC to connect to. Default:
-.I backup.
-.RE
-
-.B \-X
-.RS 3
-Exclude mode. Exclude
-.I filenames...
-from tar create or restore.
-.RE
-
-.B \-d
-.I directory
-.RS 3
-Change to initial
-.I directory
-before restoring / backing up files.
-.RE
-
-.B \-v
-.RS 3
-Verbose mode.
-.RE
-
-.B \-p
-.I password
-
-.RS 3
-The password to use to access a share. Default: none
-.RE
-
-.B \-u
-.I user
-.RS 3
-The user id to connect as. Default: UNIX login name.
-.RE
-
-.B \-t
-.I tape
-.RS 3
-Tape device. May be regular file or tape device. Default: Tape environmental
-variable; if not set, a file called
-.IR tar.out .
-.RE
-
-.B \-b
-.I blocksize
-.RS 3
-Blocking factor. Defaults to 20. See
-.BR tar (1)
-for a fuller explanation.
-.RE
-
-.B \-N
-.I filename
-.RS 3
-Backup only files newer than filename. Could be used (for example) on a log
-file to implement incremental backups.
-.RE
-
-.B \-i
-.RS 3
-Incremental mode; tar files are only backed up if they have the
-archive bit set. The archive bit is reset after each file is read.
-.RE
-
-.B \-r
-.RS 3
-Restore. Files are restored to the share from the tar file.
-.RE
-
-.B \-l
-.I log level
-.RS 3
-Log (debug) level. Corresponds to
-.B \-d
-flag of
-.BR smbclient (1).
-.RE
-.SH ENVIRONMENT VARIABLES
-The TAPE variable specifies the default tape device to write to. May
-be overridden with the
-.B \-t
-option.
-.SH BUGS
-The
-.B smbtar
-script has different options from ordinary tar and tar
-called from
-.BR smbclient .
-.SH CAVEATS
-Sites that are more careful about security may not like the way
-the script handles PC passwords. Backup and restore work on entire shares,
-should work on file lists. smbtar works best with GNU tar and may
-not work well with other versions.
-.SH VERSION
-This man page is correct for version 1.9.15p8 of the Samba suite.
-.SH SEE ALSO
-.BR smbclient (8),
-.BR smb.conf (8)
-.SH DIAGNOSTICS
-See diagnostics for
-.B smbclient
-command.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-Ricky Poulten (poultenr@logica.co.uk) wrote the tar extension and this
-man page. The
-.B smbtar
-script was heavily rewritten and improved by
-Martin Kraemer <Martin.Kraemer@mch.sni.de>. Many thanks to everyone
-who suggested extensions, improvements, bug fixes, etc.
-
-See
-.BR smb.conf (5)
-for a full list of contributors and details of how to submit bug reports,
-comments etc.
-
diff --git a/docs/manpages/testparm.1 b/docs/manpages/testparm.1
deleted file mode 100644
index 0b6e6e84c0b..00000000000
--- a/docs/manpages/testparm.1
+++ /dev/null
@@ -1,109 +0,0 @@
-.TH TESTPARM 1 testparm testparm
-.SH NAME
-testparm \- check an smbd configuration file for internal correctness
-.SH SYNOPSIS
-.B testparm
-[
-.I configfilename
-[
-.I hostname
-.I hostIP
-]
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B testparm
-is a very simple test program to check an
-.B smbd
-configuration
-file for internal correctness. If this program reports no problems, you can use
-the configuration file with confidence that
-.B smbd
-will successfully
-load the configuration file.
-
-Note that this is NOT a guarantee that the services specified in the
-configuration file will be available or will operate as expected.
-
-If the optional host name and host IP address are specified on the
-command line, this test program will run through the service entries
-reporting whether the specified host has access to each service.
-.SH OPTIONS
-.I configfilename
-
-.RS 3
-This is the name of the configuration file to check.
-.RE
-
-.I hostname
-
-.RS 3
-This is the name of the host to check access on.
-
-If this parameter is supplied, the
-.I hostIP
-parameter must also be supplied, or strange things may happen.
-.RE
-
-.I hostIP
-
-.RS 3
-This is the IP number of the host specified in the previous parameter.
-
-This number must be supplied if the
-.I hostname
-parameter is supplied, or strange things may happen.
-.RE
-.SH FILES
-.B smb.conf
-.RS 3
-This is usually the name of the configuration file used by
-.BR smbd .
-.RE
-.SH ENVIRONMENT VARIABLES
-Not applicable.
-.SH INSTALLATION
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the
-.B testparm
-program be installed under the /usr/local/samba hierarchy, in a directory readable
-by all, writeable only by root. The program itself should be executable by all.
-The program should NOT be setuid or setgid!
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the program has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR smb.conf (5),
-.BR smbd (8)
-.SH DIAGNOSTICS
-The program will issue a message saying whether the configuration file loaded
-OK or not. This message may be preceded by errors and warnings if the file
-did not load. If the file was loaded OK, the program then dumps all known
-service details to stdout.
-
-If a host name is specified but no host IP number, all bets are off.
-
-Other messages are self-explanatory.
-.SH BUGS
-None known.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-The
-.B testparm
-program and this man page were written by Karl Auer. Bug reports to
-samba-bugs@samba.anu.edu.au.
-
-See
-.BR samba (7)
-for a full list of contributors and details on how to
-submit bug reports, comments etc.
diff --git a/docs/manpages/testprns.1 b/docs/manpages/testprns.1
deleted file mode 100644
index 9819a679d84..00000000000
--- a/docs/manpages/testprns.1
+++ /dev/null
@@ -1,112 +0,0 @@
-.TH TESTPRNS 1 testprns testprns
-.SH NAME
-testprns \- check printer name for validity with smbd
-.SH SYNOPSIS
-.B testprns
-.I printername
-[
-.I printcapname
-]
-.SH DESCRIPTION
-This program is part of the Samba suite.
-
-.B testprns
-is a very simple test program to determine whether a given
-printer name is valid for use in a service to be provided by
-.B smbd.
-
-"Valid" in this context means "can be found in the printcap specified". This
-program is very stupid - so stupid in fact that it would be wisest to always
-specify the printcap file to use.
-.SH OPTIONS
-.I printername
-
-.RS 3
-The printer name to validate.
-
-Printer names are taken from the first field in each record in the printcap
-file, single printer names and sets of aliases separated by vertical bars
-("|") are recognised. Note that no validation or checking of the printcap
-syntax is done beyond that required to extract the printer name. It may
-be that the print spooling system is more forgiving or less forgiving
-than
-.BR testprns .
-However, if
-.B testprns
-finds the printer then
-.B smbd
-should do so as well.
-.RE
-
-.I printcapname
-
-.RS 3
-This is the name of the printcap file to search for the given printer name
-in.
-
-If no printcap name is specified,
-.B testprns
-will attempt to scan the printcap file specified at compile time
-(PRINTCAP_NAME).
-.RE
-.SH FILES
-.B /etc/printcap
-.RS 3
-This is usually the default printcap file to scan. See
-.BR printcap (5)).
-.RE
-.SH ENVIRONMENT VARIABLES
-Not applicable.
-.SH INSTALLATION
-The location of the server and its support files is a matter for individual
-system administrators. The following are thus suggestions only.
-
-It is recommended that the
-.B testprns
-program be installed under the /usr/local/samba hierarchy, in a directory readable
-by all, writeable only by root. The program should be executable by all.
-The program should NOT be setuid or setgid!
-.SH VERSION
-This man page is (mostly) correct for version 1.9.00 of the Samba suite, plus some
-of the recent patches to it. These notes will necessarily lag behind
-development of the software, so it is possible that your version of
-the program has extensions or parameter semantics that differ from or are not
-covered by this man page. Please notify these to the address below for
-rectification.
-.SH SEE ALSO
-.BR printcap (5),
-.BR smbd (8),
-.BR smbclient (1)
-.SH DIAGNOSTICS
-If a printer is found to be valid, the message "Printer name <printername> is
-valid" will be displayed.
-
-If a printer is found to be invalid, the message "Printer name <printername>
-is not valid" will be displayed.
-
-All messages that would normally be logged during operation of
-.B smbd
-are
-logged by this program to the file
-.I test.log
-in the current directory. The program runs at debuglevel 3, so quite extensive
-logging information is written. The log should be checked carefully for errors
-and warnings.
-
-Other messages are self-explanatory.
-.SH BUGS
-None known.
-.SH CREDITS
-The original Samba software and related utilities were created by
-Andrew Tridgell (samba-bugs@samba.anu.edu.au). Andrew is also the Keeper
-of the Source for this project.
-
-The
-.B testprns
-program and this man page were written by Karl Auer. Bug reports to
-samba-bugs@samba.anu.edu.au.
-
-See
-.BR samba (7)
-for a full list of contributors and details of how to
-submit bug reports, comments etc.
diff --git a/docs/samba.lsm b/docs/samba.lsm
deleted file mode 100644
index 36abbba769a..00000000000
--- a/docs/samba.lsm
+++ /dev/null
@@ -1,26 +0,0 @@
-Begin2
-Title = Samba
-Version = 1.8.0
-Desc1 = Samba is a SMB based file and print server for unix. It
-Desc2 = provides access to unix file and print services from
-Desc3 = SMB compatible clients such as WinNT, WfWg, OS/2
-Desc4 = and Pathworks. It also includes a ftp-style unix client
-Desc5 = and a netbios nameserver.
-Author = Andrew Tridgell
-AuthorEmail = samba-bugs@samba.anu.edu.au
-Maintainer = Andrew Tridgell
-MaintEmail = samba-bugs@samba.anu.edu.au
-Site1 = samba.anu.edu.au
-Path1 = pub/samba/
-File1 = samba-latest.tar.gz
-FileSize1 = 200K
-Required1 = Ansi-C compiler and a TCP/IP network.
-CopyPolicy1 = GNU Public License
-Keywords = LanManager, SMB, Networking
-Comment1 = To join the Samba mailing list send mail to
-Comment2 = listproc@listproc.anu.edu.au with a body of
-Comment3 = "subscribe samba Your Name"
-Entered = October 1994
-EnteredBy = Andrew Tridgell
-End
-
diff --git a/docs/textdocs/Application_Serving.txt b/docs/textdocs/Application_Serving.txt
deleted file mode 100644
index 5a17b64b030..00000000000
--- a/docs/textdocs/Application_Serving.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-January 7, 1997
-Updated: June 27, 1997
-Contributor: John H Terpstra <samba-bugs@samba.anu.edu.au>
- Copyright (C) 1997 - John H Terpstra
-Status: Current
-
-Subject: Using a Samba share as an administrative share for MS Office, etc.
-==============================================================================
-
-Problem:
-========
-Microsoft Office products can be installed as an administrative installation
-from which the application can either be run off the administratively installed
-product that resides on a shared resource, or from which that product can be
-installed onto workstation clients.
-
-The general mechanism for implementing an adminstrative installation involves
-running:
- X:\setup /A, where X is the drive letter of either CDROM or floppy
-
-This installation process will NOT install the product for use per se, but
-rather results in unpacking of the compressed distribution files into a target
-shared folder. For this process you need write privilidge to the share and it
-is desirable to enable file locking and share mode operation during this
-process.
-
-Subsequent installation of MS Office from this share will FAIL unless certain
-precautions are taken. This failure will be caused by share mode operation
-which will prevent the MS Office installation process from re-opening various
-dynamic link library files and will cause sporadic file not found problems.
-
-Solution:
-=========
-1. As soon as the administrative installation (unpacking) has completed
- set the following parameters on the share containing it:
- [MSOP95]
- path = /where_you_put_it
- comment = Your comment
- volume = "The_CD_ROM_Label"
- read only = yes
- available = yes
- share modes = no
- locking = no
- browseable = yes
- public = yes
-
-2. Now you are ready to run the setup program from the Microsoft Windows
-workstation as follows:-
- \\"Server_Name"\MSOP95\msoffice\setup
-
diff --git a/docs/textdocs/BROWSING.txt b/docs/textdocs/BROWSING.txt
deleted file mode 100644
index cb509647c7e..00000000000
--- a/docs/textdocs/BROWSING.txt
+++ /dev/null
@@ -1,548 +0,0 @@
-Author/s: Many (Thanks to Luke, Jeremy, Andrew, etc.)
-Updated: June 29, 1997
-Status: Current - For VERY Advanced Users ONLY
-
-Summary: This describes how to configure Samba for improved browsing.
-=====================================================================
-
-OVERVIEW:
-=========
-SMB networking provides a mechanism by which clients can access a list
-of machines that are available within the network. This list is called
-the browse list and is heavily used by all SMB clients. Configuration
-of SMB browsing has been problematic for some Samba users, hence this
-document.
-
-=====================================================================
-
-BROWSING
-========
-Samba now fully supports browsing. The browsing is supported by nmbd
-and is also controlled by options in the smb.conf file (see smb.conf(5)).
-
-Samba can act as a local browse master for a workgroup and the ability
-for samba to support domain logons and scripts is now available. See
-DOMAIN.txt for more information on domain logons.
-
-Samba can also act as a domain master browser for a workgroup. This
-means that it will collate lists from local browse masters into a
-wide area network server list. In order for browse clients to
-resolve the names they may find in this list, it is recommended that
-both samba and your clients use a WINS server.
-
-Note that you should NOT set Samba to be the domain master for a
-workgroup that has the same name as an NT Domain: on each wide area
-network, you must only ever have one domain master browser per workgroup,
-regardless of whether it is NT, Samba or any other type of domain master
-that is providing this service.
-
-[Note that nmbd can be configured as a WINS server, but it is not
-necessary to specifically use samba as your WINS server. NTAS can
-be configured as your WINS server. In a mixed NT server and
-samba environment on a Wide Area Network, it is recommended that
-you use the NT server's WINS server capabilities. In a samba-only
-environment, it is recommended that you use one and only one nmbd
-as your WINS server].
-
-To get browsing to work you need to run nmbd as usual, but will need
-to use the "workgroup" option in smb.conf to control what workgroup
-Samba becomes a part of.
-
-Samba also has a useful option for a Samba server to offer itself for
-browsing on another subnet. It is recommended that this option is only
-used for 'unusual' purposes: announcements over the internet, for
-example. See "remote announce" in the smb.conf man page.
-
-If something doesn't work then hopefully the log.nmb file will
-help you track down the problem. Try a debug level of 2 or 3 for
-finding problems.
-
-Note that if it doesn't work for you, then you should still be able to
-type the server name as \\SERVER in filemanager then hit enter and
-filemanager should display the list of available shares.
-
-Some people find browsing fails because they don't have the global
-"guest account" set to a valid account. Remember that the IPC$
-connection that lists the shares is done as guest, and thus you must
-have a valid guest account.
-
-Also, a lot of people are getting bitten by the problem of too many
-parameters on the command line of nmbd in inetd.conf. This trick is to
-not use spaces between the option and the parameter (eg: -d2 instead
-of -d 2), and to not use the -B and -N options. New versions of nmbd
-are now far more likely to correctly find your broadcast and network
-addess, so in most cases these aren't needed.
-
-The other big problem people have is that their broadcast address,
-netmask or IP address is wrong (specified with the "interfaces" option
-in smb.conf)
-
-
-BROWSING ACROSS SUBNETS
-=======================
-
-With the release of Samba 1.9.17(alpha1 and above) Samba has been
-updated to enable it to support the replication of browse lists
-across subnet boundaries. New code and options have been added to
-achieve this. This section describes how to set this feature up
-in different settings.
-
-To see browse lists that span TCP/IP subnets (ie. networks separated
-by routers that don't pass broadcast traffic) you must set up at least
-one WINS server. The WINS server acts as a DNS for NetBIOS names, allowing
-NetBIOS name to IP address translation to be done by doing a direct
-query of the WINS server. This is done via a directed UDP packet on
-port 137 to the WINS server machine. The reason for a WINS server is
-that by default, all NetBIOS name to IP address translation is done
-by broadcasts from the querying machine. This means that machines
-on one subnet will not be able to resolve the names of machines on
-another subnet without using a WINS server.
-
-Remember, for browsing across subnets to work correctly, all machines,
-be they Windows 95, Windows NT, or Samba servers must have the IP address
-of a WINS server given to them by a DHCP server, or by manual configuration
-(for Win95 and WinNT, this is in the TCP/IP Properties, under Network
-settings) for Samba this is in the smb.conf file.
-
-How does cross subnet browsing work ?
-=====================================
-
-Cross subnet browsing is a complicated dance, containing multiple
-moving parts. It has taken Microsoft several years to get the code
-that achieves this correct, and Samba lags behind in some areas.
-However, with the 1.9.17 release, Samba is capable of cross subnet
-browsing when configured correctly.
-
-Consider a network set up as follows :
-
- (DMB)
- N1_A N1_B N1_C N1_D N1_E
- | | | | |
- -------------------------------------------------------
- | subnet 1 |
- +---+ +---+
- |R1 | Router 1 Router 2 |R2 |
- +---+ +---+
- | |
- | subnet 2 subnet 3 |
- -------------------------- ------------------------------------
- | | | | | | | |
- N2_A N2_B N2_C N2_D N3_A N3_B N3_C N3_D
- (WINS)
-
-Consisting of 3 subnets (1, 2, 3) conneted by two routers
-(R1, R2) - these do not pass broadcasts. Subnet 1 has 5 machines
-on it, subnet 2 has 4 machines, subnet 3 has 4 machines. Assume
-for the moment that all these machines are configured to be in the
-same workgroup (for simplicities sake). Machine N1_C on subnet 1
-is configured as Domain Master Browser (ie. it will collate the
-browse lists for the workgroup). Machine N2_D is configured as
-WINS server and all the other machines are configured to register
-their NetBIOS names with it.
-
-As all these machines are booted up, elections for master browsers
-will take place on each of the three subnets. Assume that machine
-N1_C wins on subnet 1, N2_B wins on subnet 2, and N3_D wins on
-subnet 3 - these machines are known as local master browsers for
-their particular subnet. N1_C has an advantage in winning as the
-local master browser on subnet 1 as it is set up as Domain Master
-Browser.
-
-On each of the three networks, machines that are configured to
-offer sharing services will broadcast that they are offering
-these services. The local master browser on each subnet will
-receive these broadcasts and keep a record of the fact that
-the machine is offering a service. This list of records is
-the basis of the browse list. For this case, assume that
-all the machines are configured to offer services so all machines
-will be on the browse list.
-
-For each network, the local master browser on that network is
-considered 'authoritative' for all the names it receives via
-local broadcast. This is because a machine seen by the local
-master browser via a local broadcast must be on the same
-network as the local master browser and thus is a 'trusted'
-and 'verifiable' resource. Machines on other networks that
-the local master browsers learn about when collating their
-browse lists have not been directly seen - these records are
-called 'non-authoritative'.
-
-At this point the browse lists look as follows (these are
-the machines you would see in your network neighborhood if
-you looked in it on a particular network right now).
-
-Subnet Browse Master List
------- ------------- ----
-Subnet1 N1_C N1_A, N1_B, N1_C, N1_D, N1_E
-
-Subnet2 N2_B N2_A, N2_B, N2_C, N2_D
-
-Subnet3 N3_D N3_A, N3_B, N3_C, N3_D
-
-Note that at this point all the subnets are separate, no
-machine is seen across any of the subnets.
-
-Now examine subnet 2. As soon as N2_B has become the local
-master browser it looks for a Domain master browser to synchronize
-its browse list with. It does this by querying the WINS server
-(N2_D) for the IP address associated with the NetBIOS name
-WORKGROUP<1B>. This name was registerd by the Domain master
-browser (N1_C) with the WINS server as soon as it was booted.
-
-Once N2_B knows the address of the Domain master browser it
-tells it that is the local master browser for subnet 2 by
-sending a MasterAnnouncement packet as a UDP port 138 packet.
-It then synchronizes with it by doing a NetServerEnum2 call. This
-tells the Domain Master Browser to send it all the server
-names it knows about. Once the domain master browser receives
-the MasterAnnouncement packet it schedules a synchronization
-request to the sender of that packet. After both synchronizations
-are done the browse lists look like :
-
-Subnet Browse Master List
------- ------------- ----
-Subnet1 N1_C N1_A, N1_B, N1_C, N1_D, N1_E,
- N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-
-Subnet2 N2_B N2_A, N2_B, N2_C, N2_D
- N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
-
-Subnet3 N3_D N3_A, N3_B, N3_C, N3_D
-
-Servers with a (*) after them are non-authoritative names.
-
-At this point users looking in their network neighborhood on
-subnets 1 or 2 will see all the servers on both, users on
-subnet 3 will still only see the servers on their own subnet.
-
-The same sequence of events that occured for N2_B now occurs
-for the local master browser on subnet 3 (N3_D). When it
-synchronizes browse lists with the domain master browser (N1_A)
-it gets both the server entries on subnet 1, and those on
-subnet 2. After N3_D has synchronized with N1_C and vica-versa
-the browse lists look like.
-
-Subnet Browse Master List
------- ------------- ----
-Subnet1 N1_C N1_A, N1_B, N1_C, N1_D, N1_E,
- N2_A(*), N2_B(*), N2_C(*), N2_D(*),
- N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet2 N2_B N2_A, N2_B, N2_C, N2_D
- N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
-
-Subnet3 N3_D N3_A, N3_B, N3_C, N3_D
- N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*),
- N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-
-Servers with a (*) after them are non-authoritative names.
-
-At this point users looking in their network neighborhood on
-subnets 1 or 3 will see all the servers on all sunbets, users on
-subnet 2 will still only see the servers on subnets 1 and 2, but not 3.
-
-Finally, the local master browser for subnet 2 (N2_B) will sync again
-with the domain master browser (N1_C) and will recieve the missing
-server entries. Finally - and as a steady state (if no machines
-are removed or shut off) the browse lists will look like :
-
-Subnet Browse Master List
------- ------------- ----
-Subnet1 N1_C N1_A, N1_B, N1_C, N1_D, N1_E,
- N2_A(*), N2_B(*), N2_C(*), N2_D(*),
- N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet2 N2_B N2_A, N2_B, N2_C, N2_D
- N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*)
- N3_A(*), N3_B(*), N3_C(*), N3_D(*)
-
-Subnet3 N3_D N3_A, N3_B, N3_C, N3_D
- N1_A(*), N1_B(*), N1_C(*), N1_D(*), N1_E(*),
- N2_A(*), N2_B(*), N2_C(*), N2_D(*)
-
-Servers with a (*) after them are non-authoritative names.
-
-Synchronizations between the domain master browser and local
-master browsers will continue to occur, but this should be a
-steady state situation.
-
-If either router R1 or R2 fails the following will occur:
-
-1) Names of computers on each side of the inaccessible network fragments
-will be maintained for as long as 36 minutes, in the network neighbourhood
-lists.
-
-2) Attempts to connect to these inaccessible computers will fail, but the
-names will not be removed from the network neighbourhood lists.
-
-3) If one of the fragments is cut off from the WINS server, it will only
-be able to access servers on its local subnet, by using subnet-isolated
-broadcast NetBIOS name resolution. The effects are similar to that of
-losing access to a DNS server.
-
-Setting up a WINS server
-========================
-
-Either a Samba machine or a Windows NT Server machine may be set up
-as a WINS server. To set a Samba machine to be a WINS server you must
-add the following option to the smb.conf file on the selected machine :
-in the [globals] section add the line
-
- wins support = yes
-
-Versions of Samba previous to 1.9.17 had this parameter default to
-yes. If you have any older versions of Samba on your network it is
-strongly suggested you upgrade to 1.9.17 or above, or at the very
-least set the parameter to 'no' on all these machines.
-
-Machines with "wins support = yes" will keep a list of all NetBIOS
-names registered with them, acting as a DNS for NetBIOS names.
-
-You should set up only ONE wins server. Do NOT set the
-"wins support = yes" option on more than one Samba server.
-
-To set up a Windows NT Server as a WINS server you need to set up
-the WINS service - see your NT documentation for details. Note that
-Windows NT WINS Servers can replicate to each other, allowing more
-than one to be set up in a complex subnet environment. As Microsoft
-refuse to document these replication protocols Samba cannot currently
-participate in these replications. It is possible in the future that
-a Samba->Samba WINS replication protocol may be defined, in which
-case more than one Samba machine could be set up as a WINS server
-but currently only one Samba server should have the "wins support = yes"
-parameter set.
-
-After the WINS server has been configured you must ensure that all
-machines participating on the network are configured with the address
-of this WINS server. If your WINS server is a Samba machine, fill in
-the Samba machine IP address in the "Primary WINS Server" field of
-the "Control Panel->Network->Protocols->TCP->WINS Server" dialogs
-in Windows 95 or Windows NT. To tell a Samba server the IP address
-of the WINS server add the following line to the [global] section of
-all smb.conf files :
-
- wins server = <name or IP address>
-
-where <name or IP address> is either the DNS name of the WINS server
-machine or its IP address.
-
-Note that this line MUST NOT BE SET in the smb.conf file of the Samba
-server acting as the WINS server itself. If you set both the
-"wins support = yes" option and the "wins server = <name>" option then
-nmbd will fail to start.
-
-There are two possible scenarios for setting up cross subnet browsing.
-The first details setting up cross subnet browsing on a network containing
-Windows 95, Samba and Windows NT machines that are not configured as
-part of a Windows NT Domain. The second details setting up cross subnet
-browsing on networks that contain NT Domains.
-
-Setting up Browsing in a WORKGROUP
-==================================
-
-To set up cross subnet browsing on a network containing machines
-in up to be in a WORKGROUP, not an NT Domain you need to set up one
-Samba server to be the Domain Master Browser (note that this is *NOT*
-the same as a Primary Domain Controller, although in an NT Domain the
-same machine plays both roles). The role of a Domain master browser is
-to collate the browse lists from local master browsers on all the
-subnets that have a machine participating in the workgroup. Without
-one machine configured as a domain master browser each subnet would
-be an isolated workgroup, unable to see any machines on any other
-subnet. It is the presense of a domain master browser that makes
-cross subnet browsing possible for a workgroup.
-
-In an WORKGROUP environment the domain master browser must be a
-Samba server, and there must only be one domain master browser per
-workgroup name. To set up a Samba server as a domain master browser,
-set the following option in the [global] section of the smb.conf file :
-
- domain master = yes
-
-The domain master browser should also preferrably be the local master
-browser for its own subnet. In order to achieve this set the following
-options in the [global] section of the smb.conf file :
-
- domain master = yes
- local master = yes
- preferred master = yes
- os level = 65
-
-The domain master browser may be the same machine as the WINS
-server, if you require.
-
-Next, you should ensure that each of the subnets contains a
-machine that can act as a local master browser for the
-workgroup. Any NT machine should be able to do this, as will
-Windows 95 machines (although these tend to get rebooted more
-often, so it's not such a good idea to use these). To make a
-Samba server a local master browser set the following
-options in the [global] section of the smb.conf file :
-
- domain master = no
- local master = yes
- preferred master = yes
- os level = 65
-
-Do not do this for more than one Samba server on each subnet,
-or they will war with each other over which is to be the local
-master browser.
-
-The "local master" parameter allows Samba to act as a local master
-browser. The "preferred master" causes nmbd to force a browser
-election on startup and the "os level" parameter sets Samba high
-enough so that it should win any browser elections.
-
-If you have an NT machine on the subnet that you wish to
-be the local master browser then you can disable Samba from
-becoming a local master browser by setting the following
-options in the [global] section of the smb.conf file :
-
- domain master = no
- local master = no
- preferred master = no
- os level = 0
-
-Setting up Browsing in a DOMAIN
-===============================
-
-If you are adding Samba servers to a Windows NT Domain then
-you must not set up a Samba server as a domain master browser.
-By default, a Windows NT Primary Domain Controller for a Domain
-name is also the Domain master browser for that name, and many
-things will break if a Samba server registers the Domain master
-browser NetBIOS name (DOMAIN<1B>) with WINS instead of the PDC.
-
-For subnets other than the one containing the Windows NT PDC
-you may set up Samba servers as local master browsers as
-described. To make a Samba server a local master browser set
-the following options in the [global] section of the smb.conf
-file :
-
- domain master = no
- local master = yes
- preferred master = yes
- os level = 65
-
-If you wish to have a Samba server fight the election with machines
-on the same subnet you may set the "os level" parameter to lower
-levels. By doing this you can tune the order of machines that
-will become local master browsers if they are running. For
-more details on this see the section "FORCING SAMBA TO BE THE MASTER"
-below.
-
-If you have Windows NT machines that are members of the domain
-on all subnets, and you are sure they will always be running then
-you can disable Samba from taking part in browser elections and
-ever becoming a local master browser by setting following options
-in the [global] section of the smb.conf file :
-
- domain master = no
- local master = no
- preferred master = no
- os level = 0
-
-FORCING SAMBA TO BE THE MASTER
-==============================
-
-Who becomes the "master browser" is determined by an election process
-using broadcasts. Each election packet contains a number of parameters
-which determine what precedence (bias) a host should have in the
-election. By default Samba uses a very low precedence and thus loses
-elections to just about anyone else.
-
-If you want Samba to win elections then just set the "os level" global
-option in smb.conf to a higher number. It defaults to 0. Using 34
-would make it win all elections over every other system (except other
-samba systems!)
-
-A "os level" of 2 would make it beat WfWg and Win95, but not NTAS. A
-NTAS domain controller uses level 32.
-
-The maximum os level is 255
-
-If you want samba to force an election on startup, then set the
-"preferred master" global option in smb.conf to "yes". Samba will
-then have a slight advantage over other potential master browsers
-that are not preferred master browsers. Use this parameter with
-care, as if you have two hosts (whether they are windows 95 or NT or
-samba) on the same local subnet both set with "preferred master" to
-"yes", then periodically and continually they will force an election
-in order to become the local master browser.
-
-If you want samba to be a "domain master browser", then it is
-recommended that you also set "preferred master" to "yes", because
-samba will not become a domain master browser for the whole of your
-LAN or WAN if it is not also a local master browser on its own
-broadcast isolated subnet.
-
-It is possible to configure two samba servers to attempt to become
-the domain master browser for a domain. The first server that comes
-up will be the domain master browser. All other samba servers will
-attempt to become the domain master browser every 5 minutes. They
-will find that another samba server is already the domain master
-browser and will fail. This provides automatic redundancy, should
-the current domain master browser fail.
-
-
-MAKING SAMBA THE DOMAIN MASTER
-==============================
-
-The domain master is responsible for collating the browse lists of
-multiple subnets so that browsing can occur between subnets. You can
-make samba act as the domain master by setting "domain master = yes"
-in smb.conf. By default it will not be a domain master.
-
-Note that you should NOT set Samba to be the domain master for a
-workgroup that has the same name as an NT Domain.
-
-When samba is the domain master and the master browser it will listen
-for master announcements (made roughly every twelve minutes) from local
-master browsers on other subnets and then contact them to synchronise
-browse lists.
-
-If you want samba to be the domain master then I suggest you also set
-the "os level" high enough to make sure it wins elections, and set
-"preferred master" to "yes", to get samba to force an election on
-startup.
-
-Note that all your servers (including samba) and clients should be
-using a WINS server to resolve NetBIOS names. If your clients are only
-using broadcasting to resolve NetBIOS names, then two things will occur:
-
-a) your local master browsers will be unable to find a domain master
- browser, as it will only be looking on the local subnet.
-
-b) if a client happens to get hold of a domain-wide browse list, and
- a user attempts to access a host in that list, it will be unable to
- resolve the NetBIOS name of that host.
-
-If, however, both samba and your clients are using a WINS server, then:
-
-a) your local master browsers will contact the WINS server and, as long as
- samba has registered that it is a domain master browser with the WINS
- server, your local master browser will receive samba's ip address
- as its domain master browser.
-
-b) when a client receives a domain-wide browse list, and a user attempts
- to access a host in that list, it will contact the WINS server to
- resolve the NetBIOS name of that host. as long as that host has
- registered its NetBIOS name with the same WINS server, the user will
- be able to see that host.
-
-NOTE ABOUT BROADCAST ADDRESSES
-==============================
-
-If your network uses a "0" based broadcast address (for example if it
-ends in a 0) then you will strike problems. Windows for Workgroups
-does not seem to support a 0's broadcast and you will probably find
-that browsing and name lookups won't work.
-
-
-MULTIPLE INTERFACES
-===================
-
-Samba now supports machines with multiple network interfaces. If you
-have multiple interfaces then you will need to use the "interfaces"
-option in smb.conf to configure them. See smb.conf(5) for details.
-
diff --git a/docs/textdocs/BUGS.txt b/docs/textdocs/BUGS.txt
deleted file mode 100644
index 5fc069371b3..00000000000
--- a/docs/textdocs/BUGS.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-Contributor: Samba Team
-Updated: June 27, 1997
-
-Subject: This file describes how to report Samba bugs.
-============================================================================
-
->> The email address for bug reports is samba-bugs@samba.anu.edu.au <<
-
-Please take the time to read this file before you submit a bug
-report. Also, please see if it has changed between releases, as we
-may be changing the bug reporting mechanism at some time.
-
-Please also do as much as you can yourself to help track down the
-bug. Samba is maintained by a dedicated group of people who volunteer
-their time, skills and efforts. We receive far more mail about it than
-we can possibly answer, so you have a much higher chance of an answer
-and a fix if you send us a "developer friendly" bug report that lets
-us fix it fast.
-
-Do not assume that if you post the bug to the comp.protocols.smb
-newsgroup or the mailing list that we will read it. If you suspect that your
-problem is not a bug but a configuration problem then it is better to send
-it to the Samba mailing list, as there are (at last count) 5000 other users on
-that list that may be able to help you.
-
-You may also like to look though the recent mailing list archives,
-which are conveniently accessible on the Samba web pages
-at http://samba.anu.edu.au/samba/
-
-
-GENERAL INFO
-------------
-
-Before submitting a bug report check your config for silly
-errors. Look in your log files for obvious messages that tell you that
-you've misconfigured something and run testparm to test your config
-file for correct syntax.
-
-Have you run through DIAGNOSIS.txt? This is very important.
-
-If you include part of a log file with your bug report then be sure to
-annotate it with exactly what you were doing on the client at the
-time, and exactly what the results were.
-
-
-DEBUG LEVELS
-------------
-
-If the bug has anything to do with Samba behaving incorrectly as a
-server (like refusing to open a file) then the log files will probably
-be very useful. Depending on the problem a log level of between 3 and
-10 showing the problem may be appropriate. A higher level givesmore
-detail, but may use too much disk space.
-
-To set the debug level use "log level =" in your smb.conf. You may
-also find it useful to set the log level higher for just one machine
-and keep separate logs for each machine. To do this use:
-
-log level = 10
-log file = /usr/local/samba/lib/log.%m
-include = /usr/local/samba/lib/smb.conf.%m
-
-then create a file "/usr/local/samba/lib/smb.conf.machine" where
-"machine" is the name of the client you wish to debug. In that file
-put any smb.conf commands you want, for example "log level=" may be
-useful. This also allows you to experiment with different security
-systems, protocol levels etc on just one machine.
-
-The smb.conf entry "log level =" is synonymous with the entry
-"debuglevel =" that has been used in older versions of Samba and
-is being retained for backwards compatibility of smb.conf files.
-
-As the "log level =" value is increased you will record a significantly
-increasing level of debugging information. For most debugging operations
-you may not need a setting higher than 3. Nearly all bugs can be tracked
-at a setting of 10, but be prepared for a VERY large volume of log data.
-
-
-INTERNAL ERRORs
----------------
-
-If you get a "INTERNAL ERROR" message in your log files it means that
-Samba got an unexpected signal while running. It is probably a
-segmentation fault and almost certainly means a bug in Samba (unless
-you have faulty hardware or system software)
-
-If the message came from smbd then it will probably be accompanied by
-a message which details the last SMB message received by smbd. This
-info is often very useful in tracking down the problem so please
-include it in your bug report.
-
-You should also detail how to reproduce the problem, if
-possible. Please make this reasonably detailed.
-
-You may also find that a core file appeared in a "corefiles"
-subdirectory of the directory where you keep your samba log
-files. This file is the most useful tool for tracking down the bug. To
-use it you do this:
-
-gdb smbd core
-
-adding appropriate paths to smbd and core so gdb can find them. If you
-don't have gdb then try "dbx". Then within the debugger use the
-command "where" to give a stack trace of where the problem
-occurred. Include this in your mail.
-
-If you known any assembly language then do a "disass" of the routine
-where the problem occurred (if its in a library routine then
-disassemble the routine that called it) and try to work out exactly
-where the problem is by looking at the surrounding code. Even if you
-don't know assembly then incuding this info in the bug report can be
-useful.
-
-
-ATTACHING TO A RUNNING PROCESS
-------------------------------
-
-Unfortunately some unixes (in particular some recent linux kernels)
-refuse to dump a core file if the task has changed uid (which smbd
-does often). To debug with this sort of system you could try to attach
-to the running process using "gdb smbd PID" where you get PID from
-smbstatus. Then use "c" to continue and try to cause the core dump
-using the client. The debugger should catch the fault and tell you
-where it occurred.
-
-
-PATCHES
--------
-
-The best sort of bug report is one that includes a fix! If you send us
-patches please use "diff -u" format if your version of diff supports
-it, otherwise use "diff -c4". Make sure your do the diff against a
-clean version of the source and let me know exactly what version you
-used.
-
diff --git a/docs/textdocs/DIAGNOSIS.txt b/docs/textdocs/DIAGNOSIS.txt
deleted file mode 100644
index 11eb91b2ff8..00000000000
--- a/docs/textdocs/DIAGNOSIS.txt
+++ /dev/null
@@ -1,260 +0,0 @@
-Contributor: Andrew Tridgell
-Updated: June 27, 1997
-
-Subject: DIAGNOSING YOUR SAMBA SERVER
-===========================================================================
-
-This file contains a list of tests you can perform to validate your
-Samba server. It also tells you what the likely cause of the problem
-is if it fails any one of these steps. If it passes all these tests
-then it is probably working fine.
-
-You should do ALL the tests, in the order shown. I have tried to
-carefully choose them so later tests only use capabilities verified in
-the earlier tests.
-
-I would welcome additions to this set of tests. Please mail them to
-samba-bugs@samba.anu.edu.au
-
-If you send me an email saying "it doesn't work" and you have not
-followed this test procedure then you should not be surprised if I
-ignore your email.
-
-
-ASSUMPTIONS
------------
-
-In all of the tests I assume you have a Samba server called BIGSERVER
-and a PC called ACLIENT. I also assume the PC is running windows for
-workgroups with a recent copy of the microsoft tcp/ip stack. Alternatively,
-your PC may be running Windows 95 or Windows NT (Workstation or Server).
-
-The procedure is similar for other types of clients.
-
-I also assume you know the name of an available share in your
-smb.conf. I will assume this share is called "tmp". You can add a
-"tmp" share like by adding the following to smb.conf:
-
-[tmp]
- comment = temporary files
- path = /tmp
- read only = yes
-
-
-THESE TESTS ASSUME VERSION 1.9.16 OR LATER OF THE SAMBA SUITE. SOME
-COMMANDS SHOWN DID NOT EXIST IN EARLIER VERSIONS
-
-
-TEST 1:
--------
-
-In the directory in which you store your smb.conf file, run the command
-"testparm smb.conf". If it reports any errors then your smb.conf
-configuration file is faulty.
-
-Note: Your smb.conf file may be located in: /etc
- or in: /usr/local/samba/lib
-
-
-TEST 2:
--------
-
-run the command "ping BIGSERVER" from the PC and "ping ACLIENT" from
-the unix box. If you don't get a valid response then your TCP/IP
-software is not correctly installed.
-
-Note that you will need to start a "dos prompt" window on the PC to
-run ping.
-
-If you get a message saying "host not found" or similar then your DNS
-software or /etc/hosts file is not correctly setup. It is possible to
-run samba without DNS entries for the server and client, but I assume
-you do have correct entries for the remainder of these tests.
-
-Another reason why ping might fail is if your host is running firewall
-software. You will need to relax the rules to let in the workstation
-in question, perhaps by allowing access from another subnet (on Linux
-this is done via the ipfwadm program.)
-
-
-TEST 3:
--------
-
-Run the command "smbclient -L BIGSERVER" on the unix box. You
-should get a list of available shares back.
-
-If you get a error message containing the string "Bad password" then
-you probably have either an incorrect "hosts allow", "hosts deny" or
-"valid users" line in your smb.conf, or your guest account is not
-valid. Check what your guest account is using "testparm" and
-temporarily remove any "hosts allow", "hosts deny", "valid users" or
-"invalid users" lines.
-
-If you get a "connection refused" response then the smbd server could
-not be running. If you installed it in inetd.conf then you probably edited
-that file incorrectly. If you installed it as a daemon then check that
-it is running, and check that the netbios-ssn port is in a LISTEN
-state using "netstat -a".
-
-If you get a "session request failed" then the server refused the
-connection. If it says "your server software is being unfriendly" then
-its probably because you have invalid command line parameters to smbd,
-or a similar fatal problem with the initial startup of smbd. Also
-check your config file (smb.conf) for syntax errors with "testparm"
-and that the various directories where samba keeps its log and lock
-files exist.
-
-Another common cause of these two errors is having something already running
-on port 139, such as Samba (ie: smbd is running from inetd already) or
-something like Digital's Pathworks. Check your inetd.conf file before trying
-to start smbd as a daemon, it can avoid a lot of frustration!
-
-
-TEST 4:
--------
-
-Run the command "nmblookup -B BIGSERVER __SAMBA__". You should get the
-IP address of your Samba server back.
-
-If you don't then nmbd is incorrectly installed. Check your inetd.conf
-if you run it from there, or that the daemon is running and listening
-to udp port 137.
-
-One common problem is that many inetd implementations can't take many
-parameters on the command line. If this is the case then create a
-one-line script that contains the right parameters and run that from
-inetd.
-
-
-TEST 5:
--------
-
-run the command "nmblookup -B ACLIENT '*'"
-
-You should get the PCs IP address back. If you don't then the client
-software on the PC isn't installed correctly, or isn't started, or you
-got the name of the PC wrong.
-
-
-TEST 6:
--------
-
-Run the command "nmblookup -d 2 '*'"
-
-This time we are trying the same as the previous test but are trying
-it via a broadcast to the default broadcast address. A number of
-Netbios/TCPIP hosts on the network should respond, although Samba may
-not catch all of the responses in the short time it listens. You
-should see "got a positive name query response" messages from several
-hosts.
-
-If this doesn't give a similar result to the previous test then
-nmblookup isn't correctly getting your broadcast address through its
-automatic mechanism. In this case you should experiment use the
-"interfaces" option in smb.conf to manually configure your IP
-address, broadcast and netmask.
-
-If your PC and server aren't on the same subnet then you will need to
-use the -B option to set the broadcast address to the that of the PCs
-subnet.
-
-
-TEST 7:
--------
-
-Run the command "smbclient '\\BIGSERVER\TMP'". You should then be
-prompted for a password. You should use the password of the account
-you are logged into the unix box with. If you want to test with
-another account then add the -U <accountname> option to the command
-line.
-
-Once you enter the password you should get the "smb>" prompt. If you
-don't then look at the error message. If it says "invalid network
-name" then the service "tmp" is not correctly setup in your smb.conf.
-
-If it says "bad password" then the likely causes are:
-
-- you have shadow passords (or some other password system) but didn't
-compile in support for them in smbd
-- your "valid users" configuration is incorrect
-- you have a mixed case password and you haven't enabled the "password
-level" option at a high enough level
-- the "path =" line in smb.conf is incorrect. Check it with testparm
-- you enabled password encryption but didn't create the SMB encrypted
-password file
-
-Once connected you should be able to use the commands "dir" "get"
-"put" etc. Type "help <command>" for instructions. You should
-especially check that the amount of free disk space shown is correct
-when you type "dir".
-
-
-TEST 8:
--------
-
-On the PC type the command "net view \\BIGSERVER". You will need to do
-this from within a "dos prompt" window. You should get back a list of
-available shares on the server.
-
-If you get a "network name not found" or similar error then netbios
-name resolution is not working. This is usually caused by a problem in
-nmbd. To overcome it you could do one of the following (you only need
-to choose one of them):
-
-- fixup the nmbd installation
-- add the IP address of BIGSERVER to the "wins server" box in the
-advanced tcp/ip setup on the PC.
-- enable windows name resolution via DNS in the advanced section of
-the tcp/ip setup
-- add BIGSERVER to your lmhosts file on the PC.
-
-If you get a "invalid network name" or "bad password error" then the
-same fixes apply as they did for the "smbclient -L" test above. In
-particular, make sure your "hosts allow" line is correct (see the man
-pages)
-
-If you get "specified computer is not receiving requests" or similar
-it probably means that the host is not contactable via tcp services.
-Check to see if the host is running tcp wrappers, and if so add an entry in
-the hosts.allow file for your client (or subnet, etc.)
-
-
-TEST 9:
---------
-
-Run the command "net use x: \\BIGSERVER\TMP". You should be prompted
-for a password then you should get a "command completed successfully"
-message. If not then your PC software is incorrectly installed or your
-smb.conf is incorrect. make sure your "hosts allow" and other config
-lines in smb.conf are correct.
-
-It's also possible that the server can't work out what user name to
-connect you as. To see if this is the problem add the line "user =
-USERNAME" to the [tmp] section of smb.conf where "USERNAME" is the
-username corresponding to the password you typed. If you find this
-fixes things you may need the username mapping option.
-
-
-TEST 10:
---------
-
-From file manager try to browse the server. Your samba server should
-appear in the browse list of your local workgroup (or the one you
-specified in smb.conf). You should be able to double click on the name
-of the server and get a list of shares. If you get a "invalid
-password" error when you do then you are probably running WinNT and it
-is refusing to browse a server that has no encrypted password
-capability and is in user level security mode. In this case either set
-"security = server" AND "password server = Windows_NT_Machine" in your
-smb.conf file, or enable encrypted passwords AFTER compiling in support
-for encrypted passwords (refer to the Makefile).
-
-
-Still having troubles?
-----------------------
-
-Try the mailing list or newsgroup, or use the tcpdump-smb utility to
-sniff the problem.
-
-Also look at the other docs in the Samba package!
-
diff --git a/docs/textdocs/DNIX.txt b/docs/textdocs/DNIX.txt
deleted file mode 100644
index 51005e6ec8c..00000000000
--- a/docs/textdocs/DNIX.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-DNIX has a problem with seteuid() and setegid(). These routines are
-needed for Samba to work correctly, but they were left out of the DNIX
-C library for some reason.
-
-For this reason Samba by default defines the macro NO_EID in the DNIX
-section of includes.h. This works around the problem in a limited way,
-but it is far from ideal, some things still won't work right.
-
-To fix the problem properly you need to assemble the following two
-functions and then either add them to your C library or link them into
-Samba.
-
-put this in the file setegid.s:
-
- .globl _setegid
-_setegid:
- moveq #47,d0
- movl #100,a0
- moveq #1,d1
- movl 4(sp),a1
- trap #9
- bccs 1$
- jmp cerror
-1$:
- clrl d0
- rts
-
-
-put this in the file seteuid.s:
-
- .globl _seteuid
-_seteuid:
- moveq #47,d0
- movl #100,a0
- moveq #0,d1
- movl 4(sp),a1
- trap #9
- bccs 1$
- jmp cerror
-1$:
- clrl d0
- rts
-
-after creating the above files you then assemble them using
-
-as seteuid.s
-as setegid.s
-
-that should produce the files seteuid.o and setegid.o
-
-then you need to add these to the LIBSM line in the DNIX section of
-the Samba Makefile. Your LIBSM line will then look something like this:
-
-LIBSM = setegid.o seteuid.o -ln
-
-You should then remove the line:
-
-#define NO_EID
-
-from the DNIX section of includes.h
-
-Then recompile and try it out!
-
-Note that this file was derived from an email from Peter Olsson
-<pol@leissner.se>. I don't have DNIX myself, so you're probably better
-off contacting Peter if you have problems.
-
-Andrew
-
diff --git a/docs/textdocs/DOMAIN.txt b/docs/textdocs/DOMAIN.txt
deleted file mode 100644
index 3cd8a125b7b..00000000000
--- a/docs/textdocs/DOMAIN.txt
+++ /dev/null
@@ -1,361 +0,0 @@
-Contributor: Samba Team
-Updated: June 27, 1997
-
-Subject: Network Logons and Roving Profiles
-===========================================================================
-
-A domain and a workgroup are exactly the same thing in terms of network
-browsing. The difference is that a distributable authentication
-database is associated with a domain, for secure login access to a
-network. Also, different access rights can be granted to users if they
-successfully authenticate against a domain logon server (samba does not
-support this, but NT server and other systems based on NT server do).
-
-The SMB client logging on to a domain has an expectation that every other
-server in the domain should accept the same authentication information.
-However the network browsing functionality of domains and workgroups is
-identical and is explained in BROWSING.txt.
-
-Issues related to the single-logon network model are discussed in this
-document. Samba supports domain logons, network logon scripts, and user
-profiles. The support is still experimental, but it seems to work.
-
-The support is also not complete. Samba does not yet support the sharing
-of the Windows NT-style SAM database with other systems. However this is
-only one way of having a shared user database: exactly the same effect can
-be achieved by having all servers in a domain share a distributed NIS or
-Kerberos authentication database.
-
-When an SMB client in a domain wishes to logon it broadcast requests for a
-logon server. The first one to reply gets the job, and validates its
-password using whatever mechanism the Samba administrator has installed.
-It is possible (but very stupid) to create a domain where the user
-database is not shared between servers, ie they are effectively workgroup
-servers advertising themselves as participating in a domain. This
-demonstrates how authentication is quite different from but closely
-involved with domains.
-
-Another thing commonly associated with single-logon domains is remote
-administration over the SMB protocol. Again, there is no reason why this
-cannot be implemented with an underlying username database which is
-different from the Windows NT SAM. Support for the Remote Administration
-Protocol is planned for a future release of Samba.
-
-The domain support works for WfWg, and Win95 clients. Support for Windows
-NT and OS/2 clients is still being worked on and is still experimental.
-Support for profiles is confirmed as working for Win95, NT 4.0 and NT 3.51,
-although NT Workstation requires manual configuration of user accounts with
-NT's "User Manager for Domains", and no automatic profile location support
-is available using samba, although it has been confirmed as possible to use
-an NT server to specify that the location of profiles is on a samba server.
-
-The help of an NT server can be enlisted, both for profile storage and
-for user authentication. For details on user authentication, see
-security_level.txt. For details on profile storage, see below.
-
-
-Using these features you can make your clients verify their logon via
-the Samba server, make clients run a batch file when they logon to
-the network and download their preferences, desktop and start menu.
-
-
-Configuration Instructions: Network Logons
-==========================================
-
-To use domain logons and profiles you need to do the following:
-
-
-1) Setup nmbd and smbd by configuring smb.conf so that Samba is
- acting as the master browser. See <your OS>_INSTALL.txt and BROWSING.txt
- for details.
-
-2) Setup a WINS server (see NetBIOS.txt) and configure all your clients
- to use that WINS service. [lkcl 12jul97 - problems occur where
- clients do not pick up the profiles properly unless they are using a
- WINS server. this is still under investigation].
-
-3) Create a share called [netlogon] in your smb.conf. This share should
- be readable by all users, and probably should not be writeable. This
- share will hold your network logon scripts, and the CONFIG.POL file
- (Note: for details on the CONFIG.POL file, how to use it, what it is,
- refer to the Microsoft Windows NT Administration documentation.
- The format of these files is not known, so you will need to use
- Microsoft tools).
-
-For example I have used:
-
- [netlogon]
- path = /data/dos/netlogon
- writeable = no
- guest ok = no
-
-Note that it is important that this share is not writeable by ordinary
-users, in a secure environment: ordinary users should not be allowed
-to modify or add files that another user's computer would then download
-when they log in.
-
-4) in the [global] section of smb.conf set the following:
-
- domain logons = yes
- logon script = %U.bat
-
-The choice of batch file is, of course, up to you. The above would
-give each user a separate batch file as the %U will be changed to
-their username automatically. The other standard % macros may also be
-used. You can make the batch files come from a subdirectory by using
-something like:
-
- logon script = scripts\%U.bat
-
-5) create the batch files to be run when the user logs in. If the batch
- file doesn't exist then no batch file will be run.
-
-In the batch files you need to be careful to use DOS style cr/lf line
-endings. If you don't then DOS may get confused. I suggest you use a
-DOS editor to remotely edit the files if you don't know how to produce
-DOS style files under unix.
-
-6) Use smbclient with the -U option for some users to make sure that
- the \\server\NETLOGON share is available, the batch files are
- visible and they are readable by the users.
-
-7) you will probabaly find that your clients automatically mount the
- \\SERVER\NETLOGON share as drive z: while logging in. You can put
- some useful programs there to execute from the batch files.
-
-NOTE: You must be using "security = user" or "security = server" for
-domain logons to work correctly. Share level security won't work
-correctly.
-
-
-
-Configuration Instructions: Setting up Roaming User Profiles
-================================================================
-
-In the [global] section of smb.conf set the following (for example):
-
- logon path = \\profileserver\profileshare\profilepath\%U\moreprofilepath
-
-The default for this option is \\%L\%U\profile, namely
-\\sambaserver\username\profile. The \\L%\%U services is created
-automatically by the [homes] service.
-
-If you are using a samba server for the profiles, you _must_ make the
-share specified in the logon path browseable. Windows 95 appears to
-check that it can see the share and any subdirectories within that share
-specified by the logon path option, rather than just connecting straight
-away. It also attempts to create the components of the full path for
-you. If the creation of any component fails, or if it cannot see any
-component of the path, the profile creation / reading fails.
-
-[lkcl 26aug96 - we have discovered a problem where Windows clients can
-maintain a connection to the [homes] share in between logins. The
-[homes] share must NOT therefore be used in a profile path.]
-
-
-Windows 95
-----------
-
-When a user first logs in on Windows 95, the file user.DAT is created,
-as are folders "Start Menu", "Desktop", "Programs" and "Nethood".
-These directories and their contents will be merged with the local
-versions stored in c:\windows\profiles\username on subsequent logins,
-taking the most recent from each. You will need to use the [global]
-options "preserve case = yes", "short case preserve = yes" and
-"case sensitive = no" in order to maintain capital letters in shortcuts
-in any of the profile folders.
-
-The user.DAT file contains all the user's preferences. If you wish to
-enforce a set of preferences, rename their user.DAT file to user.MAN,
-and deny them write access to this file.
-
-2) On the Windows 95 machine, go to Control Panel | Passwords and
- select the User Profiles tab. Select the required level of
- roaming preferences. Press OK, but do _not_ allow the computer
- to reboot.
-
-3) On the Windows 95 machine, go to Control Panel | Network |
- Client for Microsoft Networks | Preferences. Select 'Log on to
- NT Domain'. Then, ensure that the Primary Logon is 'Client for
- Microsoft Networks'. Press OK, and this time allow the computer
- to reboot.
-
-Under Windows 95, Profiles are downloaded from the Primary Logon.
-If you have the Primary Logon as 'Client for Novell Networks', then
-the profiles and logon script will be downloaded from your Novell
-Server. If you have the Primary Logon as 'Windows Logon', then the
-profiles will be loaded from the local machine - a bit against the
-concept of roaming profiles, if you ask me.
-
-You will now find that the Microsoft Networks Login box contains
-[user, password, domain] instead of just [user, password]. Type in
-the samba server's domain name (or any other domain known to exist,
-but bear in mind that the user will be authenticated against this
-domain and profiles downloaded from it, if that domain logon server
-supports it), user name and user's password.
-
-Once the user has been successfully validated, the Windows 95 machine
-will inform you that 'The user has not logged on before' and asks you
-if you wish to save the user's preferences? Select 'yes'.
-
-Once the Windows 95 client comes up with the desktop, you should be able
-to examine the contents of the directory specified in the "logon path"
-on the samba server and verify that the "Desktop", "Start Menu",
-"Programs" and "Nethood" folders have been created.
-
-These folders will be cached locally on the client, and updated when
-the user logs off (if you haven't made them read-only by then :-).
-You will find that if the user creates further folders or short-cuts,
-that the client will merge the profile contents downloaded with the
-contents of the profile directory already on the local client, taking
-the newest folders and short-cuts from each set.
-
-If you have made the folders / files read-only on the samba server,
-then you will get errors from the w95 machine on logon and logout, as
-it attempts to merge the local and the remote profile. Basically, if
-you have any errors reported by the w95 machine, check the unix file
-permissions and ownership rights on the profile directory contents,
-on the samba server.
-
-
-If you have problems creating user profiles, you can reset the user's
-local desktop cache, as shown below. When this user then next logs in,
-they will be told that they are logging in "for the first time".
-
-
-1) instead of logging in under the [user, password, domain] dialog],
- press escape.
-
-2) run the regedit.exe program, and look in:
-
- HKEY_LOCAL_MACHINE\Windows\CurrentVersion\ProfileList
-
- you will find an entry, for each user, of ProfilePath. Note the
- contents of this key (likely to be c:\windows\profiles\username),
- then delete the key ProfilePath for the required user.
-
- [Exit the registry editor].
-
-3) WARNING - before deleting the contents of the directory listed in
- the ProfilePath (this is likely to be c:\windows\profiles\username),
- ask them if they have any important files stored on their desktop
- or in their start menu. delete the contents of the directory
- ProfilePath (making a backup if any of the files are needed).
-
- This will have the effect of removing the local (read-only hidden
- system file) user.DAT in their profile directory, as well as the
- local "desktop", "nethood", "start menu" and "programs" folders.
-
-4) search for the user's .PWL password-cacheing file in the c:\windows
- directory, and delete it.
-
-5) log off the windows 95 client.
-
-6) check the contents of the profile path (see "logon path" described
- above), and delete the user.DAT or user.MAN file for the user,
- making a backup if required.
-
-
-If all else fails, increase samba's debug log levels to between 3 and 10,
-and / or run a packet trace program such as tcpdump or netmon.exe, and
-look for any error reports.
-
-If you have access to an NT server, then first set up roaming profiles
-and / or netlogons on the NT server. Make a packet trace, or examine
-the example packet traces provided with NT server, and see what the
-differences are with the equivalent samba trace.
-
-
-Windows NT Workstation 4.0
---------------------------
-
-When a user first logs in to a Windows NT Workstation, the profile
-NTuser.MAN is created. The "User Manager for Domains" can be used
-to specify the location of the profile. Samba cannot be a domain
-logon server for NT, therefore you will need to manually configure
-each and every account. [lkcl 10aug97 - i tried setting the path
-in each account to \\samba-server\homes\profile, and discovered that
-this fails because a background process maintains the connection to
-the [homes] share which does _not_ close down in between user logins.
-you have to have \\samba-server\user\profile, where user is the
-username created from the [homes] share].
-
-The entry for the NT 4.0 profile is a _directory_ not a file. The NT
-help on profiles mentions that a directory is also created with a .PDS
-extension. The user, while logging in, must have write permission to
-create the full profile path (and the folder with the .PDS extension)
-[lkcl 10aug97 - i found that the creation of the .PDS directory failed,
-and had to create these manually for each user, with a shell script.
-also, i presume, but have not tested, that the full profile path must
-be browseable just as it is for w95, due to the manner in which they
-attempt to create the full profile path: test existence of each path
-component; create path component].
-
-In the profile directory, NT creates more folders than 95. It creates
-"Application Data" and others, as well as "Desktop", "Nethood",
-"Start Menu" and "Programs". The profile itself is stored in a file
-NTuser.DAT. Nothing appears to be stored in the .PDS directory, and
-its purpose is currently unknown.
-
-You can use the System Control Panel to copy a local profile onto
-a samba server (see NT Help on profiles: it is also capable of firing
-up the correct location in the System Control Panel for you). The
-NT Help file also mentions that renaming NTuser.DAT to NTuser.MAN
-turns a profile into a mandatory one.
-
-[lkcl 10aug97 - i notice that NT Workstation tells me that it is
-downloading a profile from a slow link. whether this is actually the
-case, or whether there is some configuration issue, as yet unknown,
-that makes NT Workstation _think_ that the link is a slow one is a
-matter to be resolved].
-
-[lkcl 20aug97 - after samba digest correspondance, one user found, and
-another confirmed, that profiles cannot be loaded from a samba server
-unless "security = user" and "encrypted passwords = yes" (see the file
-ENCRYPTION.txt) or "security = server" and "password server = ip.address.
-of.yourNTserver" are used. either of these options will allow the NT
-workstation to access the samba server using LAN manager encrypted
-passwords, without the user intervention normally required by NT
-workstation for clear-text passwords].
-
-[lkcl 25aug97 - more comments received about NT profiles: the case of
-the profile _matters_. the file _must_ be called NTuser.DAT or, for
-a mandatory profile, NTuser.MAN].
-
-
-Windows NT Server
------------------
-
-Following the instructions for NT Workstation, there is nothing to stop
-you specifying any path that you like for the location of users' profiles.
-Therefore, you could specify that the profile be stored on a samba server,
-or any other SMB server, as long as that SMB server supports encrypted
-passwords.
-
-
-
-Sharing Profiles between W95 and NT Workstation 4.0
----------------------------------------------------
-
-The default logon path is \\%L\U%. NT Workstation will attempt to create
-a directory "\\samba-server\username.PDS" if you specify the logon path
-as "\\samba-server\username" with the NT User Manager. Therefore, you
-will need to specify (for example) "\\samba-server\username\profile".
-NT 4.0 will attempt to create "\\samba-server\username\profile.PDS", which
-is more likely to succeed.
-
-If you then want to share the same Start Menu / Desktop with W95, you will
-need to specify "logon path = \\samba-server\username\profile" [lkcl 10aug97
-this has its drawbacks: i created a shortcut to telnet.exe, which attempts
-to run from the c:\winnt\system32 directory. this directory is obviously
-unlikely to exist on a W95 host].
-
-If you have this set up correctly, you will find separate user.DAT and
-NTuser.DAT files in the same profile directory.
-
-[lkcl 25aug97 - there are some issues to resolve with downloading of
-NT profiles, probably to do with time/date stamps. i have found that
-NTuser.DAT is never updated on the workstation after the first time that
-it is copied to the local workstation profile directory. this is in
-contrast to w95, where it _does_ transfer / update profiles correctly].
-
diff --git a/docs/textdocs/DOMAIN_CONTROL.txt b/docs/textdocs/DOMAIN_CONTROL.txt
deleted file mode 100644
index 0b077320cdb..00000000000
--- a/docs/textdocs/DOMAIN_CONTROL.txt
+++ /dev/null
@@ -1,108 +0,0 @@
-Initial Release: August 22, 1996
-Contributor: John H Terpstra <samba-bugs@samba.anu.edu.au>
- Copyright (C) 1996-1997 - John H Terpstra
-Updated: August 25, 1997
-Status: Current - New Content
-
-Subject: Windows NT Domain Control & Samba
-============================================================================
-
-****NOTE:****
-=============
-The term "Domain Controller" and those related to it refer to one specific
-method of authentication that can underly an SMB domain. Domain Controllers
-prior to Windows NT Server 3.1 were sold by various companies and based on
-private extensions to the LAN Manager 2.1 protocol. Windows NT introduced
-Microsoft-specific ways of distributing the user authentication database.
-See DOMAIN.txt for examples of how Samba can participate in or create
-SMB domains based on shared authentication database schemes other than the
-Windows NT SAM.
-
-Microsoft Windows NT Domain Control is an extremely complex protocol.
-We have received countless requests to implement Domain Control in Samba
-and have seriously investigated the potential to support this. The Samba
-Team have now concluded that since Domain Control is a completely
-undocumented protocol we ought NOT to implement our best guess of this
-technology. It is a Microsoft business policy NOT to release the information
-necessary to enable this to be implemented in a dependable manner.
-============================================================================
-
-Windows NT Server can be installed as either a plain file and print server
-(WORKGROUP workstaion or server) or as a server that participates in Domain
-Control (DOMAIN member, Primary Domain controller or Backup Domain controller).
-
-The same is true for OS/2 Warp Server, Digital Pathworks and other similar
-products, all of which can participate in Domain Control along with Windows NT.
-However only those servers which have licenced Windows NT code in them can be
-a primary Domain Controller (eg Windows NT Server, Advanced Server for Unix.)
-
-To many people these terms can be confusing, so let's try to clear the air.
-
-Every Windows NT system (workstation or server) has a registry database.
-The registry contains entries that describe the initialisation information
-for all services (the equivalent of Unix Daemons) that run within the Windows
-NT environment. The registry also contains entries that tell application
-software where to find dynamically loadable libraries that they depend upon.
-In fact, the registry contains entries that describes everything that anything
-may need to know to interact with the rest of the system.
-
-The registry files can be located on any Windows NT machine by opening a
-command prompt and typing:
- dir %SystemRoot%\System32\config
-
-The environment variable %SystemRoot% value can be obtained by typing:
- echo %SystemRoot%
-
-The active parts of the registry that you may want to be familiar with are
-the files called: default, system, software, sam and security.
-
-In a domain environment, Microsoft Windows NT domain controllers participate
-in replication of the SAM and SECURITY files so that all controllers within
-the domain have an exactly identical copy of each.
-
-The Microsoft Windows NT system is structured within a security model that
-says that all applications and services must authenticate themselves before
-they can obtain permission from the security manager to do what they set out
-to do.
-
-The Windows NT User database also resides within the registry. This part of
-the registry contains the user's security identifier, home directory, group
-memberships, desktop profile, and so on.
-
-Every Windows NT system (workstation as well as server) will have its own
-registry. Windows NT Servers that participate in Domain Security control
-have a database that they share in common - thus they do NOT own an
-independent full registry database of their own, as do Workstations and
-plain Servers.
-
-The User database is called the SAM (Security Access Manager) database and
-is used for all user authentication as well as for authentication of inter-
-process authentication (ie: to ensure that the service action a user has
-requested is permitted within the limits of that user's privileges).
-
-The Samba team have produced a utility that can dump the Windows NT SAM into
-smbpasswd format: see ENCRYPTION.txt for information on smbpasswd and
-/pub/samba/pwdump on your nearest Samba mirror for the utility. This
-facility is useful but cannot be easily used to implement SAM replication
-to Samba systems.
-
-Windows for Workgroups, Windows 95, and Windows NT Workstations and Servers
-can participate in a Domain security system that is controlled by Windows NT
-servers that have been correctly configured. At most every domain will have
-ONE Primary Domain Controller (PDC). It is desirable that each domain will
-have at least one Backup Domain Controller (BDC).
-
-The PDC and BDCs then participate in replication of the SAM database so that
-each Domain Controlling participant will have an up to date SAM component
-within its registry.
-
-Samba can NOT at this time function as a Domain Controller for any of these
-security services, but like all other domain members can interact with the
-Windows NT security system for all access authentication.
-
-When Samba is configured with the 'security = server' option and the
-'password server = Your_Windows_NT_Server_Name' option, then it will
-redirect all access authentication to that server. This way you can
-use Windows NT to act as your password server with full support for
-Microsoft encrypted passwords.
-
diff --git a/docs/textdocs/ENCRYPTION.txt b/docs/textdocs/ENCRYPTION.txt
deleted file mode 100644
index 075a0d322e2..00000000000
--- a/docs/textdocs/ENCRYPTION.txt
+++ /dev/null
@@ -1,324 +0,0 @@
-Contributor: Jeremy Allison <samba-bugs@samba.anu.edu.au>
-Updated: June 27, 1997
-Note: Please refer to WinNT.txt also
-
-Subject: LanManager / Samba Password Encryption.
-============================================================================
-
-With the development of LanManager and Windows NT compatible password
-encryption for Samba, it is now able to validate user connections in
-exactly the same way as a LanManager or Windows NT server.
-
-This document describes how the SMB password encryption algorithm
-works and what issues there are in choosing whether you want to use
-it. You should read it carefully, especially the part about security
-and the "PROS and CONS" section.
-
-How does it work ?
-------------------
-
-LanManager encryption is somewhat similar to UNIX password
-encryption. The server uses a file containing a hashed value of a
-users password. This is created by taking the users paintext
-password, capitalising it, and either truncating to 14 bytes (or
-padding to 14 bytes with null bytes). This 14 byte value is used as
-two 56 bit DES keys to encrypt a 'magic' eight byte value, forming a
-16 byte value which is stored by the server and client. Let this value
-be known as the *hashed password*.
-
-Windows NT encryption is a higher quality mechanism, consisting
-of doing an MD4 hash on a Unicode version of the users password. This
-also produces a 16 byte hash value that is non-reversible.
-
-When a client (LanManager, Windows for WorkGroups, Windows 95 or
-Windows NT) wishes to mount a Samba drive (or use a Samba resource) it
-first requests a connection and negotiates the protocol that the client
-and server will use. In the reply to this request the Samba server
-generates and appends an 8 byte, random value - this is stored in the
-Samba server after the reply is sent and is known as the *challenge*.
-
-The challenge is different for every client connection.
-
-The client then uses the hashed password (16 byte values described
-above), appended with 5 null bytes, as three 56 bit DES keys, each of
-which is used to encrypt the challenge 8 byte value, forming a 24 byte
-value known as the *response*.
-
-In the SMB call SMBsessionsetupX (when user level security is
-selected) or the call SMBtconX (when share level security is selected)
-the 24 byte response is returned by the client to the Samba server.
-For Windows NT protocol levels the above calculation is done on
-both hashes of the users password and both responses are returned
-in the SMB call, giving two 24 byte values.
-
-The Samba server then reproduces the above calculation, using it's own
-stored value of the 16 byte hashed password (read from the smbpasswd
-file - described later) and the challenge value that it kept from the
-negotiate protocol reply. It then checks to see if the 24 byte value it
-calculates matches the 24 byte value returned to it from the client.
-
-If these values match exactly, then the client knew the correct
-password (or the 16 byte hashed value - see security note below) and
-is this allowed access. If not then the client did not know the
-correct password and is denied access.
-
-Note that the Samba server never knows or stores the cleartext of the
-users password - just the 16 byte hashed values derived from it. Also
-note that the cleartext password or 16 byte hashed values are never
-transmitted over the network - thus increasing security.
-
-IMPORTANT NOTE ABOUT SECURITY
------------------------------
-
-The unix and SMB password encryption techniques seem similar on the
-surface. This similarity is, however, only skin deep. The unix scheme
-typically sends clear text passwords over the nextwork when logging
-in. This is bad. The SMB encryption scheme never sends the cleartext
-password over the network but it does store the 16 byte hashed values
-on disk. This is also bad. Why? Because the 16 byte hashed values are a
-"password equivalent". You cannot derive the users password from them,
-but they could potentially be used in a modified client to gain access
-to a server. This would require considerable technical knowledge on
-behalf of the attacker but is perfectly possible. You should thus
-treat the smbpasswd file as though it contained the cleartext
-passwords of all your users. Its contents must be kept secret, and the
-file should be protected accordingly.
-
-Ideally we would like a password scheme which neither requires plain
-text passwords on the net or on disk. Unfortunately this is not
-available as Samba is stuck with being compatible with other SMB
-systems (WinNT, WfWg, Win95 etc).
-
-
-PROS AND CONS
--------------
-
-There are advantages and disadvantages to both schemes.
-
-Advantages of SMB Encryption:
------------------------------
-
-- plain text passwords are not passed across the network. Someone using
-a network sniffer cannot just record passwords going to the SMB server.
-
-- WinNT doesn't like talking to a server that isn't using SMB
-encrypted passwords. It will refuse to browse the server if the server
-is also in user level security mode. It will insist on promting the
-user for the password on each connection, which is very annoying. The
-only things you can do to stop this is to use SMB encryption.
-
-Advantages of non-encrypted passwords:
---------------------------------------
-
-- plain text passwords are not kept on disk.
-
-- uses same password file as other unix services such as login and
-ftp
-
-- you are probably already using other services (such as telnet and
-ftp) which send plain text passwords over the net, so not sending them
-for SMB isn't such a big deal.
-
-Note that Windows NT 4.0 Service pack 3 changed the default for
-permissible authentication so that plaintext passwords are *never*
-sent over the wire. The solution to this is either to switch to
-encrypted passwords with Samba or edit the Windows NT registry to
-re-enable plaintext passwords. See the document WinNT.txt for
-details on how to do this.
-
-The smbpasswd file.
--------------------
-
-In order for Samba to participate in the above protocol it must
-be able to look up the 16 byte hashed values given a user name.
-Unfortunately, as the UNIX password value is also a one way hash
-function (ie. it is impossible to retrieve the cleartext of the users
-password given the UNIX hash of it) then a separate password file
-containing this 16 byte value must be kept. To minimise problems with
-these two password files, getting out of sync, the UNIX /etc/passwd and
-the smbpasswd file, a utility, mksmbpasswd.sh, is provided to generate
-a smbpasswd file from a UNIX /etc/passwd file.
-
-To generate the smbpasswd file from your /etc/passwd file use the
-following command :-
-
-cat /etc/passwd | mksmbpasswd.sh >/usr/local/samba/private/smbpasswd
-
-If you are running on a system that uses NIS, use
-
-ypcat passwd | mksmbpasswd.sh >/usr/local/samba/private/smbpasswd
-
-The mksmbpasswd.sh program is found in the Samba source directory. By
-default, the smbpasswd file is stored in :-
-
-/usr/local/samba/private/smbpasswd
-
-The owner of the /usr/local/samba/private directory should be set to
-root, and the permissions on it should be set to :-
-
-r-x------
-
-The command
-
-chmod 500 /usr/local/samba/private
-
-will do the trick. Likewise, the smbpasswd file inside the private
-directory should be owned by root and the permissions on is should be
-set to
-
-rw-------
-
-by the command :-
-
-chmod 600 smbpasswd.
-
-The format of the smbpasswd file is
-
-username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Long name:user home dir:user shell
-
-Although only the username, uid, and XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-sections are significant and are looked at in the Samba code.
-
-It is *VITALLY* important that there by 32 'X' characters between the
-two ':' characters in the XXX sections - the smbpasswd and Samba code
-will fail to validate any entries that do not have 32 characters
-between ':' characters. The first XXX section is for the Lanman password
-hash, the second is for the Windows NT version.
-
-When the password file is created all users have password entries
-consisting of 32 'X' characters. By default this disallows any access
-as this user. When a user has a password set, the 'X' characters change
-to 32 ascii hexadecimal digits (0-9, A-F). These are an ascii
-representation of the 16 byte hashed value of a users password.
-
-To set a user to have no password (not recommended), edit the file
-using vi, and replace the first 11 characters with the asci text
-
-NO PASSWORD
-
-Eg. To clear the password for user bob, his smbpasswd file entry would
-look like :
-
-bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Bob's full name:/bobhome:/bobshell
-
-If you are allowing users to use the smbpasswd command to set their own
-passwords, you may want to give users NO PASSWORD initially so they do
-not have to enter a previous password when changing to their new
-password (not recommended).
-
-Note : This file should be protected very carefully. Anyone with
-access to this file can (with enough knowledge of the protocols) gain
-access to your SMB server. The file is thus more sensitive than a
-normal unix /etc/passwd file.
-
-The smbpasswd Command.
-----------------------
-
-The smbpasswd command maintains the two 32 byte password fields in
-the smbpasswd file. If you wish to make it similar to the unix passwd
-or yppasswd programs, install it in /usr/local/samba/bin (or your main
-Samba binary directory) and make it setuid root.
-
-Note that if you do not do this then the root user will have to set all
-users passwords.
-
-To set up smbpasswd as setuid root, change to the Samba binary install
-directory and then type (as root) :
-
-chown root smbpasswd
-chmod 4555 smbpasswd
-
-If smbpasswd is installed as setuid root then you would use it as
-follows.
-
-smbpasswd
-Old SMB password: <type old alue here - just hit return if there is NO PASSWORD>
-New SMB Password: < type new value >
-Repeat New SMB Password: < re-type new value >
-
-If the old value does not match the current value stored for that user,
-or the two new values do not match each other, then the password will
-not be changed.
-
-If invoked by an ordinary user it will only allow the user to change
-his or her own Samba password.
-
-If run by the root user smbpasswd may take an optional argument,
-specifying the user name whose SMB password you wish to change. Note
-that when run as root smbpasswd does not prompt for or check the old
-password value, thus allowing root to set passwords for users who have
-forgotten their passwords.
-
-smbpasswd is designed to work in the same way and be familiar to UNIX
-users who use the passwd or yppasswd commands.
-
-NOTE. As smbpasswd is designed to be installed as setuid root I would
-appreciate it if everyone examined the source code to look for
-potential security flaws. A setuid program, if not written properly can
-be an open door to a system cracker. Please help make this program
-secure by reporting all problems to me (the author, Jeremy Allison).
-
-My email address is :-
-
-jallison@whistle.com
-
-Setting up Samba to support LanManager Encryption.
---------------------------------------------------
-
-This is a very brief description on how to setup samba to support
-password encryption. More complete instructions will probably be added
-later.
-
-1) compile and install samba as usual
-
-2) if your system can't compile the module getsmbpass.c then remove the
--DSMBGETPASS define from the Makefile.
-
-3) enable encrypted passwords in smb.conf by adding the line
-"encrypt passwords = yes" in the [global] section
-
-4) create the initial smbpasswd password file in the place you
-specified in the Makefile. A simple way to do this based on your
-existing Makefile (assuming it is in a reasonably standard format) is
-like this:
-
-cat /etc/passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd
-
-Change ownership of private and smbpasswd to root.
-
-chown -R root /usr/local/samba/private
-
-Set the correct permissions on /usr/local/samba/private
-
-chmod 500 /usr/local/samba/private
-
-Set the correct permissions on /usr/local/samba/private/smbpasswd
-
-chmod 600 /usr/local/samba/private/smbpasswd
-
-note that the mksmbpasswd.sh script is in the samba source directory.
-
-If this fails then you will find that you will need entries that look
-like this:
-
-# SMB password file.
-tridge:148:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Andrew Tridgell:/home/tridge:/bin/tcsh
-
-note that the uid and username fields must be right. Also, you must get
-the number of X's right (there should be 32).
-
-If you wish, install the smbpasswd program as suid root.
-
-chown root /usr/local/samba/bin/smbpasswd
-chmod 4555 /usr/local/samba/bin/smbpasswd
-
-5) set the passwords for users using the smbpasswd command. For
-example, as root you could do "smbpasswd tridge"
-
-6) try it out!
-
-Note that you can test things using smbclient, as it also now supports
-encryption.
-
-==============================================================================
-Footnote: Please refer to WinNT.txt also
diff --git a/docs/textdocs/Faxing.txt b/docs/textdocs/Faxing.txt
deleted file mode 100644
index 0703d75cc35..00000000000
--- a/docs/textdocs/Faxing.txt
+++ /dev/null
@@ -1,220 +0,0 @@
-Contributor: Gerhard Zuber <zuber@berlin.snafu.de>
-Date: August 5th 1997.
-Status: Current
-
-Subject: F A X I N G with S A M B A
-==========================================================================
-
-This text describes how to turn your SAMBA-server into a fax-server
-for any environment, especially for Windows.
- Author: Gerhard Zuber <zuber@berlin.snafu.de>
- Version: 1.4
- Date: 04. Aug. 1997
-
-Requirements:
- UNIX box (Linux preferred) with SAMBA and a faxmodem
- ghostscript package
- mgetty+sendfax package
- pbm package (portable bitmap tools)
-
-FTP sites:
- sunsite.unc.edu:/pub/Linux/system/Serial/mgetty+sendfax*
- tsx-11.mit.edu:/pub/linux/sources/sbin/mgetty+sendfax
- ftp.leo.org:/pub/comp/networking/communication/modem/mgetty/mgetty1.1.6-May05.tar.gz
-
- pbm10dec91.tgz
- ftp.leo.org:/pub/comp/networking/communication/modem/mgetty/pbm10dec91.tgz
- sunsite.unc.edu: ..../apps/graphics/convert/pbmplus-10dec91-bin.tar.gz
- ftp.gwdg.de/pub/linux/grafik/pbmplus.src.tar.Z (this is 10dec91 source)
- or ??? pbm10dec91.tgz pbmplus10dec91.tgz
-
-
-making mgetty+sendfax running:
-==============================
-
- go to source tree: /usr/src/mgetty+sendfax
- cp policy.h-dist policy.h
-
- change your settings: valid tty ports, modem initstring, Station-Id
-
-#define MODEM_INIT_STRING "AT &F S0=0 &D3 &K3 &C1\\\\N2"
-
-#define FAX_STATION_ID "49 30 12345678"
-
-#define FAX_MODEM_TTYS "ttyS1:ttyS2:ttyS3"
-
- Modem initstring is for rockwell based modems
- if you want to use mgetty+sendfax as PPP-dialin-server,
- define AUTO_PPP in Makefile:
-
-CFLAGS=-O2 -Wall -pipe -DAUTO_PPP
-
- compile it and install the package.
- edit your /etc/inittab and let mgetty running on your preferred
- ports:
-
-s3:45:respawn:/usr/local/sbin/mgetty ttyS2 vt100
-
- now issue a
- kill -HUP 1
- and enjoy with the lightning LEDs on your modem
- your now are ready to receive faxes !
-
-
- if you want a PPP dialin-server, edit
- /usr/local/etc/mgetty+sendfax/login.config
-
-/AutoPPP/ - ppp /usr/sbin/pppd auth debug passive modem
-
-
- Note: this package automatically decides between a fax call and
- a modem call. In case of modem call you get a login prompt !
-
-Tools for printing faxes:
-=========================
-
- your incomed faxes are in:
- /var/spool/fax/incoming
-
- print it with:
-
- for i in *
- do
- g3cat $i | g3tolj | lpr -P hp
- done
-
- in case of low resolution use instead:
-
- g3cat $i | g3tolj -aspect 2 | lpr -P hp
-
-
- g3cat is in the tools-section, g3tolj is in the contrib-section
- for printing to HP lasers.
-
- If you want to produce files for displaying and printing with Windows, use
- some tools from the pbm-package like follow
-
- g3cat $i | g3topbm - | ppmtopcx - >$i.pcx
-
- and view it with your favourite Windows tool (maybe paintbrush)
-
-
-Now making the fax-server:
-===========================
-
- fetch the file
- mgetty+sendfax/frontends/winword/faxfilter
-
- and place it in
-
- /usr/local/etc/mgetty+sendfax/
-
- prepare your faxspool file as mentioned in this file
- edit fax/faxspool.in and reinstall or change the final
- /usr/local/bin/faxspool too.
-
- if [ "$user" = "root" -o "$user" = "fax" -o \
- "$user" = "lp" -o "$user" = "daemon" -o "$user" = "bin" ]
-
- find the first line and change the second.
-
- make sure you have pbmtext (from the pbm-package). This is
- needed for creating the small header line on each page.
- Notes on pbmplus:
- Some peoples had problems with precompiled binaries (especially
- at linux) with a shared lib libgr.so.x.x. The better way is
- to fetch the source and compile it. One needs only pbmtext for
- generating the small line on top of each page /faxheader). Install
- only the individual programs you need. If you install the full
- package then install pbmplus first and then mgetty+sendfax, because
- this package has some changed programs by itself (but not pbmtext).
-
- make sure your ghostscript is functional. You need fonts !
- I prefer these from the OS/2 disks
-
- prepare your faxheader
- /usr/local/etc/mgetty+sendfax/faxheader
-
- edit your /etc/printcap file:
-
-# FAX
-lp3|fax:\
- :lp=/dev/null:\
- :sd=/usr/spool/lp3:\
- :if=/usr/local/etc/mgetty+sendfax/faxfilter:sh:sf:mx#0:\
- :lf=/usr/spool/lp3/fax-log:
-
-
-
-
- edit your /usr/local/samba/lib/smb.conf
-
- so you have a smb based printer named "fax"
-
-
-The final step:
-===============
-
- Now you have a printer called "fax" which can be used via
- TCP/IP-printing (lpd-system) or via SAMBA (windows printing).
-
- On every system you are able to produce postscript-files you
- are ready to fax.
-
- On Windows 3.1 95 and NT:
-
- Install a printer wich produces postscript output,
- e.g. apple laserwriter
-
- connect the "fax" to your printer
-
-
- Now write your first fax. Use your favourite wordprocessor,
- write, winword, notepad or whatever you want, and start
- with the headerpage.
-
- Usually each fax has a header page. It carries your name,
- your address, your phone/fax-number.
-
- It carries also the recipient, his address and his *** fax
- number ***. Now here is the trick:
-
- Use the text:
- Fax-Nr: 123456789
- as the recipients fax-number. Make sure this text does not
- occur in regular text ! Make sure this text is not broken
- by formatting information, e.g. format it as a single entity.
- (Windows Write and Win95 Wordpad are functional, maybe newer
- versions of Winword are breaking formatting information).
-
- The trick is that postscript output is human readable and
- the faxfilter program scans the text for this pattern and
- uses the found number as the fax-destination-number.
-
- Now print your fax through the fax-printer and it will be
- queued for later transmission. Use faxrunq for sending the
- queue out.
-
- Notes of SAMBA smb.conf:
- Simply use fall through from the samba printer to the unix
- printer. Sample:
-
-
- printcap name = /etc/printcap
- print command = /usr/bin/lpr -r -P %p %s
- lpq command = /usr/bin/lpq -P %p
- lprm command = /usr/bin/lprm -P %p %j
-
-
-[fax]
- comment = FAX (mgetty+sendfax)
- path = /tmp
- printable = yes
- public = yes
- writable = no
- create mode = 0700
- browseable = yes
- guest ok = no
-
-
-
diff --git a/docs/textdocs/GOTCHAS.txt b/docs/textdocs/GOTCHAS.txt
deleted file mode 100644
index bc5c6dae853..00000000000
--- a/docs/textdocs/GOTCHAS.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-This file lists Gotchas to watch out for:
-=========================================================================
-Item Number: 1.0
-Description: Problem Detecting Interfaces
-Symptom: Workstations do NOT see Samba server in Browse List
-OS: RedHat - Rembrandt Beta 2
-Platform: Intel
-Date: August 16, 1996
-Submitted By: John H Terpstra
-Details:
- By default RedHat Rembrandt-II during installation adds an
- entry to /etc/hosts as follows:-
- 127.0.0.1 loopback "hostname"."domainname"
-
- This causes Samba to loop back onto the loopback interface.
- The result is that Samba fails to communicate correctly with
- the world and therefor may fail to correctly negotiate who
- is the master browse list holder and who is the master browser.
-
-Corrective Action: Delete the entry after the word loopback
- in the line starting 127.0.0.1
-=========================================================================
-Item Number: 2.0
-Description: Problems with MS Windows NT Server network logon service
-Symptom: Loss of Domain Logon Services and failed Windows NT / 95
- logon attempts.
-OS: All Unix systems with Windows NT Domain Control environments.
-Platform: All
-Date: February 1, 1997
-Submitted By: John H Terpstra
-Details:
- Samba is configured for Domain logon control in a network
- where a Windows NT Domain Primary Controller is running.
-
- Case 1:
- The Windows NT Server is shut down, then restarted. Then
- the Samba server is reconfigured so that it NO LONGER offers
- Domain logon services. Windows NT and 95 workstations can no
- longer log onto the domain. Ouch!!!
-
- Case 2:
- The Windows NT Server which is running the Network logon
- Service is shut down and restarted while Samba is a domain
- controller offering the Domain LogOn service. Windows NT
- Workstation and Server can no longer log onto the network.
-
- Cause:
- Windows NT checks at start up to see if any domain logon
- controllers are already running within the domain. It finds
- Samba claiming to offer the service and therefore does NOT
- start its Network Logon Service.
-
- Windows NT needs the Windows NT network logon service to gain
- from its Domain controller's SAM database the security
- identifier for the user loging on.
-
-Work-around: Stop the Samba nmbd and smbd processes, then on the Windows
- NT Primary Domain Controller start the Network Logon Service.
- Now restart the Samba nmbd and smbd services.
-
- Better still: DO NOT CONFIGURE SAMBA AS THE NETWORK LOGON
- SERVER, DO NOT SET SAMBA TO BE THE DOMAIN MASTER, DO NOT
- SET SAMBA TO OS LEVEL GREATER THAN 0.
-
- ie: Let Windows NT Server be the Domain Logon server, the
- domain master browser and do NOT interfere with any aspect
- of Microsoft Windows NT Domain Control.
-=========================================================================
diff --git a/docs/textdocs/HINTS.txt b/docs/textdocs/HINTS.txt
deleted file mode 100644
index f5781ee4232..00000000000
--- a/docs/textdocs/HINTS.txt
+++ /dev/null
@@ -1,209 +0,0 @@
-Contributor: Many
-Updated: Not for a long time!
-
-Subject: A collection of hints
-Status: May be useful information but NOT current
-===============================================================================
-
-Here are some random hints that you may find useful. These really
-should be incorporated in the main docs someday.
-
-
-----------------------
-HINT: Always test your smb.conf with testparm before using it
-
-If your smb.conf file is invalid then samba will fail to load. Run
-testparm over it before you install it just to make sure there aren't
-any basic syntax or logical errors.
-
-
-----------------------
-HINT: Try printing with smbclient first
-
-If you have problems printing, test with smbclient first. Just connect using
-"smbclient '\\server\printer' -P" and use the "print" command.
-
-Once this works, you know that Samba is setup correctly for printing,
-and you should be able to get it to work from your PCs.
-
-This particularly helps in getting the "print command" right.
-
-
-----------------------
-HINT: Mount cdroms with conv=binary
-
-Some OSes (notably Linux) default to auto detection of file type on
-cdroms and do cr/lf translation. This is a very bad idea when use with
-Samba. It causes all sorts of stuff ups.
-
-To overcome this problem use conv=binary when mounting the cdrom
-before exporting it with Samba.
-
-
-----------------------
-HINT: Convert between unix and dos text formats
-
-Jim barry has written an excellent drag-and-drop cr/lf converter for
-windows. Just drag your file onto the icon and it converts the file.
-
-Get it from
-ftp://samba.anu.edu.au/pub/samba/contributed/fixcrlf.zip
-
-----------------------
-HINT: Use the "username map" option
-
-If the usernames used on your PCs don't match those used on the unix
-server then you will find the "username map" option useful.
-
------------------------
-HINT: Use "security = user" in [global]
-
-If you have the same usernames on the unix box and the PCs or have
-mapped them with the "username map" option then choose "security =
-user" in the [global] section of smb.conf.
-
-This will mean your password is checked only when you first connect,
-and subsequent connections to printers, disks etc will go more
-smoothly and much faster.
-
-The main problem with "security = user" if you use WfWg is that you
-will ONLY be able to connect as the username that you log into WfWg
-with. This is because WfWg silently ignores the password field in the
-connect drive dialog box if the server is in user security mode.
-
-------------------------
-HINT: Make your printers not "guest ok"
-
-If your printers are not "guest ok" and you are using "security =
-user" and have matching unix and PC usernames then you will attach to
-the printer without trouble as your own username. This will mean you
-will be able to delete print jobs (in 1.8.06 and above) and printer
-accounting will be possible.
-
-
------------------------
-HINT: Use a sensible "guest" account
-
-Even if all your services are not available to "guest" you will need a
-guest account. This is because the browsing is done as guest. In many
-cases setting "guest account = ftp" will do the trick. Using the
-default guest account or "guest account = nobody" will give problems on
-many unixes. If in doubt create another account with minimal
-privilages and use it instead. Your users don't need to know the
-password of the guest account.
-
-
------------------------
-HINT: Use the latest TCP/IP stack from microsoft if you use Windows
-for workgroups.
-
-The early TCP/IP stacks had lots of bugs.
-
-Microsoft has released an incremental upgrade to their TCP/IP 32-Bit
-VxD drivers. The latest release can be found on their ftp site at
-ftp.microsoft.com, located in /peropsys/windows/public/tcpip/wfwt32.exe.
-There is an update.txt file there that describes the problems that were
-fixed. New files include WINSOCK.DLL, TELNET.EXE, WSOCK.386, VNBT.386,
-WSTCP.386, TRACERT.EXE, NETSTAT.EXE, and NBTSTAT.EXE.
-
-
------------------------
-HINT: nmbd can act as a "WINS" server
-
-By default SMB clients use broadcasts to find shares. Recent clients
-(such as WfWg) can use a "wins" server instead, whcih reduces your
-broadcast traffic and allows you to find names across routers.
-
-Just point your WfWg, Win95 and NT clients at the Samba box in the WINS option.
-
-Note: nmbd does not support all WINS operations. Anyone out there have
-a spec they could send me?
-
------------------------
-HINT: you may need to delete your .pwl files when you change password.
-
-WfWg does a lousy job with passwords. I find that if I change my
-password on either the unix box or the PC the safest thing to do is to
-delete the .pwl files in the windows directory. The PC will complain about not finding the files, but will soon get over it, allowing you to enter the new password.
-
-If you don't do this you may find that WfWg remembers and uses the old
-password, even if you told it a new one.
-
-Often WfWg will totally ignore a password you give it in a dialog box.
-
-----------------------
-HINT: Using MS Access
-
-Here are some notes on running MS-Access on a Samba drive from Stefan
-Kjellberg <stefank@esi.com.au>
-
-1. Opening a database in 'exclusive' mode does NOT work. Samba ignores
- r/w/share modes on file open.
-
-2. Make sure that you open the database as 'shared' and to 'lock modified
- records'
-
-3. Of course locking must be enabled for the particular share (smb.conf)
-
-
----------------------
-HINT: password cacheing in WfWg
-
-Here is a hint from michael@ecel.uwa.edu.au (Michael Simmons):
-
-In case people where not aware. There is a program call admincfg.exe
-on the last disk (disk 8) of the WFW 3.11 disk set. To install it
-type EXPAND A:\ADMINCFG.EX_ C:\WINDOWS\ADMINCFG.EXE Then add an icon
-for it via the "Progam Manager" "New" Menu. This program allows you
-to control how WFW handles passwords. ie disable Password Caching etc
-for use with "security = user"
-
-
---------------------
-HINT: file descriptor limits
-
-If you have problems with the limits on the number of open files you
-can edit local.h to fix it.
-
---------------------
-HINT: HPUX initgroups() problem
-
-here is a hint from Frank Wales [frank@arcglade.demon.co.uk]:
-
-HP's implementation of supplementary groups is, er, non-standard (for
-hysterical reasons). There are two group files, /etc/group and
-/etc/logingroup; the system maps UIDs to numbers using the former, but
-initgroups() reads the latter. Most system admins who know the ropes
-symlink /etc/group to /etc/logingroup (hard link doesn't work for reasons
-too stupid to go into here). initgroups() will complain if one of the
-groups you're in in /etc/logingroup has what it considers to be an invalid
-ID, which means outside the range [0..UID_MAX], where UID_MAX is (I think)
-60000 currently on HP-UX. This precludes -2 and 65534, the usual 'nobody'
-GIDs.
-
-Perhaps you could suggest to users that, if they encounter this problem,
-they make sure that the programs that are failing to initgroups() be
-run as users not in any groups with GIDs outside the allowed range.
-
-This is documented in the HP manual pages under setgroups(2) and passwd(4).
-
-
----------------------
-HINT: Patch your SCO system
-
-If you run SCO Unix then you may need to get important TCP/IP patches
-for Samba to work correctly. Try
-
-Paul_Davis@mindlink.bc.ca writes:
-
- I was having problems with Accpac using 1.9.02 on SCO Unix. One
- posting function reported corrupted data. After installing uod385a,
- the problem went away (a restore from backup and then another
- run-thru).
-
- It appears that the uod385a update for SCO may be fairly important for
- a lot of different DOS and Windows software under Samba.
-
- uod385a can be found at ftp.sco.com /SLS/uod385a.Z and uod385a.ltr.Z.
-
-
diff --git a/docs/textdocs/INSTALL.sambatar b/docs/textdocs/INSTALL.sambatar
deleted file mode 100644
index 413f54d3c65..00000000000
--- a/docs/textdocs/INSTALL.sambatar
+++ /dev/null
@@ -1,33 +0,0 @@
-Contributor: Ricky Poulten <poultenr@logica.co.uk>
-Date: Unknown
-Status: Current
-
-Subject: Using smbtar
-=============================================================================
-
-Please see the readme and the man page for general info.
-
-1) Follow the samba installation instructions.
-
-2) If all goes well, test it out by creating a share on your PC (called
-backup for example) then doing something like,
-
- ./smbtar -s mypc -t /dev/rmt/0ubn -x backup
-
-substituting whatever your tape drive is for the -t option, or set your
-tape environmental variable.
-
-If all does not go well, feel free to mail the author (poultenr@logica.co.uk)
-about bug reports / help / money / pizza / etc.
-
-3) Read the man page and the NOTES file for more information
-
-4) Work smbtar into your usual nightly backup scheme (presuming you
-have one :-}).
-
-
-NOTE:
-
-If you have problems with smbtar then it's probably best to contact the
-author Ricky Poulten (poultenr@logica.co.uk).
-
diff --git a/docs/textdocs/MIRRORS.txt b/docs/textdocs/MIRRORS.txt
deleted file mode 100755
index c9bd04f1c83..00000000000
--- a/docs/textdocs/MIRRORS.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-The main Samba ftp site is samba.anu.edu.au in pub/samba/. Contact
-samba-bugs@samba.anu.edu.au for help with this site.
-
-The 'Source Only' sites may also contain binary packages as we are now
-including them on samba.anu.edu.au/pub/samba/Binary_Packages
-
-Mirror sites include:
-
-Source Only
-===========
---- Australia ---
- ftp://samba.anu.edu.au/pub/samba/
- ftp://nimbus.anu.edu.au/pub/tridge/samba/
- ftp://choc.satech.net.au/pub/samba/
---- USA Educational ---
- ftp://ftp.micro.caltech.edu/pub/samba/
- ftp://ftp.cs.ucr.edu/pub/software/samba/
- ftp://sunsite.unc.edu/pub/Linux/system/Network/samba/
---- Czech Republic ---
- ftp://sunsite.mff.cuni.cz/Net/Protocols/Samba/
---- Germany ---
- ftp://ftp.uni-trier.de/pub/unix/network/samba/
- ftp://ftp.gwdg.de/pub/server/samba/
---- Greece ---
- ftp://ftp.ntua.gr/pub/net/samba/
---- Japan ---
- ftp://ring.asahi-net.or.jp/archives/net/samba/
- ftp://ring.aist.go.jp/archives/net/samba/
- ftp://ftp.win.or.jp/pub/network/samba/
---- Korea (South) ---
- ftp://CAIR-archive.kaist.ac.kr/pub/samba/
---- Network ---
- ftp://ftp.gbnet.net/pub/samba/
- ftp://ftp.ntrl.net/pub/mirror/samba/
- ftp://despair.capecod.net/pub/Samba/
---- Poland ---
- ftp://giswitch.sggw.waw.pl/pub/unix/samba/
---- Portugal ---
- ftp://ftp.ua.pt/pub/misc/samba/
---- Romania ---
- ftp.romus.ro/pub/Linux/Network/samba/
---- Russian Federation ---
- ftp://ftp.uic.nsu.ru/pub/vendors/samba/
---- United Kingdom ---
- ftp://ftp.demon.co.uk/pub/mirrors/samba/
- ftp://src.doc.ic.ac.uk/packages/samba/
-
-Sources & Binaries
-==================
---- Austria ---
- ftp://gd.tuwien.ac.at/pub/infosys/servers/samba/
---- Denmark ---
- ftp://sunsite.auc.dk/pub/unix/networking/samba/
---- USA Educational ---
- ftp://sunsite.unc.edu/pub/packages/samba/
---- Italy ---
- http://www.inferentia.it/archives/samba/
---- United Kingdom ---
- ftp://sunsite.doc.ic.ac.uk/packages/samba/
-
-SCO binaries available from:
- http://www.math.u-szeged.hu/hardsoft/hsdetail.htm
-
-AIX and DEC OSF/1 binaries are available from:
- ftp://www.inferentia.it/archives/samba (built by davide.migliavacca@inferentia.it)
-
-QNX binaries and source code:
- ftp://quics.qnx.com/usr/free/staging/samba
-
-Amiga OS binaries and source:
- http://www.gbar.dtu.dk/~c948374/Amiga/Samba
-
-Stratos VOS binaries and source:
- ftp://ftp.stratus.com/pub/vos/tools
-
-OS/2 binaries and source:
- http://carol.wins.uva.nl/~leeuw/samba/samba2.html
-
-IBM OS/390 MVS:
- ftp://ftp.mks.com/pub/samba
-
-
-There are several others. Give archie a try.
-
-Http sites include:
-===================
-http://samba.anu.edu.au/samba
-http://www.choc.satech.net.au/pub/samba/
-
-
diff --git a/docs/textdocs/NetBIOS.txt b/docs/textdocs/NetBIOS.txt
deleted file mode 100644
index 415aa34beb9..00000000000
--- a/docs/textdocs/NetBIOS.txt
+++ /dev/null
@@ -1,152 +0,0 @@
-Contributor: lkcl - samba-bugs@arvidsjaur.anu.edu.au
- Copyright 1997 Luke Kenneth Casson Leighton
-Date: March 1997
-Status: Current
-Updated: 12jun97
-
-Subject: Definition of NetBIOS Protocol and Name Resolution Modes
-=============================================================================
-
-=======
-NETBIOS
-=======
-
-NetBIOS runs over the following tranports: TCP/IP; NetBEUI and IPX/SPX.
-Samba only uses NetBIOS over TCP/IP. For details on the TCP/IP NetBIOS
-Session Service NetBIOS Datagram Service, and NetBIOS Names, see
-rfc1001.txt and rfc1002.txt.
-
-NetBEUI is a raw NetBIOS frame protocol implementation that allows NetBIOS
-datagrams to be sent out over the 'wire' embedded within LLC frames.
-NetBEUI is not required when using NetBIOS over TCP/IP protocols and it
-is preferable NOT to install NetBEUI if it can be avoided.
-
-IPX/SPX is also not required when using NetBIOS over TCP/IP, and it is
-preferable NOT to install the IPX/SPX transport unless you are using Novell
-servers. At the very least, it is recommended that you do not install
-'NetBIOS over IPX/SPX'.
-
-[When installing Windows 95, you will find that NetBEUI and IPX/SPX are
-installed as the default protocols. This is because they are the simplest
-to manage: no Windows 95 user-configuration is required].
-
-
-NetBIOS applications (such as samba) offer their services (for example,
-SMB file and print sharing) on a NetBIOS name. They must claim this name
-on the network before doing so. The NetBIOS session service will then
-accept connections on the application's behalf (on the NetBIOS name
-claimed by the application). A NetBIOS session between the application
-and the client can then commence.
-
-NetBIOS names consist of 15 characters plus a 'type' character. This is
-similar, in concept, to an IP address and a TCP port number, respectively.
-A NetBIOS-aware application on a host will offer different services under
-different NetBIOS name types, just as a host will offer different TCP/IP
-services on different port numbers.
-
-NetBIOS names must be claimed on a network, and must be defended. The use
-of NetBIOS names is most suitable on a single subnet; a Local Area Network
-or a Wide Area Network.
-
-NetBIOS names are either UNIQUE or GROUP. Only one application can claim a
-UNIQUE NetBIOS name on a network.
-
-There are two kinds of NetBIOS Name resolution: Broadcast and Point-to-Point.
-
-
-=================
-BROADCAST NetBIOS
-=================
-
-Clients can claim names, and therefore offer services on successfully claimed
-names, on their broadcast-isolated subnet. One way to get NetBIOS services
-(such as browsing: see ftp.microsoft.com/drg/developr/CIFS/browdiff.txt; and
-SMB file/print sharing: see cifs4.txt) working on a LAN or WAN is to make
-your routers forward all broadcast packets from TCP/IP ports 137, 138 and 139.
-
-This, however, is not recommended. If you have a large LAN or WAN, you will
-find that some of your hosts spend 95 percent of their time dealing with
-broadcast traffic. [If you have IPX/SPX on your LAN or WAN, you will find
-that this is already happening: a packet analyzer will show, roughly
-every twelve minutes, great swathes of broadcast traffic!].
-
-
-============
-NBNS NetBIOS
-============
-
-rfc1001.txt describes, amongst other things, the implementation and use
-of, a 'NetBIOS Name Service'. NT/AS offers 'Windows Internet Name Service'
-which is fully rfc1001/2 compliant, but has had to take specific action
-with certain NetBIOS names in order to make it useful. (for example, it
-deals with the registration of <1c> <1d> <1e> names all in different ways.
-I recommend the reading of the Microsoft WINS Server Help files for full
-details).
-
-Samba also offers WINS server capabilities. Samba does not interact
-with NT/AS (WINS replication), so if you have a mixed NT server and
-Samba server environment, it is recommended that you use the NT server's
-WINS capabilities, instead of samba's WINS server capabilities.
-
-The use of a WINS server cuts down on broadcast network traffic for
-NetBIOS name resolution. It has the effect of pulling all the broadcast
-isolated subnets together into a single NetBIOS scope, across your LAN
-or WAN, while avoiding the use of TCP/IP broadcast packets.
-
-When you have a WINS server on your LAN, WINS clients will be able to
-contact the WINS server to resolve NetBIOS names. Note that only those
-WINS clients that have registered with the same WINS server will be
-visible. The WINS server _can_ have static NetBIOS entries added to its
-database (usually for security reasons you might want to consider putting
-your domain controllers or other important servers as static entries,
-but you should not rely on this as your sole means of security), but for
-the most part, NetBIOS names are registered dynamically.
-
-[It is important to mention that samba's browsing capabilities (as a WINS
-client) must have access to a WINS server. if you are using samba also
-as a WINS server, then it will have a direct short-cut into the WINS
-database.
-
-This provides some confusion for lots of people, and is worth mentioning
-here: a Browse Server is NOT a WINS Server, even if these services are
-implemented in the same application. A Browse Server _needs_ a WINS server
-because a Browse Server is a WINS client, which is _not_ the same thing].
-
-Clients can claim names, and therefore offer services on successfully claimed
-names, on their broadcast-isolated subnet. One way to get NetBIOS services
-(such as browsing: see ftp.microsoft.com/drg/developr/CIFS/browdiff.txt; and
-SMB file/print sharing: see cifs6.txt) working on a LAN or WAN is to make
-your routers forward all broadcast packets from TCP/IP ports 137, 138 and 139.
-You will find, however, if you do this on a large LAN or a WAN, that your
-network is completely swamped by NetBIOS and browsing packets, which is why
-WINS was developed to minimise the necessity of broadcast traffic.
-
-WINS Clients therefore claim names from the WINS server. If the WINS
-server allows them to register a name, the client's NetBIOS session service
-can then offer services on this name. Other WINS clients will then
-contact the WINS server to resolve a NetBIOS name.
-
-
-=======================
-Samba WINS Capabilities
-=======================
-
-To configure samba as a WINS server, you must add "wins support = yes" to
-the [global] section of your smb.conf file. This will enable WINS server
-capabilities in nmbd.
-
-To configure samba as a WINS client, you must add "wins server = x.x.x.x"
-to the [global] section of your smb.conf file, where x.x.x.x is the TCP/IP
-address of your WINS server. The browsing capabilities in nmbd will then
-register (and resolve) WAN-wide NetBIOS names with this WINS server.
-
-Note that if samba has "wins support = yes", then the browsing capabilities
-will _not_ use the "wins server" option to resolve NetBIOS names: it will
-go directly to the internal WINS database for NetBIOS name resolution. It
-is therefore invalid to have both "wins support = yes" and
-"wins server = x.x.x.x". Note, in particular, that if you configure the
-"wins server" parameter to be the ip address of your samba server itself
-(as might one intuitively think), that you will run into difficulties.
-Do not use both parameters!
-
-
diff --git a/docs/textdocs/OS2-Client-HOWTO.txt b/docs/textdocs/OS2-Client-HOWTO.txt
deleted file mode 100644
index cf3033956ea..00000000000
--- a/docs/textdocs/OS2-Client-HOWTO.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-Q. How can I configure OS/2 Warp Connect or OS/2 Warp 4 as a client for Samba?
-
-A. A more complete answer to this question can be found on:
- http://carol.wins.uva.nl/~leeuw/samba/warp.html
-
- Basically, you need three components:
-
- * The File and Print Client ('IBM Peer')
- * TCP/IP ('Internet support')
- * The "NetBIOS over TCP/IP" driver ('TCPBEUI')
-
- Installing the first two together with the base operating system on a blank
- system is explained in the Warp manual. If Warp has already been installed,
- but you now want to install the networking support, use the "Selective
- Install for Networking" object in the "System Setup" folder.
-
- Adding the "NetBIOS over TCP/IP" driver is not described in the manual and
- just barely in the online documentation. Start MPTS.EXE, click on OK, click
- on "Configure LAPS" and click on "IBM OS/2 NETBIOS OVER TCP/IP" in
- 'Protocols'. This line is then moved to 'Current Configuration'. Select
- that line, click on "Change number" and increase it from 0 to 1. Save this
- configuration.
-
- If the Samba server(s) is not on your local subnet, you can optionally add
- IP names and addresses of these servers to the "Names List", or specify a
- WINS server ('NetBIOS Nameserver' in IBM and RFC terminology). For Warp
- Connect you may need to download an update for 'IBM Peer' to bring it on
- the same level as Warp 4. See the webpage mentioned above.
-
-
-Q. How can I configure OS/2 Warp 3 (not Connect), OS/2 1.2, 1.3 or 2.x for
- Samba?
-
-A. You can use the free Microsoft LAN Manager 2.2c Client for OS/2 from
- ftp://ftp.microsoft.com/BusSys/Clients/LANMAN.OS2/
- See http://carol.wins.uva.nl/~leeuw/lanman.html for more information on
- how to install and use this client. In a nutshell, edit the file \OS2VER
- in the root directory of the OS/2 boot partition and add the lines
-
- 20=setup.exe
- 20=netwksta.sys
- 20=netvdd.sys
-
- before you install the client. Also, don't use the included NE2000 driver
- because it is buggy. Try the NE2000 or NS2000 driver from
- <a href="ftp://ftp.cdrom.com/pub/os2/network/ndis/">
- ftp://ftp.cdrom.com/pub/os2/network/ndis/</a> instead.
-
-
-Q. Are there any other issues when OS/2 (any version) is used as a client?
-
-A. When you do a NET VIEW or use the "File and Print Client Resource Browser",
- no Samba servers show up. This can be fixed by a patch from
- http://carol.wins.uva.nl/~leeuw/samba/fix.html
- The patch will be included in a later version of Samba. It also fixes a
- couple of other problems, such as preserving long filenames when objects
- are dragged from the Workplace Shell to the Samba server.
-
-
diff --git a/docs/textdocs/PROJECTS b/docs/textdocs/PROJECTS
deleted file mode 100644
index 07f82c74d94..00000000000
--- a/docs/textdocs/PROJECTS
+++ /dev/null
@@ -1,88 +0,0 @@
- Samba Projects Directory
- ========================
-
-
->>>>> NOTE: THIS FILE IS NOW VERY OUT OF DATE <<<<<
-
-
-This is a list of who's working on what in Samba. It's not guaranteed
-to be uptodate or accurate but I hope it will help us getting
-coordinated.
-
-If you are working on something to do with Samba and you aren't here
-then please let me know! Also, if you are listed below and you have
-any corrections or updates then please let me know.
-
-Email contact:
-samba-bugs@samba.anu.edu.au
-
-========================================================================
-Documentation and FAQ
-
-Docs and FAQ files for the Samba suite of software.
-
-Contact samba-bugs@samba.anu.edu.au with the diffs. These are urgently
-required.
-
-The FAQ is being added to on an ad hoc basis, see the web pages for info.
-
-Mark Preston was working on a set of formatted docs for Samba. Is this
-still happening? Contact mpreston@sghms.ac.uk
-
-Status last updated 2nd October 1996
-========================================================================
-
-========================================================================
-Netbeui support
-
-This aimed to produce patches so that Samba can be used with clients
-that do not have TCP/IP. It will try to remain as portable as possible.
-Contact Brian.Onn@Canada.Sun.COM (Brian Onn) Unfortunately it died, and
-although a lot of people have expressed interest nobody has come forward
-to do it. The Novell port (see Samba web pages) includes NetBEUI
-functionality in a proprietrary library which should still be helpful as
-we have the interfaces. Alan Cox (a.cox@li.org) has the information
-required to write the state machine if someone is going to do the work.
-
-Status last updated 2nd October 1996
-========================================================================
-
-========================================================================
-Smbfs
-
-A mountable smb filesystem for Linux using the userfs userspace filesystem
-
-Contact lendecke@namu01.gwdg.de (Volker Lendecke)
-
-This works really well, and is measurably more efficient than commercial
-client software. It is now part of the Linux kernel. Long filename support
-is in use.
-
-Status last updated June 1997
-========================================================================
-
-========================================================================
-Admin Tool
-
-Aims to produce a nice smb.conf editor and other useful tools for
-administering a Samba system.
-
-Contact: Steve Brown (steve@unicorn.dungeon.com)
-
-In the design phase.
-
-Status last updated 4th September 1994
-========================================================================
-
-
-========================================================================
-Lanman Client.
-
-Contact: john@amanda.xs4all.nl (John Stewart)
-
-Aims to produce a reliable LANMAN Client implementation for LINUX,
-and possibly other variations of UNIX. Project ably started by
-Tor Lillqvist; tml@hemuli.tte.vtt.fi
-
-Status last updated 17th January 1995
-========================================================================
diff --git a/docs/textdocs/Passwords.txt b/docs/textdocs/Passwords.txt
deleted file mode 100644
index f76010c4608..00000000000
--- a/docs/textdocs/Passwords.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-Contributor: Unknown
-Date: Unknown
-Status: Current
-
-Subject: NOTE ABOUT PASSWORDS
-=============================================================================
-
-Unix systems use a wide variety of methods for checking the validity
-of a password. This is primarily controlled with the Makefile defines
-mentioned in the Makefile.
-
-Also note that some clients (notably WfWg) uppercase the password
-before sending it. The server tries the password as it receives it and
-also after lowercasing it.
-
-The Samba server can also be configured to try different
-upper/lowercase combinations. This is controlled by the [global]
-parameter "password level". A level of N means to try all combinations
-up to N uppercase characters in the password. A high value can chew a
-fair bit of CPU time and can lower the security of your system. Do not
-use this options unless you really need it - the time taken for
-password checking can become so high that clients time out.
-
-If you do use the "password level" option then you might like to use
--DUFC_CRYPT in your Makefile. On some machine this makes password
-checking _much_ faster. This is also useful if you use the @group
-syntax in the user= option.
-
-If your site uses AFS (the Andrew File System), you can use the AFS section
-in the Makefile. This will first attempt to authenticate a username and
-password to AFS. If that succeeds, then the associated AFS rights will be
-granted. Otherwise, the password checking routine falls back to whatever
-Unix password checking method you are using. Note that the AFS code is
-only written and tested for AFS 3.3 and later.
-
-
-SECURITY = SERVER
-=================
-
-Samba can use a remote server to do its username/password
-validation. This allows you to have one central machine (for example a
-NT box) control the passwords for the Unix box.
-
-See the section on "security =" in smb.conf(5) for details.
-
-
diff --git a/docs/textdocs/Printing.txt b/docs/textdocs/Printing.txt
deleted file mode 100644
index e8a2d2ad27f..00000000000
--- a/docs/textdocs/Printing.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Contributor: Unknown <samba-bugs@samba.anu.edu.au>
-Date: Unknown
-Status: Current
-
-Subject: Dubugging Printing Problems
-=============================================================================
-
-This is a short description of how to debug printing problems with
-Samba. This describes how to debug problems with printing from a SMB
-client to a Samba server, not the other way around. For the reverse
-see the examples/printing directory.
-
-Please send enhancements to this file to samba-bugs@samba.anu.edu.au
-
-Ok, so you want to print to a Samba server from your PC. The first
-thing you need to understand is that Samba does not actually do any
-printing itself, it just acts as a middleman between your PC client
-and your Unix printing subsystem. Samba receives the file from the PC
-then passes the file to a external "print command". What print command
-you use is up to you.
-
-The whole things is controlled using options in smb.conf. The most
-relevant options (which you should look up in the smb.conf man page)
-are:
- print command
- lpq command
- lprm command
-
-Samba should set reasonable defaults for these depending on your
-system type, but it isn't clairvoyant. It is not uncommon that you
-have to tweak these for local conditions.
-
-On my system I use the following settings:
-
- print command = lpr -r -P%p %s
- lpq command = lpq -P%p
- lprm command = lprm -P%p %j
-
-The % bits are "macros" that get dynamically replaced with variables
-when they are used. The %s gets replaced with the name of the spool
-file that Samba creates and the %p gets replaced with the name of the
-printer. The %j gets replaced with the "job number" which comes from
-the lpq output.
-
-When I'm debugging printing problems I often replace these command
-with pointers to shell scripts that record the arguments, and the
-contents of the print file. A simple example of this kind of things
-might be:
-
- print command = cp %s /tmp/tmp.print
-
-then you print a file and look at the /tmp/tmp.print file to see what
-is produced. Try printing this file with lpr. Does it work? If not
-then your problem with with your lpr system, not with Samba. Often
-people have problems with their /etc/printcap file or permissions on
-various print queues.
-
-Another common problem is that /dev/null is not world writeable. Yes,
-amazing as it may seem, some systems make /dev/null only writeable by
-root. Samba uses /dev/null as a place to discard output from external
-commands like the "print command" so if /dev/null is not writeable
-then nothing will work.
-
-Other really common problems:
-
-- lpr isn't in the search path when Samba tries to run it. Fix this by
-using the full path name in the "print command"
-
-- the user that the PC is trying to print as doesn't have permission
-to print. Fix your lpr system.
-
-- you get an extra blank page of output. Fix this in your lpr system,
-probably by editing /etc/printcap. It could also be caused by
-incorrect setting on your client. For example, under Win95 there is a
-option Printers|Printer Name|(Right
-Click)Properties|Postscript|Advanced| that allows you to choose if a
-Ctrl-D is appended to all jobs. This will affect if a blank page is
-output.
-
-- you get raw postscript instead of nice graphics on the output. Fix
-this either by using a "print command" that cleans up the file before
-sending it to lpr or by using the "postscript" option in smb.conf.
-
-Note that you can do some pretty magic things by using your
-imagination with the "print command" option and some shell
-scripts. Doing print accounting is easy by passing the %U option to a
-print command shell script. You could even make the print command
-detect the type of output and its size and send it to an appropriate
-printer.
-
-If the above debug tips don't help, then maybe you need to bring in
-the bug gun, system tracing. See Tracing.txt in this directory.
-
diff --git a/docs/textdocs/README.DCEDFS b/docs/textdocs/README.DCEDFS
deleted file mode 100644
index da9bb2197da..00000000000
--- a/docs/textdocs/README.DCEDFS
+++ /dev/null
@@ -1,78 +0,0 @@
-Contributor: Jim Doyle <doyle@oec.com>
-Date: 06-02-95
-Status: Current but needs updating
-
-Subject: Basic DCE/DFS Support for SAMBA 1.9.13
-=============================================================================
-
-Functionality:
---------------
-
- Per-instance authentication for DCE/DFS.
-
-Missing Functionality in this Implementation:
----------------------------------------------
-
- * No automatic refresh of credentials
-
- To do so would not be that hard.. One could simply
- stash the clear-text key in memory, spawn a key management
- thread to wake up right before credentials expire and
- refresh the login context.
-
- * No UNIX Signals support (SIGCLD, SIGPIPE, SIGHUP, SIGBUS, SIGSEGV)
-
-
- There is no support for signal processing in Samba daemons
- that need to authenticate with DCE. The explanation for this
- is that the smbd is linked against thread-safe libraries in
- order to be able to use DCE authentication mechanisms.
- Because smbd uses signal() and fork(), it represents the
- worst case scenario for DCE portability. In order
- to properly support signals in a forked server environment,
- some rework of smbd is needed in order to properly
- construct, shutdown and reconstruct asynchronous signal
- handling threads and synchronous signal traps across the
- parent and child. I have not had contiguous time to work
- on it, I expect it to be a weeks worth of work to cleanly
- integrate thread-safe signal handing into the code and
- test it. Until I can get to this task, I will leave it up
- to someone adventurous enough to engineer it and negotiate
- with Andrew to integrate the changes into the mainline branch.
-
- The lack of full signal support means that you cannot
- rely upon SIGHUP-ing the parent daemon to refresh
- the configuration data. Likewise, you cannot take advantage
- of the builtin SIGBUS/SIGSEGV traps to diagnose failures.
- You will have to halt Samba in order to make changes
- and then have them take effect.
-
- The SMBD server as it stands is suitable to use if you
- already have experience with configuring and running
- SAMBA.
-
-Tested Platforms:
------------------
-
- HP-UX 9.05 / HP-UX DCE 1.2.1
- AIX 3.2.5 / AIX DCE/6000 1.3
- DEC OSF-1 3.0 / DEC DCE 1.3
-
-Building:
----------
-
- - Uncomment the the appropriate block in the Makefile
- for the platform you wish to build on.
-
- - Samples of Samba server configuration files for our
- DFS environment are included in samples.dcedfs/
-
-
-
-Bugs, Suggestions, etc..
---------------------------
-
- Please post them to the mailing list.
- That way I will see them and they will become part of
- the archives so others can share the knowledge.
-
diff --git a/docs/textdocs/README.jis b/docs/textdocs/README.jis
deleted file mode 100644
index 50ff0cced74..00000000000
--- a/docs/textdocs/README.jis
+++ /dev/null
@@ -1,149 +0,0 @@
-$B!|(B samba $BF|K\8lBP1~$K$D$$$F(B
-
-1. $BL\E*(B
-
- $BF|K\8lBP1~$O!"(B
-
- (1) MS-Windows $B>e$G!"4A;z%U%!%$%kL>$r$I$&$7$F$b07$&I,MW$N$"$k%"%W%j%1!<%7%g%s$,$A$c(B
- $B$s$HF0:n$9$k!#Nc$($P!"(BMS-WORD 5 $B$J$I$O!"%$%s%9%H!<%k;~$K4A;z$N%U%!%$%kL>$r>!<j(B
- $B$K$D$1$F$7$^$$$^$9!#$3$&$$$C$?>l9g$K$A$c$s$HBP1~$G$-$k$h$&$K$9$k!#(B
-
- (2) UNIX $B$O!":G6a$G$O$[$H$s$I$N$b$N$,(B 8 bits $B$N%U%!%$%kL>$r%5%]!<%H$7$F$$$^$9$,!"(B
- $BCf$K$O!"$3$l$r%5%]!<%H$7$F$$$J$$$b$N$b$"$j$^$9!#$3$N$h$&$J>l9g$G$b!"(B(1)$B$NL\E*(B
- $B$,K~B-$G$-$k$h$&$K$9$k!#(B
-
- $B$rL\E*$H$7$F$$$^$9!#$=$N$?$a!"F|K\8lBP1~$O!"I,MW:G>.8B$7$+9T$J$C$F$*$j$^$;$s!#(B
-
- $BF|K\8lBP1~$7$?(B samba $B$rMxMQ$9$k$?$a$K$O!"%3%s%Q%$%k$9$k;~$K!"I,$:!"(BKANJI $B$NDj5A$rDI(B
- $B2C$7$F$/$@$5$$!#$3$N%*%W%7%g%s$r;XDj$7$F$$$J$$>l9g$O!"F|K\8l$N%U%!%$%kL>$r@5$7$/07(B
- $B$&$3$H$O$G$-$^$;$s!#!J%3%s%Q%$%k$K$D$$$F$O!"2<5-(B 3. $B$r;2>H$7$F2<$5$$!K(B
-
-2. $BMxMQJ}K!(B
-
-(1) $BDI2C$7$?%Q%i%a!<%?(B
-
- smb.conf $B%U%!%$%k$N(B global $B%;%/%7%g%s$K0J2<$N%Q%i%a!<%?$r@_Dj$G$-$k$h$&$K$7$^$7$?!#(B
-
- [global]
- ....
- coding system = <$B%3!<%I7O(B>
-
- $B$3$3$G;XDj$5$l$?%3!<%I7O$,(B UNIX $B>e$N%U%!%$%k%7%9%F%`$N%U%!%$%kL>$N%3!<%I$K$J$j$^$9!#(B
- $B@_Dj$G$-$k$b$N$O!"<!$N$h$&$K$J$C$F$$$^$9!#(B
-
- sjis: SHIFT JIS (MS $B4A;z%3!<%I(B)
- euc: EUC $B%3!<%I(B
- hex: 7 bits $B$N(B ASCII $B%3!<%I0J30$N%3!<%I$r0J2<$N7A<0$GI=$9J}<0$G$9!#Nc$($P!"(B
- '$B%*%U%#%9(B' $B$H$$$&L>A0$O!"(B':83:49:83:74:83:42:83:58' $B$N$h$&$K!"(B':' $B$N8e$K#27e(B
- $B$N(B16$B?J?t$rB3$1$k7A<0$K$J$j$^$9!#(B
- $B$3$3$G!"(B':' $B$rB>$NJ8;z$KJQ99$7$?$$>l9g$O!"(Bhex $B$N8e$m$K$=$NJ8;z$r;XDj$7$^$9!#(B
- $BNc$($P!"(B@$B$rJQ$o$j$K;H$$$?$$>l9g$O!"(B'hex@'$B$N$h$&$K;XDj$7$^$9!#(B
- cap: 7 bits $B$N(B ASCII $B%3!<%I0J30$N%3!<%I$r0J2<$N7A<0$GI=$9J}<0$H$$$&E@$G$O(B
- hex$B$HF1MM$G$9$,!"(BCAP (The Columbia AppleTalk Package)$B$H8_49@-$r;}$DJQ49(B
- $BJ}<0$H$J$C$F$$$^$9!#(Bhex$B$H$N0c$$$O(B0x80$B0J>e$N%3!<%I$N$_(B':80'$B$N$h$&$KJQ49(B
- $B$5$l!"$=$NB>$O(BASCII$B%3!<%I$G8=$5$l$^$9!#(B
- $BNc$($P!"(B'$B%*%U%#%9(B'$B$H$$$&L>A0$O!"(B':83I:83t:83B:83X'$B$H$J$j$^$9!#(B
-
- JIS $B%3!<%I$K$D$$$F$O!"0J2<$NI=$r;2>H$7$F2<$5$$!#(B
- $B(#(!(!(!(((!(!(!(!(((!(!(!(!(((!(!(!(!(((!(!(!(!(((!(!(!(!(((!(!(!(!(!(!(!(!(!($(B
- $B(";XDj(B $B("4A;z3+;O("4A;z=*N;("%+%J3+;O("%+%J=*N;("1Q?t3+;O("Hw9M(B $B("(B
- $B('(!(!(!(+(!(!(!(!(+(!(!(!(!(+(!(!(!(!(+(!(!(!(!(+(!(!(!(!(+(!(!(!(!(!(!(!(!(!()(B
- $B("(Bjis7 $B("(B\E$B $B("(B\E(J $B("(B0x0e $B("(B0x0f $B("(B\E(J $B("(Bjis 7$BC10LId9f(B $B("(B
- $B("(Bjunet $B("(B\E$B $B("(B\E(J $B("(B\E(I $B("(B\E(J $B("(B\E(J $B("(B7bits $B%3!<%I(B $B("(B
- $B("(Bjis8 $B("(B\E$B $B("(B\E(J $B("(B-- $B("(B-- $B("(B\E(J $B("(Bjis 8$BC10LId9f(B $B("(B
- $B("(Bj7bb $B("(B\E$B $B("(B\E(B $B("(B0x0e $B("(B0x0f $B("(B\E(B $B("(B $B("(B
- $B("(Bj7bj $B("(B\E$B $B("(B\E(J $B("(B0x0e $B("(B0x0f $B("(B\E(J $B("(Bjis7$B$HF1$8(B $B("(B
- $B("(Bj7bh $B("(B\E$B $B("(B\E(H $B("(B0x0e $B("(B0x0f $B("(B\E(H $B("(B $B("(B
- $B("(Bj7@b $B("(B\E$@ $B("(B\E(B $B("(B0x0e $B("(B0x0f $B("(B\E(B $B("(B $B("(B
- $B("(Bj7@j $B("(B\E$@ $B("(B\E(J $B("(B0x0e $B("(B0x0f $B("(B\E(J $B("(B $B("(B
- $B("(Bj7@h $B("(B\E$@ $B("(B\E(H $B("(B0x0e $B("(B0x0f $B("(B\E(H $B("(B $B("(B
- $B("(Bj8bb $B("(B\E$B $B("(B\E(B $B("(B-- $B("(B-- $B("(B\E(B $B("(B $B("(B
- $B("(Bj8bj $B("(B\E$B $B("(B\E(J $B("(B-- $B("(B-- $B("(B\E(J $B("(Bjis8$B$HF1$8(B $B("(B
- $B("(Bj8bh $B("(B\E$B $B("(B\E(H $B("(B-- $B("(B-- $B("(B\E(H $B("(B $B("(B
- $B("(Bj8@b $B("(B\E@@ $B("(B\E(B $B("(B-- $B("(B-- $B("(B\E(B $B("(B $B("(B
- $B("(Bj8@j $B("(B\E$@ $B("(B\E(J $B("(B-- $B("(B-- $B("(B\E(J $B("(B $B("(B
- $B("(Bj8@h $B("(B\E$@ $B("(B\E(H $B("(B-- $B("(B-- $B("(B\E(H $B("(B $B("(B
- $B("(Bjubb $B("(B\E$B $B("(B\E(B $B("(B\E(I $B("(B\E(B $B("(B\E(B $B("(B $B("(B
- $B("(Bjubj $B("(B\E$B $B("(B\E(J $B("(B\E(I $B("(B\E(J $B("(B\E(J $B("(Bjunet$B$HF1$8(B $B("(B
- $B("(Bjubh $B("(B\E$B $B("(B\E(H $B("(B\E(I $B("(B\E(H $B("(B\E(H $B("(B $B("(B
- $B("(Bju@b $B("(B\E$@ $B("(B\E(B $B("(B\E(I $B("(B\E(B $B("(B\E(B $B("(B $B("(B
- $B("(Bju@j $B("(B\E$@ $B("(B\E(J $B("(B\E(I $B("(B\E(J $B("(B\E(J $B("(B $B("(B
- $B("(Bju@h $B("(B\E$@ $B("(B\E(H $B("(B\E(I $B("(B\E(H $B("(B\E(H $B("(B $B("(B
- $B(&(!(!(!(*(!(!(!(!(*(!(!(!(!(*(!(!(!(!(*(!(!(!(!(*(!(!(!(!(*(!(!(!(!(!(!(!(!(!(%(B
-
- $B$$$:$l$N>l9g$b!"$9$G$KB8:_$7$F$$$kL>A0$KBP$7$F$O!"4A;z$N3+;O=*N;%7!<%1%s%9$O!"0J2<(B
- $B$N$b$N$rG'<1$7$^$9!#(B
- $B4A;z$N;O$^$j(B: \E$B $B$+(B \E$@
- $B4A;z$N=*$j(B: \E(J $B$+(B \E(B $B$+(B \E(H
-
-(2) smbclient $B$N%*%W%7%g%s(B
-
- $B%/%i%$%"%s%H%W%m%0%i%`$G$b!"4A;z$d2>L>$r4^$s$@%U%!%$%k$r07$($k$h$&$K!"<!$N%*%W%7%g%s(B
- $B$rDI2C$7$^$7$?!#(B
-
- -t <$B%?!<%_%J%k%3!<%I7O(B>
-
- $B$3$3$G!"(B<$B%?!<%_%J%k%3!<%I7O(B>$B$K;XDj$G$-$k$b$N$O!">e$N(B<$B%3!<%I7O(B>$B$HF1$8$b$N$G$9!#(B
-
-(3) $B%G%U%)%k%H(B
-
- $B%G%U%)%k%H$N%3!<%I7O$O!"%3%s%Q%$%k;~$K7h$^$j$^$9!#(B
-
-3. $B%3%s%Q%$%k;~$N@_Dj(B
-
- Makefile $B$K@_Dj$9$k9`L\$r0J2<$K<($7$^$9!#(B
-
-(1) KANJI $B%U%i%0(B
-
- $B%3%s%Q%$%k%*%W%7%g%s$K(B -DKANJI=\"$B%3!<%I7O(B\" $B$r;XDj$7$^$9!#$3$N%3!<%I7O$O(B 2. $B$G;X(B
- $BDj$9$k$b$N$HF1$8$G$9!#Nc$($P!"(B-DKANJI=\"euc\" $B$r(BFLAGSM $B$K@_Dj$9$k$H(B UNIX $B>e$N%U%!(B
- $B%$%kL>$O!"(BEUC $B%3!<%I$K$J$j$^$9!#$3$3$G;XDj$7$?%3!<%I7O$O!"%5!<%P5Z$S%/%i%$%"%s%H(B
- $B%W%m%0%i%`$N%G%U%)%k%H$KCM$J$j$^$9!#(B
-
- $B>0!"%*%W%7%g%sCf$N(B \ $B$d(B " $B$bK:$l$:$K;XDj$7$F2<$5$$!#(B
-
-3. $B@)8B;v9`(B
-
-(1) $B4A;z%3!<%I(B
- smbd $B$rF0:n$5$;$k%[%9%H$N(B UNIX $B$,%5%]!<%H$7$F$$$J$$4A;z%3!<%I$O!"MxMQ$G$-$J$$$3$H$,(B
- $B$"$j$^$9!#JQ$JF0:n$r$9$k$h$&$J$i(B hex $B$N;XDj$r$9$k$N$,NI$$$G$7$g$&!#(B
-
-(2) smbclient $B%3%^%s%I(B
- $B%7%U%H%3!<%I$J$I$N4X78$G!"4A;z$d2>L>$r4^$s$@%U%!%$%kL>$N(B ls $B$NI=<($,Mp$l$k$3$H$,$"$j(B
- $B$^$9!#(B
-
-(3) $B%o%$%k%I%+!<%I$K$D$$$F(B
- $B$A$c$s$H$7$?%9%Z%C%/$,$h$/$o$+$i$J$+$C$?$N$G$9$,!"0l1~!"(BDOS/V $B$NF0:n$HF1$8F0:n$r9T$J(B
- $B$&$h$&$K$J$C$F$$$^$9!#(B
-
-(4) $B%m%s%0%U%!%$%kL>$K$D$$$F(B
- Windows NT/95 $B$G$O!"%m%s%0%U%!%$%kL>$,07$($^$9!#%m%s%0%U%!%$%kL>$r(B 8.3 $B%U%)!<%^%C%H(B
- $B$G07$&$?$a$K!"(Bmangling $B$7$F$$$^$9$,!"$3$NJ}K!$O!"(BNT $B$d(B 95 $B$,9T$J$C$F$$$k(B mangling $B$H(B
- $B$O0[$J$j$^$9$N$GCm0U$7$F2<$5$$!#(B
-
-4. $B>c32Ey$N%l%]!<%H$K$D$$$F(B
-
- $BF|K\8l$N%U%!%$%kL>$K4X$7$F!"J8;z2=$1Ey$N>c32$,$"$l$P!";d$K%l%]!<%H$7$FD:$1$l$P9,$$$G(B
-$B$9!#$?$@$7!"%*%j%8%J%k$+$i$NLdBjE@$d<ALd$K$D$$$F$O!"%*%j%8%J%k$N:n<T$XD>@\Ld$$9g$o$;$k(B
-$B$+!"$b$7$/$O%a!<%j%s%0%j%9%H$J$I$X%l%]!<%H$9$k$h$&$K$7$F2<$5$$!#(B
-
-$B%l%]!<%H$5$l$k>l9g!"MxMQ$5$l$F$$$k4D6-(B(UNIX $B5Z$S(B PC $BB&$N(BOS$B$J$I(B)$B$H$G$-$^$7$?$i@_Dj%U%!(B
-$B%$%k$d%m%0$J$I$rE:IU$7$FD:$1$k$H9,$$$G$9!#(B
-
-5. $B$=$NB>(B
-
- $B%3!<%IJQ49$O0J2<$NJ}!9$,:n$i$l$?%W%m%0%i%`$rMxMQ$7$F$$$^$9!#(B
-
- hex $B7A<0(B $BBgLZ!wBgDM!&C^GH(B <ohki@gssm.otsuka.tsukuba.ac.jp>$B;a(B
- cap $B7A<0(B $BI%ED(B $BF;O:(B (michiro@po.iijnet.or.jp)(michiro@dms.toppan.co.jp)$B;a(B
-
- $B$=$NB>!"$?$/$5$s$NJ}!9$+$i$$$m$$$m$H8f65<($$$?$@$-$"$j$,$H$&$4$6$$$^$7$?!#:#8e$H$b$h(B
-$B$m$7$/$*4j$$CW$7$^$9!#(B
-
-1994$BG/(B10$B7n(B28$BF|(B $BBh#1HG(B
-1995$BG/(B 8$B7n(B16$BF|(B $BBh#2HG(B
-1995$BG/(B11$B7n(B24$BF|(B $BBh#3HG(B
-1996$BG/(B 5$B7n(B13$BF|(B $BBh#4HG(B
-
-$BF#ED(B $B?r(B fujita@ainix.isac.co.jp
-
diff --git a/docs/textdocs/README.sambatar b/docs/textdocs/README.sambatar
deleted file mode 100644
index af7250c2a49..00000000000
--- a/docs/textdocs/README.sambatar
+++ /dev/null
@@ -1,23 +0,0 @@
-Contributor/s: Martin.Kraemer <Martin.Kraemer@mch.sni.de>
- and Ricky Poulten (ricky@logcam.co.uk)
-Date: Unknown - circa 1994
-Status: Obsoleted - smbtar has been a stable part of Samba
- since samba-1.9.13
-
-Subject: Sambatar (now smbtar)
-=============================================================================
-
-This is version 1.4 of my small extension to samba that allows PC shares
-to be backed up directly to a UNIX tape. It only has been tested under
-Solaris 2.3, Linux 1.1.59 and DG/UX 5.4r3.10 with version 1.9.13 of samba.
-
-See the file INSTALL for installation instructions, and
-the man page and NOTES file for some basic usage. Please let me know if you
-have any problems getting it to work under your flavour of Unix.
-
-This is only (yet another) intermediate version of sambatar.
-This version also comes with an extra gift, zen.bas, written in
-microsoft qbasic by a colleague. It is (apparently) based on a 70s
-British sci-fi series known as Blake's 7. If you have any questions
-about this program, or any suggestions (e.g. what about servillan.bas
-?), feel free to mail the author (of zen.bas) greenm@lilhd.logica.com.
diff --git a/docs/textdocs/SCO.txt b/docs/textdocs/SCO.txt
deleted file mode 100644
index 7c01aa57c6c..00000000000
--- a/docs/textdocs/SCO.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Contributor: Geza Makay <makayg@math.u-szeged.hu>
-Date: Unknown
-Status: Obsolete - Dates to SCO Unix v3.2.4 approx.
-
-Subject: TCP/IP Bug in SCO Unix
-============================================================================
-
-There is an annoying TCPIP bug in SCO Unix. This causes corruption when
-transferring files with Samba.
-
-Geza Makay (makayg@math.u-szeged.hu) sends this information:
-
-The patch you need is UOD385 Connection Drivers SLS. It is available from
-SCO (ftp.sco.com, directory SLS, files uod385a.Z and uod385a.ltr.Z).
-
-You do not need anything else but the above patch. It installs in seconds,
-and corrected the Excel problem. We also had some other minor problems (not
-only with Samba) that disappeared by installing this patch.
-
diff --git a/docs/textdocs/SMBTAR.notes b/docs/textdocs/SMBTAR.notes
deleted file mode 100644
index 679d776f56c..00000000000
--- a/docs/textdocs/SMBTAR.notes
+++ /dev/null
@@ -1,46 +0,0 @@
-Contributor: Unknown
-Date: 1994
-Status: Mostly Current - refer man page
-
-Subject: Smbtar
-============================================================================
-
-Intro
------
-
-sambatar is just a small extension to the smbclient program distributed with
-samba. A basic front end shell script, smbtar, is provided as an interface
-to the smbclient extensions.
-
-Extensions
-----------
-
-This release adds the following extensions to smbclient,
-
-tar [c|x] filename
- creates or restores from a tar file. The tar file may be a tape
-or a unix tar file. tar's behaviour is modified with the newer and tarmode
-commands.
-
-tarmode [full|inc|reset|noreset]
- With no arguments, tarmode prints the current tar mode (by default full,
-noreset). In full mode, every file is backed up during a tar command.
-In incremental, only files with the dos archive bit set are backed up.
-The archive bit is reset if in reset mode, or left untouched if in noreset.
-In reset mode, the share has to be writable, which makes sambatar even
-less secure. An alternative might be to use tarmode inc noreset which
-would implement an "expanding incremental" backup (which some may prefer
-anyway).
-
-setmode <setmode string> filename
- This is a "freebie" - nothing really to do with sambatar. This
-is a crude attrib like command (only the other way around). Setmode string
-is a combination of +-rhsa. So for example -rh would reset the read only
-bit on filename.
-
-newer filename
- This is in fact part of the 1.9.13 samba distribution, but comes
-into its own with sambatar. This causes tar (or get, mget, etc) to
-only copy files newer than the specified file name. Could be used
-against the previous nights (or whatever) log file to implement incremental
-backups.
diff --git a/docs/textdocs/Speed.txt b/docs/textdocs/Speed.txt
deleted file mode 100644
index cb086a97112..00000000000
--- a/docs/textdocs/Speed.txt
+++ /dev/null
@@ -1,333 +0,0 @@
-Contributor: Andrew Tridgell
-Date: January 1995
-Status: Current
-
-Subject: Samba performance issues
-============================================================================
-
-This file tries to outline the ways to improve the speed of a Samba server.
-
-COMPARISONS
------------
-
-The Samba server uses TCP to talk to the client. Thus if you are
-trying to see if it performs well you should really compare it to
-programs that use the same protocol. The most readily available
-programs for file transfer that use TCP are ftp or another TCP based
-SMB server.
-
-If you want to test against something like a NT or WfWg server then
-you will have to disable all but TCP on either the client or
-server. Otherwise you may well be using a totally different protocol
-(such as Netbeui) and comparisons may not be valid.
-
-Generally you should find that Samba performs similarly to ftp at raw
-transfer speed. It should perform quite a bit faster than NFS,
-although this very much depends on your system.
-
-Several people have done comparisons between Samba and Novell, NFS or
-WinNT. In some cases Samba performed the best, in others the worst. I
-suspect the biggest factor is not Samba vs some other system but the
-hardware and drivers used on the various systems. Given similar
-hardware Samba should certainly be competitive in speed with other
-systems.
-
-
-OPLOCKS
--------
-
-Oplocks are the way that SMB clients get permission from a server to
-locally cache file operations. If a server grants an oplock
-(opportunistic lock) then the client is free to assume that it is the
-only one accessing the file and it will agressively cache file
-data. With some oplock types the client may even cache file open/close
-operations. This can give enormous performance benefits.
-
-With the release of Samba 1.9.18 we now correctly support opportunistic
-locks. This is turned on by default, and can be turned off on a share-
-by-share basis by setting the parameter :
-
-oplocks = False
-
-We recommend that you leave oplocks on however, as current benchmark
-tests with NetBench seem to give approximately a 30% improvement in
-speed with them on. This is on average however, and the actual
-improvement seen can be orders of magnitude greater, depending on
-what the client redirector is doing.
-
-Previous to Samba 1.9.18 there was a 'fake oplocks' option. This
-option has been left in the code for backwards compatibility reasons
-but it's use is now deprecated. A short summary of what the old
-code did follows.
-
-Old 'fake oplocks' option - deprecated.
----------------------------------------
-
-Samba can also fake oplocks, by granting a oplock whenever a client
-asks for one. This is controlled using the smb.conf option "fake
-oplocks". If you set "fake oplocks = yes" then you are telling the
-client that it may agressively cache the file data for all opens.
-
-Enabling 'fake oplocks' on all read-only shares or shares that you know
-will only be accessed from one client at a time you will see a big
-performance improvement on many operations. If you enable this option
-on shares where multiple clients may be accessing the files read-write
-at the same time you can get data corruption.
-
-SOCKET OPTIONS
---------------
-
-There are a number of socket options that can greatly affect the
-performance of a TCP based server like Samba.
-
-The socket options that Samba uses are settable both on the command
-line with the -O option, or in the smb.conf file.
-
-The "socket options" section of the smb.conf manual page describes how
-to set these and gives recommendations.
-
-Getting the socket options right can make a big difference to your
-performance, but getting them wrong can degrade it by just as
-much. The correct settings are very dependent on your local network.
-
-The socket option TCP_NODELAY is the one that seems to make the
-biggest single difference for most networks. Many people report that
-adding "socket options = TCP_NODELAY" doubles the read performance of
-a Samba drive. The best explanation I have seen for this is that the
-Microsoft TCP/IP stack is slow in sending tcp ACKs.
-
-
-READ SIZE
----------
-
-The option "read size" affects the overlap of disk reads/writes with
-network reads/writes. If the amount of data being transferred in
-several of the SMB commands (currently SMBwrite, SMBwriteX and
-SMBreadbraw) is larger than this value then the server begins writing
-the data before it has received the whole packet from the network, or
-in the case of SMBreadbraw, it begins writing to the network before
-all the data has been read from disk.
-
-This overlapping works best when the speeds of disk and network access
-are similar, having very little effect when the speed of one is much
-greater than the other.
-
-The default value is 16384, but very little experimentation has been
-done yet to determine the optimal value, and it is likely that the best
-value will vary greatly between systems anyway. A value over 65536 is
-pointless and will cause you to allocate memory unnecessarily.
-
-
-MAX XMIT
---------
-
-At startup the client and server negotiate a "maximum transmit" size,
-which limits the size of nearly all SMB commands. You can set the
-maximum size that Samba will negotiate using the "max xmit = " option
-in smb.conf. Note that this is the maximum size of SMB request that
-Samba will accept, but not the maximum size that the *client* will accept.
-The client maximum receive size is sent to Samba by the client and Samba
-honours this limit.
-
-It defaults to 65536 bytes (the maximum), but it is possible that some
-clients may perform better with a smaller transmit unit. Trying values
-of less than 2048 is likely to cause severe problems.
-
-In most cases the default is the best option.
-
-
-LOCKING
--------
-
-By default Samba does not implement strict locking on each read/write
-call (although it did in previous versions). If you enable strict
-locking (using "strict locking = yes") then you may find that you
-suffer a severe performance hit on some systems.
-
-The performance hit will probably be greater on NFS mounted
-filesystems, but could be quite high even on local disks.
-
-
-SHARE MODES
------------
-
-Some people find that opening files is very slow. This is often
-because of the "share modes" code needed to fully implement the dos
-share modes stuff. You can disable this code using "share modes =
-no". This will gain you a lot in opening and closing files but will
-mean that (in some cases) the system won't force a second user of a
-file to open the file read-only if the first has it open
-read-write. For many applications that do their own locking this
-doesn't matter, but for some it may. Most Windows applications
-depend heavily on "share modes" working correctly and it is
-recommended that the Samba share mode support be left at the
-default of "on".
-
-The share mode code in Samba has been re-written in the 1.9.17
-release following tests with the Ziff-Davis NetBench PC Benchmarking
-tool. It is now believed that Samba 1.9.17 implements share modes
-similarly to Windows NT.
-
-NOTE: In the most recent versions of Samba there is an option to use
-shared memory via mmap() to implement the share modes. This makes
-things much faster. See the Makefile for how to enable this.
-
-
-LOG LEVEL
----------
-
-If you set the log level (also known as "debug level") higher than 2
-then you may suffer a large drop in performance. This is because the
-server flushes the log file after each operation, which can be very
-expensive.
-
-
-WIDE LINKS
-----------
-
-The "wide links" option is now enabled by default, but if you disable
-it (for better security) then you may suffer a performance hit in
-resolving filenames. The performance loss is lessened if you have
-"getwd cache = yes", which is now the default.
-
-
-READ RAW
---------
-
-The "read raw" operation is designed to be an optimised, low-latency
-file read operation. A server may choose to not support it,
-however. and Samba makes support for "read raw" optional, with it
-being enabled by default.
-
-In some cases clients don't handle "read raw" very well and actually
-get lower performance using it than they get using the conventional
-read operations.
-
-So you might like to try "read raw = no" and see what happens on your
-network. It might lower, raise or not affect your performance. Only
-testing can really tell.
-
-
-WRITE RAW
----------
-
-The "write raw" operation is designed to be an optimised, low-latency
-file write operation. A server may choose to not support it,
-however. and Samba makes support for "write raw" optional, with it
-being enabled by default.
-
-Some machines may find "write raw" slower than normal write, in which
-case you may wish to change this option.
-
-READ PREDICTION
----------------
-
-Samba can do read prediction on some of the SMB commands. Read
-prediction means that Samba reads some extra data on the last file it
-read while waiting for the next SMB command to arrive. It can then
-respond more quickly when the next read request arrives.
-
-This is disabled by default. You can enable it by using "read
-prediction = yes".
-
-Note that read prediction is only used on files that were opened read
-only.
-
-Read prediction should particularly help for those silly clients (such
-as "Write" under NT) which do lots of very small reads on a file.
-
-Samba will not read ahead more data than the amount specified in the
-"read size" option. It always reads ahead on 1k block boundaries.
-
-
-MEMORY MAPPING
---------------
-
-Samba supports reading files via memory mapping them. One some
-machines this can give a large boost to performance, on others it
-makes not difference at all, and on some it may reduce performance.
-
-To enable you you have to recompile Samba with the -DUSE_MMAP option
-on the FLAGS line of the Makefile.
-
-Note that memory mapping is only used on files opened read only, and
-is not used by the "read raw" operation. Thus you may find memory
-mapping is more effective if you disable "read raw" using "read raw =
-no".
-
-
-SLOW CLIENTS
-------------
-
-One person has reported that setting the protocol to COREPLUS rather
-than LANMAN2 gave a dramatic speed improvement (from 10k/s to 150k/s).
-
-I suspect that his PC's (386sx16 based) were asking for more data than
-they could chew. I suspect a similar speed could be had by setting
-"read raw = no" and "max xmit = 2048", instead of changing the
-protocol. Lowering the "read size" might also help.
-
-
-SLOW LOGINS
------------
-
-Slow logins are almost always due to the password checking time. Using
-the lowest practical "password level" will improve things a lot. You
-could also enable the "UFC crypt" option in the Makefile.
-
-CLIENT TUNING
--------------
-
-Often a speed problem can be traced to the client. The client (for
-example Windows for Workgroups) can often be tuned for better TCP
-performance.
-
-See your client docs for details. In particular, I have heard rumours
-that the WfWg options TCPWINDOWSIZE and TCPSEGMENTSIZE can have a
-large impact on performance.
-
-Also note that some people have found that setting DefaultRcvWindow in
-the [MSTCP] section of the SYSTEM.INI file under WfWg to 3072 gives a
-big improvement. I don't know why.
-
-My own experience wth DefaultRcvWindow is that I get much better
-performance with a large value (16384 or larger). Other people have
-reported that anything over 3072 slows things down enourmously. One
-person even reported a speed drop of a factor of 30 when he went from
-3072 to 8192. I don't know why.
-
-It probably depends a lot on your hardware, and the type of unix box
-you have at the other end of the link.
-
-
-MY RESULTS
-----------
-
-Some people want to see real numbers in a document like this, so here
-they are. I have a 486sx33 client running WfWg 3.11 with the 3.11b
-tcp/ip stack. It has a slow IDE drive and 20Mb of ram. It has a SMC
-Elite-16 ISA bus ethernet card. The only WfWg tuning I've done is to
-set DefaultRcvWindow in the [MSTCP] section of system.ini to 16384. My
-server is a 486dx3-66 running Linux. It also has 20Mb of ram and a SMC
-Elite-16 card. You can see my server config in the examples/tridge/
-subdirectory of the distribution.
-
-I get 490k/s on reading a 8Mb file with copy.
-I get 441k/s writing the same file to the samba server.
-
-Of course, there's a lot more to benchmarks than 2 raw throughput
-figures, but it gives you a ballpark figure.
-
-I've also tested Win95 and WinNT, and found WinNT gave me the best
-speed as a samba client. The fastest client of all (for me) is
-smbclient running on another linux box. Maybe I'll add those results
-here someday ...
-
-
-COMMENTS
---------
-
-If you've read this far then please give me some feedback! Which of
-the above suggestions worked for you?
-
-Mail the samba mailing list or samba-bugs@samba.anu.edu.au
diff --git a/docs/textdocs/Support.txt b/docs/textdocs/Support.txt
deleted file mode 100644
index d482ac39123..00000000000
--- a/docs/textdocs/Support.txt
+++ /dev/null
@@ -1,1847 +0,0 @@
-The Samba Consultants List
-==========================
-
-This is a list of people who are prepared to commercialy support
-Samba. Being on this list does not imply any sort of endorsement by
-anyone, it is just provided in the hope that it will be useful.
-
-Note that the organisations listed below will expect you to pay for
-The support that they offer. We have been told that several people
-assumed this was a list of kindly companies offering free commercial
-support!
-
-For free support use the Samba mailing list and the comp.protocols.smb
-newsgroup.
-
-If you want to be added to the list, or want your entry modified then
-contact the address below. Please make sure to include a header line
-giving the region and country, eg CANBERRA - AUSTRALIA.
-
-The Samba Team reserves the right not to add support providers.
-
-You can contact the maintainers at samba-bugs@samba.anu.edu.au
-
-The support list has now been re-arranged into geographical areas
-and are sorted by state/region/town within these areas.
-These are currently:
-
-Region Number of entries
-----------------------------------------------------
- AFRICA 2
- AMERICA - CENTRAL & SOUTH 4
- AMERICA - USA 35
- ASIA 1
- AUSTRALIA & NEW ZEALAND 18
- CANADA 8
- EUROPE 35
- MIDDLE EAST 1
-
-AFRICA
-======
-
-------------------------------------------------------------------------------
-GAUTENG - SOUTH AFRICA
-
-Company: Obsidian Systems
-Street Addr: Boskruin Office Park Unit 3, Bosbok street, Randpark Ridge
- Gauteng, 2156, South Africa.
-Postal Addr: PO Box 4938, Cresta, South Africa, 2118
-Contact no's: +2711 792-6500/38, Fax: +2711-792-6522
- Cell: +2783-379-6889/90/91 or +2783-377-4946 or +27832660199
-
-Our level of experience: Low level programming and support for all samba
-security and compatability issues. We use Samba in South African Schools
-and commercial companies as an affordable solution for LAN and WAN
-networking.
-
-For futher information, please consult our website www.obsidian.co.za
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-JOHANNESBURG - SOUTH AFRICA
-
- Company: Symphony Research (Pty) Ltd
- Contact: Dr Evan Summers, <evan@sr.co.za>, cell 082 900-8632.
-keywords: Samba on Linux, support and consulting
- Johannesburg (South Africa)
-
-Evan Summers, PhD Tel +27 82 900-8632 Symphony
-Linux systems integration http://sr.co.za Research
-Johannesburg, South Africa mailto:evan@sr.co.za (Pty)Ltd
-------------------------------------------------------------------------------
-
-
-
-
-
-
-
-AMERICA - CENTRAL & SOUTH
-=========================
-
-
-------------------------------------------------------------------------------
-ARGENTINA - SOUTH AMERICA
-
-Buenos Aires - Argentina
-
-Guillermo Sansovic
-Email: gui@usa.net
-Arkham Software
-Rivadavia 923 Piso 8
-1002 Buenos Aires
-Argentina
-
-Tel: + 54 1 345-0645
-
-At Arkham Software we have been working with Unix systems since 1986. We do
-intranets, software development and system integration. Our experience ith
-Samba dates from 1995.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CHILE - SOUTH AMERICA
-
-Company: Magic Consulting Group/Magic Dealer
-Street Addr: Alberto Reyes #035 Barrio Bellavista
- Providencia Santiago
-Contact no's: +56 2 365 19 18, Fax: +56 2 365 14 55
-
-Contact Person: Marcelo Bartsch or Roy Zderich
-
-Email contact:
-Samba Support : samba@mg.dyn.ml.org
-Other NET OS Support : othernetos@mg.dyn.ml.org
-Other Questions : networks@mg.dyn.ml.org
-General Info: info@mg.dyn.ml.org
-
-Our level of experience: support for all Samba and Linux security and
-compatability issues. We use Samba in our local network and we have
-experience instaling it on some other locations. we also provide
-techincal support for Linux, Novell, Windows NT, OS/2 and other
-Operating Systems.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-HONDURAS - CENTRAL AMERICA
-
-Open Systems, S.A.
-
-Open Systems, S.A. provides support to SAMBA in SCO UnixWare 2.X:
-
-Server Platform: SCO UnixWare 2.X
-Client Platform: Windows NT, Windows 95, WFW (3.11), DOS.
-
-Open Systems, S.A. also provides consulting services and technical
-support in the following server platforms since 1987:
-
-SCO Open Server 3.0 and 5.0
-SCO UnixWare 2.X (SVR4.2MP)
-UNIX SVR4 (NCR, UNISYS)
-
-Contact:
-Selim Jose Miselem
-Open Systems, S.A.
-Centro Comercial Dallas
-San Pedro Sula, Honduras, Central America
-Tel/Fax 011 (504) 529868
-e-mail: selim@opensys.hn
-URL: http://www.opensys.hn
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-VILLAHERMOSA, TAB. - MEXICO
-
-Carlos Enrique García Díaz
-E-mail: cgarcia@tnet.net.mx
-Phone: (93) 12-33-91
-
-Samba experience:
-Server: Samba 1.9.15 and above with Solaris (Sparc & x86), SG Irix 5.2 - 6.3,
-AIX 3.2, DEC OSF1 v4.0, DG/UX v4.11, SunOS.
-Client: WinNT, Win95, WfWg, Win 3.1 & LAN WorkPlace.
-------------------------------------------------------------------------------
-
-
-
-
-
-
-
-AMERICA - USA
-=============
-
-------------------------------------------------------------------------------
-ARIZONA - USA
-
-Stephen Greenberg
-Nick Temple
-Coactiv Systems Inc.
-4625 S. Lakeshore Drive, suite 401
-Tempe, AZ 85282
-(602) 345 4114
-(602) 345 4105 fax
-steveg@coactiv.net
-
-We are LAN/WAN integrators who specialize in the standard fare (i.e. Novell
-and NT) as well as UNIX, NTRIGUE and SAMBA.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BAY AREA, SILICON VALLEY CALIFORNIA - USA
-
-Adital Corp.
-
-7291 Coronado Dr. ,Suite 4 San-Jose Ca 95129
-
-Phone : (408) 257-7717 Fax : (408) 257-7772 E-Mail: ephi@adital.com
-
-Contact: Ephi Dror, Director of software development.
-
-Adital is a company that specialized in networking products development.
-We have been doing many development projects on Windows (NT/95), Macintosh,
-UNIX and embedded system platforms in the area of networking drivers and
-applications during the last few years. In regards to SAMBA, we have a lot
-of experience in SMB/CIFS protocol development.
-
-We have special expertise in porting SAMBA to embedded system environments for
-NT/WIN95/WFW client/server connectivity.
-
-We can help you defining and specifying your product as well as designing,
-implementing, testing, upgrading and maintaining it.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SAN FRANCISCO BAY AREA - USA
-
-Alex Davis --- President of FTL
-Faster Than Light, 2570 Ocean Ave. #114, San Francisco, California, 94132
-HTTP://www.ftl.net/ EMAIL:davis@ftl.net TEL:415.334.2922 FAX:415.337.6135
-
-We are located in the "Bay Area" of California, USA. We provide
-consultant and training for Unix, Windows, Macintosh applications,
-and hardware. We also provide Internet access to many of the local
-companies as a part of our "one-stop-shop" model.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SAN FRANCISCO BAY AREA - USA
-
-2125 Hamilton Ave. Suite 100
-San Jose, CA 95125
-888-ACCLAIM [Inside California]
-(408) 879 - 3100
-(408) 377-4900 [Fax]
-
-We can provide commercial support for Samba. We have created additional
-scripts that we can add to the Samba distribution to create an installation in
-Sun Solaris "package add" format. We are a Sun Reseller, but we can also
-support Samba on HP, SGI, Linux, in addition to Sun Solaris Sparc/X86.
-
-To find out more about our company, look at our website:
- http://www.acclaim.com
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BAY AREA, BERKELEY CALIFORNIA - USA
-
-Vortex Technology Services
-
-2467 Warring St Suite 206, Berkeley CA 94704
-
-Phone/Fax : (510) 540-VTEX E-Mail: support@vtex.net
- (510) 540-8839
-
-Contact: Paul Puey, Chief Network Consultant/Engineer
-
-Vortex Technology is a fast growing technical service company based in
-Berkeley, California. Our Co-founders are composed entirely of UC
-Berkeley engineering graduates with a broad range of skills in the
-technical consultation fields. We provide bay area companies with
-professional web site and database design, LAN and WAN consultation, and
-custom programming. We ourselves use a mixed NT / Linux Samba server
-environment in our office. We are very experienced with Samba
-administration as well as administration of UNIX and NT networks.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CALIFORNIA - USA
-
-Cliff Skolnick
-Steam Tunnel Operations
-900 Tennessee St, suite 22
-San Francisco, CA 94107
-http://www.steam.com/
-(415) 920-3800
-cliff@steam.com
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CALIFORNIA - USA
-
-Craftwork Solutions Inc.
-
-Craftwork Solutions Inc. is dedicated to providing the best possible
-services to our customers. The Craftworks team will provide you with a
-total solution package that will work for you both today and tomorrow.
-With our own Linux Distribution which we are constantly improving to make
-it the best and using it to provide total solutions for companies which
-are open to using Linux.
-
-Please contact mary@craftwork.com
-------------------------------------------------------------------------------
-
------------------------------------------------------------------------
-SOUTHERN CALIFORNIA - USA
-
-Michael St. Laurent
-Serving Los Angeles and Orange Counties. Please contact via email.
-rowl@earthlink.net
-Michael St. Laurent
-Hartwell Corporation
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SOUTHERN CALIFORNIA - USA
-
-Yuri Diomin
-Yuri Software
-13791 Ruette Le Parc, Ste. C
-Del Mar, CA 92014
-Phone: 619-350-8541
-Fax: 619-350-7641
-yuri@yurisw.com
-http://www.yurisw.com
-
-We have been supporting Samba in commercial installations for several years
-on a variety of client and server platforms. We have extensive experience
-in all aspects of UNIX-Windows connectivity solutions for mixed platform
-corporate setups. We are a contributor to Samba source code.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-NORTH CAROLINA - USA
-
-Whole Systems Solutions, Inc.
-
- Whole Systems Solutions, Inc. has been running Samba since the
-1.6 release. We specialize in small to medium sized business network
-solutions. Whole Systems Solutions, Inc. provides outsourcing of IT to
-enhance employee abilities therefore improving productivity. Through
-software beta testing and development network of NT, NetWare, Unix, and
-Win clients we have developed a vast knowledge base for support. Our
-clients choose us for service and support that exceeds their
-expectations. Your business depends on your computers. Your computers
-should depend on WSS.
-
-Jay M. Eisenberg Whole Systems Solutions, Inc.
-President
-Web: http://www.wss.net
-Phone: (910) 297-4977
-Email: jay@wss.net
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FORT COLLINS, COLORADO - USA
-
-Granite Computing Solutions
-ATTN: Brian Grossman
-P.O. Box 270103
-Fort Collins, CO 80527-0103
-U.S.A.
-Tel: +1 (970) 225-2370
-Email: granite@SoftHome.Net WWW: http://www.SoftHome.Net/granite/
-
-Information services, including WfWG, NT, Apple <=> Unix interoperability.
-WWW solutions. WWW education. Unix education. Custom software
-development - eg. http://www.SoftHome.Net/modsim/.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-COLORADO - USA
-
-Daylight Software
-1062 Lexington Lane
-Estes Park, CO 80517 USA
-(970) 586-6058
-
-We have experience with Samba under SunOS, Solaris and Linux,
-and also with Windows NT and Microsoft Lan Manager.
-
-Contact: daylight@frii.net
-
-Chris Howard Daylight Software
-daylight@frii.net Estes Park, Colorado USA
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FLORIDA - USA
-
-Swaney & Associates, Inc.
-ATTN: Stephen Swaney
- 2543 Lincoln Avenue
- Miami, Florida 33133
- U.S.A
- (305) 860-0570
-
-Specializing in:
- High Availability system & networks
- UNIX to PC connectivity
- Market Data systems
- Messaging Systems (Sendmail & Microsoft Exchange)
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FLORIDA - USA
-
-Progressive Computer Concepts, Inc.
-1371 Cassat Avenue
-Jacksonville, FL 32205
-info@progressive-comp.com
-800-580-2640 - 904-389-3236 - 904-389-6584 fax
-
-Related Products and Services:
- ncLinux (Network Computer) consulting, installations, and turnkey
- networks. Multi-user NT and Samba consulting, installation and
- administration (both remote and onsite), Internet and Intranet
- connectivity, LAN and WAN, firewall installation, security,
- troubleshooting and training, custom LAN/WAN/Intranet business
- systems development, WWW/CGI development (e.g. database gateways,
- catalogs).
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FLORIDA - USA
-
-The PC Doctor
-3009 West Tharpe Street Unit-C
-Tallahassee, Florida 32303
-ph 904.531.0364
-fx 904.531.0128
-
-Contacts: Andy McRory pcdr@pcdr.com
- David Blodgett david@pcdr.com
-
-The PC Doctor specializes in Linux Internet/Workgroup servers and network
-intergration. We have experience in setup and configuration of SAMBA under
-Caldera/RedHat/Slackware Linux as well as SCO and AIX. We offer workgroup
-Internet gateway servers for Windows client based networks.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FLORIDA - USA
-
-TradeWeb
-Bill Harris
-(407) 657-8649
-bill@tradeweb.net
-
-http://www.tradeweb.net
-
-We have been working with SAMBA since 1995 and support it in a number of
-large organizations. We are available to Companies in the Central
-Florida area. We are well familiar in the integration of SAMBA and NT
-and in SAMBA configuration on AIX, SCO, Linux And SUN Solaris.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FLORIDA - USA
-
-The PC Doctor
-Tampa Bay Interactive
-1314 Tampa Rd STE 120
-Palm Harbor, FL 34683
-
-ph 813.781-2209
-fx 813.571-3805
-
-Contacts: Jared Hall: jhall@tbi.net
- System Operations: support@tbi.net
-
-Tampa Bay Interactive provides complete Internet solutions for the Small
-Office and Home Office. Specializing in Intel-Based UNIX systems; Linux,
-BSD/OS, FreeBSD, SCO. Proxy Server specialists.
-
-~~ Jared Hall ~~~~~~~ Tampa Bay Interactive
-~~~~~~~~~~~~~~~~~~~~~ 1314 Tampa Rd, #120
-~~ jhall@tbi.net ~~~~ Palm Harbor, FL 34683
-~~ (813) 781-2209 ~~~ (http://www.tbi.net)
-
-Telecom Corner - http://www.tbi.net/~jhall
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GEORGIA - USA
-
-Hoppe Computer Services
-2171 Brooks Road
-Dacula(Atlanta), Georgia 30019
-770-995-5099 fax 770-338-3885
-
-Supporting the Atlanta, Georgia USA area for two and a half years.
-In the computer field for 22 years.
-
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GEORGIA - USA
-
-Region: ATLANTA, GA - USA
-Company: Advanced Application Development, Inc.
-Address: 4383 Burnleigh Chase
- Roswell, GA 30075
-Telephone: (770) 552-4248
-email: support@aad.com
-Contact Name: Rich Vaughn
- rvaughn@aad.com
-
-Provides consulting, development and system integration
-services for businesses throughout the Southeastern US.
-We have been using Samba on various UNIX platforms for
-several years and are familiar with porting and configuration
-issues. Visit our web site at http://www.aad.com.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-IOWA - USA
-
-Afan Ottenheimer
-JEONET
-PO Box 1282
-Iowa City, IA 52244
-Phone: 319-338-6353
-Fax: 319-338-6353
-Email: afan@jeonet.com
-WWW: http://www.jeonet.com/jeonet/
-
-Specializing in systems integration, database, and advanced web
-site design since 1995. Have extensive experience in
-Linux<->NT<->Windows 3.11<->Windows 95 interaction using SAMBA.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ILLINOIS - USA
-
-Information One, Inc.
-736 Hinman Ave, Suite 2W
-Evanston, IL 60202
-708-328-9137 708-328-0117 FAX
-info@info1.com
-
-Providing custom Internet and networking solutions.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ILLINOIS - USA
-
-Honesty Communications Inc.
-1001 W 75th St Suite 179A-200
-Woodridge, IL 60517
-
-http://www.honesty.com
-support@honesty.com
-
-(630) 964-8441
-(708) 399-8158 Emergency Pager
-
-Serving as 'Technical Support for Technical Support' to numerous
-companies across the country Honesty Communications provides
-solutions for all situations with
-
-We can provide Samba installation, configuration, and security analysis
-as well as on-going support, training and upgrades. We also provide
-custom programming and a slew of other services.
-
-Expertise includes:
-
- UNIX, Windows 95, Windows NT, Windows 3.x, OS/2, Programming (C/C++,
- Java, Visual Basic, Visual C, etc.), Support, Training
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-KANSAS - USA
-
-NT Integrators
-2400 W. 31st Street
-Lawrence, KS 66046
-USA
-913-842-1100
-http://www.ntintegrators.com/
-email: watts@sunflower.com
-
-My consulting company does NT/Linux/Samba/etc support.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-LAS VEGAS, NEVADA - USA
-
-DPN, Inc. Las Vegas NV
-
-(702) 873-3282 Ph.
-(702) 873-3913 Fax
-Email duane@dpn.com
-
-Can provide commercial support for samba running on any version of
-SCO above 3.0 and for Linux. We currently have installed and are
-supporting several versions of samba on over 25 client sites across
-the US, in addition to our 6 in-house samba servers. Our largest client
-site has approx. 100 users.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-NEW JERSEY - USA
-
-William J. Maggio
-LAN & Computer Integrators, Inc.
-242 Old New Brunswick Road Email: bmaggio@lci.com
-Suite 440 Voice: 908-981-1991
-Piscataway, NJ 08855 Fax : 908-981-1858
-
- Specializing in Internet connectivity and security, Sun integration and
- high speed, enterprise network design and deployment.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-NEW YORK - USA
-
-67.2 Psytronics Solutions
-
- 90 County Line Road
- Massapequa, NY 11758
- U.S.A.
-
-Phone: +1 516 598 4619
-
-Fax: +1 516 598 4619
-
-EMail: info@psytronics.com
-
-URL: http://www.psytronics.com
-
-Contact: Jaron Rubenstein
-
-Type of support: Whatever is required. Support contracts available.
-
-Special expertise:
-
- Familiar with most topics. Specializing in dial-up server (PPP)
-installation and configuration, custom programming, and Internet and
-Intranet server configuration. Authorized Red Hat Reseller.
-
-Sample prices:
-
- Upon request, usually US$50-$100/hour. Educational discounts
-available.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-OREGON - USA
-
-Warren Birnbaum
-Birnbaum Associates
-2934 N.E. 18th Avenue
-Portland, OR 97212
-Phone: 503-282-6329
-Fax: 503-288-7074
-birnbaum@teleport.com
-
-I have been supporting Samba in commercial installations for several
-years on HP-UX and Solaris server platforms. I have installed Samba on
-over 80 servers used by over 7000 users. I am a contributor to Samba
-source code.
-
-I can provide Samba installation, configuration, and custom coding
-as well as on-going support.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-TEXAS - USA
-
-Jody Winston
-xprt Computer Consulting, Inc.
-731 Voyager
-Houston, TX 77062
-(281) 480 8649, jody@sccsi.com
-
-We have been supporting software from the Free Software Foundation and
-other groups such as Linux for over 8 years. The base rate is 150.00
-US dollars per hour. Please contact us for more information on our
-rates and services.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-TEXAS - USA
-
-The Solutions Group
-P.O. Box 31400
-Houston, TX 77231-1400
-
-Voice: (713) 729-2602
-Fax: (713) 723-9387
-Email: chuckb@LinuxTX.com
-
-The Solutions Group provides support for Linux, Solaris, and SCO UNIX.
-We specialize in mixed environments using Samba. We are certified NT
-as well as UNIX specialists. We can provide onsite support in the
-Houston area and remote support in any other areas.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-UNITED STATES
-
-Stelias Computing is the developer of the InfoMagic Workgroup Server, a
-Linux distribution customized for use as a PC and Macintosh file and
-print server (using Samba and netatalk respectively). Stelias also
-offers custom system programming and Samba support contracts.
-
-For information about the InfoMagic Workgroup Server contact InfoMagic:
- http://www.infomagic.com/
- questions@infomagic.com
- voice: 800-800-6613 or 520-526-9565
- fax: 520-526-9573
-
-To contact Stelias about custom arrangments, send email to
-info@stelias.com.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WASHINGTON DC METRO - USA
-
-Asset Software, Inc. has been running Samba since the 1.6 release on various
-platforms, including SunOS 4.x, Solaris 2.x, IRIX 4.x and 5.x, Linux 1.1x,
-1.2x, and 1.3x, and BSD UNIX 4.3 and above. We specialize in small office
-network solutions and provide services to enhance a small office's
-operations. Primarily a custom software operation, our vast knowledge of
-Windows, DOS, Unix, Windows NT, MacOS, and OS/2 enable us to provide quality
-technical assistance to the small office environment at a reasonable price.
-Our upcoming multi-mailbox mail client, IQ Mail, enables users with more
-than one mailbox to send and retrieve their mail from a single, consistent
-mail client running in Windows.
-
-David J. Fenwick Asset Software, Inc.
-President djf@assetsw.com
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WASHINGTON STATE - USA
-
-Brian Meyer
-Personal Data Services
-9792 Edmonds Way Suite 121
-Seattle, Washington 98020 USA
-Voice: (206) 365-8212
-E-mail: admin@pdsnorth.com
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WASHINGTON - USA
-
-Olympic Peninsula Consulting; 1241 Lansing Ave W., Bremerton, WA 98312-4343
-telephone 1+ 360 792 6938; mailto:opc@aa.net; http://www.aa.net/~opc;
-Unix Systems and TCP/IP Network design, programming, and administration.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WASHINGTON STATE - USA
-
-INTERNET: bill@Celestial.COM Bill Campbell; Celestial Systems, Inc.
-UUCP: camco!bill PO Box 820; 2835 82nd Avenue S.E. S-100
-FAX: (206) 232-9186 Mercer Island, WA 98040-0820; (206) 236-1676
-URL: http://www.celestial.com/
-
-We provide support for Samba and many other Unix related systems. Our
-primary systems are SCO, Caldera Linux, and Solaris on Sun systems.
-
-Celestial has been in business since late 1984 working primarily on
-medium to large Unix systems. More information is available on our
-web site, http://www.celestial.com/.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WASHINGTON STATE - USA
-
-Jeff Clithero jeff@octopi.com APPGEN Vertical
-Interstellar Octopus, Ltd. Voice 360-379-1754 Accounting Solutions
-1829 Lincoln St. PgVm 800-893-9517 Integration Services
-Port Townsend, WA USA FAX 360-379-1753 Sales and Support
-
-We support SAMBA commercially.
-
-In the US/Canada we provide 800 number for our clients and can go
-onsite to customers in the Northwest US and Vancouver, BC areas.
-------------------------------------------------------------------------------
-
-
-
-ASIA
-====
-
-------------------------------------------------------------------------------
-SEOUL - KOREA
-
-MultiMedia KOREA Inc, E-Mail : info@seoul.korea.co.kr
-Internet,WWW,Network Support Group, TEL : +82-02-597-1631
- FAX : +82-02-521-4463
-SeoChoGu SeoChoDong 1537-6 WWW : http://www.korea.co.kr
-JungAng B/D #401
-SEOUL KOREA
-
-SAMBA Experience : SunOS, Solaris, Linux, SCO-Unix, Win95/NT/3.1
-------------------------------------------------------------------------------
-
-
-
-
-
-
-AUSTRALIA & NEW ZEALAND
-=======================
-
-------------------------------------------------------------------------------
-ADELAIDE - AUSTRALIA
-
-Richard Sharpe, sharpe@ns.aus.com
-NS Computer Software and Services P/L
-PO Box 86,
-Ingle Farm, SA 5098
-Australia
-
-Contact: Richard Sharpe
- Ph: +61-8-281-0063 (08-281-0063) AH
- FAX:+61-8-250-2080 (08-250-2080)
-
-Located in Adelaide, South Australia.
-
-Proficient with Digital UNIX, ULTRIX, SunOS, Linux, Win 95, WfWg, Win NT.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ADELAIDE - AUSTRALIA
-
-Loftus Computing Services
-191 Flinders Street
-Adelaide 5000
-South Australia
-
-Phone: +61 8 8407 7577
-Fax: +61 8 8407 7501
-Email: support@loftuscomp.com.au
-
-
-SAMBA Experience : SunOS, Solaris, SCO-Unix, Free BSD, Win95/NT/3.1
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BRISBANE - AUSTRALIA
-
-Brett Worth
-Select Computer Technology - Brisbane
-431 Logan Road
-Stones Corner QLD 4120
-E-Mail: brett@sct.com.au
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CANBERRA - AUSTRALIA
-
-Paul Blackman (ictinus@lake.canberra.edu.au, Ph. 06 2012518) is
-available for consultation. Paul's Samba background is with
-Solaris 2.3/4 and WFWG/Win95 machines. Paul is also the maintainer
-of the SAMBA Web Pages.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CANBERRA - AUSTRALIA
-
-Ben Elliston
-E-mail: bje@air.net.au
-Samba systems: Solaris 2.x, Linux, HP-UX.
-------------------------------------------------------------------------------
-
------------------------------------------------------------------------
-MELBOURNE - AUSTRALIA
-
-Michael Ciavarella
-Cybersoruce Pty Ltd.
-8/140 Queen Street
-Melbourne VIC 3000
-Phone: +61-3-9642-5997
-Fax: +61-3-9642-5998
-Email: mikec@cyber.com.au
-WWW: http://www.cyber.com.au
-
-Cybersource specialises in TCP/IP network integration and Open Systems
-administration. Cybersource is an Australian-owned and operated
-company, with clients including some of Australia's largest financial,
-petrochemical and state government organisations.
------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-MELBOURNE - AUSTRALIA
-
-Company Name DARX Consulting
-Postal Address PO Box 12329
- A'Beckett St PO
- Melbourne 3000
-Area of Service Melb Metro and SE Suburbs
-Phone +61 3 9822 1216
-Email info@darx.com.au
-
-We provide setup and support of samba based systems as well as
-Novell/NT Systems.
------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-N.T - AUSTRALIA
-
-Open Systems Network Support
-
-Server Platforms - Unix/Linux
-Client Platforms - Windows3.1/95/NT, Macintosh, Unix/Linux
-
---
-David Schroeder Darwin Network Services
-Ph/Fax (08) 8932 1156 PO Box 82383
-(Int) +61 8 8932 1156 Casuarina N.T
-Email: djsc@it.ntu.edu.au Australia 0811
------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-NEW SOUTH WALES - AUSTRALIA
-
-BITcom Telecommunications Phone: (02) 9747 0011
-P.O. Box 15 Int'l: +61 2 9747 0011
-Burwood NSW 2134 Australia Fax: (02) 9747 6918
-Contact: Craig Bevins Email: consult@bitcom.net.au
-
-BITcom is an open systems and networking consultancy. We have been
-doing Open Systems since long before the term was coined, a key staff
-member having participated in the IEEE working group which produced
-the POSIX standard for Un*x-like systems in 1988.
-
-We tend to have a Unix orientation (all flavours) but our focus is on
-getting the job done and we are happy to employ other technologies which
-fit. Heck, we even use and support Microsoft's products! Our areas
-of expertise cover general Unix consultancy, support for public domain
-and GNUish software, PC LAN -> Unix integration, Internet, WWW and local
-and wide-area network design, implementation and security. We have a
-collective masochistic streak and actually enjoy hacking on sendmail
-configuration. We are an AUSTEL-licenced telecommunications and data
-cabler and hold a NSW security industry licence.
-
-We know Windows NT, LANMAN, PC-NFS and others. We use, recommend and
-support Samba and have done so since 1994.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PERTH - AUSTRALIA
-
-Bruce Cook - Synonet Corporation.
-E-mail: bcook@wantree.com.au
-Mobile: 015 999 330 (International +61 15 999 330)
-Experience: Samba on FreeBSD, Linux, Solaris (Sparc), Sunos-4
- Microsoft networking using NT/NTAS, Win95, WFW311, DOS
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PERTH - AUSTRALIA
-
-Geoff Allan Phone: +61 8 9325 9922
-Office Information Fax: +61 8 9325 9938
-Perth, Western Australia Mobile: 0412 903 659
-Email: geoffa@officeinfo.com.au
-
-Office Information has been in existence since 1991. We are (amongst
-other things) systems integrators with experts in Unix, Linux, Novell,
-NT and the other DOS & Windows platforms. We also have a number of
-Clients for whom we have installed and supported Samba.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-QUEENSLAND - AUSTRALIA
-
-Plugged In Software Pty Ltd
-PO Box 4130
-4/242 Hawken Drive
-St. Lucia South, Qld 4067
-Australia
-http://www.plugged.net.au
-info@plugged.net.au
-+61 7 3876 7140
-+61 7 3876 7142 (fax)
-Point of Contact: David Wood
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SYDNEY - AUSTRALIA
-
-Philip Rhoades
-Pricom Pty Ltd
-http://www.pricom.com.au = http://203.12.131.20
-GPO Box 3411 Sydney NSW 2001 Australia
-Ph: +61:0411:185652
-Fax: +61:2:9959-3481
-E-mail: philr@mail.austasia.net
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SYDNEY - AUSTRALIA
-
-John Terpstra - Aquasoft (jht@aquasoft.com.au)
-Business: +612 9524 4040
-Home: +612 9540 3154
-Mobile: +612 414 334422 (aka 0414 334422)
-Samba Experience: Member of Samba-Team. Long term contributor to Samba
- Samba on BSD/OS, Solaris (Sparc & x86), ISC Unix, SCO Unix
- NCR SVR4, Linux, UnixWare, IBM, HP, DEC, Others.
- Training Instructor in Windows NT, wide area networking
- over TCP/IP. Providing paid-for support for Public Domain
- Software and Linux.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SYDNEY - AUSTRALIA
-
-We are a Unix & Windows developer with a consulting & support component.
-In business since 1981 with experience on Sun, hp, sgi, IBM rs6000 plus
-Windows, NT and Win95, Using Samba since September 94.
-CodeSmiths, 22 Darley Road, MANLY 2095 NSW; 977 1979; fax: 977 2116
-philm@esi.com.au (Australia; New South Wales; SYDNEY; North East)
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SYDNEY - AUSTRALIA
-
-Pacific ESI has used and installed Samba since 1.6 on a range
-of machines running SunOS, BSD/OS, SCO/UNIX, HP/UX, and Solaris,
-and WfWG and Windows95. The largest system worked on to date
-involved an Australia wide network of machines with PCs and SUNs
-at the various nodes. The in-house testing site is a wide area
-network with three sites, remotely connected with PPP and with
-SUN servers at each site to all of which are connected several
-PCs running mainly WfWG.
-
-Stefan Kjellberg Pacific Engineering Systems
-International
-info@eram.esi.com.au Voice:+61-2-9063377
-... Fax:+61-2-9063468
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WELLINGTON - NEW ZEALAND
-
-David Gempton
-Computer Consultant
-UNIX & PC Networking specialist
-TTC Technology Training Consulting
-PO Box 5444
-Lambton Quay Wellington
-New Zealand
-Phone (025) 518-574
-Email: ttcdg@cyberspace.co.nz
-------------------------------------------------------------------------------
-
-
-
-
-
-
-CANADA
-======
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
-Strata Software Limited, Kanata Ontario CANADA
-Tel: +1 (613) 591-1922 Fax: +1 (613) 591-3485
-Email: sales@strataware.com WWW: http://www.strataware.com/
-
-Strata Software Limited is a software development and consulting group
-specializing in data communications (TCP/IP and OSI), X.400, X.500 and
-LDAP, and X.509-based security. We have Samba experience with Windows NT,
-Windows 95, and Windows for Workgroups clients with Linux, Unixware
-(SVR4), and HP-UX servers.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
-WW Works Inc.
-3201 Maderna Road
-Burlington, Ontario
-Canada L7M 2W4
-
-Contact: Wade Weppler
-(905) 332-5844
-FAX: (905) 332-5535
-
-Information Systems Sales and Consulting.
-Specializing in Turnkey Windows NT Network environments with emphasis on
-Legacy UNIX System integration using Samba.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
- Bilyana Aleksic |Email: baleksic@atitech.ca |
- | |
-ATI Technologies Inc. |Phone: 905-882-2600 x3179 |
-75 Tiverton Court |Fax : 905-475-3930 |
-Unionville, Ontario | |
-Canada, L3R 9S3 | |
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
-Sound Software Ltd.
-20 Abelard Avenue
-Brampton, Ontario Canada
-905 452 0504
-sales@telly.org
-www.telly.org
-
-Sound Software company is a Caldera Business Partner, providing support for
-Samba and other applications running under Caldera Linux.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
-GenX Internet Laboratories Inc.
-20 Madison Ave.
-Toronto, Ontario, Canada
-M5R 1S2
-
-GenX Internet Labs is engaged in systems integration and
-the design and development of software for use over the
-internet and intranets.
-
-We install, support and can resolve most system/Samba problems
-on Linux. We are also an internet provider and use Samba to
-provide a remote office solution to our customers. This solution
-provides access to the shared resources on a corporate lan.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ONTARIO - CANADA
-
-FSC Internet
-The FSC Building
-188 Davenport Rd
-Toronto, Ontario
-Canada M5R 1J2
-
-(416) 921-4280
-fax (416) 966-2451
-
-info@fscinternet.com
-
-FSC Internet is one of Canada's largest UNIX and NT networking
-consulting firms. FSC's clients include numerous top-tier
-corporations (e.g. Mazda, Heinz), as well as mid-sized companies
-(e.g. the Vermont Telephone Company) and the public sector. FSC
-provides full consulting, implementation, support, and training
-services for all UNIX and NT network applications, including a
-special focus on internetworking (extensive Samba experience),
-security, high-performance Web applications, and Intranets. Please
-email us at info@fscinternet.com or call us at (416) 921-4280 for
-further information.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-OTTAWA - CANADA
-
-Russell McOrmond
-Open Systems Internet Consultant
-Serving individuals and organizations in the Ottawa (Ontario, Canada) area.
-voice: (613) 235-7584 FAX: (613) 230-1258
-russell@flora.org , http://www.flora.org/russell/work/
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-QUEBEC - CANADA
-
-Dataden Computer Systems
-Attn: Danny Arseneau
-arseneau@parkmed.com
-895 2nd Avenue
-Ile Bizard, Quebec
-Canada, H9C 1K3
-Tel: (514)891-2293
-Fax: (514)696-0848
-
-Dataden is company that specializes in Unix--TCP/IP networking.
-We have over 15 years of experience. We have been installing,
-configuring and maintaining Samba for clients for 1-1/2 years now. We
-have samba installations on Linx, SunOS and DEC OSF. Our biggest site
-has 4 Suns and 3 Linux servers running Samba which are serving a network
-of about 50 PC's running WFWg and Win95.
-------------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-EUROPE
-======
-
-------------------------------------------------------------------------------
-BRUSSELS - BELGIUM
-
-Phidani Software SPRL
-Rue de l'autonomie, 1
-1070 Brussels
-Belgium
-Tel : +32 (2) 5220663
-Fax: +32 (2) 5220930
-
-We provide commercial support in Belgium to large organisations
-(eg: N.A.T.O., Unisys, E.C.C. ...)
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PRAHA (PRAGUE) - CZECH
-
-AGC Praha,
-David Doubrava
-Sokolovska 141
-PRAHA 8
-180 00
-
-Tel: +42 (2) 6600 2202 Fax: +42 (2) 683 02 55
-Email: ddoubrava@agc.cz WWW: http://corwin.agc.cz/
-
-I have Samba experience with Windows NT,
-Windows 95, and Windows for Workgroups clients with Linux and HP-UX
-servers.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CAMBRIDGE - ENGLAND. Will travel / provide support world-wide.
-
-Luke Kenneth Casson Leighton
-Phone: +44 1223 570 262 or 570 264
-lkcl@cb1.com
-
-Configuration Experience:
-
-Clients: MSClient 3.0; WfWg; W95; NT 3.5 and 4.0 Workstation.
-Servers: Samba 1.9.15 and above (on-hands experience with Linux, SunOS
-4.1.3 and FreeBSD); NT 4.0 Server.
-
-Present Experience:
-
-Luke Leighton, a Samba Team member since October 1995, understands
-Browsing and WINS from having re-designed and re-written nmbd, and
-SMB/CIFS from attending the two CIFS conferences; by listening to
-discussions amongst the Samba Developers, and from answering user's
-queries on the Samba Digest.
-
-Support offered:
-
-If there are either areas of functionality that are missing or bugs
-that are affecting the performance of your company; if you require
-advice / training on the deployment and administration of SMB/CIFS
-Clients and Servers; if your company's policy only allows you to
-use samba if it is supported commercially... I am available for hire
-anywhere in the world.
-
-Long-term Project Aims:
-
-I would like to implement a CIFS proxying system suitable for Enterprise
-Networks (large Intranets: 10,000 to 150,000 simultaneous users) that is
-backwards compatible with all CIFS/SMB servers (MSClient 3.0 for DOS,
-through to NT 4.0).
-
-I would also like to implement an alternative SMB client for NT and 95.
-This would allow samba to offer secure and authenticated file and print
-access, to the extent that the laws of your country permit.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CAMBRIDGE - ENGLAND
-
-Mark Ayliffe MBCS, Technical Consultant
-Protechnic Computers Limited http://www.prot.demon.co.uk
-7 Signet Court Tel +44 1223 314855
-Swann's Road Fax +44 1223 368168
-Cambridge CB5 8LA
-England
-
-
-Protechnic Computers Limited has experience of installing and
-maintaining Samba on the following platforms:
-
-HP/UX 9.0x, 10.1x & 10.2x
-DG/UX, Motorola and Intel
-Digital UNIX
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-CORNWALL - ENGLAND
-
-Starstream Communications Ltd
-Unit 9
-Moss Side Industrial Estate
-Callington
-Cornwall
-PL17 7DU
-United Kingdom
-
-Phone +44 1579 384072 Fax +44 1579 384267
-
-Contact : Terry Moore-Read terry@starstream.co.uk
-
-Website : http://www.ndu-star.demon.co.uk shortly moving to
-http://www.starstream.co.uk
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-FAREHAM - ENGLAND
-
-High Field Technology Ltd
-Little Park Farm Road, Segensworth West,
-Fareham, Hants PO15 5SJ, UK.
-sales@hft.co.uk tel +44 148 957 0111 fax +44 148 957 0555
-
-Company skills: Real time hardware and software systems
-
-Samba experience: BSD/OS, Linux, LynxOS <==> WFWG, NT
-
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-LEICESTERSHIRE - ENGLAND
-
-TECTONIC LIMITED
-WESTWOOD
-78 LOUGHBOROUGH ROAD
-QUORN
-LEICESTERSHIRE
-LE12 8DX
-
-TELEPHONE 01509-620922
-FAX 01509-620933
-
-Contact Samantha Hull
-
-We are unix orientated but also specialise in pc to unix communications, we
-know and understand pc-nfs, (hence our interest in samba).
-we support sunos, solaris 1.x and 2.x, hp-ux 9.0 and 10.0, osf (or dec unix,
-whichever you prefer), winnt, wfwg and win95.
-
-We are already talking to a couple of very large samba users here in the uk.
-Tectonic are in the process of creating the UK SAMBA USER GROUP and would
-appreciate any feedback or queries.
-
-For samba support, and for details on the UK SAMBA USER GROUP, please contact
-me at: sam@tectonic.demon.co.uk
-
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-LONDON - ENGLAND
-
-Mark H. Preston,
-Network Analyst, | Email : mpreston@sghms.ac.uk
-Computer Unit, | Tel : +44 (0)181 725-5434
-St. George's Hospital Med School, | Fax : +44 (0)181 725-3583
-London SW17 ORE. | WWW : http://www.sghms.ac.uk
-
-Samba Experience:
-Server: Solaris 2.3 & 2.4, Irix 5.2 & 5.3
-Client: WinNT, Win95, WfWg, Win3.1, Ms-LanMan, DHCP support
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-LONDON - ENGLAND
-
-Name: Paul Dunne
-Address: 30 Onslow Gardens
- London
- N10 3JU
- UK
-Phone: +44 (0)181-374 8194
-Fax: None
-E-mail: paul@tiny1.demon.co.uk
-URL: http://www.tiny1.demon.co.uk
-
-Contact: Paul Dunne
-Type of support: E-mail and onsite.
-
-Expertise: Installing and troubleshooting Samba, on Linux and Win95.
-Sample prices: Basic rate £30/hour.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-READING - ENGLAND
-
-Philip Hands | E-Mail: info@hands.com Tel:+44 118 9545656
-Philip Hands Computing Ltd. | Mobile: +44 802 242989 Fax:+44 118 9474655
-Unit 1, Cherry Close, Caversham, Reading RG4 8UP ENGLAND
-
-Samba experience:
- Server platforms: Linux,SVR4,SVR3.2 & Sequent ptx
- Clients: WfWg, W3.1, OS2 and MS-LanMan
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PARIS - FRANCE
-
-Alcove
-7, rue Royer-Bendelé
-92230 Gennevilliers
- Email: alcove@alcove.fr
-http://www.alcove.fr Phone number: +33 01 40 85 80 06
- Fax number: +33 01 47 90 40 42
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BERLIN - GERMANY
-
-Name: innominate
- Multifunktionale Serverloesungen und IT-Dienstleistungen
-
-Address: Stresemannstraße 128, 10117 Berlin
-Country: Germany
-Phone: +49 30 202 90 477
-Fax: +49 30 202 90 249
-EMail: info@innominate.de
-Web: http://innominate.de
-
-Type of support: vor Ort, Email, Fernzugriff ueber Internet/ISDN,
-
-Wir verfuegen ueber umfangreiche Erfahrung mit Samba, vor allem
-in Intranetumgebungen. Neben Beratung, Dienstleistung
-und Schulung bieten wir auch individuell vorkonfigurierte
-Kommunikationsserver ("Lingo") auf der Basis von Linux an.
-Neben anderen Modulen (ISDN/Internet/Intranet/Email/Proxy
-u.a.) ist in Lingo ein Fileserver-Modul auf Samba-Basis inklusive
-einem mehrstufigen Firewallsystem enthalten.
-Außerdem verfuegt Lingo ueber eine grafische Administrations-
-oberflaeche, mit der z.B. das Hinzufuegen von neuen Benutzern
-von jedem Client per WWW-Browser moeglich ist.
-
-Prices: Komplettpreise fuer Lingo nach Vereinbarung
- 120 DM/Stunde fuer Dienstleistung
- Schulung nach Vereinbarung
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BERLIN - GERMANY
-
-Ing. Buero Buehler
-Dipl.-Ing. Frank Buehler
-Paul-Krause-Str. 5
-14129 Berlin
-Germany
-
-Phone: +49/(0)177/825 33 80 Fax: +49/(0)30/803-3039
-mailto:fb@hydmech.fb12.TU-Berlin.de
-
-We install and maintain small to middle sized Linux-Windows
-networks within the Berlin area and are available for consulting and
-questions about networking, Linux, database systems and electronics.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BIELEFELD - GERMANY
-
-I am located in Bielefeld/Germany and have been doing Unix consultancy
-work for the past 8 years throughout Germany and the rest of Europe. I
-can be contacted by email at <jpm@mens.de> or via phone at +49 521
-9225922 or telefax at +49 521 9225924.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-BIELEFELD - GERMANY
-
-Name : media engineering gmbh
-Address: Bleichstr. 77a , D-33607 Bielefeld
-Phone : +49-521-1365640
-Fax : +49-521-1365642
-eMail : info@media-eng.bielefeld.com
-URL : http://www.media-eng.bielefeld.com/
-Contact: Dipl.Ing. Hartmut Holzgraefe
-
-Type of support: phone, eMail, inhouse, remote administration
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-DREIEICH - GERMANY
-
-A. G. Schindler <schindler@az1.de>
-c/o Alpha Zero One Gmbh
-Frankfurter Str. 141
-D - 63303 Dreieich
-Germany
-
-AZ1 is a company of Value Added Resellers (VARs) of Digital Equipment
-Corp. products and solution provider for Industry Applications.
-
-We're providing commercial support for Samba running on DEC hardware
-under Digital Unix (R), Digital OpenVMS (R) and Linux.
-
-Contract based and hotline support available. Fast response on-site
-support coming soon for the Franfurt / Main area.
-
-Pathworks or WinNT to Samba migrators welcome !
-
-Please contact us via: schindler@az1.de
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GOETTINGEN - GERMANY
-
-Service Network GmbH
-Hannah Vogt Str. 1
-37085 Goettingen
-Germany
-Phone: +49-551-507775
-Fax: +49-551-507776
-http://www.sernet.de/
-samba@sernet.de
-
-SerNet is a company doing LAN consulting and training. We offer
-Internet access for our customers. We have experience with many
-different kinds of Unix, especially Linux, as well as NetWare and NT.
-Volker Lendecke, one of our our founders and a Samba Team member,
-has gained a lot of SMB/CIFS and NetWare experience writing smbfs and
-ncpfs, the Linux kernel file systems that enable Linux to access
-Windows NT and other SMB/CIFS servers, and NetWare Servers.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GREIFSWALD - GERMANY
-
-Mr. Frank Rautenberg, Mr. Heiko Boesel, Mr. Jan Holz
-UniCon Computersysteme GmbH
-Ziegelhof 20
-D-17489 Greifswald
-email: samba@unicon-gmbh.com
-www: http://www.unicon-gmbh.com
-
-We use Samba and we provide support for our customers.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-MUENCHEN - GERMANY
-
-CONSYS GmbH
-Landsberger Str. 402
-81241 München
-Germany
-Phone: +49-89-5808181
-Fax: +49-89-588776
-http://www.consys.de/
-mailto:samba@consys.de
-
-
-CONSYS is a software company. We have experience especially with SCO Unix
-and other Unix systems, as well as with Windows 95 and NT.
-We are a Premium Partner of SCO and know and have used samba for four years.
-Our engineers know a lot about the installation of SCO Unix.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GREECE
-
-Yiorgos Adamopoulos
-Electrical and Computer Engineer
-email: adamo@InterWorks.org
-
-I can provide Samba support for the following operating systems throughout the
-whole of Greece: Windows 3.11/95/NT, Ultrix, HP-UX, NetBSD, OpenBSD, SunOS,
-Solaris, Linux, Irix.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-SZEGED - HUNGARY
-
- Name: Geza Makay
- Institute: Jozsef Attila University of Szeged
- Mail: Bolyai Institute, Aradi vertanuk tere 1.
- H-6720, Szeged, Hungary
- Tel: (62) 454-091 (Hungary's code: 36)
- Fax/Message: (62) 326-246 (Hungary's code: 36)
- E-mail: makayg@math.u-szeged.hu
- World Wide Web: http://www.math.u-szeged.hu/
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-MILANO - ITALY
-
-INFERENTIA S.p.A.
-Via Tacito 6
-20137 MILANO (MI)
-ITALY
-tel: +39 2 599281
-fax: +39 2 59928221
-contact: Consulting Division
-e-mail: consulting@inferentia.it
-www: http://www.inferentia.it
-
-INFERENTIA Consulting is available for establishing commercial support
-contracts on Samba integration with Microsoft Networks-based LANs.
-We can offer a solid experience with:
-- All flavours of Windows (Workgroups, 95, NT)
-- IBM AIX, Digital UNIX, Sun Solaris, Linux, HP/UX
-- geographically distributed networks with WAN links
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ITALY
-
-InfoTecna di Cesana D. & C. s.n.c.
-Via Cesana e Villa, 29
-20046 Biassono (Mi)
-
-Tel: ++39 39 2324054
-Fax: ++39 39 2324054
-
-e-mail: infotecn@tin.it
-URL: http://space.tin.it/internet/dsbragio
-
-We provide Samba support along with generic Linux support. Specifically we
-have implemented a powerful Fax servicing system for Samba with Win95/NT
-clients. Details could be found at our URL, currently, only in Italian.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ABANO TERME (PADOVA) - ITALY
-
-PROFUSO di Zanetti Giuseppe - Studio di Consulenza Informatica
-Abano Terme (PD) - ITALY
-profuso@profuso.com
-http://www.profuso.com/
-Phone: ++39 49 8059070 / ++39 348 2220811
-
-We provide all possible support for Linux, UNIX,
-development, security and system integration.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PALERMO - ITALY
-
-Francesco Cardinale
-E-Mail: cardinal@palermo.italtel.it
-Samba experience: SVR3.2, SOLARIS, ULTRIX, LINUX <--> DOS LAN-MAN, WFW
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-PISA - ITALY
-
-I3 ICUBE s.r.l.
-Via Pascoli 8
-56125 PISA (PI)
-ITALY
-tel: 050/503202
-fax: 050/504617
-contact person: Marco Bizzarri
-e-mail: m.bizzarri@icube.it
-www: http://www.icube.it/
-
-Our company offers commercial support to integrate eterogenous networks.
-We can provide support for the following architectures:
-
-Windows:
-Windows for Workgroup
-Windows 95
-Windows NT
-
-Unix:
-Linux
-Solaris
-Digital Unix
-
-Macintosh
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-ROME - ITALY
-
-Company: Pantheon Srl
- Via del Tritone 132
- 00187 ROME - ITALY
-
-Phone/Fax: +39 6 47823666
-URL: http://www.pantheon.it
-
-Contact: Dario Centofanti <dario@pantheon.it>
-
-Pantheon provide support for SaMBa and other TCP/IP applications running
-under Linux. We are also an internet provider.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-VICENZA - ITALY
-
-Company: AVnet srl
-Address: via Fogazzaro, 2
- 36015 SCHIO (VI)
- ITALY
-phone: 0445/511445
-fax: 0445/511449
-contact: Giovanni Panozzo
-
-e-mail: samba@avnet.it
-
-
-AVnet provides consulting and support on all problems
-regarding unix-to-win networking. We operate as ISP and we
-offer in depth TCP/IP knowledge for lan, intranet and WANs.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-LUXEMBOURG - EUROPE
-
-E.C.C. sa
-11, Rue Bettlange
-L-9657 HARLANGE
-Grand-Duche de Luxembourg
-Tel. +352 93615 (from 09/97: +352 993615)
-Fax +352 93569 (from 09/97: +352 993569)
-oontact person: Stefaan A Eeckels
-email: Stefaan.Eeckels@ecc.lumail
-
-We're located in Luxembourg, and recently provided support
-for Samba at Eurostat (the European Commision), who are using
-Samba to integrate Windows NT workstations in their Solaris
-/ Windows3.1 network. All in all, things run rather smoothly now.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-DELFT - NETHERLANDS
-
-BitWizard B.V.
-van Bronckhorststraat 12
-2612 XV Delft
-The Netherlands
-Tel: +31-15-2137459
-Email: samba@BitWizard.nl
-http: http://www.bitwizard.nl/
-
-Specific activities:
-
- - Linux support
- - GNU software support
- - Linux device driver writing
- - Data recovery
-
-BitWizard supports freely distributable software,
-especially quality products like "Samba".
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-GRONINGEN - THE NETHERLANDS
-
-Company: Le Reseau netwerksystemen BV
-Address: Bieslookstraat 31
-City: Groningen
-Zip: NL-9731 HH
-Country: The Netherlands
-
-We already offer commercial support on Linux and other Unices. Together with
-an application house we have developed a office automation environment which
-heavily depends on Samba. This environment consists of a Linux application
-server which is also the Samba server. A NT server for standard office
-applications. A firewall for Internet connectivity. And a large number of
-DOS/Win3.x/W95 clients that connect to the different machines. User's home
-directories are mounted through Sambe.
-
-We also support other Unices like Solaris, SunOS, HP-UX, Digital Unix and
-AIX.
-
-Sincerely,
-
-Arthur Donkers
-Le Reseau
-
-email : arthur@reseau.nl
-phone : (+31) 595 552431
-URL http://www.reseau.nl
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-NIJMEGEN - THE NETHERLANDS
-
-Xtended Internet (http://www.xtdnet.nl/)
-
-Broerdijk 27 Postbus 170 Tel: 31-24-360 39 19
-6523 GM Nijmegen 6500 AD Nijmegen Fax: 31-24-360 19 99
-The Netherlands The Netherlands info@xtdnet.nl
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-UTRECHT - NETHERLANDS
-
-Van den Hout Creative Communications
-Koos van den Hout
-Email : koos@kzdoos.xs4all.nl
-Phone : +31-30-2871002
-Fax : +31-30-2817051
-Samba experience: Setup and configuration for Linux, Solaris, web
-publishing related usage.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-WROCLAW - POLAND
-
-Name: Sergiusz Pawlowicz
-Institute: Wroclaw University of Technology
-Mail: room 120A, Prusa 53/55, Wroclaw 50-370, Poland
-Tel: +48(71)206450
-Fax: +48(71)212448
-E-mail: ser@pwr.wroc.pl
-WWW: http://www.arch.pwr.wroc.pl/
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-VETLANDA - SWEDEN
-
- IBS Industridata AB
- Box 95
- 574 21 VETLANDA
- SWEDEN
-
-Phone: +46-383-16065
-Fax: +46-8-287905
-E-mail: samba@ibs.se
-http://www.id.ibs.se/ibsid
-
-We have offices in about 20 cities in Sweden and can provide commercial
-support for Samba.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
-
-
-
-
-MIDDLE EAST
-===========
-
-------------------------------------------------------------------------------
-ISRAEL
-
-Sela Systems
-10 Ha'Kishon St.
-Bnei-Brak
-Israel 51203
-Phone: +972-3-6190999
-Fax: +972-3-6190992
-Email: info@sela.co.il
-
-We have been involved in Samba projects since 1995.
-We have several large-scale clients using Samba in their network
-and getting support from us. We also provide Unix/NT/Novell/Win95
-system and network services and solutions. Our company also provides
-courses and training in many aspects of systems and networking,
-including TCP/IP and Samba.
-------------------------------------------------------------------------------
-
-------------------------------------------------------------------------------
diff --git a/docs/textdocs/Tracing.txt b/docs/textdocs/Tracing.txt
deleted file mode 100644
index d8b38378228..00000000000
--- a/docs/textdocs/Tracing.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Contributor: Andrew Tridgell <samba-bugs@samba.anu.edu.au>
-Date: Old
-Status: Questionable
-
-Subject: How to trace samba system calls for debugging purposes
-=============================================================================
-
-This file describes how to do a system call trace on Samba to work out
-what its doing wrong. This is not for the faint of heart, but if you
-are reading this then you are probably desperate.
-
-Actually its not as bad as the the above makes it sound, just don't
-expect the output to be very pretty :-)
-
-Ok, down to business. One of the big advantages of unix systems is
-that they nearly all come with a system trace utility that allows you
-to monitor all system calls that a program is making. This is
-extremely using for debugging and also helps when trying to work out
-why something is slower than you expect. You can use system tracing
-without any special compilation options.
-
-The system trace utility is called different things on different
-systems. On Linux systems its called strace. Under SunOS 4 its called
-trace. Under SVR4 style systems (including solaris) its called
-truss. Under many BSD systems its called ktrace.
-
-The first thing you should do is read the man page for your native
-system call tracer. In the discussion below I'll assume its called
-strace as strace is the only portable system tracer (its available for
-free for many unix types) and its also got some of the nicest
-features.
-
-Next, try using strace on some simple commands. For example, "strace
-ls" or "strace echo hello".
-
-You'll notice that it produces a LOT of output. It is showing you the
-arguments to every system call that the program makes and the
-result. Very little happens in a program without a system call so you
-get lots of output. You'll also find that it produces a lot of
-"preamble" stuff showing the loading of shared libraries etc. Ignore
-this (unless its going wrong!)
-
-For example, the only line that really matters in the "strace echo
-hello" output is:
-
-write(1, "hello\n", 6) = 6
-
-all the rest is just setting up to run the program.
-
-Ok, now you're famialiar with strace. To use it on Samba you need to
-strace the running smbd daemon. The way I tend ot use it is to first
-login from my Windows PC to the Samba server, then use smbstatus to
-find which process ID that client is attached to, then as root I do
-"strace -p PID" to attach to that process. I normally redirect the
-stderr output from this command to a file for later perusal. For
-example, if I'm using a csh style shell:
-
- strace -f -p 3872 >& strace.out
-
-or with a sh style shell:
-
- strace -f -p 3872 > strace.out 2>&1
-
-Note the "-f" option. This is only available on some systems, and
-allows you to trace not just the current process, but any children it
-forks. This is great for finding printing problems caused by the
-"print command" being wrong.
-
-Once you are attached you then can do whatever it is on the client
-that is causing problems and you will capture all the system calls
-that smbd makes.
-
-So how do you interpret the results? Generally I search thorugh the
-output for strings that I know will appear when the problem
-happens. For example, if I am having touble with permissions on a file
-I would search for that files name in the strace output and look at
-the surrounding lines. Another trick is to match up file descriptor
-numbers and "follow" what happens to an open file until it is closed.
-
-Beyond this you will have to use your initiative. To give you an idea
-of wehat you are looking for here is a piece of strace output that
-shows that /dev/null is not world writeable, which causes printing to
-fail with Samba:
-
-[pid 28268] open("/dev/null", O_RDWR) = -1 EACCES (Permission denied)
-[pid 28268] open("/dev/null", O_WRONLY) = -1 EACCES (Permission denied)
-
-the process is trying to first open /dev/null read-write then
-read-only. Both fail. This means /dev/null has incorrect permissions.
-
-Have fun!
-
-(please send updates/fixes to this file to samba-bugs@samba.anu.edu.au)
diff --git a/docs/textdocs/UNIX-SMB.txt b/docs/textdocs/UNIX-SMB.txt
deleted file mode 100644
index ec2e657c052..00000000000
--- a/docs/textdocs/UNIX-SMB.txt
+++ /dev/null
@@ -1,231 +0,0 @@
-Contributor: Andrew Tridgell <samba-bugs@samba.anu.edu.au>
-Date: April 1995
-
-Subject: Discussion of NetBIOS in a Unix World
-============================================================================
-
-This is a short document that describes some of the issues that
-confront a SMB implementation on unix, and how Samba copes with
-them. They may help people who are looking at unix<->PC
-interoperability.
-
-It was written to help out a person who was writing a paper on unix to
-PC connectivity.
-
-
-Usernames
-=========
-
-The SMB protocol has only a loose username concept. Early SMB
-protocols (such as CORE and COREPLUS) have no username concept at
-all. Even in later protocols clients often attempt operations
-(particularly printer operations) without first validating a username
-on the server.
-
-Unix security is based around username/password pairs. A unix box
-should not allow clients to do any substantive operation without some
-sort of validation.
-
-The problem mostly manifests itself when the unix server is in "share
-level" security mode. This is the default mode as the alternative
-"user level" security mode usually forces a client to connect to the
-server as the same user for each connected share, which is
-inconvenient in many sites.
-
-In "share level" security the client normally gives a username in the
-"session setup" protocol, but does not supply an accompanying
-password. The client then connects to resources using the "tree
-connect" protocol, and supplies a password. The problem is that the
-user on the PC types the username and the password in different
-contexts, unaware that they need to go together to give access to the
-server. The username is normally the one the user typed in when they
-"logged onto" the PC (this assumes Windows for Workgroups). The
-password is the one they chose when connecting to the disk or printer.
-
-The user often chooses a totally different username for their login as
-for the drive connection. Often they also want to access different
-drives as different usernames. The unix server needs some way of
-divining the correct username to combine with each password.
-
-Samba tries to avoid this problem using several methods. These succeed
-in the vast majority of cases. The methods include username maps, the
-service%user syntax, the saving of session setup usernames for later
-validation and the derivation of the username from the service name
-(either directly or via the user= option).
-
-File Ownership
-==============
-
-The commonly used SMB protocols have no way of saying "you can't do
-that because you don't own the file". They have, in fact, no concept
-of file ownership at all.
-
-This brings up all sorts of interesting problems. For example, when
-you copy a file to a unix drive, and the file is world writeable but
-owned by another user the file will transfer correctly but will
-receive the wrong date. This is because the utime() call under unix
-only succeeds for the owner of the file, or root, even if the file is
-world writeable. For security reasons Samba does all file operations
-as the validated user, not root, so the utime() fails. This can stuff
-up shared development diectories as programs like "make" will not get
-file time comparisons right.
-
-There are several possible solutions to this problem, including
-username mapping, and forcing a specific username for particular
-shares.
-
-Passwords
-=========
-
-Many SMB clients uppercase passwords before sending them. I have no
-idea why they do this. Interestingly WfWg uppercases the password only
-if the server is running a protocol greater than COREPLUS, so
-obviously it isn't just the data entry routines that are to blame.
-
-Unix passwords are case sensitive. So if users use mixed case
-passwords they are in trouble.
-
-Samba can try to cope with this by either using the "password level"
-option which causes Samba to try the offered password with up to the
-specified number of case changes, or by using the "password server"
-option which allows Samba to do its validation via another machine
-(typically a WinNT server).
-
-Samba supports the password encryption method used by SMB
-clients. Note that the use of password encryption in Microsoft
-networking leads to password hashes that are "plain text equivalent".
-This means that it is *VERY* important to ensure that the Samba
-smbpasswd file containing these password hashes is only readable
-by the root user. See the documentation ENCRYPTION.txt for more
-details.
-
-
-Locking
-=======
-
-The locking calls available under a DOS/Windows environment are much
-richer than those available in unix. This means a unix server (like
-Samba) choosing to use the standard fcntl() based unix locking calls
-to implement SMB locking has to improvise a bit.
-
-One major problem is that dos locks can be in a 32 bit (unsigned)
-range. Unix locking calls are 32 bits, but are signed, giving only a 31
-bit range. Unfortunately OLE2 clients use the top bit to select a
-locking range used for OLE semaphores.
-
-To work around this problem Samba compresses the 32 bit range into 31
-bits by appropriate bit shifting. This seems to work but is not
-ideal. In a future version a separate SMB lockd may be added to cope
-with the problem.
-
-It also doesn't help that many unix lockd daemons are very buggy and
-crash at the slightest provocation. They normally go mostly unused in
-a unix environment because few unix programs use byte range
-locking. The stress of huge numbers of lock requests from dos/windows
-clients can kill the daemon on some systems.
-
-The second major problem is the "opportunistic locking" requested by
-some clients. If a client requests opportunistic locking then it is
-asking the server to notify it if anyone else tries to do something on
-the same file, at which time the client will say if it is willing to
-give up its lock. Unix has no simple way of implementing
-opportunistic locking, and currently Samba has no support for it.
-
-Deny Modes
-==========
-
-When a SMB client opens a file it asks for a particular "deny mode" to
-be placed on the file. These modes (DENY_NONE, DENY_READ, DENY_WRITE,
-DENY_ALL, DENY_FCB and DENY_DOS) specify what actions should be
-allowed by anyone else who tries to use the file at the same time. If
-DENY_READ is placed on the file, for example, then any attempt to open
-the file for reading should fail.
-
-Unix has no equivalent notion. To implement this Samba uses either lock
-files based on the files inode and placed in a separate lock
-directory or a shared memory implementation. The lock file method
-is clumsy and consumes processing and file resources,
-the shared memory implementation is vastly prefered and is turned on
-by default for those systems that support it.
-
-Trapdoor UIDs
-=============
-
-A SMB session can run with several uids on the one socket. This
-happens when a user connects to two shares with different
-usernames. To cope with this the unix server needs to switch uids
-within the one process. On some unixes (such as SCO) this is not
-possible. This means that on those unixes the client is restricted to
-a single uid.
-
-Note that you can also get the "trapdoor uid" message for other
-reasons. Please see the FAQ for details.
-
-Port numbers
-============
-
-There is a convention that clients on sockets use high "unprivilaged"
-port numbers (>1000) and connect to servers on low "privilaged" port
-numbers. This is enforced in Unix as non-root users can't open a
-socket for listening on port numbers less than 1000.
-
-Most PC based SMB clients (such as WfWg and WinNT) don't follow this
-convention completely. The main culprit is the netbios nameserving on
-udp port 137. Name query requests come from a source port of 137. This
-is a problem when you combine it with the common firewalling technique
-of not allowing incoming packets on low port numbers. This means that
-these clients can't query a netbios nameserver on the other side of a
-low port based firewall.
-
-The problem is more severe with netbios node status queries. I've
-found that WfWg, Win95 and WinNT3.5 all respond to netbios node status
-queries on port 137 no matter what the source port was in the
-request. This works between machines that are both using port 137, but
-it means it's not possible for a unix user to do a node status request
-to any of these OSes unless they are running as root. The answer comes
-back, but it goes to port 137 which the unix user can't listen
-on. Interestingly WinNT3.1 got this right - it sends node status
-responses back to the source port in the request.
-
-
-Protocol Complexity
-===================
-
-There are many "protocol levels" in the SMB protocol. It seems that
-each time new functionality was added to a Microsoft operating system,
-they added the equivalent functions in a new protocol level of the SMB
-protocol to "externalise" the new capabilities.
-
-This means the protocol is very "rich", offering many ways of doing
-each file operation. This means SMB servers need to be complex and
-large. It also means it is very difficult to make them bug free. It is
-not just Samba that suffers from this problem, other servers such as
-WinNT don't support every variation of every call and it has almost
-certainly been a headache for MS developers to support the myriad of
-SMB calls that are available.
-
-There are about 65 "top level" operations in the SMB protocol (things
-like SMBread and SMBwrite). Some of these include hundreds of
-sub-functions (SMBtrans has at least 120 sub-functions, like
-DosPrintQAdd and NetSessionEnum). All of them take several options
-that can change the way they work. Many take dozens of possible
-"information levels" that change the structures that need to be
-returned. Samba supports all but 2 of the "top level" functions. It
-supports only 8 (so far) of the SMBtrans sub-functions. Even NT
-doesn't support them all.
-
-Samba currently supports up to the "NT LM 0.12" protocol, which is the
-one preferred by Win95 and WinNT3.5. Luckily this protocol level has a
-"capabilities" field which specifies which super-duper new-fangled
-options the server suports. This helps to make the implementation of
-this protocol level much easier.
-
-There is also a problem with the SMB specications. SMB is a X/Open
-spec, but the X/Open book is far from ideal, and fails to cover many
-important issues, leaving much to the imagination. Microsoft recently
-renamed the SMB protocol CIFS (Common Internet File System) and have
-published new specifications. These are far superior to the old
-X/Open documents but there are still undocumented calls and features.
-This specification is actively being worked on by a CIFS developers
-mailing list hosted by Microsft.
-
diff --git a/docs/textdocs/UNIX_INSTALL.txt b/docs/textdocs/UNIX_INSTALL.txt
deleted file mode 100644
index d78c36a4c9c..00000000000
--- a/docs/textdocs/UNIX_INSTALL.txt
+++ /dev/null
@@ -1,343 +0,0 @@
-Contributor: Andrew Tridgell <samba-bugs@samba.anu.edu.au>
-Date: Unknown
-Status: Current
-Updated: August 25, 1997
-
-Subject: HOW TO INSTALL AND TEST SAMBA
-===============================================================================
-
-
-STEP 0. Read the man pages. They contain lots of useful info that will
-help to get you started. If you don't know how to read man pages then
-try something like:
-
- nroff -man smbd.8 | more
-
-Unfortunately, having said this, the man pages are sadly out of date and
-really need more effort to maintain them. Other sources of information
-are pointed to by the Samba web site, http://samba.anu.edu.au/samba.
-
-STEP 1. Building the binaries
-
-To do this, first edit the file source/Makefile. You will find that
-the Makefile has an entry for most unixes and you need to uncomment
-the one that matches your operating system.
-
-You should also edit the section at the top of the Makefile which
-determines where things will be installed. You need to get this right
-before compilation as Samba needs to find some things at runtime
-(smbrun in particular). There are also settings for where you want
-your log files etc. Make sure you get these right, and that the
-directories exist.
-
-Then type "make". This will create the binaries.
-
-Once it's successfully compiled you can use "make install" to install
-the binaries and manual pages. You can separately install the binaries
-and/or man pages using "make installbin" and "make installman".
-
-Note that if you are upgrading for a previous version of Samba you
-might like to know that the old versions of the binaries will be
-renamed with a ".old" extension. You can go back to the previous
-version with "make revert" if you find this version a disaster!
-
-STEP 2. The all important step
-
-At this stage you must fetch yourself a coffee or other drink you find
-stimulating. Getting the rest of the install right can sometimes be
-tricky, so you will probably need it.
-
-If you have installed samba before then you can skip this step.
-
-STEP 3. Create the smb configuration file.
-
-There are sample configuration files in the examples subdirectory in
-the distribution. I suggest you read them carefully so you can see how
-the options go together in practice. See the man page for all the
-options.
-
-The simplest useful configuration file would be something like this:
-
- workgroup = MYGROUP
-
- [homes]
- guest ok = no
- read only = no
-
-which would allow connections by anyone with an account on the server,
-using either their login name or "homes" as the service name. (Note
-that I also set the workgroup that Samba is part of. See BROWSING.txt
-for defails)
-
-Note that "make install" will not install a smb.conf file. You need to
-create it yourself. You will also need to create the path you specify
-in the Makefile for the logs etc, such as /usr/local/samba.
-
-Make sure you put the smb.conf file in the same place you specified in
-the Makefile.
-
-STEP 4. Test your config file with testparm
-
-It's important that you test the validity of your smb.conf file using
-the testparm program. If testparm runs OK then it will list the loaded
-services. If not it will give an error message.
-
-Make sure it runs OK and that the services look resonable before
-proceeding.
-
-STEP 5. Starting the smbd and nmbd.
-
-You must choose to start smbd and nmbd either as daemons or from
-inetd. Don't try to do both! Either you can put them in inetd.conf
-and have them started on demand by inetd, or you can start them as
-daemons either from the command line or in /etc/rc.local. See the man
-pages for details on the command line options.
-
-The main advantage of starting smbd and nmbd as a daemon is that they
-will respond slightly more quickly to an initial connection
-request. This is, however, unlilkely to be a problem.
-
-Step 5a. Starting from inetd.conf
-
-NOTE; The following will be different if you use NIS or NIS+ to
-distributed services maps.
-
-Look at your /etc/services. What is defined at port 139/tcp. If
-nothing is defined then add a line like this:
-
-netbios-ssn 139/tcp
-
-similarly for 137/udp you should have an entry like:
-
-netbios-ns 137/udp
-
-Next edit your /etc/inetd.conf and add two lines something like this:
-
-netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
-netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd
-
-The exact syntax of /etc/inetd.conf varies between unixes. Look at the
-other entries in inetd.conf for a guide.
-
-NOTE: Some unixes already have entries like netbios_ns (note the
-underscore) in /etc/services. You must either edit /etc/services or
-/etc/inetd.conf to make them consistant.
-
-NOTE: On many systems you may need to use the "interfaces" option in
-smb.conf to specify the IP address and netmask of your interfaces. Run
-ifconfig as root if you don't know what the broadcast is for your
-net. nmbd tries to determine it at run time, but fails on some
-unixes. See the section on "testing nmbd" for a method of finding if
-you need to do this.
-
-!!!WARNING!!! Many unixes only accept around 5 parameters on the
-command line in inetd. This means you shouldn't use spaces between the
-options and arguments, or you should use a script, and start the
-script from inetd.
-
-Restart inetd, perhaps just send it a HUP. If you have installed an
-earlier version of nmbd then you may need to kill nmbd as well.
-
-Step 5b. Alternative: starting it as a daemon
-
-To start the server as a daemon you should create a script something
-like this one, perhaps calling it "startsmb"
-
-#!/bin/sh
-/usr/local/samba/bin/smbd -D
-/usr/local/samba/bin/nmbd -D
-
-then make it executable with "chmod +x startsmb"
-
-You can then run startsmb by hand or execute it from /etc/rc.local
-
-To kill it send a kill signal to the processes nmbd and smbd.
-
-NOTE: If you use the SVR4 style init system then you may like to look
-at the examples/svr4-startup script to make Samba fit into that system.
-
-
-STEP 6. Try listing the shares available on your server
-
-smbclient -L yourhostname
-
-Your should get back a list of shares available on your server. If you
-don't then something is incorrectly setup. Note that this method can
-also be used to see what shares are available on other LanManager
-clients (such as WfWg).
-
-If you choose user level security then you may find that Samba requests
-a password before it will list the shares. See the smbclient docs for
-details. (you can force it to list the shares without a password by
-adding the option -U% to the command line. This will not work with
-non-Samba servers)
-
-STEP 7. try connecting with the unix client. eg:
-
-smbclient '\\yourhostname\aservice'
-
-Typically the "yourhostname" would be the name of the host where you
-installed smbd. The "aservice" is any service you have defined in the
-smb.conf file. Try your user name if you just have a [homes] section
-in smb.conf.
-
-For example if your unix host is bambi and your login name is fred you
-would type:
-
-smbclient '\\bambi\fred'
-
-NOTE: The number of slashes to use depends on the type of shell you
-use. You may need '\\\\bambi\\fred' with some shells.
-
-STEP 8. Try connecting from a dos/WfWg/Win95/NT/os-2 client. Try
-mounting disks. eg:
-
-net use d: \\servername\service
-
-Try printing. eg:
-
-net use lpt1: \\servername\spoolservice
-print filename
-
-Celebrate, or send me a bug report!
-
-WHAT IF IT DOESN'T WORK?
-========================
-
-If nothing works and you start to think "who wrote this pile of trash"
-then I suggest you do step 2 again (and again) till you calm down.
-
-Then you might read the file DIAGNOSIS.txt and the FAQ. If you are
-still stuck then try the mailing list or newsgroup (look in the README
-for details). Samba has been successfully installed at thousands of
-sites worldwide, so maybe someone else has hit your problem and has
-overcome it. You could also use the WWW site to scan back issues of
-the samba-digest.
-
-When you fix the problem PLEASE send me some updates to the
-documentation (or source code) so that the next person will find it
-easier.
-
-DIAGNOSING PROBLEMS
-===================
-
-If you have instalation problems then go to DIAGNOSIS.txt to try to
-find the problem.
-
-SCOPE IDs
-=========
-
-By default Samba uses a blank scope ID. This means all your windows
-boxes must also have a blank scope ID. If you really want to use a
-non-blank scope ID then you will need to use the -i <scope> option to
-nmbd, smbd, and smbclient. All your PCs will need to have the same
-setting for this to work. I do not recommend scope IDs.
-
-
-CHOOSING THE PROTOCOL LEVEL
-===========================
-
-The SMB protocol has many dialects. Currently Samba supports 5, called
-CORE, COREPLUS, LANMAN1, LANMAN2 and NT1.
-
-You can choose what maximum protocol to support in the smb.conf
-file. The default is NT1 and that is the best for the vast majority of
-sites.
-
-In older versions of Samba you may have found it necessary to use
-COREPLUS. The limitations that led to this have mostly been fixed. It
-is now less likely that you will want to use less than LANMAN1. The
-only remaining advantage of COREPLUS is that for some obscure reason
-WfWg preserves the case of passwords in this protocol, whereas under
-LANMAN1, LANMAN2 or NT1 it uppercases all passwords before sending them,
-forcing you to use the "password level=" option in some cases.
-
-The main advantage of LANMAN2 and NT1 is support for long filenames with some
-clients (eg: smbclient, Windows NT or Win95).
-
-See the smb.conf manual page for more details.
-
-Note: To support print queue reporting you may find that you have to
-use TCP/IP as the default protocol under WfWg. For some reason if you
-leave Netbeui as the default it may break the print queue reporting on
-some systems. It is presumably a WfWg bug.
-
-
-PRINTING FROM UNIX TO A CLIENT PC
-=================================
-
-To use a printer that is available via a smb-based server from a unix
-host you will need to compile the smbclient program. You then need to
-install the script "smbprint". Read the instruction in smbprint for
-more details.
-
-There is also a SYSV style script that does much the same thing called
-smbprint.sysv. It contains instructions.
-
-
-LOCKING
-=======
-
-One area which sometimes causes trouble is locking.
-
-There are two types of locking which need to be performed by a SMB
-server. The first is "record locking" which allows a client to lock a
-range of bytes in a open file. The second is the "deny modes" that are
-specified when a file is open.
-
-Samba supports "record locking" using the fcntl() unix system
-call. This is often implemented using rpc calls to a rpc.lockd process
-running on the system that owns the filesystem. Unfortunately many
-rpc.lockd implementations are very buggy, particularly when made to
-talk to versions from other vendors. It is not uncommon for the
-rpc.lockd to crash.
-
-There is also a problem translating the 32 bit lock requests generated
-by PC clients to 31 bit requests supported by most
-unixes. Unfortunately many PC applications (typically OLE2
-applications) use byte ranges with the top bit set as semaphore
-sets. Samba attempts translation to support these types of
-applications, and the translation has proved to be quite successful.
-
-Strictly a SMB server should check for locks before every read and
-write call on a file. Unfortunately with the way fcntl() works this
-can be slow and may overstress the rpc.lockd. It is also almost always
-unnecessary as clients are supposed to independently make locking
-calls before reads and writes anyway if locking is important to
-them. By default Samba only makes locking calls when explicitly asked
-to by a client, but if you set "strict locking = yes" then it will
-make lock checking calls on every read and write.
-
-You can also disable by range locking completely using "locking =
-no". This is useful for those shares that don't support locking or
-don't need it (such as cdroms). In this case Samba fakes the return
-codes of locking calls to tell clients that everything is OK.
-
-The second class of locking is the "deny modes". These are set by an
-application when it opens a file to determine what types of access
-should be allowed simultaneously with its open. A client may ask for
-DENY_NONE, DENY_READ, DENY_WRITE or DENY_ALL. There are also special
-compatability modes called DENY_FCB and DENY_DOS.
-
-You can disable share modes using "share modes = no". This may be
-useful on a heavily loaded server as the share modes code is very
-slow. See also the FAST_SHARE_MODES option in the Makefile for a way
-to do full share modes very fast using shared memory (if your OS
-supports it).
-
-
-MAPPING USERNAMES
-=================
-
-If you have different usernames on the PCs and the unix server then
-take a look at the "username map" option. See the smb.conf man page
-for details.
-
-
-OTHER CHARACTER SETS
-====================
-
-If you have problems using filenames with accented characters in them
-(like the German, French or Scandinavian character sets) then I
-recommmend you look at the "valid chars" option in smb.conf and also
-take a look at the validchars package in the examples directory.
diff --git a/docs/textdocs/Win95.txt b/docs/textdocs/Win95.txt
deleted file mode 100644
index 69330c512d4..00000000000
--- a/docs/textdocs/Win95.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-Copyright (C) 1997 - Samba-Team
-Contributed Date: August 20, 1997
-Last Update: August 20, 1997
-
-Subject: Windows 95 and Samba Interoperability
-===============================================================================
-
-Password Handling:
-------------------
-Microsoft periodically release updates to all their operating systems. Some of
-these are welcomed while others cause us to change the way we do things. Few
-people like change, particularly if the change is unexpected. The best advice
-always is to read the documentation provided BEFORE applying an update.
-
-One of the recent Win95 updates (VRDRUPD.EXE) disables plain text (also called
-clear text) password authentication. The effects of this updates are desirable
-where MS Windows NT is providing the password authentication service. This
-update is most undesirable where Samba must provide the authentication service
-unless Samba has been specifically configured to use encrypted passwords _AND_
-has been linked with the libdes library.
-
-If the above conditions have not been complied with, and you are using Samba,
-then Windows 95 clients will NOT be able to authenticate to a Samba server.
-
-To re-enable plain text password capabilities AFTER applying this update
-you must create a new value in the Windows 95 registry.
-
-Either foillow the following procedure or just double click on the
-file Win95_PlainPassword.reg for an easier way to do this.
-
-Procedure:
-1) Launch the Registry Editor as follows:
- Click on: /Start/Run
- Type "regedit" and press enter.
-
-2) Double click on: HKEY_LOCAL_MACHINE
-
-3) Locate the following Key:
- /HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/VNETSUP
-
-4) From the menu bar select Edit/New/DWORD Value
-
-5) Rename the entry from "New Value #1" to:
- EnablePlainTextPassword
-
-6) Press Enter, then double click on the new entry.
- A dialog box will pop up and enable you to set a value.
- You must set this value to 1.
-
--------------------------------------------------------------------------------
-
-Windows 95 Updates:
--------------------
-When using Windows 95 OEM SR2 the following updates are recommended where Samba
-is being used. Please NOTE that the above change will affect you once these
-updates have been installed.
-
-There are more updates than the ones mentioned here. You are referred to the
-Microsoft Web site for all currently available updates to your specific version
-of Windows 95.
-
-Kernel Update: KRNLUPD.EXE
-Ping Fix: PINGUPD.EXE
-RPC Update: RPCRTUPD.EXE
-TCP/IP Update: VIPUPD.EXE
-Redirector Update: VRDRUPD.EXE
-
-Also, if using MS OutLook it is desirable to install the OLEUPD.EXE fix. This
-fix may stop your machine from hanging for an extended period when exiting
-OutLook and you may also notice a significant speedup when accessing network
-neighborhood services.
-
--------------------------------------------------------------------------------
-The above password information was provided by: Jochen Huppertz <jhu@nrh.de>
diff --git a/docs/textdocs/WinNT.txt b/docs/textdocs/WinNT.txt
deleted file mode 100644
index d5810535971..00000000000
--- a/docs/textdocs/WinNT.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-Contributors: Various
- Password Section - Copyright (C) 1997 - John H Terpstra
- Printing Section - Copyright (C) 1997 - Matthew Harrell
-Updated: August 20, 1997
-Status: Current
-
-Subject: Samba and Windows NT Password Handling
-=============================================================================
-
-There are some particular issues with Samba and Windows NT.
-
-Passwords:
-==========
-One of the most annoying problems with WinNT is that NT refuses to
-connect to a server that is in user level security mode and that
-doesn't support password encryption unless it first prompts the user
-for a password.
-
-This means even if you have the same password on the NT box and the
-Samba server you will get prompted for a password. Entering the
-correct password will get you connected only if Windows NT can
-communicate with Samba using a compatible mode of password security.
-
-All versions of Windows NT prior to 4.0 Service Pack 3 could negotiate
-plain text (clear text) passwords. Windows NT 4.0 Service Pack 3 changed
-this default behaviour so it now will only handle encrypted passwords.
-The following registry entry change will re-enable clear text password
-handling:
-
-Run regedt32.exe and locate the hive key entry:
-HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\rdr\parameters\
-
-Add the following value:
- EnablePlainTextPassword:REG_DWORD=1
-
-Alternatively, use the NT4_PlainPassword.reg file in this directory (either
-by double clicking on it, or run regedit.exe and select "Import Registry
-File" from the "Registry" Menu).
-
-The other major ramification of this feature of NT is that it can't
-browse a user level non-encrypted server unless it already has a
-connection open. This is because there is no spot for a password
-prompt in the browser window. It works fine if you already have a
-drive mounted (for example, one auto mounted on startup).
-=====================================================================
-
-Printing:
-=========
-When you mount a printer using the print manager in NT you may find
-the following info from Matthew Harrell <harrell@leech.nrl.navy.mil>
-useful:
-
-------------
- I noticed in your change-log you noted that some people were
-still unable to use print manager under NT. If this is the same problem
-that I encountered, it's caused by the length of time it takes NT to
-determine if the printer is ready.
-
-The problem occurs when you double-click on a printer to connect it to
-the NT machine. Because it's unable to determine if the printer is ready
-in the short span of time it has, it assumes it isn't and gives some
-strange error about not having enough resources (I forget what the error
-is). A solution to this that seems to work fine for us is to click
-once on the printer, look at the bottom of the window and wait until
-it says it's ready, then clilck on "OK".
-
-By the way, this problem probably occurs in our group because the
-Samba server doesn't actually have the printers - it queues them to
-remote printers either on other machines or using their own network
-cards. Because of this "middle layer", it takes an extra amount of
-time for the NT machine to get verification that the printer queue
-actually exists.
-
-I hope this helped in some way...
diff --git a/docs/textdocs/security_level.txt b/docs/textdocs/security_level.txt
deleted file mode 100644
index fac446fda8e..00000000000
--- a/docs/textdocs/security_level.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-Contributor: Andrew Tridgell
-Updated: June 27, 1997
-Status: Current
-
-Subject: Description of SMB security levels.
-===========================================================================
-
-Samba supports the following options to the global smb.conf parameter
-"security =":
- share, user, server
-
-Of the above, "security = server" means that Samba reports to clients that
-it is running in "user mode" but actually passes off all authentication
-requests to another "user mode" server. This requires an additional
-parameter "password server =" that points to the real authentication server.
-That real authentication server can be another Samba server or can be a
-Windows NT server, the later natively capable of encrypted password support.
-
-Below is a more complete description of security levels.
-===========================================================================
-
-A SMB server tells the client at startup what "security level" it is
-running. There are two options "share level" and "user level". Which
-of these two the client receives affects the way the client then tries
-to authenticate itself. It does not directly affect (to any great
-extent) the way the Samba server does security. I know this is
-strange, but it fits in with the client/server approach of SMB. In SMB
-everything is initiated and controlled by the client, and the server
-can only tell the client what is available and whether an action is
-allowed.
-
-I'll describe user level security first, as its simpler. In user level
-security the client will send a "session setup" command directly after
-the protocol negotiation. This contains a username and password. The
-server can either accept or reject that username/password
-combination. Note that at this stage the server has no idea what
-share the client will eventually try to connect to, so it can't base
-the "accept/reject" on anything other than:
-
-- the username/password
-- the machine that the client is coming from
-
-If the server accepts the username/password then the client expects to
-be able to mount any share (using a "tree connection") without
-specifying a password. It expects that all access rights will be as
-the username/password specified in the "session setup".
-
-It is also possible for a client to send multiple "session setup"
-requests. When the server responds it gives the client a "uid" to use
-as an authentication tag for that username/password. The client can
-maintain multiple authentication contexts in this way (WinDD is an
-example of an application that does this)
-
-
-Ok, now for share level security. In share level security (the default
-with samba) the client authenticates itself separately for each
-share. It will send a password along with each "tree connection"
-(share mount). It does not explicitly send a username with this
-operation. The client is expecting a password to be associated with
-each share, independent of the user. This means that samba has to work
-out what username the client probably wants to use. It is never
-explicitly sent the username. Some commercial SMB servers such as NT actually
-associate passwords directly with shares in share level security, but
-samba always uses the unix authentication scheme where it is a
-username/password that is authenticated, not a "share/password".
-
-Many clients send a "session setup" even if the server is in share
-level security. They normally send a valid username but no
-password. Samba records this username in a list of "possible
-usernames". When the client then does a "tree connection" it also adds
-to this list the name of the share they try to connect to (useful for
-home directories) and any users listed in the "user =" smb.conf
-line. The password is then checked in turn against these "possible
-usernames". If a match is found then the client is authenticated as
-that user.
-
-Finally "server level" security. In server level security the samba
-server reports to the client that it is in user level security. The
-client then does a "session setup" as described earlier. The samba
-server takes the username/password that the client sends and attempts
-to login to the "password server" by sending exactly the same
-username/password that it got from the client. If that server is in
-user level security and accepts the password then samba accepts the
-clients connection. This allows the samba server to use another SMB
-server as the "password server".
-
-You should also note that at the very start of all this, where the
-server tells the client what security level it is in, it also tells
-the client if it supports encryption. If it does then it supplies the
-client with a random "cryptkey". The client will then send all
-passwords in encrypted form. You have to compile samba with encryption
-enabled to support this feature, and you have to maintain a separate
-smbpasswd file with SMB style encrypted passwords. It is
-cryptographically impossible to translate from unix style encryption
-to SMB style encryption, although there are some fairly simple management
-schemes by which the two could be kept in sync.
diff --git a/examples/README b/examples/README
deleted file mode 100644
index c2c36bdcdf1..00000000000
--- a/examples/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Copyright(C) Samba-Team 1993-1997
-
-This directory contains example config files and related material for
-Samba.
-
-At a minimum please refer to the smb.conf.default file for current
-information regarding global and share parameter settings.
-
-Send additions to: samba-bugs@samba.anu.edu.au
-
-
diff --git a/examples/dce-dfs/README b/examples/dce-dfs/README
deleted file mode 100644
index 4aaba8bb33e..00000000000
--- a/examples/dce-dfs/README
+++ /dev/null
@@ -1,4 +0,0 @@
-this is a sample configuration file from Jim Doyle <doyle@oec.com> who
-did the DCE/DFS patches for Samba. It shows how to make DCE/DFS shares
-available.
-
diff --git a/examples/dce-dfs/smb.conf b/examples/dce-dfs/smb.conf
deleted file mode 100644
index f5f155b8e6c..00000000000
--- a/examples/dce-dfs/smb.conf
+++ /dev/null
@@ -1,42 +0,0 @@
-[global]
- printing = bsd
- printcap name = /etc/printcap
- load printers = no
- guest account = guest
- log file = /usr/local/samba/var/log.%m
- log level = 8
- password level = 8
-
-[homes]
- comment = Home Directories
- browseable = no
- read only = no
- create mode = 0750
-
-[test]
- comment = test stuff
- path = /dept/mis/home/testacct
- valid users = testacct
- public = no
- writable = yes
-
-[namespace]
- comment = DCE-DFS Global Root
- path = /...
- public = no
- writable = yes
-
-[oecdfs]
- comment = Corporate Cell
- path = /.../corp.boston.oec.com/fs
- browseable = no
- read only = no
- create mode = 0750
-
-[develdfs]
- comment = Technology Development Cell
- path = /.../devel.boston.oec.com/fs
- browseable = no
- read only = no
- create mode = 0750
-
diff --git a/examples/misc/extra_smbstatus b/examples/misc/extra_smbstatus
deleted file mode 100644
index 584284feb34..00000000000
--- a/examples/misc/extra_smbstatus
+++ /dev/null
@@ -1,50 +0,0 @@
-Here's something that Paul Blackman sent me that may be useful:
-
--------------------
-I created this script to do a few things that smbstatus doesn't at the
-moment. Perhaps you might want to include these. Sorry I haven't
-added things at source level, script was quick&easy.
-
-*******
-#!/bin/csh
-if ($1 == "-p") then
- smbstatus -p |sort -u
-else if ($1 == "-c") then
- echo There are `smbstatus -p |sort -u |grep -n -v z |grep -c :` unique smbd processes running.
- else if ($1 == "-l") then
- echo `date '+ %d/%m/%y %H:%M:%S'` `smbstatus -p |sort -u |grep -n -v z |grep -c :` >>$2
-else if ($1 == "-cs") then
- echo There are `smbstatus |awk '$1==share {n++;} END {print n}' share=$2` concurrent connections to share: $2
-else if ($1 == "-csl") then
- echo `date '+ %d/%m/%y %H:%M:%S'` `smbstatus |awk '$1==share {n++;} END {print n}' share=$2` >>$3
-else
- echo "'smbstat -c' ==> Count unique smbd processes."
- echo "'smbstat -p' ==> List unique smbd processes."
- echo "'smbstat -l logfile' ==> Append a log entry for the number of"
- echo " concurrent and unique processes to logfile."
- echo "'smbstat -cs sharename'"
- echo " ==> Count processes connected to sharename (assumed unique)"
- echo "'smbstat -csl sharename logfile'"
- echo " ==> Append a log entry for the number of concurrent"
- echo " processes connected to sharename (assumed unique)"
-endif
-******
-
-Run this script from cron eg.
-
-0,5,10,15,20,25,30,35,40,50,55 * * * * /usr/local/samba/bin/smbstat -l /usr/local/samba/var/smbdcount.log
-
-and you get a good idea of usage over time.
-
-Cheers,
-~^ MIME OK ^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~
- o | Paul Blackman ictinus@lake.canberra.edu.au
- o | Co-operative Research ------------------------
- o _ | Centre For Freshwater Ecology. Ph. (Aus) 06 2012518
- -- (") o | University of Canberra, Australia. Fax. " 06 2015038
- \_|_-- |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- | | "Spend a little love and get high"
- _/ \_ | - Lenny Kravitz
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-~~~~~~~~~~~~~~ SAMBA Web Pages: http://samba.anu.edu.au/samba/ ~~~~~~~~~~~~~~
-
diff --git a/examples/misc/wall.perl b/examples/misc/wall.perl
deleted file mode 100644
index 9303658ce14..00000000000
--- a/examples/misc/wall.perl
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/local/bin/perl
-#
-#@(#) smb-wall.pl Description:
-#@(#) A perl script which allows you to announce whatever you choose to
-#@(#) every PC client currently connected to a Samba Server...
-#@(#) ...using "smbclient -M" message to winpopup service.
-#@(#) Default usage is to message every connected PC.
-#@(#) Alternate usage is to message every pc on the argument list.
-#@(#) Hacked up by Keith Farrar <farrar@parc.xerox.com>
-#
-# Cleanup and corrections by
-# Michal Jaegermann <michal@ellpspace.math.ualberta.ca>
-# Message to send can be now also fed (quietly) from stdin; a pipe will do.
-#=============================================================================
-
-$smbstatus = "/usr/local/bin/smbstatus";
-$smbshout = "/usr/local/bin/smbclient -M";
-
-if (@ARGV) {
- @clients = @ARGV;
- undef @ARGV;
-}
-else { # no clients specified explicitly
- open(PCLIST, "$smbstatus |") || die "$smbstatus failed!.\n$!\n";
- while(<PCLIST>) {
- last if /^Locked files:/;
- split(' ', $_, 6);
- # do not accept this line if less then six fields
- next unless $_[5];
- # if you have A LOT of clients you may speed things up by
- # checking pid - no need to look further if this pid was already
- # seen; left as an exercise :-)
- $client = $_[4];
- next unless $client =~ /^\w+\./; # expect 'dot' in a client name
- next if grep($_ eq $client, @clients); # we want this name once
- push(@clients, $client);
- }
- close(PCLIST);
-}
-
-if (-t) {
- print <<'EOT';
-
-Enter message for Samba clients of this host
-(terminated with single '.' or end of file):
-EOT
-
- while (<>) {
- last if /^\.$/;
- push(@message, $_);
- }
-}
-else { # keep quiet and read message from stdin
- @message = <>;
-}
-
-foreach(@clients) {
-## print "To $_:\n";
- if (open(SENDMSG,"|$smbshout $_")) {
- print SENDMSG @message;
- close(SENDMSG);
- }
- else {
- warn "Cannot notify $_ with $smbshout:\n$!\n";
- }
-}
-
-exit 0;
-
diff --git a/examples/printer-accounting/README b/examples/printer-accounting/README
deleted file mode 100644
index b7ab42acb96..00000000000
--- a/examples/printer-accounting/README
+++ /dev/null
@@ -1,63 +0,0 @@
-These are just a few examples of what you can do for printer accounting;
-they are really just hacks to show a manager how may pages were being
-printed out on his new hp5n :)
-
-acct-all will run acct-sum and read the log files to generate some
-stats.
-
-Here is a sample output of the raw stats :
-
-1996-06-10.15:02:15 pkelly master.fcp.oypi.com 538 0
-1996-06-10.15:06:40 pkelly master.fcp.oypi.com 537 0
-1996-06-10.15:32:12 ted master.fcp.oypi.com 547 0
-1996-06-11.09:06:15 violet master.fcp.oypi.com 2667 0
-1996-06-11.09:48:02 violet master.fcp.oypi.com 66304 5
-1996-06-11.09:50:04 violet master.fcp.oypi.com 116975 9
-1996-06-11.09:57:20 violet master.fcp.oypi.com 3013 1
-1996-06-11.10:13:17 pkelly master.fcp.oypi.com 3407 1
-1996-06-11.12:37:06 craig master.fcp.oypi.com 13639 2
-1996-06-11.12:42:23 pkelly master.fcp.oypi.com 13639 2
-1996-06-11.12:45:11 marlene master.fcp.oypi.com 515 0
-1996-06-11.14:17:10 lucie master.fcp.oypi.com 1405 1
-1996-06-11.14:36:03 laura master.fcp.oypi.com 45486 5
-1996-06-11.15:08:21 violet master.fcp.oypi.com 1923 1
-1996-06-11.15:09:42 laura master.fcp.oypi.com 4821 1
-1996-06-11.15:12:28 laura master.fcp.oypi.com 46277 5
-1996-06-11.15:19:38 violet master.fcp.oypi.com 3503 1
-1996-06-11.15:21:49 lucie master.fcp.oypi.com 493 0
-1996-06-11.15:43:36 al master.fcp.oypi.com 3067 1
-
-And the output after the acct-sum is done on a full set of files
-in /var/log/lp/*
-
-master[1072] /var/log/lp$ /etc/conf/acct-all
-
-Sun Jul 21 23:03:16 EDT 1996
-
-Pages are approximate ...
-
-User Jobs Pages Size
-al 1 1 2 KB
-craig 1 2 13 KB
-jack 68 235 1995 KB
-laura 88 328 3050 KB
-lucie 221 379 3529 KB
-marlene 12 151 1539 KB
-melanie 83 365 3691 KB
-michelle 68 219 1987 KB
-mike 2 10 81 KB
-neil 111 225 2753 KB
-operator 44 137 1132 KB
-pkelly 368 984 11154 KB
-root 8 0 29 KB
-ted 158 257 2337 KB
-tony 244 368 2455 KB
-violet 419 1002 10072 KB
-
-
-Printer Jobs Pages
-hp2p 3 4
-hp5 915 2135
-lp 978 2524
-
-<pkelly@ets.net>
diff --git a/examples/printer-accounting/acct-all b/examples/printer-accounting/acct-all
deleted file mode 100644
index dc8f175b3cb..00000000000
--- a/examples/printer-accounting/acct-all
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-
-echo ""
-date
-echo ""
-echo "Pages are approximate ..."
-echo ""
-/etc/conf/acct-sum /var/log/lp/*
-echo ""
diff --git a/examples/printer-accounting/acct-sum b/examples/printer-accounting/acct-sum
deleted file mode 100644
index ffbfc8d8801..00000000000
--- a/examples/printer-accounting/acct-sum
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/perl
-
-while (<>) {
- ($date, $user, $machine, $size, $pages) = split(' ');
-
- $Printer{$ARGV}++;
- $PrinterPages{$ARGV} += $pages;
-
- $Jobs{$user}++;
- $Size{$user}+= $size;
- $Pages{$user}+= $pages;
-}
-
-printf "%-15s %5s %8s %8s\n", qw(User Jobs Pages Size);
-foreach $user (sort keys %Jobs) {
- printf "%-15s %5d %8d %8d \KB\n",
- $user, $Jobs{$user}, $Pages{$user}, $Size{$user}/1024;
-}
-
-
-print "\n\n";
-printf "%-15s %5s %8s %8s\n", qw(Printer Jobs Pages);
-foreach $prn (sort keys %Printer) {
- ($name = $prn) =~ s=.*/==;
- printf "%-15s %5d %8d\n",
- $name, $Printer{$prn}, $PrinterPages{$prn};
-}
-
-
diff --git a/examples/printer-accounting/hp5-redir b/examples/printer-accounting/hp5-redir
deleted file mode 100644
index 98c2b72edd2..00000000000
--- a/examples/printer-accounting/hp5-redir
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/perl
-#
-# $Source: /data/src/mirror/cvs/samba/examples/printer-accounting/hp5-redir,v $
-# $Id: hp5-redir,v 1.1 1996/07/23 03:30:56 samba-bugs Exp $
-#
-# 0 == stdin == docuement
-# 1 == stdout == printer
-# 2 == stderr == logging
-#
-# With redirection to another valid /etc/printcap entry
-#
-
-umask(002);
-
-# -w132 -l66 -i0 -n pkelly -h master.fcp.oypi.com /var/log/lp-acct
-require "getopts.pl";
-&Getopts("w:l:i:n:h:");
-
-chomp($date = `date '+%Y-%m-%d.%T'`);
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
- $atime,$mtime,$ctime,$blksize,$blocks)
- = stat(STDIN);
-
-# send to the real printer now.
-open(P, "|lpr -Pmgmt0") || die "Can't print to hp5-real ($!)\n";
-$cnt = 0;
-while (sysread(STDIN, $buf, 10240)) {
- print P $buf;
- # this is ugly, but it gives the approx in pages. We
- # don't print graphics, so ... There must be a better way :)
- $cnt += ($buf =~ /^L/g);
-}
-close(P);
-
-$acct = shift;
-if (open(ACCT, ">>$acct")) {
- print ACCT "$date $opt_n $opt_h $size $cnt\n";
- close(ACCT);
-} else {
- warn "Err: Can't account for it ($!)\n";
- warn "Log: $date $opt_n $opt_h $size $cnt\n";
-}
diff --git a/examples/printer-accounting/lp-acct b/examples/printer-accounting/lp-acct
deleted file mode 100644
index 3fe45f877fd..00000000000
--- a/examples/printer-accounting/lp-acct
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/perl
-#
-# $Source: /data/src/mirror/cvs/samba/examples/printer-accounting/lp-acct,v $
-# $Id: lp-acct,v 1.1 1996/07/23 03:30:56 samba-bugs Exp $
-#
-# 0 == stdin == docuement
-# 1 == stdout == printer
-# 2 == stderr == logging
-#
-# Regular, with no redirection
-#
-
-umask(002);
-
-# -w132 -l66 -i0 -n pkelly -h master.fcp.oypi.com /var/log/lp-acct
-require "getopts.pl";
-&Getopts("w:l:i:n:h:");
-
-chomp($date = `date '+%Y-%m-%d.%T'`);
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
- $atime,$mtime,$ctime,$blksize,$blocks)
- = stat(STDIN);
-
-$cnt = 0;
-while (sysread(STDIN, $buf, 10240)) {
- print $buf;
- $cnt += ($buf =~ /^L/g);
-}
-
-$acct = shift;
-if (open(ACCT, ">>$acct")) {
- print ACCT "$date $opt_n $opt_h $size $cnt\n";
- close(ACCT);
-} else {
- warn "Err: Can't account for it ($!)\n";
- warn "Log: $date $opt_n $opt_h $size $cnt\n";
-}
diff --git a/examples/printer-accounting/printcap b/examples/printer-accounting/printcap
deleted file mode 100644
index 976005a097c..00000000000
--- a/examples/printer-accounting/printcap
+++ /dev/null
@@ -1,22 +0,0 @@
-# HP5N - Accounting entry
-#
-# This file calls the filter, hp5-redir to do the numbers and then
-# is redirected to the real entry, mgmt0, which is a remote HP5N
-# on the LAN with it's own IP number.
-#
-hp5:lp=/dev/lp1:\
- :sd=/usr/spool/lpd/hp5-acct:\
- :lf=/var/log/lp-err:\
- :af=/var/log/lp/hp5:\
- :if=/usr/local/bin/lp/hp5-redir:\
- :sh:sf:\
- :mx#0:
-
-# HP5N - Real printer location
-mgmt0:\
- :rm=hp5.fcp.oypi.com:\
- :rp=hp5.fcp.oypi.com:\
- :sd=/usr/spool/lpd/mgmt0:\
- :sh:sf:\
- :mx#0:
-
diff --git a/examples/printing/smbprint b/examples/printing/smbprint
deleted file mode 100755
index 079f20aac41..00000000000
--- a/examples/printing/smbprint
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/sh -x
-
-# This script is an input filter for printcap printing on a unix machine. It
-# uses the smbclient program to print the file to the specified smb-based
-# server and service.
-# For example you could have a printcap entry like this
-#
-# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
-#
-# which would create a unix printer called "smb" that will print via this
-# script. You will need to create the spool directory /usr/spool/smb with
-# appropriate permissions and ownerships for your system.
-
-# Set these to the server and service you wish to print to
-# In this example I have a WfWg PC called "lapland" that has a printer
-# exported called "printer" with no password.
-
-#
-# Script further altered by hamiltom@ecnz.co.nz (Michael Hamilton)
-# so that the server, service, and password can be read from
-# a /usr/var/spool/lpd/PRINTNAME/.config file.
-#
-# In order for this to work the /etc/printcap entry must include an
-# accounting file (af=...):
-#
-# cdcolour:\
-# :cm=CD IBM Colorjet on 6th:\
-# :sd=/var/spool/lpd/cdcolour:\
-# :af=/var/spool/lpd/cdcolour/acct:\
-# :if=/usr/local/etc/smbprint:\
-# :mx=0:\
-# :lp=/dev/null:
-#
-# The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
-# server=PC_SERVER
-# service=PR_SHARENAME
-# password="password"
-#
-# E.g.
-# server=PAULS_PC
-# service=CJET_371
-# password=""
-
-#
-# Debugging log file, change to /dev/null if you like.
-#
-logfile=/tmp/smb-print.log
-# logfile=/dev/null
-
-
-#
-# The last parameter to the filter is the accounting file name.
-# Extract the directory name from the file name.
-# Concat this with /.config to get the config file.
-#
-eval acct_file=\${$#}
-spool_dir=`dirname $acct_file`
-config_file=$spool_dir/.config
-
-# Should read the following variables set in the config file:
-# server
-# service
-# password
-eval `cat $config_file`
-
-#
-# Some debugging help, change the >> to > if you want to same space.
-#
-echo "server $server, service $service" >> $logfile
-
-(
-# NOTE You may wish to add the line `echo translate' if you want automatic
-# CR/LF translation when printing.
-# echo translate
- echo "print -"
- cat
-) | /usr/local/samba/bin/smbclient "\\\\$server\\$service" $password -U $server -N -P >> $logfile
diff --git a/examples/printing/smbprint.sysv b/examples/printing/smbprint.sysv
deleted file mode 100644
index 3e1cec47f50..00000000000
--- a/examples/printing/smbprint.sysv
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-#
-# @(#) smbprint.sysv version 1.0 Ross Wakelin <r.wakelin@march.co.uk>
-#
-# Version 1.0 13 January 1995
-# modified from the original smbprint (bsd) script
-#
-# this script is a System 5 printer interface script. It
-# uses the smbclient program to print the file to the specified smb-based
-# server and service.
-#
-# To add this to your lp system, copy this file into your samba directory
-# (the example here is /opt/samba), modify the server and service variables
-# and then execute the following command (as root)
-#
-# lpadmin -punixprintername -v/dev/null -i/opt/samba/smbprint
-#
-# where unixprintername is the name that the printer will be known as
-# on your unix box.
-#
-# the script smbprint will be copied into your printer administration
-# directory (/usr/lib/lp or /etc/lp) as a new interface
-# (interface/unixprintername)
-# Then you have to enable unixprintername and accept unixprintername
-#
-# This script will then be called by the lp service to print the files
-# This script will have 6 or more parameters passed to it by the lp service.
-# The first five will contain details of the print job, who queued it etc,
-# while parameters 6 onwards are a list of files to print. We just
-# cat these at the samba client.
-#
-# Set these to the server and service you wish to print to
-# In this example I have a WfWg PC called "lapland" that has a printer
-# exported called "printer" with no password.
-#
-# clear out the unwanted parameters
-shift;shift;shift;shift;shift
-# now the argument list is just the files to print
-
-server=admin
-service=hplj2
-password=""
-
-(
-# NOTE You may wish to add the line `echo translate' if you want automatic
-# CR/LF translation when printing.
- echo translate
- echo "print -"
- cat $*
-) | /opt/samba/smbclient "\\\\$server\\$service" $password -N -P > /dev/null
-exit $?
-
diff --git a/examples/simple/README b/examples/simple/README
deleted file mode 100644
index 9628aa8260d..00000000000
--- a/examples/simple/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This is the "original" sample config file.
-
diff --git a/examples/simple/smb.conf b/examples/simple/smb.conf
deleted file mode 100644
index 786bf49057c..00000000000
--- a/examples/simple/smb.conf
+++ /dev/null
@@ -1,167 +0,0 @@
-; Configuration file for smbd.
-; ============================================================================
-; For the format of this file and comprehensive descriptions of all the
-; configuration option, please refer to the man page for smb.conf(5).
-;
-; The following configuration should suit most systems for basic usage and
-; initial testing. It gives all clients access to their home directories and
-; allows access to all printers specified in /etc/printcap.
-;
-; Things you need to check:
-; --------------------------
-;
-; 1: Check the path to your printcap file. If you are using a system that does
-; not use printcap (eg., Solaris), create a file containing lines of the
-; form
-;
-; printername|printername|printername|
-;
-; where each "printername" is the name of a printer you want to provide
-; access to. Then alter the "printcap =" entry to point to the new file.
-;
-; If using Solaris, the following command will generate a suitable printcap
-; file:
-;
-; lpc status | grep ":" | sed s/:/\|/ > myprintcap
-;
-; 2: Make sure the "print command" entry is correct for your system. This
-; command should submit a file (represented by %s) to a printer
-; (represented by %p) for printing and should REMOVE the file after
-; printing.
-;
-; One most systems the default will be OK, as long as you get "printing ="
-; right.
-;
-; It is also a good idea to use an absolute path in the print command
-; as there is no guarantee the search path will be set correctly.
-;
-; 3: Make sure the "printing =" option is set correctly for your system.
-; Possible values are "sysv", "bsd" or "aix".
-;
-; 4: Make sure the "lpq command" entry is correct for your system. The default
-; may not work for you.
-;
-; 5: Make sure that the user specified in "guest account" exists. Typically
-; this will be a user that cannot log in and has minimal privileges.
-; Often the "nobody" account doesn't work (very system dependant).
-;
-; 6: You should consider the "security =" option. See a full description
-; in the main documentation and the smb.conf(5) manual page
-;
-; 7: Look at the "hosts allow" option, unless you want everyone on the internet
-; to be able to access your files.
-;
-[global]
- printing = bsd
- printcap name = /etc/printcap
- load printers = yes
- guest account = pcguest
-; This next option sets a separate log file for each client. Remove
-; it if you want a combined log file.
- log file = /usr/local/samba/log.%m
-
-; You will need a world readable lock directory and "share modes=yes"
-; if you want to support the file sharing modes for multiple users
-; of the same files
-; lock directory = /usr/local/samba/var/locks
-; share modes = yes
-
-[homes]
- comment = Home Directories
- browseable = no
- read only = no
- create mode = 0750
-
-[printers]
- comment = All Printers
- browseable = no
- printable = yes
- public = no
- writable = no
- create mode = 0700
-
-; you might also want this one, notice that it is read only so as not to give
-; people without an account write access.
-;
-; [tmp]
-; comment = Temporary file space
-; path = /tmp
-; read only = yes
-; public = yes
-
-;
-; Other examples.
-;
-; A private printer, usable only by fred. Spool data will be placed in fred's
-; home directory. Note that fred must have write access to the spool directory,
-; wherever it is.
-;[fredsprn]
-; comment = Fred's Printer
-; valid users = fred
-; path = /homes/fred
-; printer = freds_printer
-; public = no
-; writable = no
-; printable = yes
-;
-; A private directory, usable only by fred. Note that fred requires write
-; access to the directory.
-;[fredsdir]
-; comment = Fred's Service
-; path = /usr/somewhere/private
-; valid users = fred
-; public = no
-; writable = yes
-; printable = no
-;
-; A publicly accessible directory, but read only, except for people in
-; the staff group
-;[public]
-; comment = Public Stuff
-; path = /usr/somewhere/public
-; public = yes
-; writable = no
-; printable = no
-; write list = @staff
-;
-; a service which has a different directory for each machine that connects
-; this allows you to tailor configurations to incoming machines. You could
-; also use the %u option to tailor it by user name.
-; The %m gets replaced with the machine name that is connecting.
-;[pchome]
-; comment = PC Directories
-; path = /usr/pc/%m
-; public = no
-; writeable = yes
-;
-;
-; A publicly accessible directory, read/write to all users. Note that all files
-; created in the directory by users will be owned by the default user, so
-; any user with access can delete any other user's files. Obviously this
-; directory must be writable by the default user. Another user could of course
-; be specified, in which case all files would be owned by that user instead.
-;[public]
-; path = /usr/somewhere/else/public
-; public = yes
-; only guest = yes
-; writable = yes
-; printable = no
-;
-;
-; The following two entries demonstrate how to share a directory so that two
-; users can place files there that will be owned by the specific users. In this
-; setup, the directory should be writable by both users and should have the
-; sticky bit set on it to prevent abuse. Obviously this could be extended to
-; as many users as required.
-;[myshare]
-; comment = Mary's and Fred's stuff
-; path = /usr/somewhere/shared
-; valid users = mary fred
-; public = no
-; writable = yes
-; printable = no
-; create mask = 0765
-
-
-
-
diff --git a/examples/smb.conf.default b/examples/smb.conf.default
deleted file mode 100644
index 7de2c21768b..00000000000
--- a/examples/smb.conf.default
+++ /dev/null
@@ -1,235 +0,0 @@
-; The global setting for a default install
-; Copyright(C) John H Terpstra - 1997
-;======================= Global Settings =====================================
-[global]
-
-; workgroup = NT-Domain-Name or Workgroup-Name, eg: REDHAT4
- workgroup = WORKGROUP
-
-; comment is the equivalent of the NT Description field
- comment = Samba Server
-
-; printing = BSD or SYSV or AIX, etc.
- printing = bsd
- printcap name = /etc/printcap
- load printers = yes
-
-; Uncomment this if you want a guest account, you must add this to /etc/passwd
-; guest account = pcguest
- log file = /usr/local/samba/var/log.%m
-
-; Put a capping on the size of the log files (in Kb)
- max log size = 50
-
-; Options for handling file name case sensitivity and / or preservation
-; Case Sensitivity breaks many WfW and Win95 apps
-; case sensitive = yes
- short preserve case = yes
- preserve case = yes
-
-; Security and file integrity related options
- lock directory = /usr/local/samba/var/locks
- locking = yes
-; Strict locking is available for paranoid locking situations only
-; enabling this severely degrades read / write performance.
-; strict locking = yes
-; fake oplocks = yes
- share modes = yes
-
-; Security modes: USER uses Unix username/passwd, SHARE uses WfW type passwords
-; SERVER uses an other SMB server (eg: Windows NT Server or Samba)
-; to provide authentication services
- security = user
-; Use password server option only with security = server
-; password server = <NT-Server-Name>
-
-; Encrypted Password Support - Off by default. Requires smbpasswd file
-; Refer to docs/Encryption.txt
- encrypt passwords = no
-
-; Configuration Options ***** The location of this entry in your smb.conf
-; heirachy determines which parameters are overwritten - please watch out!
-; Where %m is any SMBName (machine name, or computer name) for which a custom
-; configuration is desired
-; include = /usr/local/samba/lib/smb.conf.%m
-
-; Performance Related Options
-; Before setting socket options read the smb.conf man page!!
- socket options = TCP_NODELAY
-; Use keep alive only if really needed!!!!
-; keep alive = 60
-; Configure Samba to use multiple interfaces
-; Samba will auto-detect network interfaces - only use this if
-; the auto-detection does not deliver the needed results
-; interfaces = 192.168.12.2/24 176.16.111.22/19 10.11.13.14/255.255.252.0
-
-; Browser Control Options:
-; Local Master set to True causes Samba to participate in browser elections
-; the default setting is true, this causes Samba to behave like a
-; Windows NT server. Setting this to false turns off all browser
-; election participation.
-; local master = yes
-
-; OS Level gives Samba the power to win browser elections. Windows NT = 32
-; Any value < 32 means NT wins as Master Browser, > 32 Samba gets it
-; default = 0, this ensures that Samba will NOT win the browser election.
-; os level = 33
-
-; Domain Master specifies Samba to be the Domain Master Browser
-; Only ever set this if there is NO Windows NT Domain Controller on the
-; network
-; domain master = yes
-
-; Preferred Master causes Samba to force a local browser election on startup
-; preferred master = yes
-
-; Use with care only if you have an NT server on your network that has been
-; configured at install time to be a primary domain controller.
-; domain controller = <NT-Domain-Controller-SMBName>
-
-; Domain Logon Service Options:
-; Domain logon control can be a good thing! See [netlogon] share section below!
-; Do NOT set this to yes if there is an Windows NT domain controller
-; on the network
-; domain logons = yes
-
-; run a specific logon batch file per workstation (machine)
-; logon script = %m.bat
-; run a specific logon batch file per session username (ie: Client User Name)
-; logon script = %U.bat
-
-; Where to store roving profiles (only for Win95 and WinNT)
-; %L substitutes for the SMB name we are called, %U is username
-; You must uncomment the [Profiles] share below
-; logon path = \\%L\Profiles\%U
-
-; Windows Internet Name Serving Support Section:
-; WINS Support - Tells the NMBD component of Samba to enable it's WINS Server
-; the default is NO. If you have an Windows NT Server WINS use it!
-; Samba defaults to wins support = no
-; wins support = yes
-
-; WINS Server - Tells the NMBD components of Samba to be a WINS Client
-; Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
-; wins server = w.x.y.z
-
-; WINS Proxy - Tells Samba to answer name resolution queries on behalf of a non
-; WINS Client capable client, for this to work there must be at least one
-; WINS Server on the network. The default is NO.
-; wins proxy = yes
-
-;============================ Share Definitions ==============================
-[homes]
- comment = Home Directories
- browseable = no
- writable = yes
-
-; Un-comment the following and create the netlogon directory for Domain Logons
-; [netlogon]
-; comment = Samba Network Logon Service
-; path = /usr/local/samba/lib/netlogon
-; Case sensitivity breaks logon script processing!!!
-; case sensitive = no
-; guest ok = yes
-; locking = no
-; writable = no
-; For browseable say NO if you want to hide the NETLOGON share
-; browseable = yes
-
-; Un-comment the following to provide a specific roving profile share
-; the default is to use the user's home directory
-;[Profiles]
-; path = /usr/local/samba/profiles
-; browseable = no
-; printable = no
-; guest ok = yes
-
-; NOTE: There is NO need to specifically define each individual printer
-[printers]
- comment = All Printers
- path = /usr/spool/samba
- browseable = no
- printable = yes
-; Set public = yes to allow user 'guest account' to print
- guest ok = no
- writable = no
- create mask = 0700
-
-;[tmp]
-; comment = Temporary file space
-; path = /tmp
-; read only = no
-; public = yes
-
-; A publicly accessible directory, but read only, except for people in
-; the staff group
-[public]
- comment = Public Stuff
- path = /home/samba
- public = yes
- writable = yes
- printable = no
- write list = @users
-
-; Other examples.
-;
-; A private printer, usable only by fred. Spool data will be placed in fred's
-; home directory. Note that fred must have write access to the spool directory,
-; wherever it is.
-;[fredsprn]
-; comment = Fred's Printer
-; valid users = fred
-; path = /homes/fred
-; printer = freds_printer
-; public = no
-; writable = no
-; printable = yes
-;
-; A private directory, usable only by fred. Note that fred requires write
-; access to the directory.
-;[fredsdir]
-; comment = Fred's Service
-; path = /usr/somewhere/private
-; valid users = fred
-; public = no
-; writable = yes
-; printable = no
-;
-; a service which has a different directory for each machine that connects
-; this allows you to tailor configurations to incoming machines. You could
-; also use the %u option to tailor it by user name.
-; The %m gets replaced with the machine name that is connecting.
-;[pchome]
-; comment = PC Directories
-; path = /usr/pc/%m
-; public = no
-; writable = yes
-;
-;
-; A publicly accessible directory, read/write to all users. Note that all files
-; created in the directory by users will be owned by the default user, so
-; any user with access can delete any other user's files. Obviously this
-; directory must be writable by the default user. Another user could of course
-; be specified, in which case all files would be owned by that user instead.
-;[public]
-; path = /usr/somewhere/else/public
-; public = yes
-; only guest = yes
-; writable = yes
-; printable = no
-;
-;
-; The following two entries demonstrate how to share a directory so that two
-; users can place files there that will be owned by the specific users. In this
-; setup, the directory should be writable by both users and should have the
-; sticky bit set on it to prevent abuse. Obviously this could be extended to
-; as many users as required.
-;[myshare]
-; comment = Mary's and Fred's stuff
-; path = /usr/somewhere/shared
-; valid users = mary fred
-; public = no
-; writable = yes
-; printable = no
-; create mask = 0765
-
diff --git a/examples/svr4-startup/README b/examples/svr4-startup/README
deleted file mode 100644
index 8ed9f744770..00000000000
--- a/examples/svr4-startup/README
+++ /dev/null
@@ -1,24 +0,0 @@
-Hi and thanks for this great software.
-
-Solaris (and other sysv) machines have a standardized way of
-starting and shutting down services (you may well know that already).
-
-Here's a piece of code one could place under /etc/init.d
-and create appropriate link from, say
-
- /etc/rc2.d/S99samba.server
-
-to make smbd start and stop automatically with system bootups and
-shutdowns. Each one should edit the lines containing the
-daemon calls to agree with his/her installation (the code below
-works with the defaults) and workgroup setup (we use the -G and -n
-options).
-
-
-I hope this will be of use --- at least it is for me.
-
-Yours,
-
-Timo Knuutila
-knuutila@cs.utu.fi
-
diff --git a/examples/svr4-startup/samba.server b/examples/svr4-startup/samba.server
deleted file mode 100755
index 0a47fdb10ce..00000000000
--- a/examples/svr4-startup/samba.server
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#ident "@(#)samba.server 1.0 96/06/19 TK" /* SVr4.0 1.1.13.1*/
-#
-# Please send info on modifications to knuutila@cs.utu.fi
-#
-# This file should have uid root, gid sys and chmod 744
-#
-if [ ! -d /usr/bin ]
-then # /usr not mounted
- exit
-fi
-
-killproc() { # kill the named process(es)
- pid=`/usr/bin/ps -e |
- /usr/bin/grep -w $1 |
- /usr/bin/sed -e 's/^ *//' -e 's/ .*//'`
- [ "$pid" != "" ] && kill $pid
-}
-
-# Start/stop processes required for samba server
-
-case "$1" in
-
-'start')
-#
-# Edit these lines to suit your installation (paths, workgroup, host)
-#
- /opt/samba/bin/smbd -D -s/opt/samba/smb.conf
- /opt/samba/bin/nmbd -D -l/opt/samba/log -s/opt/samba/smb.conf
- ;;
-'stop')
- killproc nmbd
- killproc smbd
- ;;
-*)
- echo "Usage: /etc/init.d/samba.server { start | stop }"
- ;;
-esac
diff --git a/examples/thoralf/smb.conf b/examples/thoralf/smb.conf
deleted file mode 100644
index f9f147474a8..00000000000
--- a/examples/thoralf/smb.conf
+++ /dev/null
@@ -1,152 +0,0 @@
-; Configuration file for smbd (Samba 1.9.15p8)
-; created by Thoralf Freitag. Send comments to:
-; <Thoralf.Freitag@remserv.rz.fhtw-berlin.de> or
-; <Thoralf.Freitag@t-online.de>
-; last edit 24.04.1995 01:11
-;
-;
-
-[global]
-
- protocol = NT1
- ;long filenames for win95
- mangle case = yes
- ;lower and upper letters
- mangled names = yes
- default case = lower
- case sensitive = no
- preserve case = yes
- short preserve case = yes
-
- printing = bsd
- printcap name = /etc/printcap
- lpq cache time = 0
- workgroup = WORKGROUP
- admin users = su
- ;su is allowed to do all !!!
- guest account = ftp
- ;guest is same as user ftp
- default service = reference
- ;is possibly helpful to browsing under win 95
- os level = 2
- log file = /var/adm/log.smb
- max log size = 10
- debug level = 1
- share modes = yes
- lock directory = /var/adm
-
-[JP_360_raw]
- comment = Networkprinter queue for Olivetti JP 360 (untreated RAW format)
- browseable = yes
- available = yes
- public = no
- force user = root
- writable = no
- printable = yes
- printer name = samba
- ;samba is an alias name for an raw_printer in your /etc/printcap
- path = /samba/tmp
- create mode = 0700
-
-[JP_360_mono]
- comment = Networkprinter queue for Olivetti JP 360 Mono (with apsfilter)
- browseable = yes
- available = yes
- public = no
- force user = root
- writable = no
- printable = yes
- printer name = lp
- ;lp means the standard printer in your /etc/printcap
- path = /samba/tmp
- create mode = 0700
-
-[JP_360_color]
- comment = Networkprinter queue for Olivetti JP 360 Color (with apsfilter)
- browseable = yes
- available = yes
- public = no
- force user = root
- writable = no
- printable = yes
- printer name = lp4
- ;my printer need this to print with his color cartridge
- ;--> the lpd is drive to the printer as an color printer
- path = /samba/tmp
- create mode = 0700
-
-[tmp]
- comment = the garbage dump
- browseable = yes
- available = yes
- public = yes
- read only = no
- printable = no
- path = /samba/tmp
- create mask = 0777
-
-[transfer]
- comment = the market place
- browseable = yes
- available = yes
- public = yes
- read only = no
- printable = no
- path = /samba/transfer
- create mask = 0777
-
-[homes]
- comment = home directories
- browseable = no
- ;ONLY the home-dirs are visible, not the service itself
- available = yes
- guest ok = no
- read only = no
- printable = no
- create mode = 0700
-
-[install]
- comment = all of the many install files
- browsable = yes
- available = yes
- public = no
- username = @root, @users
- writable = yes
- read list = @users
- printable = no
- path = /samba/install
- create mode = 0755
-
-[doc-help]
- comment = documentations, helpfiles, FAQ's
- browsable = yes
- available = yes
- public = no
- username = @root, @users
- writable = yes
- read list = @users
- printable = no
- path = /samba/doc
- create mode = 0755
-
-[cd_rom_2]
- comment = the CD in the CD-ROM drive on PANDORA
- browsable = yes
- available = yes
- public = yes
- writable = no
- printable = no
- path = /cdrom
-
-[reference]
- ;the default, if invalid accesses
- comment = PANDORA: Samba LAN manager
- browsable = yes
- ;only as an hint
- available = no
- ;however no access possible
- public = yes
- writable = no
- printable = no
- path = /samba/tmp
-
diff --git a/examples/tridge/README b/examples/tridge/README
deleted file mode 100644
index 11c72f20b3a..00000000000
--- a/examples/tridge/README
+++ /dev/null
@@ -1,8 +0,0 @@
-This is the configuration I use at home. I have 2 client PCs, one
-running Win95, one running alternately WfWg and NTAS3.5. My server is
-a 486dx2-66 Linux box.
-
-Note that I use the %a and %m macros to load smb.conf extensions
-particular to machines and architectures. This gives me a lot of
-flexibility in how I handle each of the machines.
-
diff --git a/examples/tridge/smb.conf b/examples/tridge/smb.conf
deleted file mode 100644
index a2f269f3b76..00000000000
--- a/examples/tridge/smb.conf
+++ /dev/null
@@ -1,101 +0,0 @@
-[global]
- config file = /usr/local/samba/smb.conf.%m
- status = yes
- security = user
- encrypt passwords = yes
- server string = Tridge (%v,%h)
- load printers = yes
- log level = 1
- log file = /usr/local/samba/var/log.%m
- guest account = pcguest
- hosts allow = 192.0.2. localhost
- password level = 2
- auto services = tridge susan
- message command = csh -c '/usr/bin/X11/xedit -display :0 %s;rm %s' &
- read prediction = yes
- socket options = TCP_NODELAY
- valid chars = ö:Ö å:Å ä:Ä
- share modes = yes
- locking = yes
- strict locking = yes
- keepalive = 30
- include = /usr/local/samba/lib/smb.conf.%m
- include = /usr/local/samba/lib/smb.conf.%a
-
-
-[uniprint]
- comment = University Printing
- path = /home/susan/print
- user = susan
- postscript = yes
- print ok = yes
- print command = xmenu -heading "%s" OK&
-
-[testprn]
- comment = Test printer
- path = /tmp
- user = susan
- print ok = yes
- print command = cp %s /tmp/smb.%U.prn
- lpq command = cat /tmp/xxyz
-
-[amd]
- comment = amd area
- path = /mount
- force user = tridge
- read only = no
-
-[homes]
- browseable = no
- guest ok = no
- read only = no
- create mask = 0755
-
-[printers]
- browseable = no
- comment = Printer in Printcap
- guest ok = no
- path = /tmp
- read only = no
- print ok = yes
-
-[dos]
- browseable = yes
- comment = Dos Files
- force group = samba
- create mode = 0775
- path = /home/tridge/dos
- copy = homes
-
-[msoffice]
- browseable = yes
- comment = Microsoft Office
- force group = samba
- create mode = 0775
- path = /data/msoffice
- read only = yes
-
-[root]
- comment = Root Dir
- copy = dos
- path = /
- dont descend = /proc ./proc /etc
-
-[tmp]
- comment = tmp files
- copy = dos
- path = /tmp
- read only = no
-
-
-[cdrom]
- comment = Tridge's CdRom
- path = /mount/cdrom
- read only = yes
- locking = no
-
-[data]
- comment = Data Partition
- path = /data
- read only = yes
- guest ok = yes
diff --git a/examples/tridge/smb.conf.WinNT b/examples/tridge/smb.conf.WinNT
deleted file mode 100644
index f490f830ca7..00000000000
--- a/examples/tridge/smb.conf.WinNT
+++ /dev/null
@@ -1,14 +0,0 @@
-#log level = 4
-#readraw = no
-#writeraw = no
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/tridge/smb.conf.fjall b/examples/tridge/smb.conf.fjall
deleted file mode 100644
index 76f4d0e3cad..00000000000
--- a/examples/tridge/smb.conf.fjall
+++ /dev/null
@@ -1,21 +0,0 @@
-;log level = 4
-;readraw = no
-;writeraw = no
-;password level = 4
-;mangled map = (;1 )
-;protocol = lanman1
-;user = susan
-;getwd cache = no
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/tridge/smb.conf.lapland b/examples/tridge/smb.conf.lapland
deleted file mode 100644
index f490f830ca7..00000000000
--- a/examples/tridge/smb.conf.lapland
+++ /dev/null
@@ -1,14 +0,0 @@
-#log level = 4
-#readraw = no
-#writeraw = no
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/tridge/smb.conf.vittjokk b/examples/tridge/smb.conf.vittjokk
deleted file mode 100644
index 919ecd15420..00000000000
--- a/examples/tridge/smb.conf.vittjokk
+++ /dev/null
@@ -1,14 +0,0 @@
-;protocol = LANMAN2
-log level = 2
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/validchars/msdos70.out b/examples/validchars/msdos70.out
deleted file mode 100644
index a722b83604f..00000000000
--- a/examples/validchars/msdos70.out
+++ /dev/null
@@ -1,257 +0,0 @@
-255: ok
-254: ok
-253: ok
-252: ok
-251: ok
-250: ok
-249: ok
-248: ok
-247: ok
-246: ok
-245: ok
-244: ok
-243: ok
-242: ok
-241: ok
-240: ok
-239: ok
-238: ok
-237: ok
-236: 237
-235: ok
-234: ok
-233: ok
-232: ok
-231: 232
-230: ok
-229: ok
-228: 229
-227: ok
-226: ok
-225: ok
-224: ok
-223: ok
-222: ok
-221: ok
-220: ok
-219: ok
-218: ok
-217: ok
-216: ok
-215: ok
-214: ok
-213: 73
-212: ok
-211: ok
-210: ok
-209: ok
-208: 209
-207: ok
-206: ok
-205: ok
-204: ok
-203: ok
-202: ok
-201: ok
-200: ok
-199: ok
-198: 199
-197: ok
-196: ok
-195: ok
-194: ok
-193: ok
-192: ok
-191: ok
-190: ok
-189: ok
-188: ok
-187: ok
-186: ok
-185: ok
-184: ok
-183: ok
-182: ok
-181: ok
-180: ok
-179: ok
-178: ok
-177: ok
-176: ok
-175: ok
-174: ok
-173: ok
-172: ok
-171: ok
-170: ok
-169: ok
-168: ok
-167: ok
-166: ok
-165: ok
-164: 165
-163: 233
-162: 224
-161: 214
-160: 181
-159: ok
-158: ok
-157: ok
-156: ok
-155: 157
-154: ok
-153: ok
-152: length 0
-151: 235
-150: 234
-149: 227
-148: 153
-147: 226
-146: ok
-145: 146
-144: ok
-143: ok
-142: ok
-141: 222
-140: 215
-139: 216
-138: 212
-137: 211
-136: 210
-135: 128
-134: 143
-133: 183
-132: 142
-131: 182
-130: 144
-129: 154
-128: ok
-127: ok
-126: ok
-125: ok
-124: open unlink 0
-123: ok
-122: 90
-121: 89
-120: 88
-119: 87
-118: 86
-117: 85
-116: 84
-115: 83
-114: 82
-113: 81
-112: 80
-111: 79
-110: 78
-109: 77
-108: 76
-107: 75
-106: 74
-105: 73
-104: 72
-103: 71
-102: 70
-101: 69
-100: 68
-99: 67
-98: 66
-97: 65
-96: ok
-95: ok
-94: ok
-93: open unlink 0
-92: open unlink 0
-91: open unlink 0
-90: ok
-89: ok
-88: ok
-87: ok
-86: ok
-85: ok
-84: ok
-83: ok
-82: ok
-81: ok
-80: ok
-79: ok
-78: ok
-77: ok
-76: ok
-75: ok
-74: ok
-73: ok
-72: ok
-71: ok
-70: ok
-69: ok
-68: ok
-67: ok
-66: ok
-65: ok
-64: ok
-63: open unlink 0
-62: open unlink 0
-61: open unlink 0
-60: open unlink 0
-59: open unlink 0
-58: open unlink 0
-57: ok
-56: ok
-55: ok
-54: ok
-53: ok
-52: ok
-51: ok
-50: ok
-49: ok
-48: ok
-47: open unlink 0
-46: open unlink 0
-45: ok
-44: open unlink 0
-43: open unlink 0
-42: open unlink 0
-41: ok
-40: ok
-39: ok
-38: ok
-37: ok
-36: ok
-35: ok
-34: open unlink 0
-33: ok
-32: open unlink 0
-31: open unlink 0
-30: open unlink 0
-29: open unlink 0
-28: open unlink 0
-27: open unlink 0
-26: open unlink 0
-25: open unlink 0
-24: open unlink 0
-23: open unlink 0
-22: open unlink 0
-21: open unlink 0
-20: open unlink 0
-19: open unlink 0
-18: open unlink 0
-17: open unlink 0
-16: open unlink 0
-15: open unlink 0
-14: open unlink 0
-13: open unlink 0
-12: open unlink 0
-11: open unlink 0
-10: open unlink 0
-9: open unlink 0
-8: open unlink 0
-7: open unlink 0
-6: open unlink 0
-5: open unlink 0
-4: open unlink 0
-3: open unlink 0
-2: open unlink 0
-1: open unlink 0
-
- valid chars = 73:213 213:73 73:73 33 35 36 37 38 39 40 41 45 48 49 50 51 52 53 54 55 56 57 64 97:65 98:66 99:67 100:68 101:69 102:70 103:71 104:72 105:73 106:74 107:75 108:76 109:77 110:78 111:79 112:80 113:81 114:82 115:83 116:84 117:85 118:86 119:87 120:88 121:89 122:90 94 95 96 123 125 126 127 135:128 132:142 134:143 130:144 145:146 148:153 129:154 156 155:157 158 159 164:165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 160:181 131:182 133:183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198:199 200 201 202 203 204 205 206 207 208:209 136:210 137:211 138:212 161:214 140:215 139:216 217 218 219 220 221 141:222 223 162:224 225 147:226 149:227 228:229 230 231:232 163:233 150:234 151:235 236:237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
diff --git a/examples/validchars/nwdos70.out b/examples/validchars/nwdos70.out
deleted file mode 100644
index b0dbf628531..00000000000
--- a/examples/validchars/nwdos70.out
+++ /dev/null
@@ -1,257 +0,0 @@
-255: ok
-254: ok
-253: ok
-252: ok
-251: ok
-250: ok
-249: ok
-248: ok
-247: ok
-246: ok
-245: ok
-244: ok
-243: ok
-242: ok
-241: ok
-240: ok
-239: ok
-238: ok
-237: ok
-236: ok
-235: ok
-234: ok
-233: ok
-232: ok
-231: ok
-230: ok
-229: ok
-228: ok
-227: ok
-226: ok
-225: ok
-224: ok
-223: ok
-222: ok
-221: ok
-220: ok
-219: ok
-218: ok
-217: ok
-216: ok
-215: ok
-214: ok
-213: ok
-212: ok
-211: ok
-210: ok
-209: ok
-208: ok
-207: ok
-206: ok
-205: ok
-204: ok
-203: ok
-202: ok
-201: ok
-200: ok
-199: ok
-198: ok
-197: ok
-196: ok
-195: ok
-194: ok
-193: ok
-192: ok
-191: ok
-190: ok
-189: ok
-188: ok
-187: ok
-186: ok
-185: ok
-184: ok
-183: ok
-182: ok
-181: ok
-180: ok
-179: ok
-178: ok
-177: ok
-176: ok
-175: ok
-174: ok
-173: ok
-172: ok
-171: ok
-170: ok
-169: ok
-168: ok
-167: ok
-166: ok
-165: ok
-164: 165
-163: 85
-162: 79
-161: 73
-160: 65
-159: ok
-158: ok
-157: ok
-156: ok
-155: ok
-154: ok
-153: ok
-152: 89
-151: 85
-150: 85
-149: 79
-148: 153
-147: 79
-146: ok
-145: 146
-144: ok
-143: ok
-142: ok
-141: 73
-140: 73
-139: 73
-138: 69
-137: 69
-136: 69
-135: 128
-134: 143
-133: 65
-132: 142
-131: 65
-130: 69
-129: 154
-128: ok
-127: ok
-126: ok
-125: ok
-124: open unlink 0
-123: ok
-122: 90
-121: 89
-120: 88
-119: 87
-118: 86
-117: 85
-116: 84
-115: 83
-114: 82
-113: 81
-112: 80
-111: 79
-110: 78
-109: 77
-108: 76
-107: 75
-106: 74
-105: 73
-104: 72
-103: 71
-102: 70
-101: 69
-100: 68
-99: 67
-98: 66
-97: 65
-96: ok
-95: ok
-94: ok
-93: open unlink 0
-92: open unlink 0
-91: open unlink 0
-90: ok
-89: ok
-88: ok
-87: ok
-86: ok
-85: ok
-84: ok
-83: ok
-82: ok
-81: ok
-80: ok
-79: ok
-78: ok
-77: ok
-76: ok
-75: ok
-74: ok
-73: ok
-72: ok
-71: ok
-70: ok
-69: ok
-68: ok
-67: ok
-66: ok
-65: ok
-64: ok
-63: open unlink 0
-62: open unlink 0
-61: open unlink 0
-60: open unlink 0
-59: open unlink 0
-58: open unlink 0
-57: ok
-56: ok
-55: ok
-54: ok
-53: ok
-52: ok
-51: ok
-50: ok
-49: ok
-48: ok
-47: open unlink 0
-46: open unlink 0
-45: ok
-44: open unlink 0
-43: open unlink 0
-42: open unlink 0
-41: ok
-40: ok
-39: ok
-38: ok
-37: ok
-36: ok
-35: ok
-34: open unlink 0
-33: ok
-32: length 0
-31: open unlink 0
-30: open unlink 0
-29: open unlink 0
-28: open unlink 0
-27: open unlink 0
-26: open unlink 0
-25: open unlink 0
-24: open unlink 0
-23: open unlink 0
-22: open unlink 0
-21: open unlink 0
-20: open unlink 0
-19: open unlink 0
-18: open unlink 0
-17: open unlink 0
-16: open unlink 0
-15: open unlink 0
-14: open unlink 0
-13: open unlink 0
-12: open unlink 0
-11: open unlink 0
-10: open unlink 0
-9: open unlink 0
-8: open unlink 0
-7: open unlink 0
-6: open unlink 0
-5: open unlink 0
-4: open unlink 0
-3: open unlink 0
-2: open unlink 0
-1: open unlink 0
-
- valid chars = 69:130 130:69 69:69 65:131 131:65 65:65 65:133 133:65 65:65 69:136 136:69 69:69 69:137 137:69 69:69 69:138 138:69 69:69 73:139 139:73 73:73 73:140 140:73 73:73 73:141 141:73 73:73 79:147 147:79 79:79 79:149 149:79 79:79 85:150 150:85 85:85 85:151 151:85 85:85 89:152 152:89 89:89 65:160 160:65 65:65 73:161 161:73 73:73 79:162 162:79 79:79 85:163 163:85 85:85 33 35 36 37 38 39 40 41 45 48 49 50 51 52 53 54 55 56 57 64 97:65 98:66 99:67 100:68 101:69 102:70 103:71 104:72 105:73 106:74 107:75 108:76 109:77 110:78 111:79 112:80 113:81 114:82 115:83 116:84 117:85 118:86 119:87 120:88 121:89 122:90 94 95 96 123 125 126 127 135:128 132:142 134:143 144 145:146 148:153 129:154 155 156 157 158 159 164:165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
diff --git a/examples/validchars/readme b/examples/validchars/readme
deleted file mode 100644
index 6487fbd766a..00000000000
--- a/examples/validchars/readme
+++ /dev/null
@@ -1,101 +0,0 @@
-Note: All files in this directory are DOS formatted (CRLF line terminator).
-
-!!! VIRUS WARNING !!! I do not know if VALIDCHR.COM is virus free !!!
-I think that my system is virus free here because I do not run any games
-or other copied software. I only run Shareware/Freeware etc. from CD-ROMs
-or from registered disks, however I do not use viral scanners because
-I have not registered any (I consider `having no sex' is better than
-`testing for AIDS on a regular basis', if you know what I mean).
-
-This is VALIDCHR, a little DOS program I wrote to create
-an apropriate `valid chars =' config parameter.
-It is freeware and is thought to be distributed freely with Samba.
-
-WARNING:
- Your SMB driver may use another character map as the one VALIDCHR
- sees. The only way you can tell this is that some file names fail.
- Under Win95 everything is fine, though.
-
-Usage:
- c:
- mkdir junk_dir
- cd junk_dir
- a:validchr > a:output.log
- cd ..
- rmdir junk_dir
-
-Siedeffects:
- Files named *.TST may be deleted.
-
-Verification:
- For diagnostic purpose you can run VALIDCHR on a Samba mounted drive.
- Then you can use unix diff to compare the output of the network and
- the hard drive. These two outputs usually differ! However there
- should be few differences. I get following on Win95 (c: visa e:)
- 104c104
- < 152: length 0
- ---
- > 152: 95
- (diff line for `valid chars =' deleted because it's uninteresting)
- You can see, `y diaresis' can be mapped on the network drive while
- it cannot be mapped on the hard drive. Everything else is identical.
- However this gives a hint that one can improve the mapping.
-
-Bugs:
- Yes, probably some.
-
-
-VALIDCHR must be run on the system which character mapping should be probed.
-It must be run on the hard drive for this. VALIDCHR ALTERS THE CURRENT
-DIRECTORY AND REMOVES SOME FILES, SO ALWAYS RUN IT IN A junk DIRECTORY !!!
-You should redirect the output of VALIDCHR. At the end of the output is a
-line like
- valid chars = x:y y:x x:x ... a:b c ...
-which is suitable for your smb.conf file. (you should remove the DOS CR
-character, because DOS uses CRLF while Unix uses LF only.)
-
-Note that some mappings at the beginning of the `valid chars =' line like
-A:B B:A B:B
-might look a little bit strange to you, however sometimes character A
-has to be mapped to character B independently of a default mapping
-to uppercase or lowercase while character B must not be touched. I found
-this out the hard way ... Consider it a crude workaround, because Samba
-lacks the possibility to map characters in one direction only!
-
-VALIDCHR usually issues one warning for character 32.
-You may ignore these and any other warnings.
-
-VALIDCHR does not test for character NUL (this is the directory end marker).
-
-validchr.c is the source code to validchr.com
- You may do anything with the source code (copy, change, sell, burn)
-validchr.com is a Borland C compiled binary.
- Beware, it may contain a virus (if my system contains one).
-nwdos70.out is the output of an VALIDCHR-run under Novell DOS 7.0
- while no codepage (no display.sys) was active.
-msdos70.out is the output of an VALIDCHR-run under MS-DOS 7.0 (Win95 DOS)
- while codepage 850 was active.
-
-I have no other MS-DOS systems at home currently.
-(I have access to MS-DOS 3.0, 3.2, 3.3, 5.0 and 6.22, however I have no time
- to run VALIDCHR there)
-
-Some words to the output
-(for people not fammiliar with programming language C):
-
-probed_char: [text] mapped_char
-
-probed_char is the character probed to be written to disk
-text may be empty or contain:
- open File could not be opened.
- close File could not be closed (should not happen)
- length File name was shortened (usually occurs on SPC)
- unlink File cannot be unlinked (usually when open fails)
-mapped_char is the character which is used by MS-DOS in the directory
- This is usually the uppercase character.
- The mapped character is 0 if something failed (you may say
- that the character is not supported)
-
-The last line in the output is documented in the smb.conf manual page ;)
-
-tino@augsburg.net
diff --git a/examples/validchars/validchr.c b/examples/validchars/validchr.c
deleted file mode 100644
index 415546cb841..00000000000
--- a/examples/validchars/validchr.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* by tino@augsburg.net
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include <dirent.h>
-
-unsigned char
-test(void)
-{
- DIR *dir;
- struct dirent *dp;
- unsigned char c;
-
- if ((dir=opendir("."))==0)
- {
- perror("open .");
- return 0;
- }
- c = 0;
- while ((dp=readdir(dir))!=0)
- {
- size_t len;
-
- len = strlen(dp->d_name);
- if (len<4)
- continue;
- if (strcmp(dp->d_name+len-4, ".TST"))
- continue;
- if (len!=5)
- {
- fprintf(stderr, "warning: %s\n", dp->d_name);
- printf(" length");
- continue;
- }
- if (c)
- printf(" double%d\n", c);
- c = dp->d_name[0];
- }
- if (closedir(dir))
- perror("close .");
- return c;
-}
-
-int
-main(void)
-{
- char name[256];
- unsigned char map[256], upper[256], lower[256];
- int i, j, c;
- FILE *fd;
-
- if (test())
- {
- printf("There are *.TST files, please remove\n");
- return 0;
- }
- for (i=0; ++i<256; )
- {
- lower[i] = i;
- upper[i] = 0;
- }
- for (i=256; --i; )
- {
- map[i] = i;
- strcpy(name, "..TST");
- name[0] = i;
- printf("%d:", i);
- if ((fd=fopen(name, "w"))==0)
- printf(" open");
- else
- fclose(fd);
- c = test();
- if (unlink(name))
- printf(" unlink");
- if (c==i)
- printf(" ok");
- else
- printf(" %d", c);
- printf("\n");
- if (c!=i)
- {
- upper[c]++;
- lower[c] = i;
- }
- map[i] = c;
- }
-
- /* Uppercase characters are detected above on:
- * The character is mapped to itself and there is a
- * character which maps to it.
- * Lowercase characters are the lowest character pointing to another one.
- * Else it is a one way character.
- *
- * For this reason we have to process the list
- * 1) for 'one way' characters
- * 'one way' is something which is no upper and no lower character.
- * This is an awful, crude and ugly hack due to missing Samba support.
- * 2) for true uppercase/lowercase characters
- * 3) for standalone characters
- * Note that there might be characters which do not fall into 1 to 3.
- */
- printf("\n valid chars =");
- for (i=0; ++i<256; )
- if (map[i] && map[i]!=i && lower[map[i]]!=i)
- {
- if (!upper[i])
- printf(" %d:%d %d:%d %d:%d", /*1*/
- map[i], i, i, map[i], map[i], map[i]);
- else
- fprintf(stderr, "ignoring map %d->%d because of %d->%d\n",
- lower[i], i, i, map[i]);
- }
- for (i=0; ++i<256; )
- if (map[i] && map[i]==i)
- if (upper[i])
- printf(" %d:%d", lower[i], i); /*2*/
- else
- printf(" %d", i); /*3*/
- printf("\n");
- return 0;
-}
diff --git a/examples/validchars/validchr.com b/examples/validchars/validchr.com
deleted file mode 100644
index ce159568369..00000000000
--- a/examples/validchars/validchr.com
+++ /dev/null
Binary files differ
diff --git a/packaging/README b/packaging/README
deleted file mode 100644
index 1adb809ae5a..00000000000
--- a/packaging/README
+++ /dev/null
@@ -1,34 +0,0 @@
-Copyright (C) 1997 - Samba-Team
-Date: August 19, 1997
-Updates: First Release - 19970819
-===============================================================================
-
-Note:
-=====
-This directory is a public repository for platform specific files including
-build files for binary package distributions for specific operating systems
-as well as for source file distribution packages for those systems.
-
-As such, the files contained here are intended for use only by those wishing
-to build their own distribution packages and are NOT considered suitable
-material for anyone who wants to just install Samba from the pristine source
-files contained under the ~/source directory.
-
-All contributions / modifications / additions / etc. to the packaging files
-should be sent to samba-bugs@samba.anu.edu.au with the subject marked:
- PACKAGING: [add|mod|contrib] Your subject.
-
-Should you, or anyone you know of, have package build instructions and/or files
-that may be of use to the wider community of Samba users please mail the above
-account with subject: PACKAGING: [avail] OS xxxxxxxxxx
-where xxxxxxxxxx is the operating system platform that may be contributed.
-
-We will contact the person who is offering to contribute package build details
-to ensure that their contribution can be included in the official Samba sources.
-
-In the event that anyone wishes to contribute package build information please
-indicate in your response how we may access a suitable system to ensure our
-ability to keep the binary distribution itself current with the released source.
-
-The future of cooperatively developed software such as Samba depends on the
-willingness of all partners to share the fruit of their labours.
diff --git a/packaging/SGI/Makefile b/packaging/SGI/Makefile
deleted file mode 100644
index 8caa9ba212f..00000000000
--- a/packaging/SGI/Makefile
+++ /dev/null
@@ -1,722 +0,0 @@
-###########################################################################
-# Makefile for Samba SMB client/server for unix
-# Copyright Andrew Tridgell 1992-1996
-# Copyright John H Terpstra 1995-1997
-###########################################################################
-
-# The base directory for all samba files
-BASEDIR = /usr/samba
-
-# The base manpages directory to put the man pages in
-# Note: $(MANDIR)/man1, $(MANDIR)/man5 and $(MANDIR)/man8 must exist.
-MANDIR = /usr/share/man
-
-# The directories to put things in. If you use multiple
-# architectures or share the samba binaries across NFS then
-# you will probably want to change this layout.
-# Note: The SBINDIR is for files you do not want users to access
-# normally only applies to nmbd and smbd
-# SBINDIR implies a secure binary directory
-BINDIR = $(BASEDIR)/bin
-SBINDIR = $(BASEDIR)/bin
-LIBDIR = $(BASEDIR)/lib
-VARDIR = $(BASEDIR)/var
-
-# The permissions to give the executables
-INSTALLPERMS = 0755
-
-# Add any optimisation or debugging flags here
-# add -DSYSLOG for syslog support
-# RPM_OPT_FLAGS is needed when building an RPM distribution package
-# for RedHat Linux.
-# FLAGS1 = $(RPM_OPT_FLAGS)
-FLAGS1 = -O
-LIBS1 =
-
-# You will need to use a ANSI C compiler. This means under SunOS 4 you can't
-# use cc, instead you will have to use gcc.
-# CC = gcc
-
-# This may help with some versions of make
-SHELL = /bin/sh
-
-# The following can be useful for compiling on multiple architectures
-# just uncommment them putting the right directory in.
-# srcdir=./
-# VPATH=$(srcdir)
-
-# set these to where to find various files
-# These can be overridden by command line switches (see smbd(8))
-# or in smb.conf (see smb.conf(5))
-SMBLOGFILE = $(VARDIR)/log.smb
-NMBLOGFILE = $(VARDIR)/log.nmb
-CONFIGFILE = $(LIBDIR)/smb.conf
-LMHOSTSFILE = $(LIBDIR)/lmhosts
-
-# the directory where lock files go
-LOCKDIR = $(VARDIR)/locks
-
-# set this to the default group you want your machine to appear in
-# for browsing. This can also be set in nmbd (see nmbd(8))
-WORKGROUP = WORKGROUP
-
-# set this to the name of the default account, which is the one
-# to use when no username or password is specified. This can be overridden
-# in the runtime configuration file (see smb.conf(5))
-# NOTE: The account "nobody" may not be a good one as
-# on many unixes it may not be able to print. Thus you
-# might have to create a separate guest account that can print.
-GUESTACCOUNT = nobody
-
-# where you are going to have the smbrun binary. This defaults to the
-# install directory. This binary is needed for correct printing
-# and magic script execution. This should be an absolute path!
-# Also not that this should include the name "smbrun" on the end (the
-# name of the executable)
-SMBRUN = $(BINDIR)/smbrun
-
-#
-# The following (PAM, AFS, DCE/DFS, Kerberos5, SMB) are the
-# alternate choices for Samba authentication. If you are using
-# the UNIX password database to authenticate users you do not
-# need to uncomment any of them. If you wish to use one of these
-# alternate methods then only uncomment one of them.
-
-# This is for PAM authentication. RedHat Linux uses PAM.
-# If you use PAM, then uncomment the following lines:
-# PAM_FLAGS = -DUSE_PAM
-# PAM_LIBS = -ldl -lpam
-
-# This is for AFS authentication. If you use AFS then set AFS_BASE
-# according to your system layout, and uncomment the other lines as well.
-# AFS_BASE = /usr/afsws
-# AFS_FLAGS = -DAFS_AUTH -I$(AFS_BASE)/include
-# AFS_LIBDIR = $(AFS_BASE)/lib
-# NOTE: You may need to add -laudit in the line below
-# AFS_LIBS = -L$(AFS_LIBDIR) -L$(AFS_LIBDIR)/afs -lkauth -lprot -lubik \
-# -lauth -lrxkad -lsys -ldes -lrx -llwp -lcom_err \
-# $(AFS_LIBDIR)/afs/util.a
-
-# This is for DCE/DFS enablement. Uncomment this so that smbd can
-# operate as an authenticated user identity to operate on files that
-# live in the DCE Distributed Filesystem.
-# DCE_BASE = /opt/dcelocal
-# DCE_FLAGS = -I$(DCE_BASE)/include
-# DCE_LIBDIR = -L$(DCE_BASE)/lib
-# DCE_LIBS =
-
-# This is for Kerberos 5 authentication. Contributed by Nathan Neulinger
-# Univ. of Missouri - Rolla <nneul@umr.edu>
-# KRB5_BASE = /usr/local/krb5
-# KRB5_FLAGS = -DKRB5_AUTH -I$(KRB5_BASE)/include
-# KRB5_LIBS = -L$(KRB5_BASE)/lib -ldes425 -lkrb5 -lcrypto -lcom_err
-
-# This is for SMB encrypted (lanman) passwords.
-# you may wish to add -DREPLACE_GETPASS if your getpass() is limited
-# to 8 chars
-# DES_BASE=/usr/local/libdes
-# DES_FLAGS= -I$(DES_BASE)
-# DES_LIB= -L$(DES_BASE) -ldes
-# PASSWD_FLAGS=-DUSE_LIBDES -DSMB_PASSWD=\"$(BINDIR)/smbpasswd\" -DSMB_PASSWD_FILE=\"$(BASEDIR)/private/smbpasswd\"
-
-######################################
-# VTP-Support
-#
-# uncomment the following two lines to enable VTP-Support
-#VTP_FLAGS = -DWITH_VTP
-#VTP_OBJ = vt_mode.o
-######################################
-
-######################################
-# WHICH AWK? awk is used for automatic prototype generation. GNU awk works
-# where inferior awks don't. Sun is one manufacturer who supplies both
-# a broken awk called 'awk' and a fixed one called 'nawk'. mkproto.awk will
-# only work with the latter, and even that isn't as good as free GNU awk.
-#
-# Leave this uncommented; the OS-specific stuff will override it if required
-AWK = awk
-######################################
-
-#####################################
-# WHICH OPERATING SYSTEM?
-# UNCOMMENT ONE OF THE SECTIONS BELOW
-# MAKE SURE ONLY *ONE* IS UNCOMMENTED
-#
-# The following are additional flags that may apply
-# -DNETGROUP if your machine supports yp netgroups
-# -DAUTOMOUNT to ask for yp auto.home for users' home directories
-# -DSHADOW_PWD if you are using shadow passwords
-# -DGETPWANAM if you wish to use getpwanam() call
-# -DPWDAUTH if you have and want to use the pwdauth() call
-# -DUFC_CRYPT if you want the fast crypt routine
-# -DALLOW_CHANGE_PASSWORD if you want users to be able to set their password
-# remotely (only works on some systems)
-# -DQUOTAS for quota support in disk_free(). This probably only works
-# on some systems.
-# -DFAST_SHARE_MODES if you want the fast shared memory instead of the
-# slow description files for share mode locking. This
-# requires the mmap() and fcntl() system calls.
-#
-# NOTE: GETPWANAM & PWDAUTH are mutually exclusive, if you
-# Define one, you should NOT define the other.
-#####################################
-
-#####################################
-# for the JAPANESE EXTENSION
-# select filename's code set for KANJI/KANA in UNIX,
-# apply the following flag
-# -DKANJI=\"<code>\"
-# <code> is select character code set for JAPAN.
-# sjis: if your machine support SJIS
-# euc: if your machine support EUC
-# jis7: if your machine support JIS7
-# jis8: if your machine support JIS8
-# junet: if your machine support jis7 + junet rule
-# hex: if your machine only support 7 bits ascii filename only
-# convert to hexdecimal code preseeding ':'.
-# see also README.jis
-######################################
-
-
-# This is for SUNOS 4. Use the SUNOS5 entry for Solaris 2.
-# Note that you cannot use Suns "cc" compiler
-# as it's not an Ansi-C compiler. Get gcc or acc.
-# Note that if you have adjunct passwords you may need the GETPWANAM
-# or PWDAUTH option. There have been reports that using PWDAUTH may crash
-# your pwdauthd server so GETPWANAM is preferable (and probably faster)
-# contributed by Andrew.Tridgell@anu.edu.au
-# FLAGSM = -DSUNOS4
-# LIBSM =
-# AWK = nawk
-
-# Use this for Linux with shadow passwords
-# contributed by Andrew.Tridgell@anu.edu.au
-# add -DLINUX_BIGCRYPT is you have shadow passwords but don't have the
-# right libraries and includes
-# FLAGSM = -DLINUX -DSHADOW_PWD -DFAST_SHARE_MODES
-# LIBSM = -lshadow
-
-# Use this for Linux without shadow passwords
-# contributed by Andrew.Tridgell@anu.edu.au
-# AXPROC defines DEC Alpha Processor
-# FLAGSM = -DLINUX -DAXPROC -DFAST_SHARE_MODES
-# FLAGSM = -DLINUX -DFAST_SHARE_MODES
-# LIBSM =
-
-# Use this for Linux with shadow passwords and quota
-# contributed by xeno@mix.hive.no
-# Tested on the 1.3.57 kernel and ext2fs filesystem.
-# Notes:
-# /usr/include/sys/quota.h must be a symlink to /usr/include/linux/quota.h
-# The directory quota here must be a symlink to your quota package.
-# I just do 'ln -sf /usr/src/quota-1.50 quota' in this directory to get it to work.
-# FLAGSM = -O3 -m486 -DLINUX -DSHADOW_PWD -DQUOTAS -DFAST_SHARE_MODES
-# LIBSM = -lshadow
-
-# Use this for Linux with quota and glibc2
-# contributed by Thorvald Natvig <slicer@bimbo.hive.no>
-# Tested on the 2.0.30 kernel and ext2fs filesystem.
-# FLAGSM = -DLINUX -DQUOTAS -DNO_ASMSIGNALH -DGLIBC2 -DFAST_SHARE_MODES
-# LIBSM = -L/lib/libc5-compat -lcrypt
-
-# This is for SUNOS5.4 and later (also known as Solaris 2.4 and later)
-# contributed by Andrew.Tridgell@anu.edu.au
-# FLAGSM = -DSUNOS5 -DSHADOW_PWD -DNETGROUP -DFAST_SHARE_MODES
-# LIBSM = -lsocket -lnsl
-# AWK = nawk
-
-# This is for SUNOS 5.2 and 5.3 (also known as Solaris 2.2 and 2.3)
-# contributed by hdsi@newtech.net
-# FLAGSM = -DSUNOS5 -DSHADOW_PWD -DNETGROUP -DNO_STRFTIME -DFAST_SHARE_MODES
-# LIBSM = -lsocket -lnsl
-# AWK = nawk
-
-# This is for UXP/DS
-# contributed by dsfrost@oai6.yk.fujitsu.co.jp
-# FLAGSM = -DSVR4 -DSHADOW_PWD
-# LIBSM = -lsocket -lnsl
-
-# This is for SVR4
-# Contributed by mark@scot1.ucsalf.ac.uk
-# FLAGSM = -DSVR4 -DSHADOW_PWD -DALLOW_CHANGE_PASSWORD
-# LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb
-
-
-# This is for the Motorola 88xxx/9xx range of machines
-# Contributed by RPE@monnet.com
-# FLAGSM = -DSVR4 -DSHADOW_PWD -DGETTIMEOFDAY1
-# LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb
-
-
-# This is for UnixWare 1.x.
-# Contributed by Warren Young <tkennedy@cyberport.com>
-#FLAGSM = -Xa -DSVR4 -DSHADOW_PWD
-#LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb
-
-# This is for UnixWare 2.x WITH libdes support.
-# Contributed by tangent@cyberport.com
-#FLAGSM = -Xa -DSVR4
-#LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb
-
-# This is for UnixWare 2.x WITHOUT libdes support.
-# Contributed by tangent@cyberport.com
-#FLAGSM = -Xa -DSVR4 -DIA_UINFO
-#LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb -lcrypt -liaf
-
-# This is for UNIXWARE 2.x with shadow passwords.
-# Contributed by fja@extratech.com
-#FLAGSM = -Xa -DSVR4 -DSHADOW_PWD
-#LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb -lcrypt -lgen
-
-# This is for ULTRIX. Add -DULTRIX_AUTH for Ultrix enhanced security.
-# contributed by iversen@dsfys1.fi.uib.no
-# FLAGSM = -DULTRIX
-# LIBSM =
-
-
-# This is for OSF1 (Alpha)
-# contributed by errath@balu.kfunigraz.ac.at
-# NOTE: You may need -warning_unresolved if you get unresolved symbols
-# FLAGSM = -DOSF1
-# LIBSM =
-
-# This is for OSF1 with DCE/DFS
-# contributed by Jim Doyle <doyle@oec.com>
-# FLAGSM = -DOSF1 -DDFS_AUTH -DSIGCLD_IGNORE -DNO_SIGNAL_TEST
-# LIBSM = -ldce -lpthreads -lmach -lc_r
-
-# This is for OSF1 (Alpha) with NIS and Fast Crypt
-# contributed by David Gardiner <dgardine@cssip.edu.au>
-# FLAGSM = -DOSF1 -DNETGROUP -DUFC_CRYPT
-# LIBSM =
-
-
-# This is for OSF1 (Alpha) V2.0 Enhanced Security
-# contributed by Udo Linauer <ul@eacpc4.tuwien.ac.at>
-# FLAGSM = -DOSF1 -DOSF1_ENH_SEC
-# LIBSM = -lsecurity
-
-
-# This is for AIX 4.x
-# contributed by tomc@osi.curtin.edu.au
-# FLAGSM = -DAIX -DFAST_SHARE_MODES
-# LIBSM =
-
-# This is for AIX 4.x with quota support
-# contributed by tomc@osi.curtin.edu.au
-# FLAGSM = -DAIX -DFAST_SHARE_MODES -DQUOTAS
-# LIBSM =
-
-# This is for AIX 3.2.5 with DCE/DFS
-# contributed by Jim Doyle <doyle@oec.com>
-# FLAGSM = -DAIX -DDFS_AUTH -DSIGCLD_IGNORE -DNO_SIGNAL_TEST
-# LIBSM = -lc_r -ldce -lpthreads
-# CC = cc_r
-
-# This is for BSDI
-# contributed by tomh@metrics.com
-# versions of BSDI prior to 2.0 may need to add -DUSE_F_FSIZE for
-# disk usage stats to be correct
-# FLAGSM = -DBSDI -DFAST_SHARE_MODES
-# LIBSM =
-
-
-# This is for NetBSD. Add -DNETBSD_1_0 if you are using 1.0
-# contributed by noses@oink.rhein.de
-# FLAGSM = -DNETBSD -DSHADOW_PWD
-# LIBSM = -lcrypt
-
-
-# This is for SEQUENT.
-# Contributed by fwk@ix.netcom.com (Frank Keeney) and
-# rpwillia@Pentagon-EMH6.army.mil (Ray Williams)
-# tested on DYNIX/ptx(R) V2.1.0
-# FLAGSM = -DSEQUENT -DSHADOW_PWD -DHAVE_TIMEZONE
-# LIBSM = -lrpc -lsocket -lPW -linet -lnsl -lseq -lsec
-
-
-# This is for SEQUENT PTX 4.1.x
-# Contributed by bressler@iftccu.ca.boeing.com (Rick Bressler)
-# based on Keeny and Williams contribution.
-# tested on DYNIX/ptx(R) V4.1.3
-# FLAGSM = -DSEQUENT -DSHADOW_PWD -DHAVE_TIMEZONE -DPTX4
-# LIBSM = -lrpc -lsocket -lPW -lnsl -lseq -lsec
-
-
-# This is for HP-UX. Note that some systems don't like the -Aa switch.
-# contributed by Pasi.Kaara@atk.tpo.fi
-# You will need -DREPLACE_GETPASS if you use smb encryption
-# Add -DHPUX10 if compiling on HPUX 10.x
-# FLAGSM = -DHPUX -Aa -D_HPUX_SOURCE -D_POSIX_SOURCE
-# LIBSM =
-
-# This is for HP-UX with DCE/DFS
-# contributed by Jim Doyle <doyle@oec.com>
-# Add -DHPUX10 if compiling on HPUX 10.x
-# FLAGSM = -DHPUX -Aa -D_HPUX_SOURCE -D_POSIX_SOURCE -DDFS_AUTH -D_REENTRANT -I/usr/include/reentrant
-# LIBSM = -ldce -lM -lc_r
-
-# HP-UX 10.x Trusted System
-# Contributed by David-Michael Lincke (dlincke@sgcl1.unisg.ch)
-# FLAGSM = +O3 -Ae -DHPUX -DHPUX10 -DHPUX_10_TRUSTED
-# LIBSM = -lsec
-
-
-# This is for SGI.
-# contributed by lpc@solomon.technet.sg (Michael Chua)
-# FOR SGI IRIX 4.x.x, use the following line
-# FLAGSM = -DSGI -DHAVE_TIMEZONE
-# LIBSM = -lsun
-
-# FOR SGI IRIX 5.x.x, use this line instead
-# FLAGSM = -DSGI5 -DSHADOW_PWD -DHAVE_TIMEZONE -DFAST_SHARE_MODES
-# LIBSM =
-
-# FOR SGI IRIX 6.2 using the system compiler (*NOT* gcc), use this line instead
-# Contributed by David.Billinghurst@restech.cra.com.au
-FLAGSM = -DSGI5 -DSHADOW_PWD -DHAVE_TIMEZONE -DFAST_SHARE_MODES
-LIBSM =
-FLAGS1 = -O -n32 -g3
-
-# This is for FreeBSD
-# contributed by kuku@acds.physik.rwth-aachen.de
-# NOTE: You may need to add -DBSD44 if you have password problems
-# FLAGSM = -DFreeBSD -DFAST_SHARE_MODES
-# LIBSM = -lcrypt
-
-
-# This is for NEXTSTEP Release 2.X
-# No Posix.
-# contributed by brad@cac.washington.edu (Brad Greer)
-# FLAGSM = -DNEXT2
-# LIBSM =
-
-# This is for NEXTSTEP Release 3.0 and greater (including OPENSTEP for Mach).
-# contributed by brad@cac.washington.edu (Brad Greer)
-# additional configuration by pmarcos@next.com (Paul Marcos)
-# For compiling n-way fat executables, you should append the appropriat -arch
-# flags to the FLAGSM variable. Valid flags are:
-# -arch m68k
-# -arch i386
-# -arch hppa
-# -arch sparc
-# To compile 4-way fat, you would append
-# -arch m68k -arch i386 -arch hppa -arch sparc
-# FLAGSM = -DNEXT3_0
-# LIBSM =
-
-
-# NOTE: ISC is also known as "INTERACTIVE"
-# This is for Sunsoft ISC SVR3V4 running in POSIX mode
-# contributed by pim@cti-software.nl (Pim Zandbergen)
-# FLAGSM = -posix -D_SYSV3 -DISC -DSHADOW_PWD
-# LIBSM = -lsec -lcrypt -linet
-
-# This is for Sunsoft ISC SVR3V4 running in iBCS2 mode
-# contributed by pim@cti-software.nl (Pim Zandbergen)
-# FLAGSM = -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_SYSV3\
-# -DISC -DSHADOW_PWD -DREPLACE_GETWD -DREPLACE_RENAME
-# LIBSM = -lsec -lcrypt -linet -lcposix
-
-
-# This is for A/UX 3.0
-# Contributed by root@dolphin.csudh.edu (Jon S. Stevens)
-# FLAGSM = -DAUX
-# LIBSM =
-
-# This is for Altos Series 386/1000
-# Contributed by cal@zls.com
-# FLAGSM = -DALTOS -DHAS_RDCHK
-# LIBSM = -lsocket -lxenix
-
-
-#Note: The SCO entries require the libcrypt library. You can get it via
-#anonymous ftp from ftp.sco.com:/SLS/lng225b.* or ftp.uu.net:/vendors/sco
-#
-# Use this for SCO with shadow passwords. Tested on "Open enterprise 3.0"
-# SCO changes from Heinz Mauelshagen (mauelsha@ez.da.telekom.de)
-# FLAGSM = -DSCO -DSHADOW_PWD -DNETGROUP
-# LIBSM = -lyp -lrpc -lyp -lsec -lsocket -lcrypt_i -lintl
-
-# Use this for SCO with shadow passwords, without YP.
-# Tested on "Open Enterprise Server 3.0" (John Owens john@micros.com)
-# Also, use "CC = cc" above.
-# FLAGSM = -DSCO -DSHADOW_PWD
-# LIBSM = -lsec -lsocket -lcrypt_i
-
-# Use this for SCO with TCB passwords (default).
-# Tested on "Open enterprise 3.0". Contributed by lance@fox.com.
-# CC = cc
-# FLAGSM = -DSCO -DSecureWare
-# LIBSM = -lprot_s -lcrypt -lsocket -lm -lc_s
-
-# Use this for SCO Unix 3.2v2 (ODT 1.1) with TCB passwords (default).
-# Contributed by Stephen.Rothwell@pd.necisa.oz.au
-# N.B. this needs gcc
-# FLAGSM = -DSCO -DSecureWare -DSCO3_2_2
-# LIBSM = -lprot -lcrypt_i -lsocket -lm -lintl
-
-# This is for the european distribution of SCO.
-# Contributed by Urmet.Janes@gwhite.goodwin.ee
-# FLAGSM = -DSCO -DSHADOW_PWD
-# LIBSM = -lsec -lsocket /usr/lib/libcrypt_i.a -lintl
-
-# Use this for SCO OpenServer 5 with TCB passwords (default).
-# contributed by Scott Michel <scottm@intime.intime.com>
-# you may also like to add the -dy switch (recommended by Marnus van
-# Niekerk, mvn@pixie.co.za)
-# CC = cc -Xc
-# FLAGSM = -DSCO -DSecureWare -DEVEREST -DUSE_MMAP
-# LIBSM = -lprot -lcurses -lcrypt -lsocket -lPW -lm -lx -lc_s -lc
-
-
-# This is for intergraph.
-# contributed by cjkiick@flinx.b11.ingr.com
-# modified by ttj@sknsws61.sjo.statkart.no
-# FLAGSM = -DCLIX -D_INGR_EXTENSIONS=1
-# LIBSM = -lbsd -lc_s
-
-# This is for DGUX.
-# Contributed by ross@augie.insci.com (Ross Andrus)
-# FLAGSM = -DDGUX
-# LIBSM =
-
-# This is for DGUX on Intel boxes.
-# Contributed by tim@denmantire.com
-# FLAGSM = -DDGUX
-# LIBSM = -lsocket -lnsl -lresolv
-
-# This is for Apollo Domain/OS sr10.3 (systype = BSD4.3)
-# Added 1994-07-08 Stephen C. Steel <steve@qv3donald.LeidenUniv.nl>
-# additional patches by jmi@csd.cri.dk (John Mills)
-# you may need the "-A ansi" switch to cc
-# FLAGSM = -DAPOLLO -D_INCLUDE_BSD_SOURCE -D_INCLUDE_XOPEN_SOURCE
-# LIBSM =
-
-
-# RiscIX.
-# contributed by Jim Barry <jim@ilp.com> and
-# Charles Gay-Jones <charlie@ilp.com>
-# FLAGSM = -DRiscIX -DNOSTRDUP
-# LIBSM =
-
-
-# This is for System V with some berkely extensions (Motorola 88k R32V3.2).
-# contributed by tonyb@plaza.ds.adp.com (Tony D. Birnseth)
-# FLAGSM = -DM88K_R3
-# LIBSM = -lgen -lbsd -lnsl
-
-
-# This is for DNIX.
-# contributed by Peter Olsson <pol@leissner.se>
-# NOTE: You may need an updated libc.a from your vendor as older
-# versions have broken mktime calls and no initgroups() call
-# NOTE2: You may need -lpasswd if you use shadow passwords
-# NOTE3: Please read the file DNIX.txt in the docs directory. It
-# contains important information about uid handling under DNIX, you may
-# need to patch your C library.
-# FLAGSM = -DDNIX -I/usr/include/bsd
-# LIBSM = -ln
-
-
-# This is for Cray, Unicos 8.0
-# contributed by velo@sesun3.epfl.ch (Martin Ouwehand)
-# FLAGSM = -DCRAY -U__STDC__ -DQUOTAS
-# LIBSM =
-
-# This is for Convex
-# contributed by Victor Balashov <balashov@cv.jinr.dubna.su>
-# and Ulrich Hahn <ulrich.hahn@zdv.uni-tuebingen.de>
-# FLAGSM= -DCONVEX -DSHADOW_PWD
-# LIBSM=
-
-# This is for SMP_DC.OSx v1.1-94c079 on Pyramid S series
-# contributed by jeffrey@itm.org
-# FLAGSM = -DSOLARIS -DSHADOW_PWD -DBSD_COMP
-# LIBSM = -lsocket -lnsl
-
-# This is for QNX 4.22
-# Contributed by eldo@invisa.satlink.net (Eldo Loguzzo)
-# FLAGSM = -DQNX -DGUEST_SESSSETUP=1
-# LIBSM =
-
-
-# This is for SONY NEWS, NEWS-OS 4.2.x
-# contributed by sky@sm.sony.co.jp (Katushi Sato)
-# FLAGSM = -DNEWS42 -DKANJI=\"sjis\"
-# LIBSM =
-
-
-# This is for SONY NEWS, NEWS-OS 6.1.x
-# contributed by kobo@sm.sony.co.jp (Yoichi Kobori)
-# FLAGSM = -Xa -DSVR4 -DNEWS61 -DSHADOW_PWD -DNETGROUP -DGETTIMEOFDAY1 -DKANJI=\"euc\"\ -D_SONYILS_H
-# LIBSM = -lsocket -lnsl
-
-
-# This is for OS/2 using EMX
-# Contributed by jasonr@pec.co.nz (Jason Rumney)
-# Now maintained by Jacco de Leeuw <leeuw@wins.uva.nl>
-# FLAGSM = -DOS2
-# LIBSM = -Zexe -lsocket
-
-
-# This is for LYNX 2.3.0 (gcc v2.6)
-# Contributed by woelfel@hpe.fzk.de (Manfred Woelfel)
-# FLAGSM = -DLYNX -DUFC_CRYPT -mposix
-# LIBSM = -lbsd
-
-
-# This is for MachTen (a unix like system for Macintoshes)
-# contributed by Trevor Strohman (trev@figment.tenon.com)
-# FLAGSM = -DMACHTEN
-# LIBSM =
-
-
-# RISCOs 5.0B
-# contributed by John Agnew <johna@bfs.Unibol.COM>
-# FLAGSM = -systype svr4 -std -DSVR4
-# LIBSM = -lsocket -lnsl -lc -L/usr/ucblib -lucb
-
-
-# This is for B.O.S. (Bull Operating System)
-# Contributed by koine@fileita.it
-# FLAGSM = -DBOS -DNO_RESOURCEH -DUSE_WAITPID
-# LIBSM = -linet
-
-
-# This for Amiga using GCC and ixemul.library 43.0 or later.
-# contributed by Rask Ingemann Lambertsen <rask@k4315.kampsax.dtu.dk>
-# The binaries will support both AmiTCP and AS225R2 compatible
-# protocol stacks because of the use of ixnet.library.
-# Other protocol stacks will be supported automatically if
-# support for them is added to ixnet.library.
-# The binaries will have automatic stack extension :-)
-# smbd must be run from inetd :-(
-# FLAGSM = -DAMIGA -Dfork=vfork -mstackextend
-# LIBSM =
-
-
-
-######################################################################
-# DON'T EDIT BELOW THIS LINE
-######################################################################
-
-CFLAGS1 = $(FLAGS1) -DSMBLOGFILE=\"$(SMBLOGFILE)\" -DNMBLOGFILE=\"$(NMBLOGFILE)\"
-CFLAGS2 = -DCONFIGFILE=\"$(CONFIGFILE)\" -DLMHOSTSFILE=\"$(LMHOSTSFILE)\"
-CFLAGS3 = -DLOCKDIR=\"$(LOCKDIR)\" -DSMBRUN=\"$(SMBRUN)\"
-CFLAGS4 = -DWORKGROUP=\"$(WORKGROUP)\" -DGUEST_ACCOUNT=\"$(GUESTACCOUNT)\"
-CFLAGS5 = $(CFLAGS1) $(CFLAGS2) $(CFLAGS3) $(CFLAGS4) $(FLAGSM) $(AFS_FLAGS) $(KRB5_FLAGS)
-CFLAGS = $(CFLAGS5) $(PAM_FLAGS) $(DCE_FLAGS) $(DES_FLAGS) $(PASSWD_FLAGS) $(VTP_FLAGS)
-LIBS = $(LIBS1) $(LIBSM) $(PAM_LIBS) $(DCE_LIBS) $(KRB5_LIBS) $(DES_LIB)
-
-SPROGS = smbd nmbd
-PROGS1 = smbclient testparm testprns smbrun smbstatus smbpasswd
-PROGS = $(PROGS1) nmblookup
-SCRIPTS = smbtar addtosmbpass
-
-all : CHECK $(SPROGS) $(PROGS)
-
-CHECK :
- @$(SHELL) $(srcdir)checkos.sh $(FLAGSM)
- @echo "Using CFLAGS = $(CFLAGS)"
- @echo "Using LIBS = $(LIBS)"
-
-INCLUDES1 = version.h local.h includes.h smb.h
-INCLUDES2 = trans2.h
-INCLUDES = $(INCLUDES1) $(INCLUDES2)
-
-UTILOBJ1 = util.o system.o charset.o kanji.o fault.o smbencrypt.o charcnv.o
-UTILOBJ2 = $(UTILOBJ1) md4.o loadparm.o params.o pcap.o username.o time.o
-UTILOBJ = $(UTILOBJ2) interface.o replace.o
-PARAMOBJ = $(UTILOBJ) ufc.o smbpass.o access.o shmem.o
-SMBDOBJ1 = $(PARAMOBJ) trans2.o pipes.o message.o dir.o printing.o locking.o
-SMBDOBJ2 = ipc.o reply.o mangle.o chgpasswd.o password.o quotas.o uid.o
-SMBDOBJ = predict.o $(SMBDOBJ1) $(SMBDOBJ2) $(VTP_OBJ)
-NMBDOBJ1 = nmblib.o namepacket.o nameresp.o nmbsync.o nameannounce.o nameelect.o
-NMBDOBJ2 = namedbresp.o namedbwork.o namedbserver.o namedbsubnet.o namedbname.o
-NMBDOBJ3 = nameservresp.o nameservreply.o namelogon.o namebrowse.o namework.o nameserv.o clientutil.o
-NMBDOBJ = $(UTILOBJ) $(NMBDOBJ1) $(NMBDOBJ2) $(NMBDOBJ3)
-.SUFFIXES:
-.SUFFIXES: .c .o .h
-
-.c.o: $(INCLUDES)
- @echo Compiling $*.c
- @$(CC) $(CFLAGS) -c $(srcdir)$*.c
-
-smbd: server.o $(SMBDOBJ)
- @echo Linking smbd
- @$(CC) $(CFLAGS) -o smbd server.o $(SMBDOBJ) $(LIBS) $(AFS_LIBS)
-
-smbrun: smbrun.o
- @echo Linking smbrun
- @$(CC) $(CFLAGS) -o smbrun smbrun.o $(LIBS)
-
-nmblookup: nmblookup.o namequery.o nmblib.o $(UTILOBJ)
- @echo Linking nmblookup
- @$(CC) $(CFLAGS) -o nmblookup nmblookup.o namequery.o nmblib.o $(UTILOBJ) $(LIBS)
-
-nmbd: nmbd.o $(NMBDOBJ)
- @echo Linking nmbd
- @$(CC) $(CFLAGS) -o nmbd nmbd.o $(NMBDOBJ) $(LIBS)
-
-smbclient: client.o clitar.o getsmbpass.o namequery.o nmblib.o $(UTILOBJ)
- @echo Linking smbclient
- @$(CC) $(CFLAGS) -o smbclient client.o clitar.o getsmbpass.o namequery.o nmblib.o $(UTILOBJ) $(LIBS)
-
-smbstatus: status.o $(PARAMOBJ)
- @echo Linking smbstatus
- @$(CC) $(CFLAGS) -o smbstatus status.o $(PARAMOBJ) $(LIBS)
-
-testparm: testparm.o $(PARAMOBJ)
- @echo Linking testparm
- @$(CC) $(CFLAGS) -o testparm testparm.o $(PARAMOBJ) $(LIBS)
-
-testprns: testprns.o $(PARAMOBJ)
- @echo Linking testprns
- @$(CC) $(CFLAGS) -o testprns testprns.o $(PARAMOBJ) $(LIBS)
-
-smbpasswd: smbpasswd.o getsmbpass.o $(PARAMOBJ)
- @echo Linking smbpasswd
- @$(CC) $(CFLAGS) -o smbpasswd smbpasswd.o getsmbpass.o $(PARAMOBJ) $(LIBS)
-
-install: installbin installman installscripts
-
-installbin: all
- @$(SHELL) $(srcdir)installbin.sh $(INSTALLPERMS) $(BASEDIR) $(SBINDIR) $(LIBDIR) $(VARDIR) $(SPROGS)
- @$(SHELL) $(srcdir)installbin.sh $(INSTALLPERMS) $(BASEDIR) $(BINDIR) $(LIBDIR) $(VARDIR) $(PROGS)
-
-installscripts:
- @$(SHELL) $(srcdir)installscripts.sh $(INSTALLPERMS) $(BINDIR) $(SCRIPTS)
-
-# revert to the previously installed version
-revert:
- @$(SHELL) $(srcdir)revert.sh $(SBINDIR) $(SPROGS) $(SCRIPTS)
- @$(SHELL) $(srcdir)revert.sh $(BINDIR) $(PROGS) $(SCRIPTS)
-
-installman:
- @$(SHELL) $(srcdir)installman.sh $(MANDIR) $(srcdir)
-
-uninstall: uninstallman uninstallbin uninstallscripts
-
-uninstallman:
- @$(SHELL) $(srcdir)uninstallman.sh $(MANDIR) $(srcdir)
-
-uninstallbin:
- @$(SHELL) $(srcdir)uninstallbin.sh $(INSTALLPERMS) $(BASEDIR) $(SBINDIR) $(LIBDIR) $(VARDIR) $(SPROGS)
- @$(SHELL) $(srcdir)uninstallbin.sh $(INSTALLPERMS) $(BASEDIR) $(BINDIR) $(LIBDIR) $(VARDIR) $(PROGS)
-
-uninstallscripts:
- @$(SHELL) $(srcdir)uninstallscripts.sh $(INSTALLPERMS) $(BINDIR) $(SCRIPTS)
-
-clean:
- rm -f core *.o *~ $(PROGS) $(SPROGS)
-
-cleandir: clean
- rm -f .depend tags
-
-proto:
- @$(SHELL) $(srcdir)checkos.sh $(FLAGSM)
- $(AWK) -f mkproto.awk *.c > proto.h
-
-realclean: clean
-
diff --git a/packaging/SGI/README b/packaging/SGI/README
deleted file mode 100644
index 4b174b34df0..00000000000
--- a/packaging/SGI/README
+++ /dev/null
@@ -1,38 +0,0 @@
-This directory contains sample files for using Samba on an IRIX
-system. These were taken from a system running IRIX 6.2. The
-client machines were running Win95 and connected via the Ethernet
-using TCP/IP and DNS. Consult the Samba documentation for tips
-on configuring Samba "properly"; this smb.conf file is very simple.
-Consult the Microsoft help/documentation to understand how to
-configure the networking support on the PC clients (Win95, WfW,
-etc.).
-
-This distribution is configured so that various Samba configuration,
-binary, and log files are placed in the /usr/samba file hierarchy.
-Man pages are placed in the /usr/share/catman/u_man hierarchy.
-
-The version number of the distribution is a 10 digit number that
-is created from the samba version number plus a release number.
-Each section of the samba version number forms 2 digits of the
-version number (with leading zeros if necessary).
-
-samba version 1.9.16 first release would become 0109160000
-samba version 1.9.16p9 first release would become 0109160900
-samba version 1.9.16p9 second release would become 0109160901
-
-You can enable all printers on your system to be used by samba
-by running the script /usr/samba/mkprintcap.sh
-
-This distribution automatically configures samba to run as deamons
-by the script /etc/init.d/samba and the file /etc/config/samba
-(used by chkconfig). If you would prefer to have samba started by
-inetd you can run the script /usr/samba/inetd.sh.
-
-To create a Samba distribution you must have the Documenter's WorkBench
-package installed to format the manual pages. In addition you need
-to have the Software Packager software (inst_dev) installed to
-generate the inst images.
-
-From /usr/samba/packaging/SGI directory run the mkrelease.sh script.
-The package files will be placed in ./bins
-
diff --git a/packaging/SGI/inetd.sh b/packaging/SGI/inetd.sh
deleted file mode 100755
index 8c4c6cb8d8b..00000000000
--- a/packaging/SGI/inetd.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#! /bin/sh
-#
-# kill any running samba processes
-#
-/etc/killall smbd nmbd
-chkconfig samba off
-
-#
-# add SAMBA deamons to inetd.conf
-#
-cp /etc/inetd.conf /etc/inetd.O
-sed -e "/^netbios/D" -e "/^#SAMBA/D" /etc/inetd.O > /etc/inetd.conf
-echo '#SAMBA services' >> /etc/inetd.conf
-echo netbios-ssn stream tcp nowait root /usr/samba/bin/smbd smbd >> /etc/inetd.conf
-echo netbios-ns dgram udp wait root /usr/samba/bin/nmbd nmbd -S >> /etc/inetd.conf
-
-#
-# add SAMBA service ports to /etc/services
-#
-cp /etc/services /etc/services.O
-sed -e "/^netbios/D" -e "/^#SAMBA/D" /etc/services.O > /etc/services
-echo '#SAMBA services' >> /etc/services
-echo 'netbios-ns 137/udp # SAMBA' >> /etc/services
-echo 'netbios-ssn 139/tcp # SAMBA' >> /etc/services
-
-#
-# restart inetd to start SAMBA
-#
-/etc/killall -HUP inetd
diff --git a/packaging/SGI/legal_notice.html b/packaging/SGI/legal_notice.html
deleted file mode 100644
index fdb76456289..00000000000
--- a/packaging/SGI/legal_notice.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<HTML VERSION="2.0">
-<HEAD>
-<TITLE>Silicon Graphics Freeware Legal Notice</TITLE>
-</HEAD>
-
-<BODY>
-<H1><A NAME="LEGAL">Silicon Graphics Freeware Legal Notice</A></H1>
-<HR>
-Copyright 1995, Silicon Graphics, Inc. -- ALL RIGHTS RESERVED
-<P>
-You may copy, modify, use and distribute this software, (i)
-provided that you include the entirety of this reservation of
-rights notice in all such copies, and (ii) you comply with any
-additional or different obligations and/or use restrictions
-specified by any third party owner or supplier of the software
-in other notices that may be included with the software.
-
-<P>
-SGI DISCLAIMS ALL WARRANTIES WITH RESPECT TO THIS SOFTWARE,
-EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION,
-ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE OR NONINFRINGEMENT. SGI SHALL NOT BE LIABLE FOR ANY
-SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING,
-WITHOUT LIMITATION, LOST REVENUES, LOST PROFITS, OR LOSS OF
-PROSPECTIVE ECONOMIC ADVANTAGE, RESULTING FROM THE USE OR MISUSE
-OF THIS SOFTWARE.
-
-<P>
-U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
-
-<P>
-
-Use, duplication or disclosure by the Government is subject to
-restrictions as set forth in FAR 52.227.19(c)(2) or subparagraph
-(c)(1)(ii) of the Rights in Technical Data and Computer Software
-clause at DFARS 252.227-7013 and/or in similar or successor
-clauses in the FAR, or the DOD or NASA FAR Supplement.
-Unpublished - rights reserved under the Copyright Laws of United
-States. Contractor/manufacturer is Silicon Graphics, Inc., 2011
-N. Shoreline Blvd. Mountain View, CA 94039-7311.
-
-<H3><A NAME="SUPPORT">Product Support</A></H3>
-
-<P>
-Freeware products are not supported by Silicon Graphics or any
-of its support providers. The software contained in this package
-is made available through the generous efforts of their authors.
-Although they are interested in your feedback, they are under no
-obligation to address bugs, enhancements, or answer questions.
-
-</BODY>
-</HTML>
diff --git a/packaging/SGI/mkman b/packaging/SGI/mkman
deleted file mode 100755
index fedeb4d7196..00000000000
--- a/packaging/SGI/mkman
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-if [ ! -d catman ]; then
- mkdir catman
-fi
-
-# if you wish to make html versions of the man pages then uncomment
-# the following section and the "rman" command below
-#
-# if [ ! -d html ]; then
-# mkdir html
-# fi
-
-FILES="*.?"
-
-cd ../../docs
-for FILE in $FILES ; do
- neqn $FILE | tbl | nroff -man > ../packaging/SGI/catman/`basename $FILE`
- compress -f ../packaging/SGI/catman/`basename $FILE`
-# rman -f html -r "%s.%s.html" $FILE > ../packaging/SGI/html/$FILE.html
-done
-cd ../packaging/SGI
diff --git a/packaging/SGI/mkprintcap.sh b/packaging/SGI/mkprintcap.sh
deleted file mode 100755
index f610e757f06..00000000000
--- a/packaging/SGI/mkprintcap.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /bin/sh
-#
-# create printcap file
-#
-if [ -r /usr/samba/printcap ]
-then
- cp /usr/samba/printcap /usr/samba/printcap.O
-fi
-
-echo "#" > /usr/samba/printcap
-echo "# Samba printcap file" >> /usr/samba/printcap
-echo "# Alias names are separated by |, any name with spaces is taken as a comment" >> /usr/samba/printcap
-echo "#" >> /usr/samba/printcap
-lpstat -a | sed -e "s/ .*//" >> /usr/samba/printcap
-
diff --git a/packaging/SGI/mkrelease.sh b/packaging/SGI/mkrelease.sh
deleted file mode 100755
index 03644b2f7c0..00000000000
--- a/packaging/SGI/mkrelease.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-# create the catman versions of the manual pages
-#
-echo Making manual pages
-./mkman
-
-# build the sources
-#
-echo Making binaries
-cd ../../source
-# make -f ../packaging/SGI/Makefile clean
-make -f ../packaging/SGI/Makefile all
-cd ../packaging/SGI
-
-# generate the packages
-#
-echo Generating Inst Packages
-
-if [ ! -d bins ]; then
- mkdir bins
-fi
-
-/usr/sbin/gendist -rbase / -sbase ../.. -idb samba.idb -spec samba.spec -dist ./bins -all
-
diff --git a/packaging/SGI/printcap b/packaging/SGI/printcap
deleted file mode 100644
index b67b9cb167c..00000000000
--- a/packaging/SGI/printcap
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Sample printcap file
-# Alias names are separated by |, any name with spaces is taken as a comment
-#
-lp4js|lp12|LaserJet on the third floor by the coffee machine
diff --git a/packaging/SGI/psfixes.sed b/packaging/SGI/psfixes.sed
deleted file mode 100644
index cf5ce889145..00000000000
--- a/packaging/SGI/psfixes.sed
+++ /dev/null
@@ -1,4 +0,0 @@
-/^%/,/ /d
-/^%%Title:/s/. $/ /
-/^\/VM?/,/ VM?/c\
-/VM? { pop } def
diff --git a/packaging/SGI/relnotes.html b/packaging/SGI/relnotes.html
deleted file mode 100644
index 71140420fe0..00000000000
--- a/packaging/SGI/relnotes.html
+++ /dev/null
@@ -1,234 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
- <TITLE>Samba 1.9.17 Release Notes</TITLE>
- <META NAME="GENERATOR" CONTENT="Mozilla/3.0GoldC-SGI (X11; I; IRIX 6.2 IP22) [Netscape]">
-</HEAD>
-<BODY>
-
-<H1>Samba 1.9.17 Release Notes</H1>
-
-<P>
-<HR></P>
-
-<H2>Table of Contents</H2>
-
-<MENU>
-<LI><B><A HREF="#WHATIS">What is Samba?</A></B> </LI>
-
-<LI><B><A HREF="#Support">Support Policy</A> </B></LI>
-
-<LI><B><A HREF="#Installation">Installation Information</A> </B></LI>
-
-<LI><B><A HREF="legal_notice.html">Silicon
-Graphics Legal Notice</A> </B></LI>
-
-<LI><B><A HREF="#AUTHORNOTES">Author's Notice(s)</A> </B></LI>
-
-<LI><B><A HREF="#Documentation">Documentation Information</A> </B></LI>
-</MENU>
-
-<P>
-<HR></P>
-
-<H2><A NAME="WHATIS"></A>What is Samba?</H2>
-
-<P>Samba is an SMB client and server for Unix. It makes it possible for
-client machines running Windows 95 and Windows for Workgroups to access
-files and/or print services on a Unix system. Samba includes an SMB server
-to provide LanManager-style file and print services to PCs, a Netbios (RFC10001/1002)
-name server, and an FTP-like client application for accessing PC resources
-from Unix. </P>
-
-<P>To make Samba work you'll need to configure your server host to run
-<B>smbd</B> and <B>nmbd</B> whenever you connect to a certain Internet
-port from the client machine. <B>Smbd</B> and <B>nmbd</B> can be started
-either as daemons or from inetd.</P>
-
-<P>By default <B>smbd</B> and <B>nmbd</B> are started as daemons by the
-file <I>/etc/init.d/samba</I> in conjunction with the chkconfig variable
-samba being set to on. If you set chkconfig samba off then the deamons
-will not be automatically started on reboot. In this case you must type
-the following at a shell prompt to start samba after a reboot: </P>
-
-<PRE><B> chkconfig samba on
- /etc/init.d/samba start</B>
-</PRE>
-
-<P>If you make changes to your configuration files, <B>smbd</B> and <B>nmbd</B>
-may be restarted by typing the following at a shell prompt: </P>
-
-<PRE><B> /etc/init.d/samba start</B>
-</PRE>
-
-<P><B>smbd</B> and <B>nmbd</B> may be killed by typing the following at
-a shell prompt: </P>
-
-<PRE><B> /etc/init.d/samba stop</B>
-</PRE>
-
-<P>To have <B>smbd</B> and <B>nmbd</B> started by inetd you can execute
-the shell script <I>/usr/samba/inetd.sh</I> to automatically configure
-the various files and start the processes. This shell script first kills
-any running <B>smbd</B> and <B>nmbd</B> processes. It then removes any
-existing entries for &quot;netbios*&quot; from <I>/etc/inetd.conf</I> and
-adds the following lines </P>
-
-<PRE><B> netbios-ssn stream tcp nowait root /usr/samba/bin/smbd smbd
- netbios-ns dgram udp wait root /usr/samba/bin/nmbd nmbd -S</B>
-</PRE>
-
-<P>It then removes any existing entries for &quot;netbios*&quot; from <I>/etc/services</I>
-and adds the following lines </P>
-
-<PRE><B> netbios-ns 137/udp # SAMBA
- netbios-ssn 139/tcp # SAMBA</B>
-</PRE>
-
-<P><I>Inetd</I> is then restarted by executing:</P>
-
-<PRE><B> /etc/killall -HUP inetd</B>
-</PRE>
-
-<P>If you make changes to your configuration files, <B>smbd</B> and <B>nmbd</B>
-may be restarted by typing the following at a shell prompt: </P>
-
-<PRE><B> /etc/killall smbd nmbd
- /etc/killall -HUP inetd</B>
-</PRE>
-
-<H3><A NAME="AUTHORNOTES"></A>Author's Notice(s):</H3>
-
-<P>The author of this product is: Andrew Tridgell </P>
-
-<P>Samba is distributed freely under the <A HREF="GNU_COPYING.txt">GNU
-public license</A>. </P>
-
-<H3><A NAME="Support"></A>Support:</H3>
-
-<P>The software in this package is considered unsupported by Silicon Graphics.
-Neither the authors or Silicon Graphics are compelled to help resolve problems
-you may encounter in the installation, setup, or execution of this software.
-To be more to the point, if you call us with an issue regarding products
-in the Freeware package, we'll have to gracefully terminate the call. The
-<A HREF="http://samba.anu.edu.au/pub/samba/">
-Samba Web Page</A> has a listing of companies and individuals that offer
-commercial support for a fee.
-</P>
-
-<H2><A NAME="Installation"></A>Installation Information</H2>
-
-<P>Samba includes these subsystems: </P>
-
-<TABLE>
-<TR>
-<TD ALIGN=LEFT><B>samba.sw.base</B> (<I>default</I>)</TD>
-
-<TD>Execution environment for Samba.</TD>
-</TR>
-
-<TR>
-<TD ALIGN=left><B>samba.man.manpages</B>(<I>default</I>)</TD>
-
-<TD>Samba 1.9.17's online manual pages (preformatted).</TD>
-</TR>
-
-<TR>
-<TD ALIGN=LEFT VALIGN=TOP><B>samba.man.doc</B> (<I>default</I>)</TD>
-
-<TD>Samba documentation: hints on installation and configuration, an FAQ
-(Frequently Asked Questions), help in diagnosing problems, etc..</TD>
-</TR>
-
-<TR>
-<TD ALIGN=left><B>samba.man.relnotes</B> (<I>default</I>) </TD>
-
-<TD>Samba online release notes.</TD>
-</TR>
-
-<TR>
-<TD ALIGN=LEFT VALIGN=TOP><B>samba.src.samba</B> </TD>
-
-<TD>The Samba 1.9.17 software distribution from which this product was
-built (including the packaging/SGI directory which will allow this distribution
-to be rebuilt).</TD>
-</TR>
-</TABLE>
-
-<H3>Installation Method</H3>
-
-<P>All of the subsystems for Samba can be installed using IRIX. You do
-not need to use the miniroot. Refer to the <I>Software Installation Administrator's
-Guide</I> for complete installation instructions. </P>
-
-<H3>Prerequisites</H3>
-
-<P>Your workstation must be running IRIX 5.3 or later in order to use this
-product. </P>
-
-<H3>Configuration Files</H3>
-
-<P>Because configuration files often contain modifications, inst treats
-them specially during the installation process. If they have not been modified,
-inst removes the old file and installs the new version during software
-updates. For configuration files that have been modified, the new version
-is installed and the old version is renamed by adding the suffix .O (for
-older) to the name. The no-suffix version contains changes that are required
-for compatibility with the rest of the newly installed software, that increase
-functionality, or that fix bugs. You should use diff(1) or gdiff(1) to
-compare the two versions of the files and transfer information that you
-recognize as machine or site-specific from the .O version to the no-suffix
-version. </P>
-
-<DL>
-<DT><B>/usr/samba/lib/smb.conf</B> </DT>
-
-<DD>Configuration definitions for the <B>smbd</B> program; the SMB server
-process. The default configuration sets up password-based access to home
-directories on a machine as well as open access to to all printers and
-/tmp. The workgroup is set by default to &quot;workgroup&quot;. It is highly
-recommended that administrators review the content of this file when installing
-Samba for the first time.</DD>
-
-<DT><B>/usr/samba/printcap</B> </DT>
-
-<DD>A file that specifies the available printers on a system. It is included
-as an example; administrators may want to replace it or override the reference
-to it in the <B>smb.conf</B> file. The script <B>/usr/samba/mkprintcap.sh</B>
-was used by inst to create a printcap file that contains all printers on
-your system. You may wish to remove some printers or add a comment to each
-printer name to describe its location.</DD>
-</DL>
-
-<H2><A NAME="Documentation"></A>Documentation Information</H2>
-
-<P>Preformatted manual pages are installed by default as are the contents
-of the <B>docs</B> directory from the Samba distribution; consult <I>samba</I>(7)
-for an introduction. </P>
-
-<P>There is a mailing list for discussion of Samba. To subscribe send mail
-to <A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>
-with a body of &quot;subscribe samba Your Name&quot; </P>
-
-<P>To send mail to everyone on the list mail to <A HREF="mailto:samba@samba.anu.edu.au">samba@samba.anu.edu.au</A>.
-</P>
-
-<P>There is also an announcement mailing list where new versions are announced.
-To subscribe send mail to <A HREF="mailto:listproc@samba.anu.edu.au">listproc@samba.anu.edu.au</A>
-with a body of &quot;subscribe samba-announce Your Name&quot;. All announcements
-also go to the samba list. </P>
-
-<P>You might also like to look at the Usenet news group <A HREF="news:comp.protocols.smb">comp.protocols.smb</A>
-as it often contains lots of useful info and is frequented by lots of Samba
-users. The newsgroup was initially setup by people on the Samba mailing
-list. It is not, however, exclusive to Samba, it is a forum for discussing
-the SMB protocol (which Samba implements). </P>
-
-<P>A Samba WWW site has been setup with lots of useful info. Connect to:
-<A HREF="http://samba.anu.edu.au/pub/samba/">http://samba.anu.edu.au/pub/samba/</A>.
-It is maintained by Paul Blackman (thanks Paul!). You can contact him at
-<A HREF="mailto:ictinus@lake.canberra.edu.au">ictinus@lake.canberra.edu.au</A>.
-</P>
-
-</BODY>
-</HTML>
diff --git a/packaging/SGI/samba.config b/packaging/SGI/samba.config
deleted file mode 100644
index b3d86404ab5..00000000000
--- a/packaging/SGI/samba.config
+++ /dev/null
@@ -1 +0,0 @@
-on
diff --git a/packaging/SGI/samba.idb b/packaging/SGI/samba.idb
deleted file mode 100644
index dbf9f3b10ff..00000000000
--- a/packaging/SGI/samba.idb
+++ /dev/null
@@ -1,394 +0,0 @@
-f 0644 root sys etc/config/samba packaging/SGI/samba.config samba.sw.base config(update)
-f 0755 root sys etc/init.d/samba packaging/SGI/samba.rc samba.sw.base
-l 0000 root sys etc/rc0.d/K39samba packaging/SGI samba.sw.base symval(../init.d/samba)
-l 0000 root sys etc/rc2.d/S81samba packaging/SGI samba.sw.base symval(../init.d/samba)
-d 0755 root sys usr/relnotes/samba packaging/SGI samba.man.relnotes
-f 0644 root sys usr/relnotes/samba/GNU_COPYING.txt COPYING samba.man.relnotes
-f 0644 root sys usr/relnotes/samba/legal_notice.html packaging/SGI/legal_notice.html samba.man.relnotes
-f 0644 root sys usr/relnotes/samba/samba-relnotes.html packaging/SGI/relnotes.html samba.man.relnotes
-d 0755 root sys usr/samba packaging/SGI samba.sw.base
-f 0444 root sys usr/samba/README packaging/SGI/README samba.sw.base
-d 0755 root sys usr/samba/bin packaging/SGI samba.sw.base
-f 0755 root sys usr/samba/bin/addtosmbpass source/addtosmbpass samba.sw.base
-f 0775 root sys usr/samba/bin/nmbd source/nmbd samba.sw.base
-f 0755 root sys usr/samba/bin/nmblookup source/nmblookup samba.sw.base
-f 0644 root sys usr/samba/bin/psfixes.sed packaging/SGI/psfixes.sed samba.sw.base
-f 0755 root sys usr/samba/bin/sambalp packaging/SGI/sambalp samba.sw.base
-f 0755 root sys usr/samba/bin/smbclient source/smbclient samba.sw.base
-f 0775 root sys usr/samba/bin/smbd source/smbd samba.sw.base
-f 4555 root sys usr/samba/bin/smbpasswd source/smbpasswd samba.sw.base
-f 0755 root sys usr/samba/bin/smbprint packaging/SGI/smbprint samba.sw.base
-f 0755 root sys usr/samba/bin/smbrun source/smbrun samba.sw.base
-f 0755 root sys usr/samba/bin/smbstatus source/smbstatus samba.sw.base
-f 0755 root sys usr/samba/bin/smbtar source/smbtar samba.sw.base
-f 0775 root sys usr/samba/bin/testparm source/testparm samba.sw.base
-f 0775 root sys usr/samba/bin/testprns source/testprns samba.sw.base
-d 0755 root sys usr/samba/docs docs samba.man.doc
-f 0644 root sys usr/samba/docs/Application_Serving.txt docs/Application_Serving.txt samba.man.doc
-f 0644 root sys usr/samba/docs/BROWSING.txt docs/BROWSING.txt samba.man.doc
-f 0644 root sys usr/samba/docs/BUGS.txt docs/BUGS.txt samba.man.doc
-f 0644 root sys usr/samba/docs/DIAGNOSIS.txt docs/DIAGNOSIS.txt samba.man.doc
-f 0644 root sys usr/samba/docs/DNIX.txt docs/DNIX.txt samba.man.doc
-f 0644 root sys usr/samba/docs/DOMAIN.txt docs/DOMAIN.txt samba.man.doc
-f 0644 root sys usr/samba/docs/DOMAIN_CONTROL.txt docs/DOMAIN_CONTROL.txt samba.man.doc
-f 0644 root sys usr/samba/docs/ENCRYPTION.txt docs/ENCRYPTION.txt samba.man.doc
-f 0644 root sys usr/samba/docs/Faxing.txt docs/Faxing.txt samba.man.doc
-f 0644 root sys usr/samba/docs/GOTCHAS.txt docs/GOTCHAS.txt samba.man.doc
-f 0644 root sys usr/samba/docs/HINTS.txt docs/HINTS.txt samba.man.doc
-f 0644 root sys usr/samba/docs/INSTALL.sambatar docs/INSTALL.sambatar samba.man.doc
-f 0644 root sys usr/samba/docs/MIRRORS docs/MIRRORS samba.man.doc
-f 0644 root sys usr/samba/docs/NT4_PlainPassword.reg docs/NT4_PlainPassword.reg samba.man.doc
-f 0644 root sys usr/samba/docs/NetBIOS.txt docs/NetBIOS.txt samba.man.doc
-f 0644 root sys usr/samba/docs/OS2-Client-HOWTO.txt docs/OS2-Client-HOWTO.txt samba.man.doc
-f 0644 root sys usr/samba/docs/PROJECTS docs/PROJECTS samba.man.doc
-f 0644 root sys usr/samba/docs/Passwords.txt docs/Passwords.txt samba.man.doc
-f 0644 root sys usr/samba/docs/Printing.txt docs/Printing.txt samba.man.doc
-f 0644 root sys usr/samba/docs/README.DCEDFS docs/README.DCEDFS samba.man.doc
-f 0644 root sys usr/samba/docs/README.jis docs/README.jis samba.man.doc
-f 0644 root sys usr/samba/docs/README.sambatar docs/README.sambatar samba.man.doc
-f 0644 root sys usr/samba/docs/SCO.txt docs/SCO.txt samba.man.doc
-f 0644 root sys usr/samba/docs/SMBTAR.notes docs/SMBTAR.notes samba.man.doc
-f 0644 root sys usr/samba/docs/Speed.txt docs/Speed.txt samba.man.doc
-f 0644 root sys usr/samba/docs/Support.txt docs/Support.txt samba.man.doc
-f 0644 root sys usr/samba/docs/THANKS docs/THANKS samba.man.doc
-f 0644 root sys usr/samba/docs/Tracing.txt docs/Tracing.txt samba.man.doc
-f 0644 root sys usr/samba/docs/UNIX-SMB.txt docs/UNIX-SMB.txt samba.man.doc
-f 0644 root sys usr/samba/docs/UNIX_INSTALL.txt docs/UNIX_INSTALL.txt samba.man.doc
-f 0644 root sys usr/samba/docs/Win95.txt docs/Win95.txt samba.man.doc
-f 0644 root sys usr/samba/docs/Win95_PlainPassword.reg docs/Win95_PlainPassword.reg samba.man.doc
-f 0644 root sys usr/samba/docs/WinNT.txt docs/WinNT.txt samba.man.doc
-f 0644 root sys usr/samba/docs/announce docs/announce samba.man.doc
-d 0755 root sys usr/samba/docs/faq docs/faq samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-Server-FAQ-1.html docs/faq/Samba-Server-FAQ-1.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-Server-FAQ-2.html docs/faq/Samba-Server-FAQ-2.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-Server-FAQ.html docs/faq/Samba-Server-FAQ.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-Server-FAQ.sgml docs/faq/Samba-Server-FAQ.sgml samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-1.html docs/faq/Samba-meta-FAQ-1.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-2.html docs/faq/Samba-meta-FAQ-2.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-3.html docs/faq/Samba-meta-FAQ-3.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-4.html docs/faq/Samba-meta-FAQ-4.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-5.html docs/faq/Samba-meta-FAQ-5.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ-6.html docs/faq/Samba-meta-FAQ-6.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ.html docs/faq/Samba-meta-FAQ.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ.sgml docs/faq/Samba-meta-FAQ.sgml samba.man.doc
-f 0644 root sys usr/samba/docs/faq/Samba-meta-FAQ.txt docs/faq/Samba-meta-FAQ.txt samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq-1.html docs/faq/sambafaq-1.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq-2.html docs/faq/sambafaq-2.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq-3.html docs/faq/sambafaq-3.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq-4.html docs/faq/sambafaq-4.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq-5.html docs/faq/sambafaq-5.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq.html docs/faq/sambafaq.html samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq.sgml docs/faq/sambafaq.sgml samba.man.doc
-f 0644 root sys usr/samba/docs/faq/sambafaq.txt docs/faq/sambafaq.txt samba.man.doc
-f 0644 root sys usr/samba/docs/history docs/history samba.man.doc
-f 0644 root sys usr/samba/docs/internals.doc source/internals.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameannounce.doc source/nameannounce.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namebrowse.doc source/namebrowse.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namedbname.doc source/namedbname.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namedbresp.doc source/namedbresp.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameelect.doc source/nameelect.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namelogon.doc source/namelogon.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namepacket.doc source/namepacket.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namequery.doc source/namequery.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameresp.doc source/nameresp.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameserv.doc source/nameserv.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameservreply.doc source/nameservreply.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nameservresp.doc source/nameservresp.doc samba.man.doc
-f 0644 root sys usr/samba/docs/namework.doc source/namework.doc samba.man.doc
-f 0644 root sys usr/samba/docs/nmbd.8 docs/nmbd.8 samba.man.doc
-f 0644 root sys usr/samba/docs/samba.7 docs/samba.7 samba.man.doc
-f 0644 root sys usr/samba/docs/samba.faq docs/samba.faq samba.man.doc
-f 0644 root sys usr/samba/docs/samba.lsm docs/samba.lsm samba.man.doc
-f 0644 root sys usr/samba/docs/security_level.txt docs/security_level.txt samba.man.doc
-f 0644 root sys usr/samba/docs/smb.conf.5 docs/smb.conf.5 samba.man.doc
-f 0644 root sys usr/samba/docs/smbclient.1 docs/smbclient.1 samba.man.doc
-f 0644 root sys usr/samba/docs/smbd.8 docs/smbd.8 samba.man.doc
-f 0644 root sys usr/samba/docs/smbpasswd.8 docs/smbpasswd.8 samba.man.doc
-f 0644 root sys usr/samba/docs/smbrun.1 docs/smbrun.1 samba.man.doc
-f 0644 root sys usr/samba/docs/smbstatus.1 docs/smbstatus.1 samba.man.doc
-f 0644 root sys usr/samba/docs/smbtar.1 docs/smbtar.1 samba.man.doc
-f 0644 root sys usr/samba/docs/testparm.1 docs/testparm.1 samba.man.doc
-f 0644 root sys usr/samba/docs/testprns.1 docs/testprns.1 samba.man.doc
-f 0644 root sys usr/samba/docs/wfw_slip.htm docs/wfw_slip.htm samba.man.doc
-f 0755 root sys usr/samba/inetd.sh packaging/SGI/inetd.sh samba.sw.base
-d 0755 root sys usr/samba/lib packaging/SGI samba.sw.base
-f 0644 root sys usr/samba/lib/smb.conf packaging/SGI/smb.conf samba.sw.base config(update)
-f 0775 root sys usr/samba/mkprintcap.sh packaging/SGI/mkprintcap.sh samba.sw.base exitop(/usr/samba/mkprintcap.sh) removeop(rm /usr/samba/printcap)
-d 0755 root sys usr/samba/src source samba.src.samba
-f 0644 root sys usr/samba/src/COPYING COPYING samba.src.samba
-f 0644 root sys usr/samba/src/Manifest Manifest samba.src.samba
-f 0644 root sys usr/samba/src/README README samba.src.samba
-f 0644 root sys usr/samba/src/Read-Manifest-Now Read-Manifest-Now samba.src.samba
-f 0644 root sys usr/samba/src/Roadmap Roadmap samba.src.samba
-f 0644 root sys usr/samba/src/WHATSNEW.txt WHATSNEW.txt samba.src.samba
-d 0755 root sys usr/samba/src/docs docs samba.src.samba
-f 0644 root sys usr/samba/src/docs/Application_Serving.txt docs/Application_Serving.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/BROWSING.txt docs/BROWSING.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/BUGS.txt docs/BUGS.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/DIAGNOSIS.txt docs/DIAGNOSIS.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/DNIX.txt docs/DNIX.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/DOMAIN.txt docs/DOMAIN.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/DOMAIN_CONTROL.txt docs/DOMAIN_CONTROL.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/ENCRYPTION.txt docs/ENCRYPTION.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/Faxing.txt docs/Faxing.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/GOTCHAS.txt docs/GOTCHAS.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/HINTS.txt docs/HINTS.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/INSTALL.sambatar docs/INSTALL.sambatar samba.src.samba
-f 0644 root sys usr/samba/src/docs/MIRRORS docs/MIRRORS samba.src.samba
-f 0644 root sys usr/samba/src/docs/NT4_PlainPassword.reg docs/NT4_PlainPassword.reg samba.src.samba
-f 0644 root sys usr/samba/src/docs/NetBIOS.txt docs/NetBIOS.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/OS2-Client-HOWTO.txt docs/OS2-Client-HOWTO.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/PROJECTS docs/PROJECTS samba.src.samba
-f 0644 root sys usr/samba/src/docs/Passwords.txt docs/Passwords.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/Printing.txt docs/Printing.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/README.DCEDFS docs/README.DCEDFS samba.src.samba
-f 0644 root sys usr/samba/src/docs/README.jis docs/README.jis samba.src.samba
-f 0644 root sys usr/samba/src/docs/README.sambatar docs/README.sambatar samba.src.samba
-f 0644 root sys usr/samba/src/docs/SCO.txt docs/SCO.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/SMBTAR.notes docs/SMBTAR.notes samba.src.samba
-f 0644 root sys usr/samba/src/docs/Speed.txt docs/Speed.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/Support.txt docs/Support.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/THANKS docs/THANKS samba.src.samba
-f 0644 root sys usr/samba/src/docs/Tracing.txt docs/Tracing.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/UNIX-SMB.txt docs/UNIX-SMB.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/UNIX_INSTALL.txt docs/UNIX_INSTALL.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/Win95.txt docs/Win95.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/Win95_PlainPassword.reg docs/Win95_PlainPassword.reg samba.src.samba
-f 0644 root sys usr/samba/src/docs/WinNT.txt docs/WinNT.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/announce docs/announce samba.src.samba
-d 0755 root sys usr/samba/src/docs/faq docs/faq samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-Server-FAQ-1.html docs/faq/Samba-Server-FAQ-1.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-Server-FAQ-2.html docs/faq/Samba-Server-FAQ-2.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-Server-FAQ.html docs/faq/Samba-Server-FAQ.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-Server-FAQ.sgml docs/faq/Samba-Server-FAQ.sgml samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-1.html docs/faq/Samba-meta-FAQ-1.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-2.html docs/faq/Samba-meta-FAQ-2.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-3.html docs/faq/Samba-meta-FAQ-3.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-4.html docs/faq/Samba-meta-FAQ-4.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-5.html docs/faq/Samba-meta-FAQ-5.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ-6.html docs/faq/Samba-meta-FAQ-6.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ.html docs/faq/Samba-meta-FAQ.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ.sgml docs/faq/Samba-meta-FAQ.sgml samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/Samba-meta-FAQ.txt docs/faq/Samba-meta-FAQ.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq-1.html docs/faq/sambafaq-1.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq-2.html docs/faq/sambafaq-2.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq-3.html docs/faq/sambafaq-3.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq-4.html docs/faq/sambafaq-4.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq-5.html docs/faq/sambafaq-5.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq.html docs/faq/sambafaq.html samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq.sgml docs/faq/sambafaq.sgml samba.src.samba
-f 0644 root sys usr/samba/src/docs/faq/sambafaq.txt docs/faq/sambafaq.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/history docs/history samba.src.samba
-f 0644 root sys usr/samba/src/docs/nmbd.8 docs/nmbd.8 samba.src.samba
-f 0644 root sys usr/samba/src/docs/samba.7 docs/samba.7 samba.src.samba
-f 0644 root sys usr/samba/src/docs/samba.faq docs/samba.faq samba.src.samba
-f 0644 root sys usr/samba/src/docs/samba.lsm docs/samba.lsm samba.src.samba
-f 0644 root sys usr/samba/src/docs/security_level.txt docs/security_level.txt samba.src.samba
-f 0644 root sys usr/samba/src/docs/smb.conf.5 docs/smb.conf.5 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbclient.1 docs/smbclient.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbd.8 docs/smbd.8 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbpasswd.8 docs/smbpasswd.8 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbrun.1 docs/smbrun.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbstatus.1 docs/smbstatus.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/smbtar.1 docs/smbtar.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/testparm.1 docs/testparm.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/testprns.1 docs/testprns.1 samba.src.samba
-f 0644 root sys usr/samba/src/docs/wfw_slip.htm docs/wfw_slip.htm samba.src.samba
-d 0755 root sys usr/samba/src/examples examples samba.src.samba
-f 0664 root sys usr/samba/src/examples/README examples/README samba.src.samba
-d 0755 root sys usr/samba/src/examples/dce-dfs examples/dce-dfs samba.src.samba
-f 0644 root sys usr/samba/src/examples/dce-dfs/README examples/dce-dfs/README samba.src.samba
-f 0644 root sys usr/samba/src/examples/dce-dfs/smb.conf examples/dce-dfs/smb.conf samba.src.samba
-d 0755 root sys usr/samba/src/examples/misc examples/misc samba.src.samba
-f 0644 root sys usr/samba/src/examples/misc/extra_smbstatus examples/misc/extra_smbstatus samba.src.samba
-f 0644 root sys usr/samba/src/examples/misc/wall.perl examples/misc/wall.perl samba.src.samba
-d 0775 root sys usr/samba/src/examples/printer-accounting examples/printer-accounting samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/README examples/printer-accounting/README samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/acct-all examples/printer-accounting/acct-all samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/acct-sum examples/printer-accounting/acct-sum samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/hp5-redir examples/printer-accounting/hp5-redir samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/lp-acct examples/printer-accounting/lp-acct samba.src.samba
-f 0664 root sys usr/samba/src/examples/printer-accounting/printcap examples/printer-accounting/printcap samba.src.samba
-d 0755 root sys usr/samba/src/examples/printing examples/printing samba.src.samba
-f 0755 root sys usr/samba/src/examples/printing/smbprint examples/printing/smbprint samba.src.samba
-f 0644 root sys usr/samba/src/examples/printing/smbprint.sysv examples/printing/smbprint.sysv samba.src.samba
-d 0755 root sys usr/samba/src/examples/simple examples/simple samba.src.samba
-f 0644 root sys usr/samba/src/examples/simple/README examples/simple/README samba.src.samba
-f 0644 root sys usr/samba/src/examples/simple/smb.conf examples/simple/smb.conf samba.src.samba
-d 0775 root sys usr/samba/src/examples/svr4-startup examples/svr4-startup samba.src.samba
-f 0664 root sys usr/samba/src/examples/svr4-startup/README examples/svr4-startup/README samba.src.samba
-f 0775 root sys usr/samba/src/examples/svr4-startup/samba.server examples/svr4-startup/samba.server samba.src.samba
-d 0755 root sys usr/samba/src/examples/thoralf examples/thoralf samba.src.samba
-f 0644 root sys usr/samba/src/examples/thoralf/smb.conf examples/thoralf/smb.conf samba.src.samba
-d 0755 root sys usr/samba/src/examples/tridge examples/tridge samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/README examples/tridge/README samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/smb.conf examples/tridge/smb.conf samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/smb.conf.WinNT examples/tridge/smb.conf.WinNT samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/smb.conf.fjall examples/tridge/smb.conf.fjall samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/smb.conf.lapland examples/tridge/smb.conf.lapland samba.src.samba
-f 0644 root sys usr/samba/src/examples/tridge/smb.conf.vittjokk examples/tridge/smb.conf.vittjokk samba.src.samba
-d 0775 root sys usr/samba/src/examples/validchars examples/validchars samba.src.samba
-f 0664 root sys usr/samba/src/examples/validchars/msdos70.out examples/validchars/msdos70.out samba.src.samba
-f 0664 root sys usr/samba/src/examples/validchars/nwdos70.out examples/validchars/nwdos70.out samba.src.samba
-f 0664 root sys usr/samba/src/examples/validchars/readme examples/validchars/readme samba.src.samba
-f 0664 root sys usr/samba/src/examples/validchars/validchr.c examples/validchars/validchr.c samba.src.samba
-f 0664 root sys usr/samba/src/examples/validchars/validchr.com examples/validchars/validchr.com samba.src.samba
-d 0755 root sys usr/samba/src/packaging packaging samba.src.samba
-f 0644 root sys usr/samba/src/packaging/README packaging/README samba.src.samba
-d 0755 root sys usr/samba/src/packaging/SGI packaging/SGI samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/Makefile packaging/SGI/Makefile samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/README packaging/SGI/README samba.src.samba
-f 0755 root sys usr/samba/src/packaging/SGI/inetd.sh packaging/SGI/inetd.sh samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/legal_notice.html packaging/SGI/legal_notice.html samba.src.samba
-f 0755 root sys usr/samba/src/packaging/SGI/mkman packaging/SGI/mkman samba.src.samba
-f 0755 root sys usr/samba/src/packaging/SGI/mkprintcap.sh packaging/SGI/mkprintcap.sh samba.src.samba
-f 0755 root sys usr/samba/src/packaging/SGI/mkrelease.sh packaging/SGI/mkrelease.sh samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/printcap packaging/SGI/printcap samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/psfixes.sed packaging/SGI/psfixes.sed samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/relnotes.html packaging/SGI/relnotes.html samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/samba.config packaging/SGI/samba.config samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/samba.idb packaging/SGI/samba.idb samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/samba.rc packaging/SGI/samba.rc samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/samba.spec packaging/SGI/samba.spec samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/sambalp packaging/SGI/sambalp samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/smb.conf packaging/SGI/smb.conf samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/smbpasswd packaging/SGI/smbpasswd samba.src.samba
-f 0644 root sys usr/samba/src/packaging/SGI/smbprint packaging/SGI/smbprint samba.src.samba
-d 0755 root sys usr/samba/src/packaging/redhat packaging/redhat samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/Instructions packaging/redhat/Instructions samba.src.samba
-f 0755 root sys usr/samba/src/packaging/redhat/makeldirp.sh packaging/redhat/makeldirs.sh samba.src.samba
-f 0755 root sys usr/samba/src/packaging/redhat/makerpms.sh packaging/redhat/makerpms.sh samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/samba-axp.patch packaging/redhat/samba-axp.patch samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/samba-make.patch packaging/redhat/samba-make.patch samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/samba.log packaging/redhat/samba.log samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/samba.pamd packaging/redhat/samba.pamd samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/samba.spec packaging/redhat/samba.spec samba.src.samba
-f 0644 root sys usr/samba/src/packaging/redhat/smb.conf packaging/redhat/smb.conf samba.src.samba
-f 0755 root sys usr/samba/src/packaging/redhat/smb.init packaging/redhat/smb.init samba.src.samba
-f 0755 root sys usr/samba/src/packaging/redhat/smbprint packaging/redhat/smbprint samba.src.samba
-d 0755 root sys usr/samba/src/source source samba.src.samba
-f 0644 root sys usr/samba/src/source/Makefile source/Makefile samba.src.samba
-f 0644 root sys usr/samba/src/source/Makefile.OS2 source/Makefile.OS2 samba.src.samba
-f 0644 root sys usr/samba/src/source/access.c source/access.c samba.src.samba
-f 0644 root sys usr/samba/src/source/addtosmbpass source/addtosmbpass samba.src.samba
-f 0644 root sys usr/samba/src/source/byteorder.h source/byteorder.h samba.src.samba
-f 0644 root sys usr/samba/src/source/change-log source/change-log samba.src.samba
-f 0644 root sys usr/samba/src/source/charcnv.c source/charcnv.c samba.src.samba
-f 0644 root sys usr/samba/src/source/charset.c source/charset.c samba.src.samba
-f 0644 root sys usr/samba/src/source/charset.h source/charset.h samba.src.samba
-f 0644 root sys usr/samba/src/source/checkos.sh source/checkos.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/chgpasswd.c source/chgpasswd.c samba.src.samba
-f 0644 root sys usr/samba/src/source/client.c source/client.c samba.src.samba
-f 0644 root sys usr/samba/src/source/clientutil.c source/clientutil.c samba.src.samba
-f 0644 root sys usr/samba/src/source/clitar.c source/clitar.c samba.src.samba
-f 0644 root sys usr/samba/src/source/clitar.h source/clitar.h samba.src.samba
-f 0644 root sys usr/samba/src/source/dir.c source/dir.c samba.src.samba
-f 0644 root sys usr/samba/src/source/fault.c source/fault.c samba.src.samba
-f 0644 root sys usr/samba/src/source/getsmbpass.c source/getsmbpass.c samba.src.samba
-f 0644 root sys usr/samba/src/source/includes.h source/includes.h samba.src.samba
-f 0644 root sys usr/samba/src/source/installbin.sh source/installbin.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/installman.sh source/installman.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/installscripts.sh source/installscripts.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/interface.c source/interface.c samba.src.samba
-f 0644 root sys usr/samba/src/source/internals.doc source/internals.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/ipc.c source/ipc.c samba.src.samba
-f 0644 root sys usr/samba/src/source/kanji.c source/kanji.c samba.src.samba
-f 0644 root sys usr/samba/src/source/kanji.h source/kanji.h samba.src.samba
-f 0644 root sys usr/samba/src/source/loadparm.c source/loadparm.c samba.src.samba
-f 0644 root sys usr/samba/src/source/local.h source/local.h samba.src.samba
-f 0644 root sys usr/samba/src/source/locking.c source/locking.c samba.src.samba
-f 0644 root sys usr/samba/src/source/mangle.c source/mangle.c samba.src.samba
-f 0644 root sys usr/samba/src/source/md4.c source/md4.c samba.src.samba
-f 0644 root sys usr/samba/src/source/md4.h source/md4.h samba.src.samba
-f 0644 root sys usr/samba/src/source/message.c source/message.c samba.src.samba
-f 0644 root sys usr/samba/src/source/mkproto.awk source/mkproto.awk samba.src.samba
-f 0644 root sys usr/samba/src/source/mksmbpasswd.sh source/mksmbpasswd.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/nameannounce.c source/nameannounce.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameannounce.doc source/nameannounce.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namebrowse.c source/namebrowse.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namebrowse.doc source/namebrowse.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nameconf.c source/nameconf.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbname.c source/namedbname.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbname.doc source/namedbname.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbresp.c source/namedbresp.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbresp.doc source/namedbresp.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbserver.c source/namedbserver.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbsubnet.c source/namedbsubnet.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namedbwork.c source/namedbwork.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameelect.c source/nameelect.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameelect.doc source/nameelect.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namelogon.c source/namelogon.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namelogon.doc source/namelogon.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namepacket.c source/namepacket.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namepacket.doc source/namepacket.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namequery.c source/namequery.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namequery.doc source/namequery.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nameresp.c source/nameresp.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameresp.doc source/nameresp.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nameserv.c source/nameserv.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameserv.doc source/nameserv.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nameserv.h source/nameserv.h samba.src.samba
-f 0644 root sys usr/samba/src/source/nameservreply.c source/nameservreply.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameservreply.doc source/nameservreply.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nameservresp.c source/nameservresp.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nameservresp.doc source/nameservresp.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/namework.c source/namework.c samba.src.samba
-f 0644 root sys usr/samba/src/source/namework.doc source/namework.doc samba.src.samba
-f 0644 root sys usr/samba/src/source/nmbd.c source/nmbd.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nmblib.c source/nmblib.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nmblookup.c source/nmblookup.c samba.src.samba
-f 0644 root sys usr/samba/src/source/nmbsync.c source/nmbsync.c samba.src.samba
-f 0644 root sys usr/samba/src/source/params.c source/params.c samba.src.samba
-f 0644 root sys usr/samba/src/source/password.c source/password.c samba.src.samba
-f 0644 root sys usr/samba/src/source/pcap.c source/pcap.c samba.src.samba
-f 0644 root sys usr/samba/src/source/pipes.c source/pipes.c samba.src.samba
-f 0644 root sys usr/samba/src/source/predict.c source/predict.c samba.src.samba
-f 0644 root sys usr/samba/src/source/printing.c source/printing.c samba.src.samba
-f 0644 root sys usr/samba/src/source/proto.h source/proto.h samba.src.samba
-f 0644 root sys usr/samba/src/source/quotas.c source/quotas.c samba.src.samba
-f 0644 root sys usr/samba/src/source/replace.c source/replace.c samba.src.samba
-f 0644 root sys usr/samba/src/source/reply.c source/reply.c samba.src.samba
-f 0644 root sys usr/samba/src/source/revert.sh source/revert.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/server.c source/server.c samba.src.samba
-f 0644 root sys usr/samba/src/source/shmem.c source/shmem.c samba.src.samba
-f 0644 root sys usr/samba/src/source/smb.h source/smb.h samba.src.samba
-f 0644 root sys usr/samba/src/source/smbencrypt.c source/smbencrypt.c samba.src.samba
-f 0644 root sys usr/samba/src/source/smbpass.c source/smbpass.c samba.src.samba
-f 0644 root sys usr/samba/src/source/smbpasswd.c source/smbpasswd.c samba.src.samba
-f 0644 root sys usr/samba/src/source/smbrun.c source/smbrun.c samba.src.samba
-f 0644 root sys usr/samba/src/source/smbtar source/smbtar samba.src.samba
-f 0644 root sys usr/samba/src/source/status.c source/status.c samba.src.samba
-f 0644 root sys usr/samba/src/source/system.c source/system.c samba.src.samba
-f 0644 root sys usr/samba/src/source/testparm.c source/testparm.c samba.src.samba
-f 0644 root sys usr/samba/src/source/testprns.c source/testprns.c samba.src.samba
-f 0644 root sys usr/samba/src/source/time.c source/time.c samba.src.samba
-f 0644 root sys usr/samba/src/source/trans2.c source/trans2.c samba.src.samba
-f 0644 root sys usr/samba/src/source/trans2.h source/trans2.h samba.src.samba
-f 0644 root sys usr/samba/src/source/ufc.c source/ufc.c samba.src.samba
-f 0644 root sys usr/samba/src/source/uid.c source/uid.c samba.src.samba
-f 0644 root sys usr/samba/src/source/uninstallbin.sh source/uninstallbin.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/uninstallman.sh source/uninstallman.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/uninstallscripts.sh source/uninstallscripts.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/updatesmbpasswd.sh source/updatesmbpasswd.sh samba.src.samba
-f 0644 root sys usr/samba/src/source/username.c source/username.c samba.src.samba
-f 0644 root sys usr/samba/src/source/util.c source/util.c samba.src.samba
-f 0644 root sys usr/samba/src/source/version.h source/version.h samba.src.samba
-f 0644 root sys usr/samba/src/source/vt_mode.c source/vt_mode.c samba.src.samba
-f 0644 root sys usr/samba/src/source/vt_mode.h source/vt_mode.h samba.src.samba
-d 0775 root sys usr/samba/var/locks packaging/SGI samba.sw.base
-d 0755 root sys usr/share/catman/u_man packaging/SGI/catman samba.man.manpages
-d 0755 root sys usr/share/catman/u_man/cat1 packaging/SGI/catman samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/smbclient.1.Z packaging/SGI/catman/smbclient.1.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/smbrun.1.Z packaging/SGI/catman/smbrun.1.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/smbstatus.1.Z packaging/SGI/catman/smbstatus.1.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/smbtar.1.Z packaging/SGI/catman/smbtar.1.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/testparm.1.Z packaging/SGI/catman/testparm.1.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat1/testprns.1.Z packaging/SGI/catman/testprns.1.Z samba.man.manpages
-d 0755 root sys usr/share/catman/u_man/cat5 packaging/SGI/catman samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat5/smb.conf.5.Z packaging/SGI/catman/smb.conf.5.Z samba.man.manpages
-d 0755 root sys usr/share/catman/u_man/cat7 packaging/SGI/catman samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat7/samba.7.Z packaging/SGI/catman/samba.7.Z samba.man.manpages
-d 0755 root sys usr/share/catman/u_man/cat8 packaging/SGI/catman samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat8/nmbd.8.Z packaging/SGI/catman/nmbd.8.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat8/smbd.8.Z packaging/SGI/catman/smbd.8.Z samba.man.manpages
-f 0664 root sys usr/share/catman/u_man/cat8/smbpasswd.8.Z packaging/SGI/catman/smbpasswd.8.Z samba.man.manpages
diff --git a/packaging/SGI/samba.rc b/packaging/SGI/samba.rc
deleted file mode 100644
index 121b3400a38..00000000000
--- a/packaging/SGI/samba.rc
+++ /dev/null
@@ -1,42 +0,0 @@
-#! /bin/sh
-
-#
-# Samba server control
-#
-
-IS_ON=/etc/chkconfig
-KILLALL=/sbin/killall
-
-SAMBAD=/usr/samba/bin/smbd
-#SAMBA_OPTS=-d2
-NMBD=/usr/samba/bin/nmbd
-#NMBD_OPTS=-d1
-
-if test ! -x $IS_ON ; then
- IS_ON=true
-fi
-
-if $IS_ON verbose ; then
- ECHO=echo
-else # For a quiet startup and shutdown
- ECHO=:
-fi
-
-case $1 in
-'start')
- if $IS_ON samba && test -x $SAMBAD; then
- $KILLALL -15 smbd nmbd
- $ECHO "Samba:\c"
- $SAMBAD $SAMBA_OPTS -D; $ECHO " smbd\c"
- $NMBD $NMBD_OPTS -D; $ECHO " nmbd\c"
- $ECHO "."
- fi
- ;;
-'stop')
- $ECHO "Stopping Samba Servers."
- $KILLALL -15 smbd nmbd
- ;;
-*)
- echo "usage: /etc/init.d/samba {start|stop}"
- ;;
-esac
diff --git a/packaging/SGI/samba.spec b/packaging/SGI/samba.spec
deleted file mode 100644
index 1940e93e935..00000000000
--- a/packaging/SGI/samba.spec
+++ /dev/null
@@ -1,45 +0,0 @@
-product samba
- id "Samba version 1.9.17"
- image sw
- id "Samba Execution Environment"
- version 0109170006
- order 0
- subsys base default
- id "Samba Execution Environment"
- replaces fw_samba.sw.base 0 9999999999
- replaces fw_samba.sw.samba 0 9999999999
- exp samba.sw.base
- endsubsys
- endimage
- image man
- id "Samba Online Documentation"
- version 0109170006
- order 1
- subsys manpages default
- id "Samba Man Page"
- replaces fw_samba.man.manpages 0 9999999999
- replaces fw_samba.man.samba 0 9999999999
- exp samba.man.manpages
- endsubsys
- subsys doc default
- id "Samba Documentation"
- replaces fw_samba.man.doc 0 9999999999
- exp samba.man.doc
- endsubsys
- subsys relnotes default
- id "Samba Release Notes"
- replaces fw_samba.man.relnotes 0 9999999999
- exp samba.man.relnotes
- endsubsys
- endimage
- image src
- id "Samba Source Code"
- version 0109170006
- order 2
- subsys samba
- id "Samba Source Code"
- replaces fw_samba.src.samba 0 9999999999
- exp samba.src.samba
- endsubsys
- endimage
-endproduct
diff --git a/packaging/SGI/sambalp b/packaging/SGI/sambalp
deleted file mode 100644
index d7c6be2a2d4..00000000000
--- a/packaging/SGI/sambalp
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /bin/sh
-#
-# Workaround Win95 printer driver/Impressario bug by removing
-# the PS check for available virtual memory. Note that this
-# bug appears to be in all Win95 print drivers that generate
-# PostScript; but is for certain there with a QMS-PS 810 (the
-# printer type I configure on the Win95-side for printing with
-# Samba).
-#
-# the sed script fixes 3 different bugs. The first line removes
-# the JCL statements added by some HP printer drivers to the
-# beginning of the postscript output. The second line fixes a
-# bug in output from word files with long filenames. A non-printing
-# character added to the end of the title comment by word is
-# removed. The third and fourth lines are the VM fix described
-# above.
-#
-TITLE="$3 on $4"
-
-sed -f /usr/samba/bin/psfixes.sed $2 | /usr/bin/lp -c -d$1 -t"$TITLE"
-rm $2
diff --git a/packaging/SGI/smb.conf b/packaging/SGI/smb.conf
deleted file mode 100644
index 178231d2cd1..00000000000
--- a/packaging/SGI/smb.conf
+++ /dev/null
@@ -1,84 +0,0 @@
-; Configuration file for smbd.
-; ============================================================================
-; For the format of this file and comprehensive descriptions of all the
-; configuration option, please refer to the man page for smb.conf(5).
-
-; This is a sample configuration for IRIX 6.x systems
-;
-; The following configuration should suit most systems for basic usage and
-; initial testing. It gives all clients access to their home directories and
-; allows access to all printers specified in /etc/printcap as well as /usr/tmp.
-;
-[global]
- comment = Samba %v
- workgroup = workgroup
- printing = sysv
-;
-; A printcap file is created during installation that contains the names
-; of all printers attached to your system. Names longer than 8 characters
-; will not be visible to clients.
-;
- printcap name = /usr/samba/printcap
-;
-; If you are using Impressario then you'll want to use the
-; sambalp script provided with this package. It works around
-; a problem in the PostScript generated by the standard Windows
-; drivers--there is a check to verify sufficient virtual memory
-; is available in the printer to print the job, but this fails
-; under Impressario because of a bug in Impressario. The sambalp
-; script strips out the vmstatus check. BTW, when using this
-; setup to print be sure to configure a Windows printer driver
-; that generates PostScript--QMS-PS 810 is one that should work
-; with the sambalp script.
-;
- print command = /usr/samba/bin/sambalp %p %s %U %m
- load printers = yes
- guest account = nobody
- browseable = yes
-
-; Set a max size for log files in Kb
- log file = /usr/samba/var
- max log size = 50
-
-; You will need a world readable lock directory and "share modes=yes"
-; if you want to support the file sharing modes for multiple users
-; of the same files
- locking = yes
- lock directory = /usr/samba/var/locks
- share modes = yes
-
-; security = user
-
-; You need to test to see if this makes a difference on your system
- socket options = TCP_NODELAY
-
-; Set the os level to > 32 if there is no NT server for your workgroup
- os level = 0
- preferred master = no
- domain master = no
- local master = no
- wins support = no
- wins server =
-
- preserve case = yes
- short preserve case = yes
-
-[homes]
- comment = Home Directories
- browseable = no
- writable = yes
-
-[printers]
- comment = All Printers
- path = /usr/tmp
- browseable = no
- printable = yes
- public = yes
- writable = no
- create mask = 0700
-
-[tmp]
- comment = Temporary file space
- path = /usr/tmp
- read only = no
- public = yes
diff --git a/packaging/SGI/smbpasswd b/packaging/SGI/smbpasswd
deleted file mode 100644
index 79c834dc354..00000000000
--- a/packaging/SGI/smbpasswd
+++ /dev/null
@@ -1 +0,0 @@
-username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Long name:user home dir:user shell
diff --git a/packaging/SGI/smbprint b/packaging/SGI/smbprint
deleted file mode 100644
index 935f98bf923..00000000000
--- a/packaging/SGI/smbprint
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-#
-# @(#) smbprint.sysv version 1.0 Ross Wakelin <r.wakelin@march.co.uk>
-#
-# Version 1.0 13 January 1995
-# modified from the original smbprint (bsd) script
-#
-# this script is a System 5 printer interface script. It
-# uses the smbclient program to print the file to the specified smb-based
-# server and service.
-#
-# To add this to your lp system, copy this file into your samba directory
-# (the example here is /opt/samba), modify the server and service variables
-# and then execute the following command (as root)
-#
-# lpadmin -punixprintername -v/dev/null -i/opt/samba/smbprint
-#
-# where unixprintername is the name that the printer will be known as
-# on your unix box.
-#
-# the script smbprint will be copied into your printer administration
-# directory (/usr/lib/lp or /etc/lp) as a new interface
-# (interface/unixprintername)
-# Then you have to enable unixprintername and accept unixprintername
-#
-# This script will then be called by the lp service to print the files
-# This script will have 6 or more parameters passed to it by the lp service.
-# The first five will contain details of the print job, who queued it etc,
-# while parameters 6 onwards are a list of files to print. We just
-# cat these at the samba client.
-#
-# Set these to the server and service you wish to print to
-# In this example I have a WfWg PC called "lapland" that has a printer
-# exported called "printer" with no password.
-#
-# clear out the unwanted parameters
-shift;shift;shift;shift;shift
-# now the argument list is just the files to print
-
-server=admin
-service=hplj2
-password=""
-
-(
-# NOTE You may wish to add the line `echo translate' if you want automatic
-# CR/LF translation when printing.
- echo translate
- echo "print -"
- cat $*
-) | /usr/samba/bin/smbclient "\\\\$server\\$service" $password -N -P > /dev/null
-exit $?
-
diff --git a/packaging/Solaris/pkg-specs/Packaging.script b/packaging/Solaris/pkg-specs/Packaging.script
deleted file mode 100644
index 6f182c33e52..00000000000
--- a/packaging/Solaris/pkg-specs/Packaging.script
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-./mkprototype
-pkgmk -o -d /tmp -b `pwd` -f ./prototype
-cd /tmp
-pkgtrans . samba.pkg samba
diff --git a/packaging/Solaris/pkg-specs/mkprototype b/packaging/Solaris/pkg-specs/mkprototype
deleted file mode 100644
index 5ca0746beea..00000000000
--- a/packaging/Solaris/pkg-specs/mkprototype
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-# this creates prototype files
-pkgproto * > prototype
-nawk 'BEGIN { print "# d directory"
- print "# e a file to be edited upon installation or removal"
- print "# f a standard executable or data file"
- print "# i installation script or information file"
- print "# l linked file"
- print "# s symbolic link"
- print "# v volatile file (one whose contents are expected to
-change)"
- print "#" }
-/ pkginfo / { print "i pkginfo" ; next }
-/ postinstall / { print "i postinstall" ; next }
-/ postremove / { print "i postremove" ; next }
-/d none usr / { print "d none usr ? ? ?" ; next }
-/d none usr\/local / { print "d none usr/local ? ? ?" ; next }
-/d none etc / { print "d none etc ? ? ?" ; next }
-/f none etc\// { $1 = "v" }
-/d none opt / { print "d none opt ? ? ?" ; next }
-/d none var / { print "d none var ? ? ?" ; next }
-/none prototype / { next }
-/none mkprototype / { next }
-/ src[ \/]/ { next }
-/^[dfv]/ { $5 = "bin"
- $6 = "bin"
- print
- next }
-{ print }' prototype >/tmp/prototype.$$
-mv /tmp/prototype.$$ prototype
-
diff --git a/packaging/Solaris/pkg-specs/pkginfo b/packaging/Solaris/pkg-specs/pkginfo
deleted file mode 100644
index ab06b3fffab..00000000000
--- a/packaging/Solaris/pkg-specs/pkginfo
+++ /dev/null
@@ -1,12 +0,0 @@
-PSTAMP=Mon Sep 29 17:26:14 BST 1997
-PKG=samba
-NAME=SMB based file/printer sharing
-VERSION=1.9.17p2,REV=1
-ARCH=sparc
-CATEGORY=system
-VENDOR=samba group
-DESC=File and printer sharing for NT workstations
-CLASSES=none
-INTONLY=1
-HOTLINE=Please contact your local UNIX support group
-BASEDIR=/
diff --git a/packaging/Solaris/pkg-specs/postinstall b/packaging/Solaris/pkg-specs/postinstall
deleted file mode 100644
index 0fbe9da10b5..00000000000
--- a/packaging/Solaris/pkg-specs/postinstall
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-# install samba
-
-nawk '/^netbios-[ns]*[ ]/ {next}
-{print}
-END { print "netbios-ssn 139/tcp"
- print "netbios-ns 137/udp # samba service" }' \
- ${PKG_INSTALL_ROOT}/etc/inet/services > /tmp/services.$$ && \
- mv -f /tmp/services.$$ ${PKG_INSTALL_ROOT}/etc/inet/services &&
-\
- chmod 644 ${PKG_INSTALL_ROOT}/etc/inet/services && \
- echo "Updated ${PKG_INSTALL_ROOT}/etc/inet/services"
-
-nawk '/samba.*mbd[ ]/ { next }
-{print}
-END { print "# samba connections are handled by smbd and nmbd"
- print "netbios-ssn stream tcp nowait root /opt/samba/bin/smbd
-smbd"
- print "netbios-ns dgram udp wait root /opt/samba/bin/nmbd nmbd" }'
-\
- ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf > /tmp/inetd.conf.$$ &&
-\
- mv -f /tmp/inetd.conf.$$ ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf
-&& \
- chmod 644 ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf && \
- echo "Updated ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf"
-
-echo "Installed samba service into ${PKG_INSTALL_ROOT:-/}"
-
-inetpid=`/bin/ps -ef | awk '/ \/usr\/sbin\/inetd / { print $2 } '`
-if [ "X$inetpid" = "X" ]; then
- echo "inetd not running"
-else
- echo "Restarting inetd($inetpid)"
- kill -HUP $inetpid
-fi
-
diff --git a/packaging/Solaris/pkg-specs/postremove b/packaging/Solaris/pkg-specs/postremove
deleted file mode 100644
index 7f7a5c1f8e4..00000000000
--- a/packaging/Solaris/pkg-specs/postremove
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-# remove samba
-
-nawk '/^netbios-[ns]*[ ]/ {next}
-{print} ' \
- ${PKG_INSTALL_ROOT}/etc/inet/services > /tmp/services.$$ && \
- mv -f /tmp/services.$$ ${PKG_INSTALL_ROOT}/etc/inet/services &&
-\
- chmod 644 ${PKG_INSTALL_ROOT}/etc/inet/services && \
- echo "Updated ${PKG_INSTALL_ROOT}/etc/inet/services"
-
-nawk '/samba.*mbd[ ]/ { next }
-{print} ' \
- ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf > /tmp/inetd.conf.$$ &&
-\
- mv -f /tmp/inetd.conf.$$ ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf
-&& \
- chmod 644 ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf && \
- echo "Updated ${PKG_INSTALL_ROOT}/etc/inet/inetd.conf"
-
-echo "Removed samba service from ${PKG_INSTALL_ROOT:-/}"
-
-inetpid=`/bin/ps -ef | awk '/ \/usr\/sbin\/inetd / { print $2 } '`
-if [ "X$inetpid" = "X" ]; then
- echo "inetd not running"
-else
- echo "Restarting inetd($inetpid)"
- kill -HUP $inetpid
-fi
-
diff --git a/source/.cvsignore b/source/.cvsignore
deleted file mode 100644
index 9b7ea034be9..00000000000
--- a/source/.cvsignore
+++ /dev/null
@@ -1,12 +0,0 @@
-Makefile.RPM
-makefile
-makefile.sunos5
-nmbd
-nmblookup
-smbclient
-smbd
-smbpasswd
-smbrun
-smbstatus
-testparm
-testprns
diff --git a/source/arcfour.c b/source/arcfour.c
deleted file mode 100644
index a28d702a861..00000000000
--- a/source/arcfour.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
-
- a implementation of arcfour designed for use in the
- SMB password change protocol based on the description
- in 'Applied Cryptography', 2nd Edition.
-
- Copyright (C) Jeremy Allison 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "arcfour.h"
-
-void set_arc4_key(unsigned char *data, int key_length, arc4_key *arckey)
-{
- unsigned int i;
- unsigned char j;
- unsigned char tc;
- unsigned char *s_box = &arckey->s_box[0];
-
- arckey->index_i = 0;
- arckey->index_j = 0;
- for(i = 0; i < 256; i++)
- s_box[i] = (unsigned char)i;
-
- j = 0;
- for( i = 0; i < 256; i++)
- {
- j += (s_box[i] + data[i%key_length]);
- tc = s_box[i];
- s_box[i] = s_box[j];
- s_box[j] = tc;
- }
-}
-
-void arc4(arc4_key *arckey, unsigned char *data_in, unsigned char *data_out,
- int length)
-{
- unsigned char tc;
- int ind;
- unsigned char i, j;
- unsigned char t;
- unsigned char *s_box = &arckey->s_box[0];
-
- for( ind = 0; ind < length; ind++)
- {
- i = ++arckey->index_i;
- j = arckey->index_j += s_box[i];
- tc = s_box[i];
- s_box[i] = s_box[j];
- s_box[j] = tc;
- t = s_box[i] + s_box[j];
- *data_out++ = *data_in++ ^ s_box[t];
- }
-}
-
-#if 0
-/* Test vector */
-unsigned char key_data[] = { 0x61, 0x8a, 0x63, 0xd2, 0xfb };
-unsigned char plaintext[] = { 0xdc, 0xee, 0x4c, 0xf9, 0x2c };
-unsigned char ciphertext[] = { 0xf1, 0x38, 0x29, 0xc9, 0xde };
-
-int main(int argc, char *argv[])
-{
- unsigned char out[5];
- arc4_key key;
-
- set_arc4_key(key_data, 5, &key);
- arc4(&key, plaintext, out, 5);
-
- if(memcmp(out, ciphertext, 5) ==0)
- printf("Test ok !\n");
- else
- printf("Test fail !\n");
- return 0;
-}
-#endif
diff --git a/source/arcfour.h b/source/arcfour.h
deleted file mode 100644
index 34a4e8f91be..00000000000
--- a/source/arcfour.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef _ARC4_H_
-#define _ARC4_H_
-
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
-
- a implementation of arcfour designed for use in the
- SMB password change protocol based on the description
- in 'Applied Cryptography', 2nd Edition.
-
- Copyright (C) Jeremy Allison 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-typedef struct {
- unsigned char s_box[256];
- unsigned char index_i;
- unsigned char index_j;
-} arc4_key;
-
-extern void set_arc4_key(unsigned char *data, int key_length, arc4_key *arckey);
-extern void arc4(arc4_key *arckey, unsigned char *data_in,
- unsigned char *data_out, int length);
-
-#endif /* _ARC4_H_ */
diff --git a/source/cgi.c b/source/cgi.c
deleted file mode 100644
index 56c293985d6..00000000000
--- a/source/cgi.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- some simple CGI helper routines
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-#include "includes.h"
-
-#define MAX_VARIABLES 512
-
-struct var {
- char *name;
- char *value;
-};
-
-static struct var variables[MAX_VARIABLES];
-static int num_variables;
-
-
-static int grab_line(int *cl, char *line, int maxsize)
-{
- int i = 0;
-
- while ((*cl)) {
- int c = fgetc(stdin);
- (*cl)--;
-
- if (c == EOF) {
- (*cl) = 0;
- break;
- }
-
- if (c == '+') {
- c = ' ';
- }
-
- if (c == '\r') continue;
-
- if (strchr("\n&", c)) break;
-
- if (c == '%' && (*cl) >= 2) {
- int c1, c2;
- c1 = fgetc(stdin);
- c2 = fgetc(stdin);
- (*cl) -= 2;
- if (c1 == EOF || c2 == EOF) break;
- if (c1 >= '0' && c1 <= '9')
- c1 = c1 - '0';
- else if (c1 >= 'A' && c1 <= 'F')
- c1 = 10 + c1 - 'A';
- else if (c1 >= 'a' && c1 <= 'f')
- c1 = 10 + c1 - 'a';
- else break;
-
- if (c2 >= '0' && c2 <= '9')
- c2 = c2 - '0';
- else if (c2 >= 'A' && c2 <= 'F')
- c2 = 10 + c2 - 'A';
- else if (c2 >= 'a' && c2 <= 'f')
- c2 = 10 + c2 - 'a';
- else break;
-
- c = (c1<<4) | c2;
- }
-
- line[i++] = c;
-
- if (i == maxsize) break;
- }
-
- /* now unescape the line */
-
-
- line[i] = 0;
- return 1;
-}
-
-
-/***************************************************************************
- load all the variables passed to the CGI program
- ***************************************************************************/
-void cgi_load_variables(void)
-{
- static pstring line;
- char *p;
- int len;
-
- if (!(p=getenv("CONTENT_LENGTH"))) return;
-
- len = atoi(p);
-
- if (len <= 0) return;
-
-
-
- while (len && grab_line(&len, line, sizeof(line)-1)) {
- p = strchr(line,'=');
- if (!p) continue;
-
- *p = 0;
-
- variables[num_variables].name = strdup(line);
- variables[num_variables].value = strdup(p+1);
-
- if (!variables[num_variables].name ||
- !variables[num_variables].value)
- continue;
-
-#if 0
- printf("%s=%s<br>\n",
- variables[num_variables].name,
- variables[num_variables].value);
-#endif
-
- num_variables++;
- if (num_variables == MAX_VARIABLES) break;
- }
-
- fclose(stdin);
-}
-
-
-/***************************************************************************
- find a variable passed via CGI
- ***************************************************************************/
-char *cgi_variable(char *name)
-{
- int i;
-
- for (i=0;i<num_variables;i++)
- if (strcmp(variables[i].name, name) == 0)
- return variables[i].value;
- return NULL;
-}
-
-
-/***************************************************************************
- return the value of a CGI boolean variable.
- ***************************************************************************/
-int cgi_boolean(char *name, int def)
-{
- char *p = cgi_variable(name);
-
- if (!p) return def;
-
- return strcmp(p, "1") == 0;
-}
diff --git a/source/change-log b/source/change-log
deleted file mode 100644
index 42a27fe6f68..00000000000
--- a/source/change-log
+++ /dev/null
@@ -1,1878 +0,0 @@
-SUPERCEDED Change Log for Samba
-^^^^^^^^^^
-
-Unless otherwise attributed, all changes were made by
-Andrew.Tridgell@anu.edu.au. All bugs to samba-bugs@samba.anu.edu.au.
-
-NOTE: THIS LOG IS IN CHRONOLOGICAL ORDER
-
-NOTE: From now on the cvs.log file will be used to give a complete log of
-changes to samba. This change-log is now obsolete.
-
-1.5.00 announced to mailing list
-
-1.5.01 1/12/93
- - configuration through makefile only
- - fixed silly bug that made the client not accept dir's from
- the server
- - tested and updated include files for ultrix, aix and solaris
- - several things fixed thanks to pierson@ketje.enet.dec.com
- who provided invaluable help and advice.
-
-1.5.02 1/12/93
- - added username option to services file so connection
- as non guest from lanmanager is possible
- - made server abort when it can't read/write on a socket
- - added logging to client
-
-1.5.03 2/12/93
- - printing now works
- - fixed a minor bug to do with hidden and system attributes
-
-1.5.04 2/12/93
- - added reduce_name() call to fill in security hole.
- - cleanup up debug stuff a little
-
-1.5.05 2/12/93
- - fixed bug in reduce_name that affects services with base paths
- that have a soft link in them.
-
-1.5.06 3/12/93
- - used the reserved server field in the search status to hold the
- directory pointer. This allows lots of directories to be open
- at once by clients without stuffing things up.
- - preserved all the client reserved bytes in the search status
- in case they actually use them. Hopefully this will fix the annoying
- empty directory dir bug. (it does)
-
-1.5.07 3/12/93
- - fixed silly bug that caused volume ids to appear twice
- - fixed a wrote-too-few bug in smb_send()
-
-1.5.08 3/12/93
- - did the SMBsearch properly. It can now handle recursive searches.
- In order to keep the required dir info I encode the dirptr and
- the current dir offset (from telldir) into 5 bytes by using a table
- on the last 7 bits of the first byte. The first bit is always on
- as this byte must by != 0
- This is all put in the "server reserved" search field.
-
-1.5.09 5/12/93
- - added a prototype nameserver. It's broken but can at least interpret
- incoming packets.
- - minor fixes to the server and client
-
-
-1.5.10 5/12/93
- - fixed silly unsigned/signed char bug that made dosshell noot see all files
- - added nmbd to Makefile
-
-1.5.11 6/12/93
- - made the volume label appear as the service name, rather than "Remote"
- - made the nmbd actually work (a little) for lanman for dos
-
-1.5.12 7/12/93
- - fixed broadcasting in the nameserver
- - the smbd now correctly sets the pid and uid
- - nmbd now seems to work enough to satisfy the MS client.
-
-
-1.5.13 7/12/93
- - fixed a silly bug that truncated filenames
- - added -B option to nameserver to specify bcast address
- - added -R option to nameserver to prevent name registering
- - fixed minor read() bug. Does this fix the "cmp" bug?
-
-1.5.14 8/12/93
- - fixed a bug in send_login() in the client. Thanks to
- tim.hudson@gslmail.mincom.oz.au for pointing this out.
- - changed name_mangle() to pad to minimum of 32 bytes with spaces
- - changed the returned buffer size in reply_connect() to not
- count the 4 byte length field. This fixes the "can execute" bug
- and the "comp" bug
- - once again re-wrote the directory pointer handling code.
- now "tree" works correctly
-
-1.5.15 9/12/93
- - fixed name mangle bug introduced in 1.5.14 which stopped
- nameserver from working
-
-1.5.16 9/12/93
- - arrgh. another silly bug in name_mangle() causes the client to die.
-
-
-1.5.17 13/12/93
- - some cosmetic cleanups to the code
- - changed make_connection not to lower case the password (thanks
- to bryan@alex.com)
- - fixed accept() bug not initialising in_addrlen (thanks to
- bogstad@cs.jhu.edu)
- - fixed cd bug in client.c (thanks to joergs@toppoint.de)
- - lots of fixes to the nameserver to read_socket and
- associated routines. It should now correctly reply to the originating
- address and use the correct broadcast.
- (thanks to troyer@saifr00.ateng.az.honeywell.com)
- - SVR4 patches from mark@scot1.ucsalf.ac.uk
- - changed the default BUFFER_SIZE to 0xFFFF
-
-1.5.18 15/12/93
- - minor fix to reply_printqueue() to zero data buffer array.
- - added print command to client.
- - fixed minor bug in cmd_put() in client where a handle could
- be closed without being previously opened.
- - minor cleanups to the client
- - minor solaris fixes from lonnie@itg.ti.com
- - SYSV, shadow password and dfree() fixes from mark@scot1.ucsalf.ac.uk
- - fixed reply_delete() to not delete read-only files
- - fixed infinite loop in reply_delete on "del ."
- Thanks to mark@scot1.ucsalf.ac.uk for pointing this out.
- - posix mode definitions and changes from mark@scot1.ucsalf.ac.uk
-
-
-1.5.19 18/12/93
- - another very minor fix to dfree().
- - minor change to SVR4 makefile entry from rossw@march.co.uk
- - changed reply_open not to open directories, this fixes the
- "copy .." bug pointed out by mark@scot1.ucsalf.ac.uk
- - changed dos_mode() so it doesn't return hidden and system info
- on directories.
- - changed get_dir_entry() not to descend into proc/self under linux
- control this with the DONT_DESCEND define in includes.h
- - changed smb_setlen() to add in the SMB id. (thanks
- to troyer@saifr00.ateng.az.honeywell.com)
- - fixed minor bug in reply_dir() so it won't return a ACCESS_DENIED
- when searching a directory that is unreadable
- - removed second stat() from get_dir_entry() (speed up)
- - made null searches close the dirptr (fixes big filesystem problem)
- - fixed clean_name for cd .. (from magnus@axiom.se)
-
-
-1.5.20 28/12/93
- - added debug statement in case of SMBcreate with volid set (leefi@microsoft.com)
- - fixed a bug in dptr_close() so it sets the next_key to a better
- value, this fixes a annoying dir bug
- - LOTS of changes from jeremy@netcom.com (Jeremy Allison). This
- makes it possible to at least connect to a NT server with the client
- and also fixes up much of the socket/process code. This also includes
- stuff for compiling on a sun386
- - got the client working with the Syntax server (a commercial
- smb-based server). This required a few minor changes so the xmit
- sizes were negotiated properly.
- - added support for OSF1, tested on a DEC3000/400 alpha.
- - fixed the ifconf support under ultrix
-
-1.5.21 31/12/93
- - minor cosmetic change to reduce_name()
- - changes for HPUX from ppk@atk.tpo.fi (Pasi Kaara)
- - minor fix to nameserver
- - revamped configuration file format. It now takes a Windows-style
- (.INI style) configuration file. See the file services for
- full details of the format. New files: loadparm.c, loadparm.h,
- params.c, params.h, testparm.c. Several changes to smb.h, local.h,
- server.c, Makefile. The services structure is no longer visible
- to the rest of the system. (Karl Auer)
- - added ability to specify a print command on a per service basis
- and globally via the configuration file. Also allows guest account
- to be specified in the configuration file. Made appropriate changes
- to server.c so that these data items are obtained from the config
- module rather than from hardcoded strings (though the hardcoded
- strings are still the source of the defaults). (Karl Auer)
- - renamed old-style configuration file to services.old (Karl Auer)
- - changed README to reflect new configuration details. (Karl Auer)
- - removed an item from the bugs wishlist (now supplied!) (Karl Auer)
- - protected smb.h against multiple compilation. (Karl Auer)
- - protected local.h against multiple compilation. (Karl Auer)
- - made config stuff do dynamic allocation
- - added "homes" capability
- - added create_mask to each service in config
-
-1.5.22 3/1/94
- - added "root dir" option for extra security
- - added -n option to client (useful for OS/2)
- - changed operation of -n to nameserver to be more useful
- - patches from Jeremy Allison (jeremy@netcom.com)
- fixing bug in set_message(), fixing up wait3() for SYSV,
- making cd check the path in the client, allowing fetching to stdin
- in client, and enhancing prompt in client to include directory.
- - made the -D become_daemon() actually detach from the tty. This
- may need tuning for different flavors of unix.
- - added "dont descend" option to each service to prevent infinite
- loops on recursive filesystems.
- - updated README to add "running as a daemon" and a simple
- smb.conf file.
- - HP/UX fixes from ppk@atk.tpo.fi
- - made lock calls only if opened with write enabled, as pointed out
- by gadams@ddrive.demon.co.uk
-
-1.5.23 4/1/94
- - minor fix to logging of data in receive_smb(). It used to
- miss the last 4 bytes of packets.
- - added the pid,uid and mid fields to the negotiation phase of
- the client.
- - made client able to print from stdin
- - added password on command line for client
- - created a sample printcap input filter "smbprint"
- - several fixes to client to work with OS/2
- - added mput, mget, prompt and lcd to client
-
-1.5.24 5/1/94
- - a resend of 1.5.23 as I managed to not include the new
- prompt, mput and mget code.
-
-1.5.25 7/1/94
- - change -B on nameserver so it can override the broadcast address
- - minor changes to printing in client so OS/2 server can handle it.
- - fixed reply_access() where OK was not being initialised
- - added "max xmit" to global parameters.
- - changed create to open with O_RDWR instead of O_WRONLY
- - added printmode command to client
- - made help return extra help on a specified command in client
- - fixed return code in chkpath
- - added "recurse" and "lowercase" options to client
- - fixed some error codes from server
- - added -I option to client
- - fix for become_daemon() for HPUX from ppk@atk.tpo.fi
- - added "hosts allow" and "hosts deny" to server
- - added keepalives to server
- - added "access" feature to testparam
- - NetBSD patches from sreiz@aie.nl
-
-1.5.26 8/1/94
- - changed semantics of hosts access code to do more sensible defaults
- when either of "hosts allow" or "hosts deny" is blank
- - added the SO_KEEPALIVE option to configurations of sockets in the
- server
- - made some of the SVAL fns into macros to keep fussy compilers from
- complaining
- - fixed several null pointer bugs in check_access(). These bugs
- made 1.5.25 unuseable for many people.
- - fixed null pointer reference of lp_dontdescend()
- - reload services file after each new connection.
-
-1.5.27 11/1/94
- - fixed opening mode for reply_open() in server
- - patches from Jeremy Allison (jeremy@netcom.com) to support the
- "core+" protocol. The patches also inclued some other features, such
- as a new read_with_timeout() call (used by SMBreadbraw), and auto
- detection of the need to create a socket.
- - changed the default KEEPALIVE value to 0, as it caused
- problems with Lanmanager.
- - added tar capability to client when getting files
- - altered unix_mode() to return x bits for directories
- - fixed bug in trim_string()
-
-1.5.28 12/1/94
- - cleaned up the debug levels a little so debug level 1 is a practical
- level for general use
- - fixed a bug in add_a_service() where a freed pointer was referenced. Thanks
- to bryan@alex.com for finding the bug.
- - fixed bug in time structure handling in server and client. Thanks to
- bryan@alex.com for pointing out the bug.
-
-
-1.5.29 15/1/94
- - fixed a silly bug in reply_open(). Thanks to
- jeremy@netcom.com for pointing this out.
- - fixed debug levels in client to be more sensible
- - added raw read to client
- - added -B option to client
- - fixed several bugs in the client, mostly to do with the tar option
- - added -E option to client
-
-1.5.30 16/1/94
- - added lots of prototypes so compilers don't complain
- - fixed minor bug in reply_rename() (thanks to ppk@atk.tpo.fi)
- - added more support for LANMAN1.0 protocol.
- - added SESSION SETUP AND X call
- - added READ AND X call
- - added TREE CONNECT AND X call
- - added support for setbuffer for HPUX (thanks to ppk@atk.tpo.fi)
-
-1.5.31 29/1/94
- - added support for user level security in smbclient eg:
- smbclient "\\SERVER\SHARE" -U USERNAME%PASSWORD
- - added error message decode as per SMB File Sharing
- protocol extensions. (thanks to merik@blackadder.dsh.oz.au)
- - added selection masks to smbclient that recurse down directory
- tree. eg: mget *.* with recurse and mask *.c on will retrieve all
- *.c files in the tree.
- - patches for FreeBSD from kuku@acds.physik.rwth-aachen.de
- - changed reduce_name() to trim ./ from front of strings and / from
- back
- - fixed a nasty bug in trim_string().
- - numerous small changes to lots of stuff that I didn't
- document while I was doing them. Sorry :-(
- - slightly updated sockspy
-
- - The following was done by Karl Auer (Karl.Auer@anu.edu.au)
- - added processing in configuration file of a [printers] section. Allows
- connection to any printer specified in /etc/printcap (or the file
- specified in the global parameter 'printcap name').
- - added full processing of 'available' flag to configuration file. A
- service can now be 'turned off' by specifying 'available = no'. Of
- dubious utility.
- - added 'printcap =' parameter to [global] section in the configuration
- file. This allows the normal /etc/printcap to be bypassed when
- checking printer names for dynamic printer connections via [printers].
- - added 'printer name =' parameters to both the [global] section and
- services sections of the configuration file. This allows the printer
- name only to be set, without having to specify an entire print
- command.
- - added some synonyms: 'writable' and 'write ok' have the opposite sense
- to 'read only'. 'public' may be used instead of 'guest ok'. 'printer'
- may be used instead of 'printer name'. 'printable' is the same as
- 'print ok'. 'root' may be used instead of 'root dir' or 'root
- directory'.
- - added lots more detail to the sample configuration file to take
- account of the above.
- - many minor fixes to internal documentation in the configuration
- sources.
- - also - Man pages!
-
-
-1.5.32 3/2/94
- - addition of smbd, smbclient and testparm man pages
- from Karl Auer
- - zombie process fix from lendecke@namu01.gwdg.de
- - added capability to nmbd to serve names available
- via gethostbyname().
-
-1.5.33 3/2/94
- - fixed up getting of netmask so it works on more unix variants
- - added -N option to nmbd
- - changed GMT diff calculation. need to check it's right for
- lots of OSes
- - fixed a bug in read_and_X() and chain_reply() chaining now
- seems to work correctly
-
-1.5.34 4/2/94
- - fixed bug in client that meant it couldn't get/put files from WfWg
- - fixed a bug in the server that caused lpr to return -1 under sunos
- - fixed a few errors in the hosts allow section of the
- smb.conf.5 manual page and added examples
-
-1.5.35 6/2/1994
- - minor bugfix in reduce_name().
- - changed width of "size" in client during a dir
- - patches for NEXT (among other things) from lendecke@namu01.gwdg.de
- - added -a switch to server, and made default action to append
- to log file
- - added deadtime options to [global] section for timing out
- dead connections to the smbd.
- - HPUX changes from Pasi.Kaara@atk.tpo.fi
- - made use of unsigned char more consistent
- - changed the way of getting the default username and host in the
- client
- - made LANMAN1 default to on in the client, off in server.
- Use -DLANMAN1=1 to make it on in both.
- - lots of casts and cleanups for various operating systems
- - changes to the Makefile from Karl to auto-instal the man pages
- - added a short history of the project to the distribution
-
-1.5.36 15/2/94
- - fixed minor bug in Debug() (thanks to Pasi.Kaara@atk.tpo.fi)
- - fixed bug in server.c so -a wasn't accepted.
- - minor fixes to the client
- - added hosts file to name server (-H option)
- - added -G option for groups to nameserver
- - cleanups and additions from Jeremy Allison, taking us
- closer to LANMAN1.0. In particular the locking code was cleaned up
- considerably.
-
-1.5.37 16/2/94
- - fixed bug introduced in 1.5.36 which disabled SMBcreate
-
-1.5.38 18/2/94
- - fixed get_broadcast() for ultrix (fix from iversen@dsfys1.fi.uib.no)
- - added automatic group registration
- - fixed bug in registration code
- - made nmbd work better with WfWg, and probably others
- - updated the man pages to include the new nmbd options.
- - minor updates to the README
- - fixed double log_out() in send_packet().
- - fixed bug in smbclient so that "dir" didn't work correctly
- with pathworks
- - possibly fixed bug in server that led to "abort retry ignore" from
- pathworks client when doing a "dir".
- - changed behaviour of smbclient login slightly, to try a
- blank password in SMBtcon if the right password fails, and a
- session setup has succeeded. Some clients seem to use a blank
- one if a session setup has succeeded.
- - ISC patches from imb@asstdc.scgt.oz.au
- - the client now tries to do name registration using a unicast.
- Let me know if this helps anyone.
- - tried to add a "contributed" line to each OS in the Makefile.
-
-1.5.39 18/2/94
- - fixed silly C code that only worked with some compilers
- - fixed another silly bug in nameserv.c that caused it to seg fault
-
-1.5.40 21/2/94
- - removed the from (IP) message so people don't worry about 0.0.0.0,
- it's redundant anyway.
- - changed the client so the crypt key isn't printed
- - changed the structure of switch_message() to use a list of functions.
- This improves the debug info.
- - made SMBopen ignore supplied attribute as per X/Open spec
- - made SMBopen fail if file doesn't exist in all cases. Let me know
- if this breaks something. It is implied in the X/Open spec. This
- fixes the pkzip bug.
- - added dptr_demote() to replace dptr_close() to try and fix
- pathworks dir bug. This has the potential disadvantage of
- leaving lots of open file descriptors.
- - changed mask_match to disallow two .s in a name
-
-1.5.41 2/3/94
- - added "dfree command" global option to smbd to support an
- external "disk free" executable (typically a script). This gets
- around the problem of getting disk free info reliably on lots
- of systems.
- - added ffirst and fclose to client
- - simple SYSVR4 patch from mark@scot1.ucsalf.ac.uk
- - added better uid/gid reporting for debugging purposes
- - several changes to the logon procedure for the client, so hopefully
- it will connect correctly to a wider range of servers.
- - server should no longer crash if it can't open the debug
- file (thanks to MGK@newton.npl.co.uk)
- - added the THANKS file.
-
-1.5.42 6/3/94
- - lots of changes from Jeremy Allison, implementing more of
- the LANMAN1.0 protocol, and fixing a few bugs.
- - fixed delete bug, so hopefully wildcards are correct now
- - pcap changes from Martin Kiff so non-aliased printers in
- /etc/printcap are recognised
- - wrote announce file ready for 1.6
- - re-wrote browse code in client (still doesn't work)
- - updates to man-pages from Karl Auer
- - made raw packet dumps mode 0600 and only if -dA is given
- - changed socket code to use utility functions in util.c
-
-1.6.00 17/3/94
- - made server always return to original directory (rather than /)
- - fixed bug in params.c that caused a seg fault if no parms in a
- section
- - minor clean ups for clean compile under solaris
- - solaris fix for running from inetd from Karl Auer
- - fixes for dfree() under solaris
- - minor changes that might help BSDI
- - changes to the Makefile, manual-pages and sample config file from
- Karl Auer
- - fixed dfree for Ultrix
-
-1.6.01 19/3/94
- - fixed setatr bug that allowed directories to be unusable
-
-1.6.02 27/3/94
- - added timestamps to connection message in log
- - added idle timeout of 10 minutes to name server
- - made HAVE_SYSCONF==0 the default in includes.h
- - made the client not register by default
- - ISC patches from imb@asstdc.scgt.oz.au
- - GetWd() cache code from Martin Kiff
- - rewrote the locking code in terms of fcntl() calls.
- - fixed "can't delete directory" bug
- - added code to close old dirptrs for duplicate searches
- - removed exchange_uids() and the access() call and replaced them.
-
-1.6.03 28/3/94
- - tried to clean up the time handling a little (local vs gmt time)
- - added debug level global to server config
- - added protocol level global to server config
- - added SMBecho command to server
- - included Karl Auers SMBGuide in the distribution.
-
-1.6.04 31/3/94
- - fixed time zeroing bug in smb_close and smb_setatr
- - re-wrote the username/password handling to be more flexible
- - added "guest only" service setting to smb.conf
- - updated man pages for new username/password handling
- - fixed parse bug in reply_tconX
- - improved error return code from tcon
- - several changes to fix printing from WfWg
-
-1.6.05 2/4/94
- - changed the name of the whole package to Samba
- - removed SMBexit call from client to stop exiting error message
- - added interpret_addr() call to replace inet_addr() so
- a hostname can be used whenever a IP is required
-
-1.6.06 8/4/94
- - added random tid choice to reduce problem of clients not
- detecting a server disconnection.
- - made client not report spurious time from CORE or COREPLUS server.
- - minor HPUX fix from gunjkoa@dep.sa.gov.au
- - turned off GETWD_CACHE until we track down a minor bug in it
-
-1.6.07: 10/4/94
- - added helpful error messages to connection failure in client.
- - fixed problem with mput in client
- - changed server to allow guest-only sesssetup messages with any
- password. Control this with GUEST_SESSION_SETUP in local.h.
- - minor change to session setup handling in make_connection()
- - added check for right number of \s in the client.
- - made the server not exit on last close if the deadtime is != 0
- - added malloc and realloc wrappers. enable them with -DWRAP_MALLOC=1
- - if smbd is started with a debug level of 10 or greater it creates
- a log file ending in the process number
-
-1.6.08: 18/4/94
- - updated the THANKS file
- - changes from marcel@fanout.et.tudelft.nl (Marcel Mol) for AMPM
- times and error report on connect().
- - made the get_myname() routine discard any part after the first '.'
- - added a wrapper for free from Martin Kiff
- - added simpleminded code to handle trapdoor uid systems (untested)
- - added Martin Kiffs "paranoid" getwd code.
- - added default MAXPATHLEN if undefined of 1024
- - made get_broadcast() continue to get netmask if it can't get
- broadcast (suggestion from Hannu Martikk)
- - replaced fchmod() calls with chmod() to satisfy some unixes
-
-
-
-1.6.09: 4/5/94
- - changed perror() calls to strerror() in server.c
- - fix for dfree on OSF1 from
- Maximilian Errath (errath@balu.kfunigraz.ac.at)
- - fixed server time reporting for protocol >= LANMAN1
- - fixed TimeDiff() for machines without TIMEZONE or TIMELOCAL
- (thanks to Vesa S{rkel{ <vesku@rankki.kcl.fi>)
- - added SYSV defs to AIX and HPUX to fix "memory" problem
- (actually a signal problem).
- - added version to client banner in log file
- - Ultrix patches from Vesa S{rkel{ <vesku@rankki.kcl.fi>
- - added ! command to client for executing shell commands
- - fixed ERRnofids bug in server
- - fixed name_equal bug
- (thanks to cjkiick@flinx.b11.ingr.com (Chris Kiick))
- - wrapped gethostbyname() with Get_Hostbyname() to prevent
- case sensitive problems on name lookups
- - limit printer tmp filename to 14 chars
- (from Paul Thomas Mahoney <ptm@xact1.xact.com>)
- - added ability to understand 64 bit file times
- (thanks to davidb@ndl.co.uk (David Boreham))
- - added Gwt_Pwnam() wrapper to cover server case-sensitivity
- problems (suggestion from J.M.OConnor@massey.ac.nz (John O'Connor))
- - changed the setuid() calls to try and work for more systems
- without breaking the ones it currently works for
- - added version number to usage()
- (suggestion from peter@prospect.anprod.csiro.au)
- - added "security=" option for share or user level security
- - allowed multiple usernames in "user=" field
- - changed display method for recursive dorectory listings
- - switched client to use long filenames where supported
- - added speed reporting to client transfers
- - several NT fixes to server from jra@vantive.com (Jeremy Allison)
- - ISC fixes from ptm@xact.demon.co.uk (Paul Mahoney)
- - fix to README from grif@cs.ucr.edu (Michael A. Griffith)
- - default netmask and broadcast from Ian A Young <iay@threel.co.uk>
- - changed default of is_locked() on fcntl() error.
- - fixed bug in read_with_timeout() that could cause a runaway
- smbd process.
- - fixed findnext bug for long filenames in client
- - changed default protocol level to LANMAN1
- - change default reported security level to SHARE.
- - changed password_ok() so that if pwdauth() fails it tries
- with standard crypt.
- - added "translate" command to the client to do CR/LF translation
- for printing, and add a form feed at the end.
- (thanks to mh2620@sarek.sbc.com (Mark A. Horstman ) )
- - added "locking=yes/no" toggle for each service
- - SCO unix patches from Heinz Mauelshagen (mauelsha@ez.da.telekom.de)
-
-1.6.10: 7/5/94
- - fixed important bug in readbraw/writebraw
- - added -A option to client
- - fixed delete bug on long filenames (untested). Thanks to
- Stefan Wessels <SWESSELS@dos-lan.cs.up.ac.za>
- - neatened up the byte swapping code
-
-1.6.11: 3/6/94
- - fixed bug in client in receive_trans2_response() that caused
- some strange behaviour with LANMAN2.
- - fixed some offset/alignment problems with lockingX (thanks to
- Jeremy Allison)
- - allow locking on O_RDONLY files. Thanks to Martin N Dey <mnd@netmgrs.co.uk>
- - fixed del bug in client thanks to paulzn@olivetti.nl (Paul van der Zwan)
- - fixed multiple user= bug thanks to MDGrosen@spectron.COM (Mark Grosen)
- - added translate ability for all files. Thanks to mh2620@sarek.sbc.com (Mark A. Horstman )
- - mask out negative lock offsets. Thanks to bgm@atml.co.uk (Barry G Merrick)
- - more attempts to get the structure alignment better for some machines
- - cleaned up the machine dependencies a little
- - ISC fixes from Paul Thomas Mahoney <ptm@xact1.xact.com>
- - enabled printing with a SMBclose and SMBwrite for NT
- thanks to jkf@frisky.Franz.COM (Sean Foderaro)
- - SGI changes from Michael Chua <lpc@solomon.technet.sg>
- - CLIX patches from cjkiick@ingr.com
- - NEXT2 and NEXT3_0 patches from Brad Greer (brad@cac.washington.edu)
- - BSDI changes from tomh@metrics.com (Tom Haapanen)
- - SCO patches from John Owens (john@micros.com)
- - fix psz bug in pcap.c (thanks to Karl Auer)
- - added widelinks option (global and per service). Suggestion from
- Karl Auer. Defaults to True.
- - made locking able to be global or local (default is give by global)
- - added check_name() to dir listings
- - added "packet size" option to globals. default to 32767. This
- "fixes" a WfWg bug (thanks to Karl Auer)
- - fixes for getattrE and setattrE and minor fix in util.c from Jeremy Allison.
- - Karl updated the man pages o be current
- - disabled writebraw and readbraw until a possible bug can be investigated further
-
-1.7.00: 14/7/94
- - added session_users list, to overcome problem of missing usernames in SMBTconX.
- - added term support to the client
- - added "default service"
- - fork for print so user is not root
- - added name mangling to 8.3 (rudimentary)
- - fixed bug in in_group()
- - changed to use gid in place of egid
- - fixed client connection to OS/2 (1.3 + lanman2.2) and long filenames
- - added patches from mcochran@wellfeet.com (Marc Cochran)
- these implement scope ids and fix some udp bugs. It means
- the -L option to nmbd now works.
- - made nmbd respond to incoming port rather than only 137
- - made wide links refuse .. components
- - fixed "dir foo." bug to stop it showing "foo.???"
- - improved name mangling (added stack)
- - added valid FNUM check to most calls
- - fixed important do_put bug in the client
- - added magic scripts to the server
- - re-enabled getwd_cache code
- - added optional agressive password checking
- - removed dptr_closepath from SMBsearch to try and stop "dos for loop"
- bug
- - DGUX patches from ross@augie.insci.com (ross andrus)
- - updated the README and THANKS file.
- - added node status request to -L option of nmbd
- - stripped trailing spaces in mask_match() (thanks to mike hench hench@cae.uwm.edu)
- - added COREPLUS style print queue reporting and "lpq command"
- in globals.
- - cleaned up date handling and fixed byte order dependancy on dates
- in SMBgetattrE.
- - cleaned up the password handling and added "password level" with
- the possability of checking all case combinations up to N upper
- case chars.
- - changed to use recvfrom only on udp ports (fixed read raw!)
- - added TCB password support for SCO (thanks to lance@fox.com)
- - updated README, THANKS and announce files.
- - fixed timezone reporting to be signed (thanks to noses@oink.rhein.de)
- - disabled max packet as it could cause problems with WfWg (no longer
- needed now readraw is "fixed")
- - changed from creat() to open() in mktemp and mknew.
- - changed umask handling
- - sped up nmbd by making it cache names
- - changed idle timeout on nmbd to 2 mins
- - Netbsd changes from noses@oink.rhein.de
- - released alpha2
- - added name timeout to nmbd
- - changed bind port retry in nmbd
- - added Limitations sections to README
- - fixed two . in is_83()
- - fixed compilations warnings in util.c (thanks to njw@cpsg.com.au)
- - made [homes] honour multiple user list
- - fixed mask match bug introduced in alpha1
- - added "mangled stack" option for stack size
- - added mangled stack promotion
- - released alpha3
- - netbsd-1.0 fix for statfs().
- - added null_string to util.c to reduce memory usage
- - changed the way directory structures are put together
- - added smbrun for system() requests
- - changed maxmux to 0 in hope of avoiding mpx commands problem
- - fixed zero response length for session keepalives
- - removed called name from session users list
- - added F_RDLCK support to try and handle locks on readonly files
- - made directory creation honour the lowercase flag in client (thanks
- to charlie@edina.demon.co.uk)
- - made checksum for mangling independant of extension if extension is
- lowercase
- - added ability to rename files with different extension, preserving
- root name
- - released alpha4
- - better command line error checking in client
- - changed all debug statements to new format
- - fixed delete error code reporting
- - released alpha5
- - added mangled name support to wildcard delete in server
- - fixed mask bug in SMBsearch
- - cleaned up prototypes
- - released alpha6
- - fixed important bug in session_setup which made WfWg freeze
- (maxmux was 0 - this bug was introduced in alpha4)
- - released alpha7
- - two printing bug fixes thanks to bgm@atml.co.uk (Barry G Merrick)
- - uid fix to smbrun (thanks to larry@witch.mitra.com)
- - man page updates from Karl Auer
- - FAQ file from Karl Auer
- - released alpha8
- - fixed read-only flag in dos_mode() for non writeable services
- - fixed error code reporting in open() and openX().
- - minor secureware fix from (thanks to lance@fox.com)
- - released alpha9
- - casting cleanups for memcpy().
- - cleaned up error code names to be more consistant
-
-1.7.01: 17/7/94
- - minor man page fix from baeder@cadence.com (Scott Baeder)
- - changed usage() error message in client
- - made nmbd not exit if can't register own name
- - made nmbd only register if running as a daemon
- - fixed stdout problem in smbrun by closing stdin/stdout/stderr
- - minor fix to lmhosts parsing
-
-
-1.7.02: 20/7/94
- - made nmbd not call get_broadcast if both -B and -N are used (thanks
- to Chris Woodrow <Chris.Woodrow@actrix.gen.nz>)
- - disabled GETWD_CACHE again
- - fixed INCLUDES list in Makefile to add version.h (thanks to
- jimw@PE-Nelson.COM (Jim Watt))
- - made checkname do a become user if it hasn't already done so.
- - added consistancy check to become_user().
- - removed mask extension expansion from SMBsearch
- - small change to chkpth
- - fix to snum select for lpq status (thanks to Rafi Sadowsky
- rafi@tavor.openu.ac.il)
- - changed daemon to is_daemon for NetBSD (thanks to noses@oink.rhein.de)
- - removed STAFS3 stuff for NETBSD_1_0
-
-
-1.7.03: 29/7/94
- - updated docs for new distribution structure
- - made getatr return 0 size for directories (thanks to Bernd Esser
- esser@pib1.physik.uni-bonn.de)
- - added valid dos filename checks from Stefan Wessels
- (swessels@cs.up.ac.za)
- - added trimming of . in hostnames to -S mode of nmbd
- - removed become_user() and OPEN_CNUM calls. Now make them
- in switch_message instead which simplifies a lot of code.
- - added GETFNUM macro to make chain_fnum more consistant and
- reliable.
- - added flags to protocol structures to simplify CAN_WRITE and AS_USER
- checking
- - added getwd cache boolean option to globals
- - added fclose() to lpq status routine thanks to
- dgb900@durras.anu.edu.au (David Baldwin)
- - added "only user" option, to limit connection usernames to those
- in the user= line
- - changed to badpath from badfile in chkpath despite specs (following
- what WfWg does). This fixes "file not found" error in copy command.
- Thanks to rwa@aber.ac.uk for pointing out the bug
- - changes for apollo from Stephen C. Steel <steve@qv3donald.LeidenUniv.nl>
- - more changes for Apollo from jmi@csd.cri.dk (John Mills)
- - released alpha release
- - added FTRUNCATE_CAN_EXTEND=0 as default to fix problem with word6.
- Possibly not needed on many OSes? Thanks to Charlie Hussey
- charlie@edina.demon.co.uk
- - started adding max connections code
- - much improved group handling contributed by
- Ian Heath (ih@ecs.soton.ac.uk)
-
-1.7.04: 29/7/94
- - fixed one line bug in SMBopenX that got error code wrong.
-
-1.7.05: 2/8/94
- - added UNIXERROR() macro to get error code from unix errno.
- - fixed lpq status for MSTCPB3
- - added @ option for user= line to lookup groups in group file
- - added become_user optimisation and process timeout (thanks to
- Jeanette Pauline Middelink (middelin@calvin.iaf.nl)
- - added malloc optimisation in readbraw
- - released alpha
- - patches for OSF1 enhanced security from Udo Linauer <ul@eacpc4.tuwien.ac.at>
- - made level 2 a more useful debug level (less guff)
- - added "max connections" and "lock dir" options to allow
- limiting of the number of connections to a service at one time.
- - released alpha2
- - updated man pages
- - released alpha3
- - added read prediction code for better read performance
- - released alpha4
- - minor tuning to receive_smb()
- - changed the order of mangled stack checking
- - bug fix in read_predict().
- - released alpha5
- - minor search optimisation
- - fixed keep alive bug in writebraw and in readbraw in the client
- - released alpha6
- - disabled writeraw by default pending a bug fix
- - added profiling code (off by default)
- - minor delete tuning
-
-
-1.7.06: 4/8/94
- - OSF1 crypt fix thanks to Udo Linauer <ul@eacpc4.tuwien.ac.at>
- - ifdef'd EDQUOT in case you don't have it (thanks to Paul Blackman <ictinus@Lake.canberra.edu.au>)
- - tidied up UNIXERROR stuff to work on more systems.
- - made Makefile more sophisticated and added "make revert"
-
-1.7.07: 4/8/94
- - fixed one line fatal bug in receive_smb. Thanks to bruce@pixar.com
-
-1.7.08: 2/9/94
- - initgroups call for SCO from lance@fox.com
- - code cleanups from cap@isac.hces.com (Simon Casady)
- - use full pathname in print command construction
- - ISC includes fix from Martin Tomes <mt00@ecl.etherm.co.uk>
- - added GID_TYPE define to cope with ultrix. Thanks to
- brad@cac.washington.edu
- - added umask call to main in server
- - fixed several minor problems with the max connections
- code. Thanks to lehmann@klizix.mpi-stuttgart.mpg.de (Arno Lehmann).
- - fixed filetime in writeclose. Thanks to Andreas Bahrdt
- <100321.2431@compuserve.com>
- - df fix for large disks from Andreas Bahrdt
- - getpwanam support from horn@mickey.jsc.nasa.gov
- - clean name change from Bernd Esser
- <be@syli30.physik.uni-bonn.de>
- - released alpha1
- - more locking changes to fix Excel problem
- - released alpha3
- - another minor locking change
- - smarter masking in the locking code. Excel now apparently works.
- - minor FAQ updates
- - changed max connections refusal error to access denied.
- - added queue command to client to show the print queue
- - changed some print queue reporting stuff
-
-1.8.0: 14/10/94
- - added international chars to valid_dos_char(). Thanks
- to Daniel.Grandjean@dgr.epfl.ch
- - volume label fix
- - released alpha1
- - important off by 4 fix in the server
- - readbraw size adaption in the client
- - released alpha2
- - wait3 cast for NeXt fixed. Thanks to dbrandon@politics.tamu.edu.
- - man page fix for max xmit. Thanks to mmoore@wexford (Mike Moore)
- - is_8_3() fixes from Jochen Roderburg <Roderburg@rrz.Uni-Koeln.DE>
- - list_match() fix from jkf@soton.ac.uk
- - statfs3 fix for BSDI from dan@supra.com
- - changed file open/close/read in server in preparation for mmap()
- based IO.
- - added mmap() support for reading files in the server. Optional
- at compile time. Thanks to suggestion from Roger Binns <rogerb@x.co.uk>
- - mmap bug fixes
- - added __SAMBA__ name in nmbd
- - major changes for support of lanman2 and long filenames from
- Jeremy Allison (jeremy@netcom.com)
- - lseek optimisation. Thanks to Linus Torvalds.
- - released alpha4
- - date patches for lanman2 from Jeremy Allison
- - added protocol aliases to handle WfWg (untested)
- - allow for zero params or data in reply_trans2
- - small lanman2 patches from jeremy
- - more prototype additions for clean compilation
- - postscript patches from tim@fsg.com
- - more lanman2 patches from Jeremy
- - added null ioctl support
- - kanji patches from fujita@ainix.isac.co.jp
- - released alpha6
- - disallowed null password access (thanks to Birger Kraegelin krg@iitb.fhg.de)
- - Makefile fix for ultrix from andrew@d2bsys.demon.co.uk (Andrew Stirling)
- - added per-service mangled names
- - totally re-vamped loadparm.c
- - added "mangling char" parameter
- - released alpha7
- - added "default case = lower|upper" service option
- - change mangling char to a service parameter
- - ultrix enhanced security patch from steven@gopher.dosli.govt.nz
- - more changes to loadparm.c
- - printer name always set in [printers]
- - string_free() fix thanks to jef_iwaniw@pts.mot.com
- - changed group handling to be faster and work for large numbers
- of groups
- - added dynamic gid_t type determination
- - released alpha8
- - fixed become_user() problem for services with invalid
- directories
- - added "invalid users" list on per service basis
- - fixed pointer problems in alpha8 (thanks to murnaghant@a1uproar.yuppy.rdgmts.MTS.dec.com)
- - fixed some date setting problems
- - trans2 fixes from jeremy to stop infinite directory listings of
- long filenames
- - "standard input" lpq patch from root@tlspu.demon.co.uk (Adrian Hungate)
- - changed password checking to check session list and validated ids
- before user list
- - split off password functions into password.c
- - added hosts equiv and rhosts code (thanks to Tim Murnaghan <murnaghant@a1uproar.yuppy.hhl.MTS.dec.com>)
- - released alpha11
- - added "newer" command to the client
- - attempt at aix trapdoor uid workaround
- - released alpha12
- - minor trans2 bugfix
- - added ufc crypt (fast crypt) support. Thanks to suggestion from
- forrest d whitcher <fw@world.std.com>
- - socket() fix for getting bcast and netmask thanks to
- Brian.Onn@Canada.Sun.COM
- - added beginnings of IPC and named pipe support in the server
- - changed file structure a bit, creating reply.c
- - finished print queue support for lanman1
- - changed default protocol to LANMAN2
- - released alpha13
- - logged IPC connects at a higher debug level
- - added netgroup support to hosts equiv search
- - disallowed root access though hosts.equiv (thanks to Colin.Dean@Smallworld.co.uk)
- - kanji and password handling fixes from fujita@ainix.isac.co.jp
- - several bug fixes for lanman and other things from
- esser@pib1.physik.uni-bonn.de (Bernd Esser)
- - updated man pages, README and announce files.
- - released 1.8.00alpha1
- - reply_close() time change fix from Andreas Bahrdt <100321.2431@compuserve.com>
- - added valid users list to compliment invalid users list.
- - aix fixes from tomc@osi.curtin.edu.au (Tom Crawley)
- - changed testparm output format
- - support for getting time from the server (nearly untested)
- - fixed device type error for wild device ????
- - fixed groups problem when in 0 groups
- - more IPC fixups
- - added support for "net view \\server" command to list
- available services (like browsing)
- - released 1.8.00alpha2
- - changed port choice for nmbd -L
- - added -L option to client to view share list on a host
- - bug fixes for NetShareEnum code
- - added "server string" option
- - changed default print file name to include remote machine name.
- - added hooks for browsing in nmbd
- - added browsing to nmbd
- - freebsd fixed from Steve Sims SimsS@Infi.Net
- - got rid of tell()
- - added subnet browsing with the S option in lmhosts
- - made smbd prime nmbd with a 1 byte dgram
- - added REUSADDR to open_socket_in() thanks to peter@ifm.liu.se
-
-
-1.8.01: 18/10/94
-
- - auto add group "LANGROUP" if no group specified in nmbd
- - made nmbd more responsive at startup
- - lots of cleanups and consistancy checks
- - added -C option to nmbd to set "machine comment".
- - fixed postscript option
- - force print_file in print_open()
- - restructured the browsing a little
- - casesignames fix for lanman-dos
- - auto-load home directory from session setup
- - changed to StrnCpy() for safety
- - fixed "out of file descriptors" bug in the client (a WfWg bug?)
-
-
-1.8.02: 22/10/94
- - fixed uppercase username problem
- - added "hide dot files" option
- - changed auto debug log in nmbd
- - added LMHOSTS to Makefile
- - added M flag in lmhosts to specify own netbios name
- - added "load printers" option to auto-load all printers
- - substitution of %p in lpq command
- - substitution of %h and %v in server string and -C option of
- nmbd
- - string substitions substitute all occurances of a pattern
- - added casesignames global option
- - fix for man pages thanks to David Gardiner <dgardine@cssip.edu.au>
- - changed debug options a bit
- - added default for lpq command and lpr command
- - changed default shell path to /bin/sh
- - forced lpq under api to run as root - should speed things up
- - added "group" option to force group of a connection
- - added "read list" and "write list" options
- - added max mux option - seems to fix NT browsing?
- - added "mangled map" option thanks to
- Martin.Tomes@uk.co.eurotherm.controls
- - separated mangling functions into mangle.c
- - allowed all dos chars in mangled names
- - apollo changes from Helmut Buchsbaum <buc@eze22.siemens.co.at>
- - password changing code from Bob Nance <Bob.Nance@niehs.nih.gov>
- it doesn't quite work yet, but it's a start (disabled by default)
-
-
-1.8.03: 25/10/94
- - made auto loaded services browsable as per default service
- so you can hide homes but keep home directories.
- - changed check_name() to handle "direct to network" printing
- - auto 3 minute deadtime if all connections are closed. This
- prevents restart when polling the print queue.
- - fix for newer command in client from Rich-Hoesly@uai.com
- - changed connection recording method
- - added the program smbstatus
- - changed timeout mechanism
- - "null passwords" option from Pim Zandbergen <pim@cti-software.nl>
- - made new files with casesignames=False set their case to the default
- case.
- - fixed problem of uppercasing first letter of printers in printcap
- - debug level fixes in trans2 from jimw@PE-Nelson.COM (Jim Watt)
- - made null printer default to lp
-
-1.8.04: 27/10/94
- - added OS2.txt from riiber@oslonett.no
- - another "auto services" fix. A silly strtok() bug :-(
- - fixed the status locking and max connections (broken in 1.8.03)
- - released alpha1
- - added gets_slash so lines can be continued in smb.conf and
- lmhosts
- - browse list bugfix
- - default to "load printers=yes"
- - rewrote pcap.c
- - intergraph bugfix from tarjeij@ulrik.uio.no
- - changed properties flags in nmbd (to fix NT print browsing)
- - allowed very long lines in printcap parsing.
-
-1.8.05: 28/10/94
- - lanman2 fix from Jeremy
-
-1.9.00: 22/1/95
- - only add home if not already there.
- - added ulogoffX support
- - PTR_DIFF() cleanups
- - fixed a bug that caused STATUS..LCK to grow very large
- - changed mangling to handle names ending in . a little better
- - added "strip dot" option
- - SGI and setgroups() fix from bill@sg25.npt.nuwc.navy.mil
- - fixed password preservation in password_ok() (again?)
- - unink fix from emer@vssad.enet.dec.com (Joel S. Emer)
- - changed username part of spool filename to max 10 chars (from 6)
- - magic script fix from beverly@datacube.com (Beverly Brown)
- - reply_special() fix from Peter Brouwer <pb@apd.dec.com>
- - stopped nmbd from listening on 138. It didn't seem to help much.
- - clix fixes from ttj@sknsws61.sjo.statkart.no
- - fixed select behaviour under Linux
- - man page fix from Robin Cutshaw <robin@intercore.com>
- - ISC block size fix from ralf@rbsoft.sdata.de (Ralf Beck)
- - ISC fixes from Martin.Tomes@controls.eurotherm.co.uk
- - attrib bit fix in smbclient (pointed out by Rich-Hoesly@uai.com)
- - japanese extensions from fujita@ainix.isac.co.jp (Takashi
- Fujita) and ouki@gssm.otuska.tsukuba.ac.jp.
- - SCO patches from Stephen.Rothwell@pd.necisa.oz.au
- - changed the system commands to redirect stderr
- - changed default printername to service name for all print ops
- - added ability to delete print queue entries
- - added warning if you try to print without -P in smbclient
- - INTERACTIVE patches from cardinal@settimo.italtel.it
- - patch to handle spaces in group names from GJC@vax1.village.com
- (GEORGE J. CARRETTE)
- - lockingX fix from stefank@esi.COM.AU (Stefan Kjellberg)
- - some fairly radical changes to filename handling. We can now
- handle mixed case filenames properly
- - released alpha2
- - added sysv printing support and improved bsd support
- - changed the user that does print queues and lprm jobs
- - return code support in the client from doylen@nbslib.isc-br.com (Doyle Nickless)
- - added "strict locking" option. Defaults to no.
-
- - added -I switch to nmbd
- - fixed DEV bug thanks to Dirk.DeWachter@rug.ac.be
- - use pw_encrypt() for shadow passords in Linux (from begemot@begemot.iko.kharkov.ua (Dmitry Gorodchanin))
- - disabled read prediction by default
- - added varient handling code to ipc.c for printQ and printDel.
- - released alpha5
- - AUX patches from root@dolphin.csudh.edu
- - struct timeval fix from gkb1@york.ac.uk
- - patches to merge ISC and INTERACTIVE from pim@cti-software.nl
- - changed to "printing ="
- - fixed problem with long print queues.
- - fixed node status request in nmbd to go to non bcast
- - made default path in services /tmp if not specified
- - added %u in passwd program
- - fixed up the password changing code for Linux
- - no guest sess setup when user level security
- - changed timeouts to kill dirptrs so cdroms can be unmounted
- - added auto-reload of smb.conf if changed
- - added SIGHUP to reload the config files
- - added -M option to nmbd to search for a master browser
- - added support for continue bit in trans2findnext
- - changed to dynamic strings in some more structures
- - changed default deadtime to 30 minutes
- - cleaned up the memory swapping code a bit
- - updated the man pages somewhat
- - added %m and %u in the "path=" of services
- - released alpha6
- - simple testing and fixups for solaris, sunos, aix, ultrix and
- osf/1 (this is all I have access to).
- - fixed chdir bug
- - added hashing to cnum selection
- - released alpha7
- - fixed printing bug
- - reduced chance of "hung" smbd with dead client
- - fixed do_match() bug (recently introduced)
- - released alpha8
- - nameserver fix from W.J.M.vGeest@et.tudelft.nl (W.J.M. van Geest)
- - rewrote readbraw to try and overlap reads with writes
- - client optimisations
- - rewrote getwd cache and enabled it by default
- - added partial smb packet reads (hopefully faster writes)
- - added log file and log level options (with subs)
- - added "read size" option
- - tried setting some more socket options
- - can use subs in "config file=" and will auto-reload
- - added "include" options, with some subs
- - finally got print manager working with NT
- - auto-respond in nmbd to non-broadcast (auto WINS server, no -A
- needed)
- - released alpha10
- - auto-delet unused services when reloading
- - fixed auto-deletion
- - fixed long names in printing
- - fixed double loading of services file
- - added printer file name support
- - reformatted man pages for better www conversion
- - renamed to 1.9.00.
- - added support for RNetServerGetInfo and NetWkstaGetInfo API's
- - updated the docs a bit
- - released alpha1
- - added -M -
- - changed nmbd announce interval to 10 mins in outgoing packets
- - hopefully fixed idle timeout reconnects
- - strupper all command lines in nmbd
- - added %a substitution for "remote architecture"
- - added "Samba" protocol (same as lanman2)
- - added "security = SERVER"
- - released alpha2
- - lowercase password fix
- - fixed connect path length bug (thanks to JOHN YTSENG
- <jtseng@cory.EECS.Berkeley.EDU>)
- - added subs on "password server".
- - fixed printing filename bug from smbclient
- - disk quotas and hpux printing support from Dirk.DeWachter@rug.ac.be
- - Makefile patches from pappinm@ayr_srv2.nth.dpi.qld.gov.au
- - AFS patches from Mike Allard (mgrmja@nextwork.rose-hulman.edu)
- - fixed grp name = server name problem
- - man page updates from Charlie Brady (charlieb@budge.apana.org.au)
- - fixed file search bug by adding "finished" flag
- - added "max log size". Suggestion from Mark Hastings <mark.hastings@gain.com>
- - released alpha3
- - changed the read/write routines to handle partial read/writes
- - released alpha4
- - changed "guest account" to per-service
- - changed so "guest ok" allows access to the guest account,
- not the "user=" line
- - changed default readsize to 2048
- - try bind to 137 in nmbd if possible
- - added server lookup to -L option in smbclient (gets list of servers)
- - added -M switch to smbclient for sending winpopup messages
- - released alpha5
- - FAQ updates from Paul Blackman ictinus@lake.canberra.edu.au
-
-1.9.01: 23/1/95
- - changed comment in print Q info to service rather than server comment
- - fixed smbclient -L to NT when in user level security mode
- - hopefully finally fixed NT print manager problems
- - added informative messages during smbclient -M
- - added node status replies to nmbd
- - changed the lock offset fixup calculation to be more friendly
- to dumb lockd daemons.
- - added sigbus and sigsegv handlers to catch any silly errors and
- print a message
- - added message receipt to smbd and "message command =" option
-
-1.9.02: 25/1/95
- - added argv/argc mangling for people who start the server the
- wrong way.
- - some man page updates
- - added "revalidate" option
- - added hosts allow/deny access check to messaging access
- - added timeouts in the client
- - added check for existance of smbrun binary
- - man page updates from Colin.Dean@Smallworld.co.uk
- - freebsd patches from dfr@render.com
- - added mask sanity check in SMBsearch
- - added more useful substitutions (%S, %P, %I and %T)
- - added "exec =" option to execute commands on each connection
-
-1.9.03: 13/3/95
- - added "socket options" option
- - close base fd's (0,1 and 2)
- - use dup(0) for inetd operation
- - better detection of is_daemon
- - hopefully finally fixed silly put bug that gave the wrong
- date on files.
- - fixed segv in readbraw bug
- - added improved checing for invalid (or null) print file name
- - several patches from ad@papyrus.hamburg.com (Andreas Degert)
- - fixed slow logout bug in smbclient
- - fixed automounter problems
- - added subs on lock dir
- - BSDI patch from John.Terpstra@Aquasoft.com.au
- - added separate nmb and smb logfile entries in the Makefile
- - fixed return code error in open calls
- - added simple status display of printer in lpq parsing
- - rewrote the directory handling to avoid seekdir (added dir.c)
- - added uid=65535 check (thanks to grant@gear.torque.net)
- - enhanced transfer_file() to add header (used in readbraw)
- - reply_special bugfix from ferret@pc8871.seqeb.gov.au
- - added HAVE_PATHCONF
- - RiscIX patches from Jim Barry <jim@ilp.com> and
- Charles Gay-Jones <charlie@ilp.com>
- - CLIX patches from ttj@sknsws61.sjo.statkart.no
- - fixed aix lpq parser from kvintus@acd.com
- - added substitutions to "include="
- - M88K_S3 patches from tonyb@plaza.ds.adp.com (Tony D. Birnseth)
- - fixed mangled stack problem
- - added code to handle broken readdir() setups on solaris
- - initgroups() fix from jarit@to.icl.fi
- - dgux dfree fix from listwork@cloud9.net
- - dnix support from Peter Olsson <pol@leissner.se>
- - getgrgid() patch from tpg@bailey.com (Tom Gall)
- - Makefile patch from obrien@Sea.Legent.com (David O'Brien)
- - password changing fixes from Dirk.DeWachter@rug.ac.be
- - minor man page updates
- - tried to enhance the read prediction code a little bit
-
-1.9.04: 16/3/95
- - a bit better handling of global include lists
- - fixed GSTRING bug in loadparm.c (affected "socket options =")
- - fixed broken lpq parsing code (recent bug).
- Thanks to Dirk.DeWachter@rug.ac.be
-
-1.9.05: 20/3/95
- - improved mget in client to take multiple arguments and default
- to *.*
- - socket option fixes for both nmbd and smbd
- - changed the byteorder handling scheme to be more portable (and
- faster)
- - lint cleanups from kast@kcs.planet.net (Robert Kast)
- - added crude segv, sigbus and sighup recovery to nmbd
- - rewrote lanman2_match to be closer to NT and WfWg behaviour
- - Cray support from velo@sesun3.epfl.ch (Martin Ouwehand)
- - "admin users" patch from Tim Leamy <tcleamy@ucdavis.edu>
- - released alpha1
- - added samba.7 man page
- - no chdir when doing non AS_USER protocols
- - become_guest() returns true in trapdoor uid system
- - added more sophisticated segv/sigbus reporting (Linux only)
- - released alpha2
- - minor code cleanups (output of -Wall)
- - smbprint fix from James Dryfoos <dryfoos@ll.mit.edu>
- - improved testparm a little
- - updated INSTALL.txt a little
-
-
-1.9.06: 21/3/95
- - added %S substitution to users, valid users and invalid
- users. This is useful for [homes].
- - split off printing routines into printing.c and more dir
- commands into dir.c
- - postexec patch from jpm@gin.Mens.DE (Jan-Piet Mens)
- - smbstatus updates from jpm@gin.Mens.DE (Jan-Piet Mens)
- - reload sighup after use
- - fixed name ptr offset bug
- - added %f in print commands
- - fixed byte ordering in nmbd which caused browsing to fail in
- 1.9.05
-
-1.9.07: 22/3/95
- - important directory listing fix
- - allowed path= in [homes] section
- - printer status patches from Dirk.DeWachter@rug.ac.be
-
-1.9.08: 24/3/95
- - fixed . and .. in root dir for lanman2
- - better default comment in [homes]
- - added time stamping to directory entries
- - check directory access at connection time
- - rlimit code from loebach@homer.atria.com (Thomas M. Loebach)
- - fixed home dir default comment
- - totally rewrote dptr handling to overcome a persistant bug
- - added [globals] as well as [global]
-
-1.9.09: 30/3/95
- - fixed static string bug in nmbd
- - better null password handling
- - split CFLAGS in Makefile
- - fixed typo in smbclient messaging
- - made home dir not inherit path from [global]
- - standard input printing patch from xiao@ic.ac.uk
- - added O_CREAT to all print opens (bug in Win95)
- - use /proc for process_exists under Linux and solaris
- - fixed another segv problem in readbraw
- - fixed volume label problem
- - lots of changes to try and support the NT1 protocol
- - released alpha1
- - fixed session setup bug with NT in NT1 protocol
- - released alpha2
- - fixed "get" bug in smbclient that affected NT3.5
- - added SO_KEEPALIVE as a default socket option in smbd
- - changed some error codes to match those that NT 3.5 produces
- - updated trans2 with some new calls for Win95 and WinNT (better
- long file support)
- - released alpha3
- - fixed "nmbd -D -b" timeouts
- - added IS_LONG_NAME flag to getattr in NT1
- - added the NT qfileinfo trans2 commands
- - merged qpathinfo with qfileinfo
- - changed idling technique to try and be more friendly to
- clients
- - merged setfileinfo with setpathinfo and updated them with the NT fns
- - improved read prediction a lot
- - added read prediction to readbraw
- - improved fault reporting (last packet dump)
-
-1.9.10: 30/3/95
- - fixed read prediction+readbraw bug for read/write files
-
-1.9.11: 9/4/95
- - fixed trans2 qpathinfo bug
- - fixed bug with % in service name when doing print queue requests
- - default readsize now 16K
- - minor read prediction changes
- - fixed status initialisation in print queue reporting
- - fixed const compile problem for hpux
- - minor SMBread fix from Volker Lendecke <lendecke@namu01.gwdg.de>
- - removed space after -P in print commands (for fussy systems)
- - disabled level2 of setfilepathinfo
- - changed to a single read dir model, saving all dir names in
- the Dir structure
- - disabled NT protocols in the client due to reported problems
- - fixed QUERY_FS_VOLUME_INFO which caused Win95 to hang on drive
- properties
- - minor lseek bug fix
- - fixed up keepalives
- - new timezone handling code (hopefully better!)
- from steve@qv3pluto.LeidenUniv.nl
- - BSDI interface patch from jrb@csi.compuserve.com
- - gettimeofday changes from Roger Binns <rogerb@x.co.uk>
- - added smbrun option
- - added "root preexec" and "root postexec" options
-
-1.9.12: 12/4/95
- - hopefully fixed some recently introduced NT problems
- - fixed a unlink error code problem
- - minor testparm fix
- - fixed silly error messages about comments in config files
- - added "valid chars" option for other languages
-
-1.9.13: 28/4/95
- - patches from David O'Brien (obrien@Sea.Legent.com) improving the
- netgroup suport, and adding the "map archive" option, as well as
- other minor cleanups.
- - tried to add info level 3 and 4 support for OS/2
- - default deadtime set to 0 as in docs
- - cleaned up the trans2 code a little
- - cleaned up the Makefile a little
- - added charset.c and charset.h
- - expanded "valid chars" option to handle case mapping
- - lots of changes to try and get timezones right
- - released alpha1
- - win95 fixups
- - released alpha2
- - added %H substitution (gives home directory)
- - nameserv.c cleanups and minor bug fixes
- - redid the browse hook logic
- - fixed daylight saving time offset for logfile messages
- - added name cacheing to nmbd
- - added send counts to node status in nmbd
- - added STRICT_TIMEZONES compile time option (very computationally
- expensive)
- - removed the partial read code
- - cleaned up the permission checking a lot
- - added share modes (DENY_READ, DENY_WRITE, DENY_ALL, DENY_NONE,
- DENY_FCB and DENY_DOS)
- - added "share modes" option
- - cleaned up the file open calls
- - released alpha4
- - fixed important one line bug in open_file()
- - trans2 client fix from lendecke@namu01.gwdg.de
- - netgroup patche from David O'Brien (obrien@Sea.Legent.com)
- - case sensitive fix from lenneis@statrix2.wu-wien.ac.at (Joerg Lenneis)
- - got long filenames working from Win95 dos prompt
- - added "workgroup=" option
- - added "username map" option including multiple maps, group maps etc
- - fixed password server for NT1 protocol and made it more robust
- - changed unix_mode() to add IWUSR to read-only directories. This
- is much closer to what clients expect.
- - added preservation of unused permission bits when a chmod() is
- called from a client.
- - made static those fns that could be
- - fixed typo in access.c (thanks to Andrew J Cole
- <A.J.Cole@cbl.leeds.ac.uk>)
- - added %d substitution for process id
- (thanks to lenneis@statrix2.wu-wien.ac.at (Joerg Lenneis))
- - changed share error code to ERRbadshare
- - added locked files list to smbstatus if share modes is enabled
- - changed DENY_DOS to allow read by other tasks
- - added shared_pending checks to server
- - preserverd all possible permission bits during a chmod, and
- fixed a trans2 chmod bug
- - open /dev/null to use up first 3 fds, in an attempt to stop rogue
- library routines from causing havoc
- - fixed NT username problem when in server security
- - added "force user" and "force group" options
- - cleaned up some of the IPC calls a bit
- - added writeraw to the client and cleaned up write raw in the server
- - osf1 big-crypt bugfix from Udo Linauer <ul@eacpc4.tuwien.ac.at>
- - hopefully better disk-full checking
- - next uid bugfix from patrick@graphics.cornell.edu
- - changed share modes so lock directory doesn't need to be world
- writeable
- - enabled write-raw by default
- - added server_info() in client
- - added level checks in some ipc calls
- - added defines for the important timeouts in local.h
- - added print queue deletion to smbclient (untested)
- - removed the sysconf() calls
- - optimised writebraw a bit
- - fixed some file deletion problems
- - added total_data check for extended attribs in trans2 (for OS/2)
- - fixed broadcast reply bug in nmbd
- - added careful core dumping code
- - added faster password level searches (suggestion
- by lydick@cvpsun104.csc.ti.com (Dan Lydick))
-
-
-1.9.14: 22/9/95
- - fixed up level 3 and 4 trans2 requests for OS/2
- - minor optimisations in a few places
- - cleaned up the closing of low fds a bit
- - added SO_REUSEADDR to socket as a daemon
- - override aDIR bit for directories in dos_chmod()
- - SGI5 fixes from ymd@biosym.com (Yuri Diomin)
- - bsize sanity check and removed sunos force to 1k
- - force the create mode to be at least 0700
- - SCO and freebsd include changes from Peter Olsson
- <pol@leissner.se>
- - check with FQDN in access.c (thanks to Arne Ansper <arne@ioc.ee>)
- - default broadcast for dnix from Peter Olsson <pol@leissner.se>
- - solaris patches from Ronald Guilmette <rfg@segfault.us.com>
- - added EXDEV handling
- - small AFS Makefile patch from mgrlhc@nextwork.rose-hulman.edu
- - hopefully fixed the Win95 dates to work in other than my
- timezone
- - attempted alignment fixups (to speed up memcpy)
- - added some DCE/DFS support (thanks to Jim Doyle <doyle@oec.com>)
- - added fix so that root doesn't have special privilages to open
- readonly files for writing (but admin users do). This fixes the MS
- office install problem.
- - fixed trans2 response bug in client
- - got dual names working for NT
- - enabled lock_and_read in NT protocol
- - added %L macro for "local machine"
- - changed dfree reporting to use "sectors per unit"
- - fixed "not enough memory" bug in MS print manger by limiting
- share name length in share enum.
- - "short preserve case" option from Rabin Ezra (rabin@acm.org)
- - added archive option to client
- - changed openX in client to be able to open hidden and system files
- - added "sync always" option
- - rewrote writebmpx and readbmpx
- - added auto string_sub_basic to all loadparm strings
- - lots of nmbd fixups (add registration, refresh etc)
- - released alpha1
- - added smbtar patches from Ricky Poulten (poultenr@logica.co.uk)
- - added a lpq cache and the "lpq cache time" option
- - released alpha 2
- - sun includes fix from Kimmo Suominen <kim@deshaw.com>
- - change nmbd -L lookup type to workstation from server
- - added min print space option
- - added user and group names to smbstatus (thanks to
- davide.migliavacca@inferentia.it)
- - fixed %f in print command bug (thanks to huver@amgraf.com)
- - added wildcard support to SMBmv
- - misc patches from David Elm (delm@hookup.net)
- - changed default of "share modes" to yes
- - changed default of "status" to yes
- - aix qconfig parsing from Jean-Pierre.Boulard@univ-rennes1.fr
- - more long_date fixups
- - added wildcards to nmbd
- - extensive changes to ipc.c and miscellaneous other changes
- from ad@papyrus.hamburg.com (Andreas Degert). Should especially
- help OS/2 users
- - added name release to nmbd
- - relesed alpha4
- - fixed "SOLARIS" to SUNOS5 in Makefile
- - several minor fixups to get it to compile on aix, osf1, ultrix,
- solaris and sunos
- - released alpha5
- - minor bug fixes and cleanups in ipc.c
- - fixed "only user" bug
- - changed lpq to report guest queue entries as sesssetup_user to
- allow for deletion by windows
- - released alpha6
- - added __SAMBA__ as type 0 in nmbd (was type 20)
- - fixed null print job bug
- - added 8 char warnings to testparm and smbclient
- - changed to 8 char limit for names in pcap.c
- - added linked list of config files to detect all date changes
- that require a reload
- - simplified pcap guessing heuristics
- - added space trimming to the name mapping
- - updated Get_Pwnam to add allow_change field for username mapping
- - fixed MemMove bug (thanks to mass@tanner.com (Massimo
- Sivilotti))
- - released alpha7
- - rewrote MemMove to be a little more efficient
- - ipc va_arg bug fix from djg@tas.com (Dave Gesswein)
- - added check for illegal chars in long filenames
- - fixed name cache init bug in nmbd
- - Convex patches from Victor Balashov <balashov@cv.jinr.dubna.su>
- - timestring() bugfix from staale@spacetec.no
- - changed %H to give path of forced user if one is set
- - added quoting to smbclient to allow spaces in filenames
- - convex and other patches from Ulrich Hahn
- <ulrich.hahn@zdv.uni-tuebingen.de>
- - released alpha8
- - fixed rename directory bug
- - nmbd wins fix from Maximilian Errath <errath@balu.kfunigraz.ac.at>
- - client and AFS changes + password.c reorganisation + "more" and
- "pwd" commands in client from Todd j. Derr (tjd@smi.med.pitt.edu)
- - fixed several nmbd bugs
- - released alpha9
- - fixed another "cd" bug in smbclient
- - password encryption from Jeremy Allison
- - added "passwd chat" option and chat interpretation code
- - added "smb passwd file" option
- - released alpha10
- - cleaned up chgpasswd.c a little
- - portability changes to the encryption handling code
- - added password encryption to smbclient
- - fixed a share level security encryption bug
- - added "ENCRYPTION.txt" document
- - released alpha11
- - added code to detect a password server loop
- - fixed typo in chkpath in client.c that broken cd (again)
- - LINUX_BIGCRYPT from marsj@ida.liu.se
- - AFS password fixup from jbushey@primenet.com (Jeffrey G. Bushey)
- - iso/8859-1 charcnv patches from Dan.Oscarsson@malmo.trab.se
- - strtok/user_in_list fix from roderich@nodebonn.muc.bmw.de
- - NETGROUP patches from J.W.Schilperoort@research.ptt.nl
- - trim_string patch from J.W.Schilperoort@research.ptt.nl
- - fixed problem with files with no extension getting mixed up
- - ipc bugfix for print job deletion from Rainer Leberle <rleberle@auspex.de>
- - released alpha12
- - pwlen fix in NETGROUP from Andrew J Cole <A.J.Cole@cbl.leeds.ac.uk>
- - lots of uid and encryption changes from Jeremy Allison. WinDD
- should now work.
- - released alpha13
- - fixed max_xmit bug in client
- - select fix in server (fixed critical drive errors under ISC)
- - released alpha14
- - wildcard fix from Jeremy
- - changes to make IPC code more robust
- - small select loop change to reduce cleaning of share files
- - vtp, altos and mktime patches from Christian A. Lademann
- <cal@zls.com>
- - EEXIST bugfix in server.c
- - changed mangled map to apply in all cases
- - released alpha15
- - fixed fcb open permissions (should mean apps know when a file is
- read only)
- - released alpha16
- - client help formatting fix and docs fix from Peter Jones
- <thanatos@drealm.org>
- - added a directory cache
- - use /proc whenever possible for pid detection
- - TCSANOW fix in getsmbpasswd from roderich@nodebonn.muc.bmw.de
- - fixed default printing mode for sysv systems
- - make client always expand mask
- - more minor IPC fixups
- - pyramid makefile entry from jeffrey@itm.org
- - client fixups for passlen, maxvcs and session redirect from
- Charles Hoch <hoch@hplcgh.hpl.hp.com>
- - finally fixed important IPC bug (varargs bug with int16)
- - quota patches from Dirk.DeWachter@rug.ac.be
- - print queue cache changes (per service) and print queue priority
- additions from Dirk.DeWachter@rug.ac.be
- - new japanese patches (incomplete) from
- fujita@ainix.isac.co.jp (Takashi Fujita)
- - moved a lot more functions into system.c via wrappers
- - changed a lot of the connection refused error codes to be more
- informative (or at least different)
- - released alpha17
- - changed error return code from cannor chdir() in make_connection
- - fixed realloc() bug in printing.c
- - fixed invalid username bug in sesssetupX
- - released alpha18
- - made default service change name to asked for service (idea
- from Ian McEwan <ijm@doc.ic.ac.uk>)
- - fixed "guest only" bug
- - sambatar patches from Ricky
- - printing.c patches from Dirk.DeWachter@rug.ac.be
- - rewrote become_user()
- - sunos5 patch from Niels.Baggesen@uni-c.dk
- - more japanese extensions patches from fujita@ainix.isac.co.jp
- - released alpha20
- - added force_user to conn struct
-
-
-1.9.15: 14/11/95
- - removed bcast override from workgroup announce in nmbd
- - aix patch, added NO_SYSMOUNTH, from
- lionel leston <102624.346@compuserve.com>
- - quick fix in lp_string() to try and stop some core dumps
- - added uid cache in connections structure
- to make user level security faster
- - changed dos_mode() to show read-only on read-only shares only if
- user w bit not set
- - added check to stop exit_server() looping
- - core dump fix in string_sub()
- - fix client bug for long dirs in NT1 mode.
- Thanks to Erwin Authried (erwin@ws1.atv.tuwien.ac.at)
- - switched to a safer (but probably slower) readbraw implementation
- - released p1
- - readbraw fix from Stefaan.Eeckels@eunet.lu
- - fixed groups bug when user is in 1 group
- - fixed NT1 dir bug
- - changed default protocol in client to NT1
- - changed trans2 to not return both names in long listing if long
- name is 8.3
- - made stat of "" return RONLY if not writeable drive
- - wrapped strcpy() to stop nulls propogating (hack)
- - made rename and unlink look at share locks on file
- - clitar memory leak fix from jjm@jjm.com
- - added -p option to smbstatus to list smbd processes
- - added rename to the client
- - released p2
- - fixed SMBmv for case where the destination exists
- - man page patch from michal@ellpspace.math.ualberta.ca (Michal Jaegermann)
- - once again redid the time handling, but finally explained what
- is going on, this is written up in TIME.txt. The "kludge-GMT" used
- by NT is a bastard and led to a lot of the confusion
- - kanji patch from fujita@ainix.isac.co.jp (Takashi Fujita)
- - is08859-1 patches from eauth@mail.cso.co.at
- - starting rewriting nmbd, new nmbd is nmbd2, old one still around
- for time being
- - released p3
- - rewrote more of nmbd2 to use new structures
- - CLIX patches from Jason.J.Faultless@bechtel.btx400.co.uk
- - DirCacheFlush() bugfix from Michael Joosten
- <joost@ori.cadlab.de>. This bug explains a lot of the crashes.
- - fixed a bug in ChDir() that caused reversion to / in some
- situations
- - ipc fix from Magnus Hyllander <mhy@os.se>
- - released p4
- - smbpasswd fix from Jeremy
- - compilation fixes from Magnus Hyllander <mhy@os.se>
- - added NetServerEnum to ipc.c (needed for master browser stuff)
- - Makefile fix from Gunther Mayer <gmayer@physik.uni-kl.de>
- - cleanups for clean compile on several OSes
- - added browse mastering code
- - started integration with smb.conf for nmbd2
- - released p5
- - fixed death_time (should be t+ttl*3)
- - fixed non-removal of dead servers
- - added smbstatus -u patch from oskarh@spornet.is (Oskar Hannesson)
- - NETGROUP fix from J.W.Schilperoort@research.kpn.com
- - select and NO_SETGROUPS patches from lennylim@netcom.com (Lenny
- Lim)
- - added LINKS_READ_ONLY define in dos_mode() for LM/X
- compatability
- - "dir a.c" bug fixed thanks to roderich@nodebonn.muc.bmw.de
- (Roderich Schupp)
- - job cancel fix in client from peo@mtek.chalmers.se
- - changed nmbd2 to nmbd
- - fixed "dir a*" under trans2 lookups
- - added StrnCaseCmp()
- - updated docs a bit for new browsing stuff
- - updated INSTALL.txt
- - hopefully fixed server level security with WfWg
-
-1.9.15 (patches):
- - major/minor fix for solaris from Jeroen Schipper
- <Jeroen.Schipper@let.ruu.nl>
- - fixed critical bug in directory listings
- - released p1
- - fixed one of the causes of "out of memory" while browsing
- - fixed manpage install script (Paul Blackman)
- - added DNS failures to name cache
- - fixed writebmpx bug (affects OS/2)
- - misc OS/2 fixes, mostly for EA handling
- - added SMBcopy
- - added "max ttl" option
- - arch detection patch from Bas Laarhoven <bas@vimec.nl>
- - released p2
- - another OS/2 fix - the level 4 getpathinfo for EAs
- - added "alternate permissions" option
- - changed client to parse destination names into name + domain
- - fixed problem with PrimaryGroup and lmhosts loading
- - added domain master ability to nmbd
- - added "domain master" option
- - added "domain controller" option and code
- - pwd fix to client from Erik Devriendt (de@te6.siemens.be)
- - fixed problem in smbmv that led to ar not working in mks
- - added transs2
- - released p3
- - updated email addresses
- - fix for innetgr from Olaf Seibert (rhialto@polder.ubc.kun.nl)
- - client translate fix from bandc@dircon.co.uk
- - netbsd bcast fix from from Olaf Seibert (rhialto@polder.ubc.kun.nl)
- - syslog code from Alex Nash <alex@fa.tca.com>
- - strip dot fix from Arne Ansper <arne@ioc.ee>
- - added addtosmbpass + man page from
- michal@ellpspace.math.ualberta.ca (Michal Jaegermann)
- - pcap fix for AIX from Jon Christiansen <jchristi@sctcorp.com>
- - fixed servertype bug in remote announcements
- - fixed up illegal name checks (should also be faster)
- - kanji patches from fujita@ainix.isac.co.jp (Takashi Fujita)
- - fixed bug handling non-encrypted passwords
- - released p4
- - fixed makefile for addtosmbpass
- - DCE/DFS fixes from John Brezak (brezak@ch.hp.com)
- - client patch for partial command matching from Andrew Wiseman
- <bandc@dircon.co.uk>
- - made is_8_3() handle full paths
- - rewrote open_file_shared() with help from Charles Hoch
- <hoch@hplcgh.hpl.hp.com>
- - changed syslog to handle interactive programs
- - fixed syslog problem with full path in argv[0]
- - illegal name fixup for kanji from fujita@ainix.isac.co.jp
- - fixed server level security to allow fallback to encryption
- - changed reply_read() and reply_lockread() to ignore clients
- smb_bufsize in order to handle broken lanman clients
- - fixed NT wildcard problem with old style programs
- - man page patches from "John M. Sellens"
- <jmsellen@watdragon.uwaterloo.ca>
- - partially documented the "character set" option
- - changed default for MAXDIR to 64
- - changed default DPTR idle time to 120
- - released p5
- - QNX patches from eldo@invisa.satlink.net (Eldo Loguzzo)
- - made nmbd use the "max log size" option and changed log handling
- code a bit
- - sunos patches, remote protocol (%R) addition and arch detection
- changes to stop compiler warning from Timothy Hunt <tim@fsg.com>
- - fixed become_user() bug that led to incorrect permissions in
- some situations.
- - released p6
- - is_8_3() fix from Charles Hoch <hoch@hplcgh.hpl.hp.com>
- - nmblib bugfix from gmk@mhcnet.att.com (George Kull)
- - aix pcap fix from Jon Christiansen <jchristi@sctcorp.com>
- - added explicit sig_pipe() in server.c
- - added domain logins option (not fully implemented)
- - added HAVE_GMTOFF code
- - got rid of PM_MAXLINE
- - minor client fix from goggi@eflir (Garðar Georg Nielsen)
- - added SIGCLD_IGNORE for HPUX (from Tor Lillqvist
- <tml@hemuli.tte.vtt.fi>)
- - OSF/1 lpq patch from scooter@GENE.COM (Scooter Morris)
- - NeXT patches from pmarcos@next.com (Paul Marcos)
- - dstdiff patch to stop infinite loop from Erwin Authried (eauth@cso.co.at)
- - password server option can now take a list of password servers
- - patches to let samba run on OS/2 from Jason Rumney <jasonr@pec.co.nz>
- - added domain logon and logon script suport
- - SCO openserver 5 patches from Scott Michel <scottm@intime.intime.com>
- - Makefile changes from Marty Leisner <leisner@sdsp.mc.xerox.com>
- - chgpasswd changes from Roman Dumych <roman@nyxis.unibase.com>
- for SVR4
- - GUEST_SESSSETUP change from David.Chappell@mail.cc.trincoll.edu
- - released p7
- - moved SO_REUSEADDR before bind() (thanks to Thomas Bellman
- <tbe@ivab.se>)
- - added more flexible GUEST_SESSSETUP to local.h and restored
- pre-p7 behaviour as default
- - released p8
-
-1.9.16:
- - Makefile fix from Marty Leisner <leisner@sdsp.mc.xerox.com>
- - added %g and %G substitutions
- - changed IDLE_CLOSED_TIMEOUT to 60
- - fixed the "admin user" status in domain logons
- - hpux 10 "trusted security" patches from David-Michael Lincke
- (dlincke@sgcl1.unisg.ch)
- - added nmb lookups to client from Adrian Hill <Adrian.Hill@softimage.co.uk>
- - svr4 pause/resume printing patch from Brendan O'Dea (bod@tyndall.com.au)
- - fixed master announcement thanks to Luke Leighton <rah14@dial.pipex.com>
- - changed srcdir usage in Makefile to be friendly to more systems
- - NT4 alignment patches from Jeremy Allison (jra@vantive.com)
- - updated share mode code for new spec
- - minor client bugfix (for smbclient '\\\')
- - fix for level 260 when magling disabled. From Martin Tomes
- <Martin.Tomes@ecl.etherm.co.uk>
- - SMBtranss2 fix for OS/2 from Jeremy Allison
- - profiles fixup from Timm Wetzel <twetzel@cage.mpibpc.gwdg.de>
- - man page updates from Dirk.DeWachter@rug.ac.be
- - nmbsync fix from Andy Whitcroft <andy@soi.city.ac.uk>
- - Lynx patches from Manfred Woelfel <woelfel@hpesco1.fzk.de>
- - new smbtar stuff from Ricky
- - changed to share mode DENY_NONE for tar
- - fixed -D option of smbclient when in tar mode
- - added aARCH to open modes
- - added code to cope with select/read errors
- - fixed blank browse entries after smb.conf reread
- - integrated new browse stuff from Luke into ipc.c
- - added workgroup list to smbclient -L
- - improved archive attribute handling in close_file() and
- write_file()
- - smbtar fixes from Martin.Kraemer@mch.sni.de
- - Linux quota patch from xeno@mix.hsv.no
- - try to work around NT passlen2 problem in session setup
- - released alpha1
-
-NOTE: From now on the cvs.log file will be used to give a complete log of
-changes to samba. This change-log is now obsolete.
-
-
-==========
-todo:
-
-
-64 bit longs and IP addresses may give problems with unsigned longs?
-
-set archive bit whenever file is modified??
-
-fix man page dates
-
-reply only to own workgroup in server enum
-
-patch to compile with g++ and possibly solaris c++
-
-nmbd needs to keep browse list uptodate by talking to the master if it loses
-an election as others may still think its a valid backup and use it to get
-lists.
-
-leftover lock files can end up belonging to non-smbd processes after a reboot.
-
-hosts allow in nmbd
-
-hosts allow cache
-
-add password command in smbclient
-
-drag long filename to samba under os/2 gives short name
-
-document max ttl option
-
-dup/close 0 for getopt?
-
-implement SMBmove ??
-
-add option to print more info about locked files (full path, share name
-etc)
-
-very slow listing CD, perhaps because of order of stat and readdir or add
-masking to opendir?
-
-protocol drop back in client to avoid openX etc.
-
-handle exported fat drives to a long filename capable client
-
-add check for existance of lpq commands etc (use stat?)
-
-get rid of the silly +4 and -4 by removing NBT stuff
-
-write-only shares
-
-document cnvchar stuff
-
-allow smbd to serve user and group lists to win95
-
-document homes behaviour with WinDD
-
-add "hide file = *.o" "hide dir = .Foo*" "show file = xx*" type options.
-
-ALLOW_PASSWORD_CHANGE only compiles/works on some systems
-
-weird foooooooo/open.exe bug on NT
-
-%a detection can't detect Win95 versus WinNT
-
-reverse mangled maps, so (*.html *.htm) works for new files.
-
-install problems with w95. could be some sort of race?
-
-more efficient Files[] structure to handle thousands of open files
-
-lpd stuff:
- Tony Aiuto (tony@ics.com)
-
-make max disk size local
-
diff --git a/source/client/client.c b/source/client/client.c
deleted file mode 100644
index 6d85bd8807f..00000000000
--- a/source/client/client.c
+++ /dev/null
@@ -1,4910 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB client
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-
-#ifndef REGISTER
-#define REGISTER 0
-#endif
-
-pstring cur_dir = "\\";
-pstring cd_path = "";
-pstring service="";
-pstring desthost="";
-extern pstring myname;
-extern pstring myhostname;
-pstring password = "";
-pstring username="";
-pstring workgroup="";
-char *cmdstr="";
-BOOL got_pass = False;
-BOOL connect_as_printer = False;
-BOOL connect_as_ipc = False;
-extern struct in_addr ipzero;
-
-char cryptkey[8];
-BOOL doencrypt=False;
-
-extern pstring user_socket_options;
-
-/* 30 second timeout on most commands */
-#define CLIENT_TIMEOUT (30*1000)
-#define SHORT_TIMEOUT (5*1000)
-
-/* value for unused fid field in trans2 secondary request */
-#define FID_UNUSED (0xFFFF)
-
-int name_type = 0x20;
-
-int max_protocol = PROTOCOL_NT1;
-
-
-time_t newer_than = 0;
-int archive_level = 0;
-
-extern pstring debugf;
-extern int DEBUGLEVEL;
-
-BOOL translation = False;
-
-
-static BOOL send_trans_request(char *outbuf,int trans,
- char *name,int fid,int flags,
- char *data,char *param,uint16 *setup,
- int ldata,int lparam,int lsetup,
- int mdata,int mparam,int msetup);
-static BOOL receive_trans_response(char *inbuf,int trans,
- int *data_len,int *param_len,
- char **data,char **param);
-static int interpret_long_filename(int level,char *p,file_info *finfo);
-static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir);
-static int interpret_short_filename(char *p,file_info *finfo);
-static BOOL call_api(int prcnt,int drcnt,
- int mprcnt,int mdrcnt,
- int *rprcnt,int *rdrcnt,
- char *param,char *data,
- char **rparam,char **rdata);
-static BOOL do_this_one(file_info *finfo);
-
-/* clitar bits insert */
-extern int blocksize;
-extern BOOL tar_inc;
-extern BOOL tar_reset;
-/* clitar bits end */
-
-
-int cnum = 0;
-int pid = 0;
-int gid = 0;
-int uid = 0;
-int mid = 0;
-int myumask = 0755;
-
-int max_xmit = BUFFER_SIZE;
-
-extern pstring scope;
-
-BOOL prompt = True;
-
-int printmode = 1;
-
-BOOL recurse = False;
-BOOL lowercase = False;
-
-BOOL have_ip = False;
-
-struct in_addr dest_ip;
-
-#define SEPARATORS " \t\n\r"
-
-BOOL abort_mget = True;
-
-extern int Protocol;
-
-BOOL readbraw_supported = False;
-BOOL writebraw_supported = False;
-
-pstring fileselection = "";
-
-extern file_info def_finfo;
-
-/* timing globals */
-int get_total_size = 0;
-int get_total_time_ms = 0;
-int put_total_size = 0;
-int put_total_time_ms = 0;
-
-/* totals globals */
-int dir_total = 0;
-
-extern int Client;
-
-#define USENMB
-
-extern int coding_system;
-static BOOL setup_term_code (char *code)
-{
- int new;
- new = interpret_coding_system (code, UNKNOWN_CODE);
- if (new != UNKNOWN_CODE) {
- coding_system = new;
- return True;
- }
- return False;
-}
-#define CNV_LANG(s) dos2unix_format(s,False)
-#define CNV_INPUT(s) unix2dos_format(s,True)
-
-/****************************************************************************
-setup basics in a outgoing packet
-****************************************************************************/
-void setup_pkt(char *outbuf)
-{
- SSVAL(outbuf,smb_pid,pid);
- SSVAL(outbuf,smb_uid,uid);
- SSVAL(outbuf,smb_mid,mid);
- if (Protocol > PROTOCOL_COREPLUS)
- {
- SCVAL(outbuf,smb_flg,0x8);
- SSVAL(outbuf,smb_flg2,0x1);
- }
-}
-
-/****************************************************************************
-write to a local file with CR/LF->LF translation if appropriate. return the
-number taken from the buffer. This may not equal the number written.
-****************************************************************************/
-static int writefile(int f, char *b, int n)
-{
- int i;
-
- if (!translation)
- return(write(f,b,n));
-
- i = 0;
- while (i < n)
- {
- if (*b == '\r' && (i<(n-1)) && *(b+1) == '\n')
- {
- b++;i++;
- }
- if (write(f, b, 1) != 1)
- {
- break;
- }
- b++;
- i++;
- }
-
- return(i);
-}
-
-/****************************************************************************
- read from a file with LF->CR/LF translation if appropriate. return the
- number read. read approx n bytes.
-****************************************************************************/
-static int readfile(char *b, int size, int n, FILE *f)
-{
- int i;
- int c;
-
- if (!translation || (size != 1))
- return(fread(b,size,n,f));
-
- i = 0;
- while (i < n)
- {
- if ((c = getc(f)) == EOF)
- {
- break;
- }
-
- if (c == '\n') /* change all LFs to CR/LF */
- {
- b[i++] = '\r';
- n++;
- }
-
- if(i < n)
- b[i++] = c;
- }
-
- return(i);
-}
-
-
-/****************************************************************************
-read from a file with print translation. return the number read. read approx n
-bytes.
-****************************************************************************/
-static int printread(FILE *f,char *b,int n)
-{
- int i;
-
- i = readfile(b,1, n-1,f);
-#if FORMFEED
- if (feof(f) && i>0)
- b[i++] = '\014';
-#endif
-
- return(i);
-}
-
-/****************************************************************************
-check for existance of a dir
-****************************************************************************/
-static BOOL chkpath(char *path,BOOL report)
-{
- fstring path2;
- pstring inbuf,outbuf;
- char *p;
-
- strcpy(path2,path);
- trim_string(path2,NULL,"\\");
- if (!*path2) *path2 = '\\';
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,4 + strlen(path2),True);
- SCVAL(outbuf,smb_com,SMBchkpth);
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,path2);
-
-#if 0
- {
- /* this little bit of code can be used to extract NT error codes.
- Just feed a bunch of "cd foo" commands to smbclient then watch
- in netmon (tridge) */
- static int code=0;
- SIVAL(outbuf, smb_rcls, code | 0xC0000000);
- SSVAL(outbuf, smb_flg2, SVAL(outbuf, smb_flg2) | (1<<14));
- code++;
- }
-#endif
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (report && CVAL(inbuf,smb_rcls) != 0)
- DEBUG(2,("chkpath: %s\n",smb_errstr(inbuf)));
-
- return(CVAL(inbuf,smb_rcls) == 0);
-}
-
-
-/****************************************************************************
-send a message
-****************************************************************************/
-static void send_message(char *inbuf,char *outbuf)
-{
- int total_len = 0;
-
- char *p;
- int grp_id;
-
- /* send a SMBsendstrt command */
- bzero(outbuf,smb_size);
- set_message(outbuf,0,0,True);
- CVAL(outbuf,smb_com) = SMBsendstrt;
- SSVAL(outbuf,smb_tid,cnum);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,username);
- p = skip_string(p,1);
- *p++ = 4;
- strcpy(p,desthost);
- p = skip_string(p,1);
-
- set_message(outbuf,0,PTR_DIFF(p,smb_buf(outbuf)),False);
-
- send_smb(Client,outbuf);
-
-
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- {
- printf("SMBsendstrt failed. (%s)\n",smb_errstr(inbuf));
- return;
- }
-
- grp_id = SVAL(inbuf,smb_vwv0);
-
- printf("Connected. Type your message, ending it with a Control-D\n");
-
- while (!feof(stdin) && total_len < 1600)
- {
- int maxlen = MIN(1600 - total_len,127);
- pstring msg;
- int l=0;
- int c;
-
- bzero(msg,smb_size);
-
- for (l=0;l<maxlen && (c=fgetc(stdin))!=EOF;l++)
- {
- if (c == '\n')
- msg[l++] = '\r';
- msg[l] = c;
- }
-
- CVAL(outbuf,smb_com) = SMBsendtxt;
-
- set_message(outbuf,1,l+3,True);
-
- SSVAL(outbuf,smb_vwv0,grp_id);
-
- p = smb_buf(outbuf);
- *p = 1;
- SSVAL(p,1,l);
- memcpy(p+3,msg,l);
-
- send_smb(Client,outbuf);
-
-
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- {
- printf("SMBsendtxt failed (%s)\n",smb_errstr(inbuf));
- return;
- }
-
- total_len += l;
- }
-
- if (total_len >= 1600)
- printf("the message was truncated to 1600 bytes ");
- else
- printf("sent %d bytes ",total_len);
-
- printf("(status was %d-%d)\n",CVAL(inbuf,smb_rcls),SVAL(inbuf,smb_err));
-
- CVAL(outbuf,smb_com) = SMBsendend;
- set_message(outbuf,1,0,False);
- SSVAL(outbuf,smb_vwv0,grp_id);
-
- send_smb(Client,outbuf);
-
-
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- {
- printf("SMBsendend failed (%s)\n",smb_errstr(inbuf));
- return;
- }
-}
-
-
-
-/****************************************************************************
-check the space on a device
-****************************************************************************/
-static void do_dskattr(void)
-{
- pstring inbuf,outbuf;
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,0,True);
- CVAL(outbuf,smb_com) = SMBdskattr;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- DEBUG(0,("Error in dskattr: %s\n",smb_errstr(inbuf)));
-
- DEBUG(0,("\n\t\t%d blocks of size %d. %d blocks available\n",
- SVAL(inbuf,smb_vwv0),
- SVAL(inbuf,smb_vwv1)*SVAL(inbuf,smb_vwv2),
- SVAL(inbuf,smb_vwv3)));
-}
-
-/****************************************************************************
-show cd/pwd
-****************************************************************************/
-static void cmd_pwd(void)
-{
- DEBUG(0,("Current directory is %s",CNV_LANG(service)));
- DEBUG(0,("%s\n",CNV_LANG(cur_dir)));
-}
-
-
-/****************************************************************************
-change directory - inner section
-****************************************************************************/
-static void do_cd(char *newdir)
-{
- char *p = newdir;
- pstring saved_dir;
- pstring dname;
-
- /* Save the current directory in case the
- new directory is invalid */
- strcpy(saved_dir, cur_dir);
- if (*p == '\\')
- strcpy(cur_dir,p);
- else
- strcat(cur_dir,p);
- if (*(cur_dir+strlen(cur_dir)-1) != '\\') {
- strcat(cur_dir, "\\");
- }
- dos_clean_name(cur_dir);
- strcpy(dname,cur_dir);
- strcat(cur_dir,"\\");
- dos_clean_name(cur_dir);
-
- if (!strequal(cur_dir,"\\"))
- if (!chkpath(dname,True))
- strcpy(cur_dir,saved_dir);
-
- strcpy(cd_path,cur_dir);
-}
-
-/****************************************************************************
-change directory
-****************************************************************************/
-static void cmd_cd(char *inbuf,char *outbuf)
-{
- fstring buf;
-
- if (next_token(NULL,buf,NULL))
- do_cd(buf);
- else
- DEBUG(0,("Current directory is %s\n",CNV_LANG(cur_dir)));
-}
-
-
-/****************************************************************************
- display info about a file
- ****************************************************************************/
-static void display_finfo(file_info *finfo)
-{
- if (do_this_one(finfo)) {
- time_t t = finfo->mtime; /* the time is assumed to be passed as GMT */
- DEBUG(0,(" %-30s%7.7s%10d %s",
- CNV_LANG(finfo->name),
- attrib_string(finfo->mode),
- finfo->size,
- asctime(LocalTime(&t))));
- dir_total += finfo->size;
- }
-}
-
-
-/****************************************************************************
- do a directory listing, calling fn on each file found. Use the TRANSACT2
- call for long filenames
- ****************************************************************************/
-static int do_long_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
-{
- int max_matches = 512;
- int info_level = Protocol<PROTOCOL_NT1?1:260; /* NT uses 260, OS/2 uses 2. Both accept 1. */
- char *p;
- pstring mask;
- file_info finfo;
- int i;
- char *dirlist = NULL;
- int dirlist_len = 0;
- int total_received = 0;
- BOOL First = True;
- char *resp_data=NULL;
- char *resp_param=NULL;
- int resp_data_len = 0;
- int resp_param_len=0;
-
- int ff_resume_key = 0;
- int ff_searchcount=0;
- int ff_eos=0;
- int ff_lastname=0;
- int ff_dir_handle=0;
- int loop_count = 0;
-
- uint16 setup;
- pstring param;
-
- strcpy(mask,Mask);
-
- while (ff_eos == 0)
- {
- loop_count++;
- if (loop_count > 200)
- {
- DEBUG(0,("Error: Looping in FIND_NEXT??\n"));
- break;
- }
-
- if (First)
- {
- setup = TRANSACT2_FINDFIRST;
- SSVAL(param,0,attribute); /* attribute */
- SSVAL(param,2,max_matches); /* max count */
- SSVAL(param,4,8+4+2); /* resume required + close on end + continue */
- SSVAL(param,6,info_level);
- SIVAL(param,8,0);
- strcpy(param+12,mask);
- }
- else
- {
- setup = TRANSACT2_FINDNEXT;
- SSVAL(param,0,ff_dir_handle);
- SSVAL(param,2,max_matches); /* max count */
- SSVAL(param,4,info_level);
- SIVAL(param,6,ff_resume_key); /* ff_resume_key */
- SSVAL(param,10,8+4+2); /* resume required + close on end + continue */
- strcpy(param+12,mask);
-
- DEBUG(5,("hand=0x%X resume=%d ff_lastname=%d mask=%s\n",
- ff_dir_handle,ff_resume_key,ff_lastname,mask));
- }
- /* ??? original code added 1 pad byte after param */
-
- send_trans_request(outbuf,SMBtrans2,NULL,FID_UNUSED,0,
- NULL,param,&setup,
- 0,12+strlen(mask)+1,1,
- BUFFER_SIZE,10,0);
-
- if (!receive_trans_response(inbuf,SMBtrans2,
- &resp_data_len,&resp_param_len,
- &resp_data,&resp_param))
- {
- DEBUG(3,("FIND%s gave %s\n",First?"FIRST":"NEXT",smb_errstr(inbuf)));
- break;
- }
-
- /* parse out some important return info */
- p = resp_param;
- if (First)
- {
- ff_dir_handle = SVAL(p,0);
- ff_searchcount = SVAL(p,2);
- ff_eos = SVAL(p,4);
- ff_lastname = SVAL(p,8);
- }
- else
- {
- ff_searchcount = SVAL(p,0);
- ff_eos = SVAL(p,2);
- ff_lastname = SVAL(p,6);
- }
-
- if (ff_searchcount == 0)
- break;
-
- /* point to the data bytes */
- p = resp_data;
-
- /* we might need the lastname for continuations */
- if (ff_lastname > 0)
- {
- switch(info_level)
- {
- case 260:
- ff_resume_key =0;
- StrnCpy(mask,p+ff_lastname,resp_data_len-ff_lastname);
- /* strcpy(mask,p+ff_lastname+94); */
- break;
- case 1:
- strcpy(mask,p + ff_lastname + 1);
- ff_resume_key = 0;
- break;
- }
- }
- else
- strcpy(mask,"");
-
- /* and add them to the dirlist pool */
- dirlist = Realloc(dirlist,dirlist_len + resp_data_len);
-
- if (!dirlist)
- {
- DEBUG(0,("Failed to expand dirlist\n"));
- break;
- }
-
- /* put in a length for the last entry, to ensure we can chain entries
- into the next packet */
- {
- char *p2;
- for (p2=p,i=0;i<(ff_searchcount-1);i++)
- p2 += interpret_long_filename(info_level,p2,NULL);
- SSVAL(p2,0,resp_data_len - PTR_DIFF(p2,p));
- }
-
- /* grab the data for later use */
- memcpy(dirlist+dirlist_len,p,resp_data_len);
- dirlist_len += resp_data_len;
-
- total_received += ff_searchcount;
-
- if (resp_data) free(resp_data); resp_data = NULL;
- if (resp_param) free(resp_param); resp_param = NULL;
-
- DEBUG(3,("received %d entries (eos=%d resume=%d)\n",
- ff_searchcount,ff_eos,ff_resume_key));
-
- First = False;
- }
-
- if (!fn)
- for (p=dirlist,i=0;i<total_received;i++)
- {
- p += interpret_long_filename(info_level,p,&finfo);
- display_finfo(&finfo);
- }
-
- for (p=dirlist,i=0;i<total_received;i++)
- {
- p += interpret_long_filename(info_level,p,&finfo);
- dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,True);
- }
-
- /* free up the dirlist buffer */
- if (dirlist) free(dirlist);
- return(total_received);
-}
-
-
-/****************************************************************************
- do a directory listing, calling fn on each file found
- ****************************************************************************/
-static int do_short_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
-{
- char *p;
- int received = 0;
- BOOL first = True;
- char status[21];
- int num_asked = (max_xmit - 100)/DIR_STRUCT_SIZE;
- int num_received = 0;
- int i;
- char *dirlist = NULL;
- pstring mask;
- file_info finfo;
-
- finfo = def_finfo;
-
- bzero(status,21);
-
- strcpy(mask,Mask);
-
- while (1)
- {
- bzero(outbuf,smb_size);
- if (first)
- set_message(outbuf,2,5 + strlen(mask),True);
- else
- set_message(outbuf,2,5 + 21,True);
-
-#if FFIRST
- if (Protocol >= PROTOCOL_LANMAN1)
- CVAL(outbuf,smb_com) = SMBffirst;
- else
-#endif
- CVAL(outbuf,smb_com) = SMBsearch;
-
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,num_asked);
- SSVAL(outbuf,smb_vwv1,attribute);
-
- p = smb_buf(outbuf);
- *p++ = 4;
-
- if (first)
- strcpy(p,mask);
- else
- strcpy(p,"");
- p += strlen(p) + 1;
-
- *p++ = 5;
- if (first)
- SSVAL(p,0,0);
- else
- {
- SSVAL(p,0,21);
- p += 2;
- memcpy(p,status,21);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- received = SVAL(inbuf,smb_vwv0);
-
- DEBUG(5,("dir received %d\n",received));
-
- DEBUG(6,("errstr=%s\n",smb_errstr(inbuf)));
-
- if (received <= 0) break;
-
- first = False;
-
- dirlist = Realloc(dirlist,(num_received + received)*DIR_STRUCT_SIZE);
-
- if (!dirlist)
- return 0;
-
- p = smb_buf(inbuf) + 3;
-
- memcpy(dirlist+num_received*DIR_STRUCT_SIZE,
- p,received*DIR_STRUCT_SIZE);
-
- memcpy(status,p + ((received-1)*DIR_STRUCT_SIZE),21);
-
- num_received += received;
-
- if (CVAL(inbuf,smb_rcls) != 0) break;
- }
-
-#if FFIRST
- if (!first && Protocol >= PROTOCOL_LANMAN1)
- {
- bzero(outbuf,smb_size);
- CVAL(outbuf,smb_com) = SMBfclose;
-
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
-
- strcpy(p,"");
- p += strlen(p) + 1;
-
- *p++ = 5;
- SSVAL(p,0,21);
- p += 2;
- memcpy(p,status,21);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- DEBUG(0,("Error closing search: %s\n",smb_errstr(inbuf)));
- }
-#endif
-
- if (!fn)
- for (p=dirlist,i=0;i<num_received;i++)
- {
- p += interpret_short_filename(p,&finfo);
- display_finfo(&finfo);
- }
-
- for (p=dirlist,i=0;i<num_received;i++)
- {
- p += interpret_short_filename(p,&finfo);
- dir_action(inbuf,outbuf,attribute,&finfo,recurse_dir,fn,False);
- }
-
- if (dirlist) free(dirlist);
- return(num_received);
-}
-
-
-
-/****************************************************************************
- do a directory listing, calling fn on each file found
- ****************************************************************************/
-void do_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir)
-{
- DEBUG(5,("do_dir(%s,%x,%s)\n",Mask,attribute,BOOLSTR(recurse_dir)));
- if (Protocol >= PROTOCOL_LANMAN2)
- {
- if (do_long_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir) > 0)
- return;
- }
-
- expand_mask(Mask,False);
- do_short_dir(inbuf,outbuf,Mask,attribute,fn,recurse_dir);
- return;
-}
-
-/*******************************************************************
- decide if a file should be operated on
- ********************************************************************/
-static BOOL do_this_one(file_info *finfo)
-{
- if (finfo->mode & aDIR) return(True);
-
- if (newer_than && finfo->mtime < newer_than)
- return(False);
-
- if ((archive_level==1 || archive_level==2) && !(finfo->mode & aARCH))
- return(False);
-
- return(True);
-}
-
-
-/*****************************************************************************
- Convert a character pointer in a call_api() response to a form we can use.
- This function contains code to prevent core dumps if the server returns
- invalid data.
-*****************************************************************************/
-static char *fix_char_ptr(unsigned int datap, unsigned int converter, char *rdata, int rdrcnt)
-{
-if( datap == 0 ) /* turn NULL pointers */
- { /* into zero length strings */
- return "";
- }
-else
- {
- unsigned int offset = datap - converter;
-
- if( offset >= rdrcnt )
- {
- DEBUG(1,("bad char ptr: datap=%u, converter=%u, rdata=%lu, rdrcnt=%d>", datap, converter, (unsigned long)rdata, rdrcnt));
- return "<ERROR>";
- }
- else
- {
- return &rdata[offset];
- }
- }
-}
-
-/****************************************************************************
-interpret a short filename structure
-The length of the structure is returned
-****************************************************************************/
-static int interpret_short_filename(char *p,file_info *finfo)
-{
- finfo->mode = CVAL(p,21);
-
- /* this date is converted to GMT by make_unix_date */
- finfo->ctime = make_unix_date(p+22);
- finfo->mtime = finfo->atime = finfo->ctime;
- finfo->size = IVAL(p,26);
- strcpy(finfo->name,p+30);
-
- return(DIR_STRUCT_SIZE);
-}
-
-/****************************************************************************
-interpret a long filename structure - this is mostly guesses at the moment
-The length of the structure is returned
-The structure of a long filename depends on the info level. 260 is used
-by NT and 2 is used by OS/2
-****************************************************************************/
-static int interpret_long_filename(int level,char *p,file_info *finfo)
-{
- if (finfo)
- memcpy(finfo,&def_finfo,sizeof(*finfo));
-
- switch (level)
- {
- case 1: /* OS/2 understands this */
- if (finfo)
- {
- /* these dates are converted to GMT by make_unix_date */
- finfo->ctime = make_unix_date2(p+4);
- finfo->atime = make_unix_date2(p+8);
- finfo->mtime = make_unix_date2(p+12);
- finfo->size = IVAL(p,16);
- finfo->mode = CVAL(p,24);
- strcpy(finfo->name,p+27);
- }
- return(28 + CVAL(p,26));
-
- case 2: /* this is what OS/2 uses mostly */
- if (finfo)
- {
- /* these dates are converted to GMT by make_unix_date */
- finfo->ctime = make_unix_date2(p+4);
- finfo->atime = make_unix_date2(p+8);
- finfo->mtime = make_unix_date2(p+12);
- finfo->size = IVAL(p,16);
- finfo->mode = CVAL(p,24);
- strcpy(finfo->name,p+31);
- }
- return(32 + CVAL(p,30));
-
- /* levels 3 and 4 are untested */
- case 3:
- if (finfo)
- {
- /* these dates are probably like the other ones */
- finfo->ctime = make_unix_date2(p+8);
- finfo->atime = make_unix_date2(p+12);
- finfo->mtime = make_unix_date2(p+16);
- finfo->size = IVAL(p,20);
- finfo->mode = CVAL(p,28);
- strcpy(finfo->name,p+33);
- }
- return(SVAL(p,4)+4);
-
- case 4:
- if (finfo)
- {
- /* these dates are probably like the other ones */
- finfo->ctime = make_unix_date2(p+8);
- finfo->atime = make_unix_date2(p+12);
- finfo->mtime = make_unix_date2(p+16);
- finfo->size = IVAL(p,20);
- finfo->mode = CVAL(p,28);
- strcpy(finfo->name,p+37);
- }
- return(SVAL(p,4)+4);
-
- case 260: /* NT uses this, but also accepts 2 */
- if (finfo)
- {
- int ret = SVAL(p,0);
- int namelen;
- p += 4; /* next entry offset */
- p += 4; /* fileindex */
-
- /* these dates appear to arrive in a weird way. It seems to
- be localtime plus the serverzone given in the initial
- connect. This is GMT when DST is not in effect and one
- hour from GMT otherwise. Can this really be right??
-
- I suppose this could be called kludge-GMT. Is is the GMT
- you get by using the current DST setting on a different
- localtime. It will be cheap to calculate, I suppose, as
- no DST tables will be needed */
-
- finfo->ctime = interpret_long_date(p); p += 8;
- finfo->atime = interpret_long_date(p); p += 8;
- finfo->mtime = interpret_long_date(p); p += 8; p += 8;
- finfo->size = IVAL(p,0); p += 8;
- p += 8; /* alloc size */
- finfo->mode = CVAL(p,0); p += 4;
- namelen = IVAL(p,0); p += 4;
- p += 4; /* EA size */
- p += 2; /* short name len? */
- p += 24; /* short name? */
- StrnCpy(finfo->name,p,namelen);
- return(ret);
- }
- return(SVAL(p,0));
- }
-
- DEBUG(1,("Unknown long filename format %d\n",level));
- return(SVAL(p,0));
-}
-
-
-
-
-/****************************************************************************
- act on the files in a dir listing
- ****************************************************************************/
-static void dir_action(char *inbuf,char *outbuf,int attribute,file_info *finfo,BOOL recurse_dir,void (*fn)(),BOOL longdir)
-{
-
- if (!((finfo->mode & aDIR) == 0 && *fileselection &&
- !mask_match(finfo->name,fileselection,False,False)) &&
- !(recurse_dir && (strequal(finfo->name,".") ||
- strequal(finfo->name,".."))))
- {
- if (recurse_dir && (finfo->mode & aDIR))
- {
- pstring mask2;
- pstring sav_dir;
- strcpy(sav_dir,cur_dir);
- strcat(cur_dir,finfo->name);
- strcat(cur_dir,"\\");
- strcpy(mask2,cur_dir);
-
- if (!fn)
- DEBUG(0,("\n%s\n",CNV_LANG(cur_dir)));
-
- strcat(mask2,"*");
-
- if (longdir)
- do_long_dir(inbuf,outbuf,mask2,attribute,fn,True);
- else
- do_dir(inbuf,outbuf,mask2,attribute,fn,True);
-
- strcpy(cur_dir,sav_dir);
- }
- else
- {
- if (fn && do_this_one(finfo))
- fn(finfo);
- }
- }
-}
-
-
-/****************************************************************************
- receive a SMB trans or trans2 response allocating the necessary memory
- ****************************************************************************/
-static BOOL receive_trans_response(char *inbuf,int trans,
- int *data_len,int *param_len,
- char **data,char **param)
-{
- int total_data=0;
- int total_param=0;
- int this_data,this_param;
-
- *data_len = *param_len = 0;
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
- show_msg(inbuf);
-
- /* sanity check */
- if (CVAL(inbuf,smb_com) != trans)
- {
- DEBUG(0,("Expected %s response, got command 0x%02x\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com)));
- return(False);
- }
- if (CVAL(inbuf,smb_rcls) != 0)
- return(False);
-
- /* parse out the lengths */
- total_data = SVAL(inbuf,smb_tdrcnt);
- total_param = SVAL(inbuf,smb_tprcnt);
-
- /* allocate it */
- *data = Realloc(*data,total_data);
- *param = Realloc(*param,total_param);
-
- while (1)
- {
- this_data = SVAL(inbuf,smb_drcnt);
- this_param = SVAL(inbuf,smb_prcnt);
- if (this_data)
- memcpy(*data + SVAL(inbuf,smb_drdisp),
- smb_base(inbuf) + SVAL(inbuf,smb_droff),
- this_data);
- if (this_param)
- memcpy(*param + SVAL(inbuf,smb_prdisp),
- smb_base(inbuf) + SVAL(inbuf,smb_proff),
- this_param);
- *data_len += this_data;
- *param_len += this_param;
-
- /* parse out the total lengths again - they can shrink! */
- total_data = SVAL(inbuf,smb_tdrcnt);
- total_param = SVAL(inbuf,smb_tprcnt);
-
- if (total_data <= *data_len && total_param <= *param_len)
- break;
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
- show_msg(inbuf);
-
- /* sanity check */
- if (CVAL(inbuf,smb_com) != trans)
- {
- DEBUG(0,("Expected %s response, got command 0x%02x\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com)));
- return(False);
- }
- if (CVAL(inbuf,smb_rcls) != 0)
- return(False);
- }
-
- return(True);
-}
-
-
-/****************************************************************************
- get a directory listing
- ****************************************************************************/
-static void cmd_dir(char *inbuf,char *outbuf)
-{
- int attribute = aDIR | aSYSTEM | aHIDDEN;
- pstring mask;
- fstring buf;
- char *p=buf;
-
- dir_total = 0;
- strcpy(mask,cur_dir);
- if(mask[strlen(mask)-1]!='\\')
- strcat(mask,"\\");
-
- if (next_token(NULL,buf,NULL))
- {
- if (*p == '\\')
- strcpy(mask,p);
- else
- strcat(mask,p);
- }
- else {
- strcat(mask,"*");
- }
-
- do_dir(inbuf,outbuf,mask,attribute,NULL,recurse);
-
- do_dskattr();
-
- DEBUG(3, ("Total bytes listed: %d\n", dir_total));
-}
-
-
-
-/****************************************************************************
- get a file from rname to lname
- ****************************************************************************/
-static void do_get(char *rname,char *lname,file_info *finfo1)
-{
- int handle=0,fnum;
- uint32 nread=0;
- char *p;
- BOOL newhandle = False;
- char *inbuf,*outbuf;
- file_info finfo;
- BOOL close_done = False;
- BOOL ignore_close_error = False;
- char *dataptr=NULL;
- int datalen=0;
-
- struct timeval tp_start;
- GetTimeOfDay(&tp_start);
-
- if (finfo1)
- finfo = *finfo1;
- else
- finfo = def_finfo;
-
- if (lowercase)
- strlower(lname);
-
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- bzero(outbuf,smb_size);
- set_message(outbuf,15,1 + strlen(rname),True);
-
- CVAL(outbuf,smb_com) = SMBopenX;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0xFF);
- SSVAL(outbuf,smb_vwv2,1);
- SSVAL(outbuf,smb_vwv3,(DENY_NONE<<4));
- SSVAL(outbuf,smb_vwv4,aSYSTEM | aHIDDEN);
- SSVAL(outbuf,smb_vwv5,aSYSTEM | aHIDDEN);
- SSVAL(outbuf,smb_vwv8,1);
-
- p = smb_buf(outbuf);
- strcpy(p,rname);
- p = skip_string(p,1);
-
- /* do a chained openX with a readX? */
-#if 1
- if (finfo.size > 0)
- {
- DEBUG(3,("Chaining readX wth openX\n"));
- SSVAL(outbuf,smb_vwv0,SMBreadX);
- SSVAL(outbuf,smb_vwv1,smb_offset(p,outbuf));
- bzero(p,200);
- p -= smb_wct;
- SSVAL(p,smb_wct,10);
- SSVAL(p,smb_vwv0,0xFF);
- SSVAL(p,smb_vwv5,MIN(max_xmit-500,finfo.size));
- SSVAL(p,smb_vwv9,MIN(BUFFER_SIZE,finfo.size));
- smb_setlen(outbuf,smb_len(outbuf)+11*2+1);
- }
-#endif
-
- if(!strcmp(lname,"-"))
- handle = fileno(stdout);
- else
- {
- handle = creat(lname,0644);
- newhandle = True;
- }
- if (handle < 0)
- {
- DEBUG(0,("Error opening local file %s\n",lname));
- free(inbuf);free(outbuf);
- return;
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- if (CVAL(inbuf,smb_rcls) == ERRSRV &&
- SVAL(inbuf,smb_err) == ERRnoresource &&
- reopen_connection(inbuf,outbuf))
- {
- do_get(rname,lname,finfo1);
- return;
- }
- DEBUG(0,("%s opening remote file %s\n",smb_errstr(inbuf),CNV_LANG(rname)));
- if(newhandle)
- close(handle);
- free(inbuf);free(outbuf);
- return;
- }
-
- strcpy(finfo.name,rname);
-
- if (!finfo1)
- {
- finfo.mode = SVAL(inbuf,smb_vwv3);
- /* these times arrive as LOCAL time, using the DST offset
- corresponding to that time, we convert them to GMT */
- finfo.mtime = make_unix_date3(inbuf+smb_vwv4);
- finfo.atime = finfo.ctime = finfo.mtime;
- finfo.size = IVAL(inbuf,smb_vwv6);
- }
-
- DEBUG(3,("file %s attrib 0x%X\n",CNV_LANG(finfo.name),finfo.mode));
-
- fnum = SVAL(inbuf,smb_vwv2);
-
- /* we might have got some data from a chained readX */
- if (SVAL(inbuf,smb_vwv0) == SMBreadX)
- {
- p = (smb_base(inbuf)+SVAL(inbuf,smb_vwv1)) - smb_wct;
- datalen = SVAL(p,smb_vwv5);
- dataptr = smb_base(inbuf) + SVAL(p,smb_vwv6);
- }
- else
- {
- dataptr = NULL;
- datalen = 0;
- }
-
-
- DEBUG(2,("getting file %s of size %d bytes as %s ",
- CNV_LANG(finfo.name),
- finfo.size,
- lname));
-
- while (nread < finfo.size && !close_done)
- {
- int method = -1;
- static BOOL can_chain_close = True;
-
- p=NULL;
-
- DEBUG(3,("nread=%d max_xmit=%d fsize=%d\n",nread,max_xmit,finfo.size));
-
- /* 3 possible read types. readbraw if a large block is required.
- readX + close if not much left and read if neither is supported */
-
- /* we might have already read some data from a chained readX */
- if (dataptr && datalen>0)
- method=3;
-
- /* if we can finish now then readX+close */
- if (method<0 && can_chain_close && (Protocol >= PROTOCOL_LANMAN1) &&
- ((finfo.size - nread) <
- (max_xmit - (2*smb_size + 13*SIZEOFWORD + 300))))
- method = 0;
-
- /* if we support readraw then use that */
- if (method<0 && readbraw_supported)
- method = 1;
-
- /* if we can then use readX */
- if (method<0 && (Protocol >= PROTOCOL_LANMAN1))
- method = 2;
-
- switch (method)
- {
- /* use readX */
- case 0:
- case 2:
- if (method == 0)
- close_done = True;
-
- /* use readX + close */
- bzero(outbuf,smb_size);
- set_message(outbuf,10,0,True);
- CVAL(outbuf,smb_com) = SMBreadX;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- if (close_done)
- {
- CVAL(outbuf,smb_vwv0) = SMBclose;
- SSVAL(outbuf,smb_vwv1,smb_offset(smb_buf(outbuf),outbuf));
- }
- else
- CVAL(outbuf,smb_vwv0) = 0xFF;
-
- SSVAL(outbuf,smb_vwv2,fnum);
- SIVAL(outbuf,smb_vwv3,nread);
- SSVAL(outbuf,smb_vwv5,MIN(max_xmit-200,finfo.size - nread));
- SSVAL(outbuf,smb_vwv6,0);
- SIVAL(outbuf,smb_vwv7,0);
- SSVAL(outbuf,smb_vwv9,MIN(BUFFER_SIZE,finfo.size-nread));
-
- if (close_done)
- {
- p = smb_buf(outbuf);
- bzero(p,9);
-
- CVAL(p,0) = 3;
- SSVAL(p,1,fnum);
- SIVALS(p,3,-1);
-
- /* now set the total packet length */
- smb_setlen(outbuf,smb_len(outbuf)+9);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s reading remote file\n",smb_errstr(inbuf)));
- break;
- }
-
- if (close_done &&
- SVAL(inbuf,smb_vwv0) != SMBclose)
- {
- /* NOTE: WfWg sometimes just ignores the chained
- command! This seems to break the spec? */
- DEBUG(3,("Rejected chained close?\n"));
- close_done = False;
- can_chain_close = False;
- ignore_close_error = True;
- }
-
- datalen = SVAL(inbuf,smb_vwv5);
- dataptr = smb_base(inbuf) + SVAL(inbuf,smb_vwv6);
- break;
-
- /* use readbraw */
- case 1:
- {
- static int readbraw_size = BUFFER_SIZE;
-
- extern int Client;
- bzero(outbuf,smb_size);
- set_message(outbuf,8,0,True);
- CVAL(outbuf,smb_com) = SMBreadbraw;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
- SSVAL(outbuf,smb_vwv0,fnum);
- SIVAL(outbuf,smb_vwv1,nread);
- SSVAL(outbuf,smb_vwv3,MIN(finfo.size-nread,readbraw_size));
- SSVAL(outbuf,smb_vwv4,0);
- SIVALS(outbuf,smb_vwv5,-1);
- send_smb(Client,outbuf);
-
- /* Now read the raw data into the buffer and write it */
- if(read_smb_length(Client,inbuf,0) == -1) {
- DEBUG(0,("Failed to read length in readbraw\n"));
- exit(1);
- }
-
- /* Even though this is not an smb message, smb_len
- returns the generic length of an smb message */
- datalen = smb_len(inbuf);
-
- if (datalen == 0)
- {
- /* we got a readbraw error */
- DEBUG(4,("readbraw error - reducing size\n"));
- readbraw_size = (readbraw_size * 9) / 10;
-
- if (readbraw_size < max_xmit)
- {
- DEBUG(0,("disabling readbraw\n"));
- readbraw_supported = False;
- }
-
- dataptr=NULL;
- continue;
- }
-
- if(read_data(Client,inbuf,datalen) != datalen) {
- DEBUG(0,("Failed to read data in readbraw\n"));
- exit(1);
- }
- dataptr = inbuf;
- }
- break;
-
- case 3:
- /* we've already read some data with a chained readX */
- break;
-
- default:
- /* use plain read */
- bzero(outbuf,smb_size);
- set_message(outbuf,5,0,True);
- CVAL(outbuf,smb_com) = SMBread;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,MIN(max_xmit-200,finfo.size - nread));
- SIVAL(outbuf,smb_vwv2,nread);
- SSVAL(outbuf,smb_vwv4,finfo.size - nread);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s reading remote file\n",smb_errstr(inbuf)));
- break;
- }
-
- datalen = SVAL(inbuf,smb_vwv0);
- dataptr = smb_buf(inbuf) + 3;
- break;
- }
-
- if (writefile(handle,dataptr,datalen) != datalen)
- {
- DEBUG(0,("Error writing local file\n"));
- break;
- }
-
- nread += datalen;
- if (datalen == 0)
- {
- DEBUG(0,("Error reading file %s. Got %d bytes\n",CNV_LANG(rname),nread));
- break;
- }
-
- dataptr=NULL;
- datalen=0;
- }
-
-
-
- if (!close_done)
- {
- bzero(outbuf,smb_size);
- set_message(outbuf,3,0,True);
- CVAL(outbuf,smb_com) = SMBclose;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SIVALS(outbuf,smb_vwv1,-1);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (!ignore_close_error && CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s closing remote file\n",smb_errstr(inbuf)));
- if(newhandle)
- close(handle);
- free(inbuf);free(outbuf);
- return;
- }
- }
-
- if(newhandle)
- close(handle);
-
- if (archive_level >= 2 && (finfo.mode & aARCH)) {
- bzero(outbuf,smb_size);
- set_message(outbuf,8,strlen(rname)+4,True);
- CVAL(outbuf,smb_com) = SMBsetatr;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
- SSVAL(outbuf,smb_vwv0,finfo.mode & ~(aARCH));
- SIVALS(outbuf,smb_vwv1,0);
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,rname);
- p += strlen(p)+1;
- *p++ = 4;
- *p = 0;
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
- }
-
- {
- struct timeval tp_end;
- int this_time;
-
- GetTimeOfDay(&tp_end);
- this_time =
- (tp_end.tv_sec - tp_start.tv_sec)*1000 +
- (tp_end.tv_usec - tp_start.tv_usec)/1000;
- get_total_time_ms += this_time;
- get_total_size += finfo.size;
-
- DEBUG(1,("(%g kb/s) (average %g kb/s)\n",
- finfo.size / (1.024*this_time + 1.0e-4),
- get_total_size / (1.024*get_total_time_ms)));
- }
-
- free(inbuf);free(outbuf);
-}
-
-
-/****************************************************************************
- get a file
- ****************************************************************************/
-static void cmd_get(void)
-{
- pstring lname;
- pstring rname;
- char *p;
-
- strcpy(rname,cur_dir);
- strcat(rname,"\\");
-
- p = rname + strlen(rname);
-
- if (!next_token(NULL,p,NULL)) {
- DEBUG(0,("get <filename>\n"));
- return;
- }
- strcpy(lname,p);
- dos_clean_name(rname);
-
- next_token(NULL,lname,NULL);
-
- do_get(rname,lname,NULL);
-}
-
-
-/****************************************************************************
- do a mget operation on one file
- ****************************************************************************/
-static void do_mget(file_info *finfo)
-{
- pstring rname;
- pstring quest;
-
- if (strequal(finfo->name,".") || strequal(finfo->name,".."))
- return;
-
- if (abort_mget)
- {
- DEBUG(0,("mget aborted\n"));
- return;
- }
-
- if (finfo->mode & aDIR)
- sprintf(quest,"Get directory %s? ",CNV_LANG(finfo->name));
- else
- sprintf(quest,"Get file %s? ",CNV_LANG(finfo->name));
-
- if (prompt && !yesno(quest)) return;
-
- if (finfo->mode & aDIR)
- {
- pstring saved_curdir;
- pstring mget_mask;
- char *inbuf,*outbuf;
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- strcpy(saved_curdir,cur_dir);
-
- strcat(cur_dir,finfo->name);
- strcat(cur_dir,"\\");
-
- unix_format(finfo->name);
- {
- if (lowercase)
- strlower(finfo->name);
-
- if (!directory_exist(finfo->name,NULL) &&
- sys_mkdir(finfo->name,0777) != 0)
- {
- DEBUG(0,("failed to create directory %s\n",CNV_LANG(finfo->name)));
- strcpy(cur_dir,saved_curdir);
- free(inbuf);free(outbuf);
- return;
- }
-
- if (sys_chdir(finfo->name) != 0)
- {
- DEBUG(0,("failed to chdir to directory %s\n",CNV_LANG(finfo->name)));
- strcpy(cur_dir,saved_curdir);
- free(inbuf);free(outbuf);
- return;
- }
- }
-
- strcpy(mget_mask,cur_dir);
- strcat(mget_mask,"*");
-
- do_dir((char *)inbuf,(char *)outbuf,
- mget_mask,aSYSTEM | aHIDDEN | aDIR,do_mget,False);
- chdir("..");
- strcpy(cur_dir,saved_curdir);
- free(inbuf);free(outbuf);
- }
- else
- {
- strcpy(rname,cur_dir);
- strcat(rname,finfo->name);
- do_get(rname,finfo->name,finfo);
- }
-}
-
-/****************************************************************************
-view the file using the pager
-****************************************************************************/
-static void cmd_more(void)
-{
- fstring rname,lname,tmpname,pager_cmd;
- char *pager;
-
- strcpy(rname,cur_dir);
- strcat(rname,"\\");
- sprintf(tmpname,"%s/smbmore.%d",tmpdir(),(int)getpid());
- strcpy(lname,tmpname);
-
- if (!next_token(NULL,rname+strlen(rname),NULL)) {
- DEBUG(0,("more <filename>\n"));
- return;
- }
- dos_clean_name(rname);
-
- do_get(rname,lname,NULL);
-
- pager=getenv("PAGER");
- sprintf(pager_cmd,"%s %s",(pager? pager:PAGER), tmpname);
- system(pager_cmd);
- unlink(tmpname);
-}
-
-
-
-/****************************************************************************
-do a mget command
-****************************************************************************/
-static void cmd_mget(char *inbuf,char *outbuf)
-{
- int attribute = aSYSTEM | aHIDDEN;
- pstring mget_mask;
- fstring buf;
- char *p=buf;
-
- *mget_mask = 0;
-
- if (recurse)
- attribute |= aDIR;
-
- abort_mget = False;
-
- while (next_token(NULL,p,NULL))
- {
- strcpy(mget_mask,cur_dir);
- if(mget_mask[strlen(mget_mask)-1]!='\\')
- strcat(mget_mask,"\\");
-
- if (*p == '\\')
- strcpy(mget_mask,p);
- else
- strcat(mget_mask,p);
- do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False);
- }
-
- if (! *mget_mask)
- {
- strcpy(mget_mask,cur_dir);
- if(mget_mask[strlen(mget_mask)-1]!='\\')
- strcat(mget_mask,"\\");
- strcat(mget_mask,"*");
- do_dir((char *)inbuf,(char *)outbuf,mget_mask,attribute,do_mget,False);
- }
-}
-
-/****************************************************************************
-make a directory of name "name"
-****************************************************************************/
-static BOOL do_mkdir(char *name)
-{
- char *p;
- char *inbuf,*outbuf;
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return False;
- }
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,2 + strlen(name),True);
-
- CVAL(outbuf,smb_com) = SMBmkdir;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,name);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s making remote directory %s\n",
- smb_errstr(inbuf),CNV_LANG(name)));
-
- free(inbuf);free(outbuf);
- return(False);
- }
-
- free(inbuf);free(outbuf);
- return(True);
-}
-
-
-/****************************************************************************
- make a directory
- ****************************************************************************/
-static void cmd_mkdir(char *inbuf,char *outbuf)
-{
- pstring mask;
- fstring buf;
- char *p=buf;
-
- strcpy(mask,cur_dir);
-
- if (!next_token(NULL,p,NULL))
- {
- if (!recurse)
- DEBUG(0,("mkdir <dirname>\n"));
- return;
- }
- strcat(mask,p);
-
- if (recurse)
- {
- pstring ddir;
- pstring ddir2;
- *ddir2 = 0;
-
- strcpy(ddir,mask);
- trim_string(ddir,".",NULL);
- p = strtok(ddir,"/\\");
- while (p)
- {
- strcat(ddir2,p);
- if (!chkpath(ddir2,False))
- {
- do_mkdir(ddir2);
- }
- strcat(ddir2,"\\");
- p = strtok(NULL,"/\\");
- }
- }
- else
- do_mkdir(mask);
-}
-
-
-/*******************************************************************
- write to a file using writebraw
- ********************************************************************/
-static int smb_writeraw(char *outbuf,int fnum,int pos,char *buf,int n)
-{
- extern int Client;
- pstring inbuf;
-
- bzero(outbuf,smb_size);
- bzero(inbuf,smb_size);
- set_message(outbuf,Protocol>PROTOCOL_COREPLUS?12:10,0,True);
-
- CVAL(outbuf,smb_com) = SMBwritebraw;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,n);
- SIVAL(outbuf,smb_vwv3,pos);
- SSVAL(outbuf,smb_vwv7,1);
-
- send_smb(Client,outbuf);
-
- if (!receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- return(0);
-
- _smb_setlen(buf-4,n); /* HACK! XXXX */
-
- if (write_socket(Client,buf-4,n+4) != n+4)
- return(0);
-
- if (!receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0) {
- DEBUG(0,("Error writing remote file (2)\n"));
- return(0);
- }
- return(SVAL(inbuf,smb_vwv0));
-}
-
-
-
-/*******************************************************************
- write to a file
- ********************************************************************/
-static int smb_writefile(char *outbuf,int fnum,int pos,char *buf,int n)
-{
- pstring inbuf;
-
- if (writebraw_supported && n > (max_xmit-200))
- return(smb_writeraw(outbuf,fnum,pos,buf,n));
-
- bzero(outbuf,smb_size);
- bzero(inbuf,smb_size);
- set_message(outbuf,5,n + 3,True);
-
- CVAL(outbuf,smb_com) = SMBwrite;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,n);
- SIVAL(outbuf,smb_vwv2,pos);
- SSVAL(outbuf,smb_vwv4,0);
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,n);
-
- memcpy(smb_buf(outbuf)+3,buf,n);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0) {
- DEBUG(0,("%s writing remote file\n",smb_errstr(inbuf)));
- return(0);
- }
- return(SVAL(inbuf,smb_vwv0));
-}
-
-
-
-/****************************************************************************
- put a single file
- ****************************************************************************/
-static void do_put(char *rname,char *lname,file_info *finfo)
-{
- int fnum;
- FILE *f;
- int nread=0;
- char *p;
- char *inbuf,*outbuf;
- time_t close_time = finfo->mtime;
- char *buf=NULL;
- static int maxwrite=0;
-
- struct timeval tp_start;
- GetTimeOfDay(&tp_start);
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- bzero(outbuf,smb_size);
- set_message(outbuf,3,2 + strlen(rname),True);
-
- if (finfo->mtime == 0 || finfo->mtime == -1)
- finfo->mtime = finfo->atime = finfo->ctime = time(NULL);
-
- CVAL(outbuf,smb_com) = SMBcreate;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,finfo->mode);
- put_dos_date3(outbuf,smb_vwv1,finfo->mtime);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,rname);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s opening remote file %s\n",smb_errstr(inbuf),CNV_LANG(rname)));
-
- free(inbuf);free(outbuf);if (buf) free(buf);
- return;
- }
-
- f = fopen(lname,"r");
-
- if (!f)
- {
- DEBUG(0,("Error opening local file %s\n",lname));
- free(inbuf);free(outbuf);
- return;
- }
-
-
- fnum = SVAL(inbuf,smb_vwv0);
- if (finfo->size < 0)
- finfo->size = file_size(lname);
-
- DEBUG(1,("putting file %s of size %d bytes as %s ",lname,finfo->size,CNV_LANG(rname)));
-
- if (!maxwrite)
- maxwrite = writebraw_supported?MAX(max_xmit,BUFFER_SIZE):(max_xmit-200);
-
- while (nread < finfo->size)
- {
- int n = maxwrite;
- int ret;
-
- n = MIN(n,finfo->size - nread);
-
- buf = (char *)Realloc(buf,n+4);
-
- fseek(f,nread,SEEK_SET);
- if ((n = readfile(buf+4,1,n,f)) < 1)
- {
- DEBUG(0,("Error reading local file\n"));
- break;
- }
-
- ret = smb_writefile(outbuf,fnum,nread,buf+4,n);
-
- if (n != ret) {
- if (!maxwrite) {
- DEBUG(0,("Error writing file\n"));
- break;
- } else {
- maxwrite /= 2;
- continue;
- }
- }
-
- nread += n;
- }
-
-
-
- bzero(outbuf,smb_size);
- set_message(outbuf,3,0,True);
- CVAL(outbuf,smb_com) = SMBclose;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- put_dos_date3(outbuf,smb_vwv1,close_time);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s closing remote file %s\n",smb_errstr(inbuf),CNV_LANG(rname)));
- fclose(f);
- free(inbuf);free(outbuf);
- if (buf) free(buf);
- return;
- }
-
-
- fclose(f);
- free(inbuf);free(outbuf);
- if (buf) free(buf);
-
- {
- struct timeval tp_end;
- int this_time;
-
- GetTimeOfDay(&tp_end);
- this_time =
- (tp_end.tv_sec - tp_start.tv_sec)*1000 +
- (tp_end.tv_usec - tp_start.tv_usec)/1000;
- put_total_time_ms += this_time;
- put_total_size += finfo->size;
-
- DEBUG(1,("(%g kb/s) (average %g kb/s)\n",
- finfo->size / (1.024*this_time + 1.0e-4),
- put_total_size / (1.024*put_total_time_ms)));
- }
-}
-
-
-
-/****************************************************************************
- put a file
- ****************************************************************************/
-static void cmd_put(void)
-{
- pstring lname;
- pstring rname;
- fstring buf;
- char *p=buf;
- file_info finfo;
- finfo = def_finfo;
-
- strcpy(rname,cur_dir);
- strcat(rname,"\\");
-
-
- if (!next_token(NULL,p,NULL))
- {
- DEBUG(0,("put <filename>\n"));
- return;
- }
- strcpy(lname,p);
-
- if (next_token(NULL,p,NULL))
- strcat(rname,p);
- else
- strcat(rname,lname);
-
- dos_clean_name(rname);
-
- {
- struct stat st;
- if (!file_exist(lname,&st)) {
- DEBUG(0,("%s does not exist\n",lname));
- return;
- }
- finfo.mtime = st.st_mtime;
- }
-
- do_put(rname,lname,&finfo);
-}
-
-/****************************************************************************
- seek in a directory/file list until you get something that doesn't start with
- the specified name
- ****************************************************************************/
-static BOOL seek_list(FILE *f,char *name)
-{
- pstring s;
- while (!feof(f))
- {
- if (fscanf(f,"%s",s) != 1) return(False);
- trim_string(s,"./",NULL);
- if (strncmp(s,name,strlen(name)) != 0)
- {
- strcpy(name,s);
- return(True);
- }
- }
-
- return(False);
-}
-
-
-/****************************************************************************
- set the file selection mask
- ****************************************************************************/
-static void cmd_select(void)
-{
- strcpy(fileselection,"");
- next_token(NULL,fileselection,NULL);
-}
-
-
-/****************************************************************************
- mput some files
- ****************************************************************************/
-static void cmd_mput(void)
-{
- pstring lname;
- pstring rname;
- file_info finfo;
- fstring buf;
- char *p=buf;
-
- finfo = def_finfo;
-
-
- while (next_token(NULL,p,NULL))
- {
- struct stat st;
- pstring cmd;
- pstring tmpname;
- FILE *f;
-
- sprintf(tmpname,"%s/ls.smb.%d",tmpdir(),(int)getpid());
- if (recurse)
- sprintf(cmd,"find . -name \"%s\" -print > %s",p,tmpname);
- else
- sprintf(cmd,"/bin/ls %s > %s",p,tmpname);
- system(cmd);
-
- f = fopen(tmpname,"r");
- if (!f) continue;
-
- while (!feof(f))
- {
- pstring quest;
-
- if (fscanf(f,"%s",lname) != 1) break;
- trim_string(lname,"./",NULL);
-
- again1:
-
- /* check if it's a directory */
- if (directory_exist(lname,&st))
- {
- if (!recurse) continue;
- sprintf(quest,"Put directory %s? ",lname);
- if (prompt && !yesno(quest))
- {
- strcat(lname,"/");
- if (!seek_list(f,lname))
- break;
- goto again1;
- }
-
- strcpy(rname,cur_dir);
- strcat(rname,lname);
- if (!chkpath(rname,False) && !do_mkdir(rname)) {
- strcat(lname,"/");
- if (!seek_list(f,lname))
- break;
- goto again1;
- }
-
- continue;
- }
- else
- {
- sprintf(quest,"Put file %s? ",lname);
- if (prompt && !yesno(quest)) continue;
-
- strcpy(rname,cur_dir);
- strcat(rname,lname);
- }
- dos_format(rname);
-
- /* null size so do_put knows to ignore it */
- finfo.size = -1;
-
- /* set the date on the file */
- finfo.mtime = st.st_mtime;
-
- do_put(rname,lname,&finfo);
- }
- fclose(f);
- unlink(tmpname);
- }
-}
-
-/****************************************************************************
- cancel a print job
- ****************************************************************************/
-static void do_cancel(int job)
-{
- char *rparam = NULL;
- char *rdata = NULL;
- char *p;
- int rdrcnt,rprcnt;
- pstring param;
-
- bzero(param,sizeof(param));
-
- p = param;
- SSVAL(p,0,81); /* DosPrintJobDel() */
- p += 2;
- strcpy(p,"W");
- p = skip_string(p,1);
- strcpy(p,"");
- p = skip_string(p,1);
- SSVAL(p,0,job);
- p += 2;
-
- if (call_api(PTR_DIFF(p,param),0,
- 6,1000,
- &rprcnt,&rdrcnt,
- param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
-
- if (!res)
- printf("Job %d cancelled\n",job);
- else
- printf("Error %d calcelling job %d\n",res,job);
- return;
- }
- else
- printf("Server refused cancel request\n");
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return;
-}
-
-
-/****************************************************************************
- cancel a print job
- ****************************************************************************/
-static void cmd_cancel(char *inbuf,char *outbuf )
-{
- fstring buf;
- int job;
-
- if (!connect_as_printer)
- {
- DEBUG(0,("WARNING: You didn't use the -P option to smbclient.\n"));
- DEBUG(0,("Trying to cancel print jobs without -P may fail\n"));
- }
-
- if (!next_token(NULL,buf,NULL)) {
- printf("cancel <jobid> ...\n");
- return;
- }
- do {
- job = atoi(buf);
- do_cancel(job);
- } while (next_token(NULL,buf,NULL));
-}
-
-
-/****************************************************************************
- get info on a file
- ****************************************************************************/
-static void cmd_stat(char *inbuf,char *outbuf)
-{
- fstring buf;
- pstring param;
- char *resp_data=NULL;
- char *resp_param=NULL;
- int resp_data_len = 0;
- int resp_param_len=0;
- char *p;
- uint16 setup = TRANSACT2_QPATHINFO;
-
- if (!next_token(NULL,buf,NULL)) {
- printf("stat <file>\n");
- return;
- }
-
- bzero(param,6);
- SSVAL(param,0,4); /* level */
- p = param+6;
- strcpy(p,cur_dir);
- strcat(p,buf);
-
- send_trans_request(outbuf,SMBtrans2,NULL,FID_UNUSED,0,
- NULL,param,&setup,
- 0,6 + strlen(p)+1,1,
- BUFFER_SIZE,2,0);
-
- receive_trans_response(inbuf,SMBtrans2,
- &resp_data_len,&resp_param_len,
- &resp_data,&resp_param);
-
- if (resp_data) free(resp_data); resp_data = NULL;
- if (resp_param) free(resp_param); resp_param = NULL;
-}
-
-
-/****************************************************************************
- print a file
- ****************************************************************************/
-static void cmd_print(char *inbuf,char *outbuf )
-{
- int fnum;
- FILE *f = NULL;
- uint32 nread=0;
- pstring lname;
- pstring rname;
- char *p;
-
- if (!connect_as_printer)
- {
- DEBUG(0,("WARNING: You didn't use the -P option to smbclient.\n"));
- DEBUG(0,("Trying to print without -P may fail\n"));
- }
-
- if (!next_token(NULL,lname,NULL))
- {
- DEBUG(0,("print <filename>\n"));
- return;
- }
-
- strcpy(rname,lname);
- p = strrchr(rname,'/');
- if (p)
- {
- pstring tname;
- strcpy(tname,p+1);
- strcpy(rname,tname);
- }
-
- if ((int)strlen(rname) > 14)
- rname[14] = 0;
-
- if (strequal(lname,"-"))
- {
- f = stdin;
- strcpy(rname,"stdin");
- }
-
- dos_clean_name(rname);
-
- bzero(outbuf,smb_size);
- set_message(outbuf,2,2 + strlen(rname),True);
-
- CVAL(outbuf,smb_com) = SMBsplopen;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0);
- SSVAL(outbuf,smb_vwv1,printmode);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,rname);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s opening printer for %s\n",smb_errstr(inbuf),CNV_LANG(rname)));
- return;
- }
-
- if (!f)
- f = fopen(lname,"r");
- if (!f)
- {
- DEBUG(0,("Error opening local file %s\n",lname));
- return;
- }
-
-
- fnum = SVAL(inbuf,smb_vwv0);
-
- DEBUG(1,("printing file %s as %s\n",lname,CNV_LANG(rname)));
-
- while (!feof(f))
- {
- int n;
-
- bzero(outbuf,smb_size);
- set_message(outbuf,1,3,True);
-
- /* for some strange reason the OS/2 print server can't handle large
- packets when printing. weird */
- n = MIN(1024,max_xmit-(smb_len(outbuf)+4));
-
- if (translation)
- n = printread(f,smb_buf(outbuf)+3,(int)(0.95*n));
- else
- n = readfile(smb_buf(outbuf)+3,1,n,f);
- if (n <= 0)
- {
- DEBUG(0,("read gave %d\n",n));
- break;
- }
-
- smb_setlen(outbuf,smb_len(outbuf) + n);
-
- CVAL(outbuf,smb_com) = SMBsplwr;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,n+3);
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,n);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s printing remote file\n",smb_errstr(inbuf)));
- break;
- }
-
- nread += n;
- }
-
- DEBUG(2,("%d bytes printed\n",nread));
-
- bzero(outbuf,smb_size);
- set_message(outbuf,1,0,True);
- CVAL(outbuf,smb_com) = SMBsplclose;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s closing print file\n",smb_errstr(inbuf)));
- if (f != stdin)
- fclose(f);
- return;
- }
-
- if (f != stdin)
- fclose(f);
-}
-
-/****************************************************************************
-show a print queue - this is deprecated as it uses the old smb that
-has limited support - the correct call is the cmd_p_queue_4() after this.
-****************************************************************************/
-static void cmd_queue(char *inbuf,char *outbuf )
-{
- int count;
- char *p;
-
- bzero(outbuf,smb_size);
- set_message(outbuf,2,0,True);
-
- CVAL(outbuf,smb_com) = SMBsplretq;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,32); /* a max of 20 entries is to be shown */
- SSVAL(outbuf,smb_vwv1,0); /* the index into the queue */
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s obtaining print queue\n",smb_errstr(inbuf)));
- return;
- }
-
- count = SVAL(inbuf,smb_vwv0);
- p = smb_buf(inbuf) + 3;
- if (count <= 0)
- {
- DEBUG(0,("No entries in the print queue\n"));
- return;
- }
-
- {
- char status[20];
-
- DEBUG(0,("Job Name Size Status\n"));
-
- while (count--)
- {
- switch (CVAL(p,4))
- {
- case 0x01: sprintf(status,"held or stopped"); break;
- case 0x02: sprintf(status,"printing"); break;
- case 0x03: sprintf(status,"awaiting print"); break;
- case 0x04: sprintf(status,"in intercept"); break;
- case 0x05: sprintf(status,"file had error"); break;
- case 0x06: sprintf(status,"printer error"); break;
- default: sprintf(status,"unknown"); break;
- }
-
- DEBUG(0,("%-6d %-16.16s %-9d %s\n",
- SVAL(p,5),p+12,IVAL(p,7),status));
- p += 28;
- }
- }
-
-}
-
-
-/****************************************************************************
-show information about a print queue
-****************************************************************************/
-static void cmd_p_queue_4(char *inbuf,char *outbuf )
-{
- char *rparam = NULL;
- char *rdata = NULL;
- char *p;
- int rdrcnt, rprcnt;
- pstring param;
- int result_code=0;
-
- if (!connect_as_printer)
- {
- DEBUG(0,("WARNING: You didn't use the -P option to smbclient.\n"));
- DEBUG(0,("Trying to print without -P may fail\n"));
- }
-
- bzero(param,sizeof(param));
-
- p = param;
- SSVAL(p,0,76); /* API function number 76 (DosPrintJobEnum) */
- p += 2;
- strcpy(p,"zWrLeh"); /* parameter description? */
- p = skip_string(p,1);
- strcpy(p,"WWzWWDDzz"); /* returned data format */
- p = skip_string(p,1);
- strcpy(p,strrchr(service,'\\')+1); /* name of queue */
- p = skip_string(p,1);
- SSVAL(p,0,2); /* API function level 2, PRJINFO_2 data structure */
- SSVAL(p,2,1000); /* size of bytes of returned data buffer */
- p += 4;
- strcpy(p,""); /* subformat */
- p = skip_string(p,1);
-
- DEBUG(1,("Calling DosPrintJobEnum()...\n"));
- if( call_api(PTR_DIFF(p,param), 0,
- 10, 4096,
- &rprcnt, &rdrcnt,
- param, NULL,
- &rparam, &rdata) )
- {
- int converter;
- result_code = SVAL(rparam,0);
- converter = SVAL(rparam,2); /* conversion factor */
-
- DEBUG(2,("returned %d bytes of parameters, %d bytes of data, %d records\n", rprcnt, rdrcnt, SVAL(rparam,4) ));
-
- if (result_code == 0) /* if no error, */
- {
- int i;
- uint16 JobId;
- uint16 Priority;
- uint32 Size;
- char *UserName;
- char *JobName;
- char *JobTimeStr;
- time_t JobTime;
- char PrinterName[20];
-
- strcpy(PrinterName,strrchr(service,'\\')+1); /* name of queue */
- strlower(PrinterName); /* in lower case */
-
- p = rdata; /* received data */
- for( i = 0; i < SVAL(rparam,4); ++i)
- {
- JobId = SVAL(p,0);
- Priority = SVAL(p,2);
- UserName = fix_char_ptr(SVAL(p,4), converter, rdata, rdrcnt);
- strlower(UserName);
- Priority = SVAL(p,2);
- JobTime = make_unix_date3( p + 12);
- JobTimeStr = asctime(LocalTime( &JobTime));
- Size = IVAL(p,16);
- JobName = fix_char_ptr(SVAL(p,24), converter, rdata, rdrcnt);
-
-
- printf("%s-%u %s priority %u %s %s %u bytes\n",
- PrinterName, JobId, UserName,
- Priority, JobTimeStr, JobName, Size);
-
-#if 0 /* DEBUG code */
- printf("Job Id: \"%u\"\n", SVAL(p,0));
- printf("Priority: \"%u\"\n", SVAL(p,2));
-
- printf("User Name: \"%s\"\n", fix_char_ptr(SVAL(p,4), converter, rdata, rdrcnt) );
- printf("Position: \"%u\"\n", SVAL(p,8));
- printf("Status: \"%u\"\n", SVAL(p,10));
-
- JobTime = make_unix_date3( p + 12);
- printf("Submitted: \"%s\"\n", asctime(LocalTime(&JobTime)));
- printf("date: \"%u\"\n", SVAL(p,12));
-
- printf("Size: \"%u\"\n", SVAL(p,16));
- printf("Comment: \"%s\"\n", fix_char_ptr(SVAL(p,20), converter, rdata, rdrcnt) );
- printf("Document: \"%s\"\n", fix_char_ptr(SVAL(p,24), converter, rdata, rdrcnt) );
-#endif /* DEBUG CODE */
- p += 28;
- }
- }
- }
- else /* call_api() failed */
- {
- printf("Failed, error = %d\n", result_code);
- }
-
- /* If any parameters or data were returned, free the storage. */
- if(rparam) free(rparam);
- if(rdata) free(rdata);
-
- return;
-}
-
-/****************************************************************************
-show information about a print queue
-****************************************************************************/
-static void cmd_qinfo(char *inbuf,char *outbuf )
-{
- char *rparam = NULL;
- char *rdata = NULL;
- char *p;
- int rdrcnt, rprcnt;
- pstring param;
- int result_code=0;
-
- bzero(param,sizeof(param));
-
- p = param;
- SSVAL(p,0,70); /* API function number 70 (DosPrintQGetInfo) */
- p += 2;
- strcpy(p,"zWrLh"); /* parameter description? */
- p = skip_string(p,1);
- strcpy(p,"zWWWWzzzzWWzzl"); /* returned data format */
- p = skip_string(p,1);
- strcpy(p,strrchr(service,'\\')+1); /* name of queue */
- p = skip_string(p,1);
- SSVAL(p,0,3); /* API function level 3, just queue info, no job info */
- SSVAL(p,2,1000); /* size of bytes of returned data buffer */
- p += 4;
- strcpy(p,""); /* subformat */
- p = skip_string(p,1);
-
- DEBUG(1,("Calling DosPrintQueueGetInfo()...\n"));
- if( call_api(PTR_DIFF(p,param), 0,
- 10, 4096,
- &rprcnt, &rdrcnt,
- param, NULL,
- &rparam, &rdata) )
- {
- int converter;
- result_code = SVAL(rparam,0);
- converter = SVAL(rparam,2); /* conversion factor */
-
- DEBUG(2,("returned %d bytes of parameters, %d bytes of data, %d records\n", rprcnt, rdrcnt, SVAL(rparam,4) ));
-
- if (result_code == 0) /* if no error, */
- {
- p = rdata; /* received data */
-
- printf("Name: \"%s\"\n", fix_char_ptr(SVAL(p,0), converter, rdata, rdrcnt) );
- printf("Priority: %u\n", SVAL(p,4) );
- printf("Start time: %u\n", SVAL(p,6) );
- printf("Until time: %u\n", SVAL(p,8) );
- printf("Seperator file: \"%s\"\n", fix_char_ptr(SVAL(p,12), converter, rdata, rdrcnt) );
- printf("Print processor: \"%s\"\n", fix_char_ptr(SVAL(p,16), converter, rdata, rdrcnt) );
- printf("Parameters: \"%s\"\n", fix_char_ptr(SVAL(p,20), converter, rdata, rdrcnt) );
- printf("Comment: \"%s\"\n", fix_char_ptr(SVAL(p,24), converter, rdata, rdrcnt) );
- printf("Status: %u\n", SVAL(p,28) );
- printf("Jobs: %u\n", SVAL(p,30) );
- printf("Printers: \"%s\"\n", fix_char_ptr(SVAL(p,32), converter, rdata, rdrcnt) );
- printf("Drivername: \"%s\"\n", fix_char_ptr(SVAL(p,36), converter, rdata, rdrcnt) );
-
- /* Dump the driver data */
- {
- int count, x, y, c;
- char *ddptr;
-
- ddptr = rdata + SVAL(p,40) - converter;
- if( SVAL(p,40) == 0 ) {count = 0;} else {count = IVAL(ddptr,0);}
- printf("Driverdata: size=%d, version=%u\n", count, IVAL(ddptr,4) );
-
- for(x=8; x < count; x+=16)
- {
- for(y=0; y < 16; y++)
- {
- if( (x+y) < count )
- printf("%2.2X ", CVAL(ddptr,(x+y)) );
- else
- fputs(" ", stdout);
- }
- for(y=0; y < 16 && (x+y) < count; y++)
- {
- c = CVAL(ddptr,(x+y));
- if(isprint(c))
- fputc(c, stdout);
- else
- fputc('.', stdout);
- }
- fputc('\n', stdout);
- }
- }
-
- }
- }
- else /* call_api() failed */
- {
- printf("Failed, error = %d\n", result_code);
- }
-
- /* If any parameters or data were returned, free the storage. */
- if(rparam) free(rparam);
- if(rdata) free(rdata);
-
- return;
-}
-
-/****************************************************************************
-delete some files
-****************************************************************************/
-static void do_del(file_info *finfo)
-{
- char *p;
- char *inbuf,*outbuf;
- pstring mask;
-
- strcpy(mask,cur_dir);
- strcat(mask,finfo->name);
-
- if (finfo->mode & aDIR)
- return;
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- bzero(outbuf,smb_size);
- set_message(outbuf,1,2 + strlen(mask),True);
-
- CVAL(outbuf,smb_com) = SMBunlink;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,mask);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- DEBUG(0,("%s deleting remote file %s\n",smb_errstr(inbuf),CNV_LANG(mask)));
-
- free(inbuf);free(outbuf);
-
-}
-
-/****************************************************************************
-delete some files
-****************************************************************************/
-static void cmd_del(char *inbuf,char *outbuf )
-{
- pstring mask;
- fstring buf;
- int attribute = aSYSTEM | aHIDDEN;
-
- if (recurse)
- attribute |= aDIR;
-
- strcpy(mask,cur_dir);
-
- if (!next_token(NULL,buf,NULL))
- {
- DEBUG(0,("del <filename>\n"));
- return;
- }
- strcat(mask,buf);
-
- do_dir((char *)inbuf,(char *)outbuf,mask,attribute,do_del,False);
-}
-
-
-/****************************************************************************
-remove a directory
-****************************************************************************/
-static void cmd_rmdir(char *inbuf,char *outbuf )
-{
- pstring mask;
- fstring buf;
- char *p;
-
- strcpy(mask,cur_dir);
-
- if (!next_token(NULL,buf,NULL))
- {
- DEBUG(0,("rmdir <dirname>\n"));
- return;
- }
- strcat(mask,buf);
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,2 + strlen(mask),True);
-
- CVAL(outbuf,smb_com) = SMBrmdir;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,mask);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s removing remote directory file %s\n",smb_errstr(inbuf),CNV_LANG(mask)));
- return;
- }
-
-}
-
-/****************************************************************************
-rename some files
-****************************************************************************/
-static void cmd_rename(char *inbuf,char *outbuf )
-{
- pstring src,dest;
- fstring buf,buf2;
- char *p;
-
- strcpy(src,cur_dir);
- strcpy(dest,cur_dir);
-
- if (!next_token(NULL,buf,NULL) || !next_token(NULL,buf2,NULL))
- {
- DEBUG(0,("rename <src> <dest>\n"));
- return;
- }
- strcat(src,buf);
- strcat(dest,buf2);
-
- bzero(outbuf,smb_size);
- set_message(outbuf,1,4 + strlen(src) + strlen(dest),True);
-
- CVAL(outbuf,smb_com) = SMBmv;
- SSVAL(outbuf,smb_tid,cnum);
- SSVAL(outbuf,smb_vwv0,aHIDDEN | aDIR | aSYSTEM);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,src);
- p = skip_string(p,1);
- *p++ = 4;
- strcpy(p,dest);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s renaming files\n",smb_errstr(inbuf)));
- return;
- }
-
-}
-
-
-/****************************************************************************
-toggle the prompt flag
-****************************************************************************/
-static void cmd_prompt(void)
-{
- prompt = !prompt;
- DEBUG(2,("prompting is now %s\n",prompt?"on":"off"));
-}
-
-
-/****************************************************************************
-set the newer than time
-****************************************************************************/
-static void cmd_newer(void)
-{
- fstring buf;
- BOOL ok;
- struct stat sbuf;
-
- ok = next_token(NULL,buf,NULL);
- if (ok && (sys_stat(buf,&sbuf) == 0))
- {
- newer_than = sbuf.st_mtime;
- DEBUG(1,("Getting files newer than %s",
- asctime(LocalTime(&newer_than))));
- }
- else
- newer_than = 0;
-
- if (ok && newer_than == 0)
- DEBUG(0,("Error setting newer-than time\n"));
-}
-
-/****************************************************************************
-set the archive level
-****************************************************************************/
-static void cmd_archive(void)
-{
- fstring buf;
-
- if (next_token(NULL,buf,NULL)) {
- archive_level = atoi(buf);
- } else
- DEBUG(0,("Archive level is %d\n",archive_level));
-}
-
-/****************************************************************************
-toggle the lowercaseflag
-****************************************************************************/
-static void cmd_lowercase(void)
-{
- lowercase = !lowercase;
- DEBUG(2,("filename lowercasing is now %s\n",lowercase?"on":"off"));
-}
-
-
-
-
-/****************************************************************************
-toggle the recurse flag
-****************************************************************************/
-static void cmd_recurse(void)
-{
- recurse = !recurse;
- DEBUG(2,("directory recursion is now %s\n",recurse?"on":"off"));
-}
-
-/****************************************************************************
-toggle the translate flag
-****************************************************************************/
-static void cmd_translate(void)
-{
- translation = !translation;
- DEBUG(2,("CR/LF<->LF and print text translation now %s\n",
- translation?"on":"off"));
-}
-
-
-/****************************************************************************
-do a printmode command
-****************************************************************************/
-static void cmd_printmode(void)
-{
- fstring buf;
- fstring mode;
-
- if (next_token(NULL,buf,NULL))
- {
- if (strequal(buf,"text"))
- printmode = 0;
- else
- {
- if (strequal(buf,"graphics"))
- printmode = 1;
- else
- printmode = atoi(buf);
- }
- }
-
- switch(printmode)
- {
- case 0:
- strcpy(mode,"text");
- break;
- case 1:
- strcpy(mode,"graphics");
- break;
- default:
- sprintf(mode,"%d",printmode);
- break;
- }
-
- DEBUG(2,("the printmode is now %s\n",mode));
-}
-
-/****************************************************************************
-do the lcd command
-****************************************************************************/
-static void cmd_lcd(void)
-{
- fstring buf;
- pstring d;
-
- if (next_token(NULL,buf,NULL))
- sys_chdir(buf);
- DEBUG(2,("the local directory is now %s\n",GetWd(d)));
-}
-
-
-/****************************************************************************
-send a session request
-****************************************************************************/
-static BOOL send_session_request(char *inbuf,char *outbuf)
-{
- fstring dest;
- char *p;
- int len = 4;
- /* send a session request (RFC 8002) */
-
- strcpy(dest,desthost);
- p = strchr(dest,'.');
- if (p) *p = 0;
-
- /* put in the destination name */
- p = outbuf+len;
- name_mangle(dest,p,name_type); /* 0x20 is the SMB server NetBIOS type. */
- len += name_len(p);
-
- /* and my name */
- p = outbuf+len;
- name_mangle(myname,p,0);
- len += name_len(p);
-
- /* setup the packet length */
- _smb_setlen(outbuf,len);
- CVAL(outbuf,0) = 0x81;
-
- send_smb(Client,outbuf);
- DEBUG(5,("Sent session request\n"));
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,0) == 0x84) /* C. Hoch 9/14/95 Start */
- {
- /* For information, here is the response structure.
- * We do the byte-twiddling to for portability.
- struct RetargetResponse{
- unsigned char type;
- unsigned char flags;
- int16 length;
- int32 ip_addr;
- int16 port;
- };
- */
- extern int Client;
- int port = (CVAL(inbuf,8)<<8)+CVAL(inbuf,9);
- /* SESSION RETARGET */
- putip((char *)&dest_ip,inbuf+4);
-
- close_sockets();
- Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
- if (Client == -1)
- return False;
-
- DEBUG(3,("Retargeted\n"));
-
- set_socket_options(Client,user_socket_options);
-
- /* Try again */
- return send_session_request(inbuf,outbuf);
- } /* C. Hoch 9/14/95 End */
-
-
- if (CVAL(inbuf,0) != 0x82)
- {
- int ecode = CVAL(inbuf,4);
- DEBUG(0,("Session request failed (%d,%d) with myname=%s destname=%s\n",
- CVAL(inbuf,0),ecode,myname,desthost));
- switch (ecode)
- {
- case 0x80:
- DEBUG(0,("Not listening on called name\n"));
- DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost));
- DEBUG(0,("You may find the -I option useful for this\n"));
- break;
- case 0x81:
- DEBUG(0,("Not listening for calling name\n"));
- DEBUG(0,("Try to connect as another name (instead of %s)\n",myname));
- DEBUG(0,("You may find the -n option useful for this\n"));
- break;
- case 0x82:
- DEBUG(0,("Called name not present\n"));
- DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost));
- DEBUG(0,("You may find the -I option useful for this\n"));
- break;
- case 0x83:
- DEBUG(0,("Called name present, but insufficient resources\n"));
- DEBUG(0,("Perhaps you should try again later?\n"));
- break;
- default:
- DEBUG(0,("Unspecified error 0x%X\n",ecode));
- DEBUG(0,("Your server software is being unfriendly\n"));
- break;
- }
- return(False);
- }
- return(True);
-}
-
-static struct {
- int prot;
- char *name;
-} prots[] = {
- {PROTOCOL_CORE,"PC NETWORK PROGRAM 1.0"},
- {PROTOCOL_COREPLUS,"MICROSOFT NETWORKS 1.03"},
- {PROTOCOL_LANMAN1,"MICROSOFT NETWORKS 3.0"},
- {PROTOCOL_LANMAN1,"LANMAN1.0"},
- {PROTOCOL_LANMAN2,"LM1.2X002"},
- {PROTOCOL_LANMAN2,"Samba"},
- {PROTOCOL_NT1,"NT LM 0.12"},
- {PROTOCOL_NT1,"NT LANMAN 1.0"},
- {-1,NULL}
-};
-
-
-/****************************************************************************
-send a login command
-****************************************************************************/
-static BOOL send_login(char *inbuf,char *outbuf,BOOL start_session,BOOL use_setup)
-{
- BOOL was_null = (!inbuf && !outbuf);
- int sesskey=0;
- time_t servertime = 0;
- extern int serverzone;
- int sec_mode=0;
- int crypt_len;
- int max_vcs=0;
- char *pass = NULL;
- pstring dev;
- char *p;
- int numprots;
- int tries=0;
-
- if (was_null)
- {
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- }
-
-#if AJT
- if (strstr(service,"IPC$")) connect_as_ipc = True;
-#endif
-
- strcpy(dev,"A:");
- if (connect_as_printer)
- strcpy(dev,"LPT1:");
- if (connect_as_ipc)
- strcpy(dev,"IPC");
-
-
- if (start_session && !send_session_request(inbuf,outbuf))
- {
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- bzero(outbuf,smb_size);
-
- /* setup the protocol strings */
- {
- int plength;
-
- for (plength=0,numprots=0;
- prots[numprots].name && prots[numprots].prot<=max_protocol;
- numprots++)
- plength += strlen(prots[numprots].name)+2;
-
- set_message(outbuf,0,plength,True);
-
- p = smb_buf(outbuf);
- for (numprots=0;
- prots[numprots].name && prots[numprots].prot<=max_protocol;
- numprots++)
- {
- *p++ = 2;
- strcpy(p,prots[numprots].name);
- p += strlen(p) + 1;
- }
- }
-
- CVAL(outbuf,smb_com) = SMBnegprot;
- setup_pkt(outbuf);
-
- CVAL(smb_buf(outbuf),0) = 2;
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- show_msg(inbuf);
-
- if (CVAL(inbuf,smb_rcls) != 0 || ((int)SVAL(inbuf,smb_vwv0) >= numprots))
- {
- DEBUG(0,("SMBnegprot failed. myname=%s destname=%s - %s \n",
- myname,desthost,smb_errstr(inbuf)));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- Protocol = prots[SVAL(inbuf,smb_vwv0)].prot;
-
-
- if (Protocol < PROTOCOL_NT1) {
- sec_mode = SVAL(inbuf,smb_vwv1);
- max_xmit = SVAL(inbuf,smb_vwv2);
- sesskey = IVAL(inbuf,smb_vwv6);
- serverzone = SVALS(inbuf,smb_vwv10)*60;
- /* this time is converted to GMT by make_unix_date */
- servertime = make_unix_date(inbuf+smb_vwv8);
- if (Protocol >= PROTOCOL_COREPLUS) {
- readbraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x1) != 0);
- writebraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x2) != 0);
- }
- crypt_len = smb_buflen(inbuf);
- memcpy(cryptkey,smb_buf(inbuf),8);
- DEBUG(3,("max mux %d\n",SVAL(inbuf,smb_vwv3)));
- max_vcs = SVAL(inbuf,smb_vwv4);
- DEBUG(3,("max vcs %d\n",max_vcs));
- DEBUG(3,("max blk %d\n",SVAL(inbuf,smb_vwv5)));
- } else {
- /* NT protocol */
- sec_mode = CVAL(inbuf,smb_vwv1);
- max_xmit = IVAL(inbuf,smb_vwv3+1);
- sesskey = IVAL(inbuf,smb_vwv7+1);
- serverzone = SVALS(inbuf,smb_vwv15+1)*60;
- /* this time arrives in real GMT */
- servertime = interpret_long_date(inbuf+smb_vwv11+1);
- crypt_len = CVAL(inbuf,smb_vwv16+1);
- memcpy(cryptkey,smb_buf(inbuf),8);
- if (IVAL(inbuf,smb_vwv9+1) & 1)
- readbraw_supported = writebraw_supported = True;
- DEBUG(3,("max mux %d\n",SVAL(inbuf,smb_vwv1+1)));
- max_vcs = SVAL(inbuf,smb_vwv2+1);
- DEBUG(3,("max vcs %d\n",max_vcs));
- DEBUG(3,("max raw %d\n",IVAL(inbuf,smb_vwv5+1)));
- DEBUG(3,("capabilities 0x%x\n",IVAL(inbuf,smb_vwv9+1)));
- }
-
- DEBUG(3,("Sec mode %d\n",SVAL(inbuf,smb_vwv1)));
- DEBUG(3,("max xmt %d\n",max_xmit));
- DEBUG(3,("Got %d byte crypt key\n",crypt_len));
- DEBUG(3,("Chose protocol [%s]\n",prots[SVAL(inbuf,smb_vwv0)].name));
-
- doencrypt = ((sec_mode & 2) != 0);
-
- if (servertime) {
- static BOOL done_time = False;
- if (!done_time) {
- DEBUG(1,("Server time is %sTimezone is UTC%+02.1f\n",
- asctime(LocalTime(&servertime)),
- -(double)(serverzone/3600.0)));
- done_time = True;
- }
- }
-
- get_pass:
-
- if (got_pass)
- pass = password;
- else
- pass = (char *)getpass("Password: ");
-
- /* use a blank username for the 2nd try with a blank password */
- if (tries++ && !*pass)
- *username = 0;
-
- if (Protocol >= PROTOCOL_LANMAN1 && use_setup)
- {
- fstring pword;
- int passlen = strlen(pass)+1;
- strcpy(pword,pass);
-
- if (doencrypt && *pass) {
- DEBUG(3,("Using encrypted passwords\n"));
- passlen = 24;
- SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword);
- }
-
- /* if in share level security then don't send a password now */
- if (!(sec_mode & 1)) {strcpy(pword, "");passlen=1;}
-
- /* send a session setup command */
- bzero(outbuf,smb_size);
-
- if (Protocol < PROTOCOL_NT1) {
- set_message(outbuf,10,1 + strlen(username) + passlen,True);
- CVAL(outbuf,smb_com) = SMBsesssetupX;
- setup_pkt(outbuf);
-
- CVAL(outbuf,smb_vwv0) = 0xFF;
- SSVAL(outbuf,smb_vwv2,max_xmit);
- SSVAL(outbuf,smb_vwv3,2);
- SSVAL(outbuf,smb_vwv4,max_vcs-1);
- SIVAL(outbuf,smb_vwv5,sesskey);
- SSVAL(outbuf,smb_vwv7,passlen);
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen);
- p += passlen;
- strcpy(p,username);
- } else {
- if (!doencrypt) passlen--;
- /* for Win95 */
- set_message(outbuf,13,0,True);
- CVAL(outbuf,smb_com) = SMBsesssetupX;
- setup_pkt(outbuf);
-
- CVAL(outbuf,smb_vwv0) = 0xFF;
- SSVAL(outbuf,smb_vwv2,BUFFER_SIZE);
- SSVAL(outbuf,smb_vwv3,2);
- SSVAL(outbuf,smb_vwv4,getpid());
- SIVAL(outbuf,smb_vwv5,sesskey);
- SSVAL(outbuf,smb_vwv7,passlen);
- SSVAL(outbuf,smb_vwv8,0);
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen); p += SVAL(outbuf,smb_vwv7);
- strcpy(p,username);p = skip_string(p,1);
- strcpy(p,workgroup);p = skip_string(p,1);
- strcpy(p,"Unix");p = skip_string(p,1);
- strcpy(p,"Samba");p = skip_string(p,1);
- set_message(outbuf,13,PTR_DIFF(p,smb_buf(outbuf)),False);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- show_msg(inbuf);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- if (! *pass &&
- ((CVAL(inbuf,smb_rcls) == ERRDOS &&
- SVAL(inbuf,smb_err) == ERRnoaccess) ||
- (CVAL(inbuf,smb_rcls) == ERRSRV &&
- SVAL(inbuf,smb_err) == ERRbadpw)))
- {
- got_pass = False;
- DEBUG(3,("resending login\n"));
- goto get_pass;
- }
-
- DEBUG(0,("Session setup failed for username=%s myname=%s destname=%s %s\n",
- username,myname,desthost,smb_errstr(inbuf)));
- DEBUG(0,("You might find the -U, -W or -n options useful\n"));
- DEBUG(0,("Sometimes you have to use `-n USERNAME' (particularly with OS/2)\n"));
- DEBUG(0,("Some servers also insist on uppercase-only passwords\n"));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- if (Protocol >= PROTOCOL_NT1) {
- char *domain,*os,*lanman;
- p = smb_buf(inbuf);
- os = p;
- lanman = skip_string(os,1);
- domain = skip_string(lanman,1);
- if (*domain || *os || *lanman)
- DEBUG(1,("Domain=[%s] OS=[%s] Server=[%s]\n",domain,os,lanman));
- }
-
- /* use the returned uid from now on */
- if (SVAL(inbuf,smb_uid) != uid)
- DEBUG(3,("Server gave us a UID of %d. We gave %d\n",
- SVAL(inbuf,smb_uid),uid));
- uid = SVAL(inbuf,smb_uid);
- }
-
- /* now we've got a connection - send a tcon message */
- bzero(outbuf,smb_size);
-
- if (strncmp(service,"\\\\",2) != 0)
- {
- DEBUG(0,("\nWarning: Your service name doesn't start with \\\\. This is probably incorrect.\n"));
- DEBUG(0,("Perhaps try replacing each \\ with \\\\ on the command line?\n\n"));
- }
-
-
- again2:
-
- {
- int passlen = strlen(pass)+1;
- fstring pword;
- strcpy(pword,pass);
-
- if (doencrypt && *pass) {
- passlen=24;
- SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword);
- }
-
- /* if in user level security then don't send a password now */
- if ((sec_mode & 1)) {
- strcpy(pword, ""); passlen=1;
- }
-
- if (Protocol <= PROTOCOL_COREPLUS) {
- set_message(outbuf,0,6 + strlen(service) + passlen + strlen(dev),True);
- CVAL(outbuf,smb_com) = SMBtcon;
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 0x04;
- strcpy(p, service);
- p = skip_string(p,1);
- *p++ = 0x04;
- memcpy(p,pword,passlen);
- p += passlen;
- *p++ = 0x04;
- strcpy(p, dev);
- }
- else {
- set_message(outbuf,4,2 + strlen(service) + passlen + strlen(dev),True);
- CVAL(outbuf,smb_com) = SMBtconX;
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0xFF);
- SSVAL(outbuf,smb_vwv3,passlen);
-
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen);
- p += passlen;
- strcpy(p,service);
- p = skip_string(p,1);
- strcpy(p,dev);
- }
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- /* trying again with a blank password */
- if (CVAL(inbuf,smb_rcls) != 0 &&
- (int)strlen(pass) > 0 &&
- !doencrypt &&
- Protocol >= PROTOCOL_LANMAN1)
- {
- DEBUG(2,("first SMBtconX failed, trying again. %s\n",smb_errstr(inbuf)));
- strcpy(pass,"");
- goto again2;
- }
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("SMBtconX failed. %s\n",smb_errstr(inbuf)));
- DEBUG(0,("Perhaps you are using the wrong sharename, username or password?\n"));
- DEBUG(0,("Some servers insist that these be in uppercase\n"));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
-
- if (Protocol <= PROTOCOL_COREPLUS) {
- max_xmit = SVAL(inbuf,smb_vwv0);
-
- cnum = SVAL(inbuf,smb_vwv1);
- }
- else {
- max_xmit = MIN(max_xmit,BUFFER_SIZE-4);
- if (max_xmit <= 0)
- max_xmit = BUFFER_SIZE - 4;
-
- cnum = SVAL(inbuf,smb_tid);
- }
-
- DEBUG(3,("Connected with cnum=%d max_xmit=%d\n",cnum,max_xmit));
-
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return True;
-}
-
-
-/****************************************************************************
-send a logout command
-****************************************************************************/
-static void send_logout(void )
-{
- pstring inbuf,outbuf;
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,0,True);
- CVAL(outbuf,smb_com) = SMBtdis;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("SMBtdis failed %s\n",smb_errstr(inbuf)));
- }
-
-
-#ifdef STATS
- stats_report();
-#endif
- exit(0);
-}
-
-
-
-/****************************************************************************
-call a remote api
-****************************************************************************/
-static BOOL call_api(int prcnt,int drcnt,
- int mprcnt,int mdrcnt,
- int *rprcnt,int *rdrcnt,
- char *param,char *data,
- char **rparam,char **rdata)
-{
- static char *inbuf=NULL;
- static char *outbuf=NULL;
-
- if (!inbuf) inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if (!outbuf) outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- send_trans_request(outbuf,SMBtrans,"\\PIPE\\LANMAN",0,0,
- data,param,NULL,
- drcnt,prcnt,0,
- mdrcnt,mprcnt,0);
-
- return (receive_trans_response(inbuf,SMBtrans,
- rdrcnt,rprcnt,
- rdata,rparam));
-}
-
-/****************************************************************************
- send a SMB trans or trans2 request
- ****************************************************************************/
-static BOOL send_trans_request(char *outbuf,int trans,
- char *name,int fid,int flags,
- char *data,char *param,uint16 *setup,
- int ldata,int lparam,int lsetup,
- int mdata,int mparam,int msetup)
-{
- int i;
- int this_ldata,this_lparam;
- int tot_data=0,tot_param=0;
- char *outdata,*outparam;
- pstring inbuf;
- char *p;
-
- this_lparam = MIN(lparam,max_xmit - (500+lsetup*SIZEOFWORD)); /* hack */
- this_ldata = MIN(ldata,max_xmit - (500+lsetup*SIZEOFWORD+this_lparam));
-
- bzero(outbuf,smb_size);
- set_message(outbuf,14+lsetup,0,True);
- CVAL(outbuf,smb_com) = trans;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- outparam = smb_buf(outbuf)+(trans==SMBtrans ? strlen(name)+1 : 3);
- outdata = outparam+this_lparam;
-
- /* primary request */
- SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */
- SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */
- SSVAL(outbuf,smb_mprcnt,mparam); /* mprcnt */
- SSVAL(outbuf,smb_mdrcnt,mdata); /* mdrcnt */
- SCVAL(outbuf,smb_msrcnt,msetup); /* msrcnt */
- SSVAL(outbuf,smb_flags,flags); /* flags */
- SIVAL(outbuf,smb_timeout,0); /* timeout */
- SSVAL(outbuf,smb_pscnt,this_lparam); /* pscnt */
- SSVAL(outbuf,smb_psoff,smb_offset(outparam,outbuf)); /* psoff */
- SSVAL(outbuf,smb_dscnt,this_ldata); /* dscnt */
- SSVAL(outbuf,smb_dsoff,smb_offset(outdata,outbuf)); /* dsoff */
- SCVAL(outbuf,smb_suwcnt,lsetup); /* suwcnt */
- for (i=0;i<lsetup;i++) /* setup[] */
- SSVAL(outbuf,smb_setup+i*SIZEOFWORD,setup[i]);
- p = smb_buf(outbuf);
- if (trans==SMBtrans)
- strcpy(p,name); /* name[] */
- else
- {
- *p++ = 0; /* put in a null smb_name */
- *p++ = 'D'; *p++ = ' '; /* this was added because OS/2 does it */
- }
- if (this_lparam) /* param[] */
- memcpy(outparam,param,this_lparam);
- if (this_ldata) /* data[] */
- memcpy(outdata,data,this_ldata);
- set_message(outbuf,14+lsetup, /* wcnt, bcc */
- PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- if (this_ldata < ldata || this_lparam < lparam)
- {
- /* receive interim response */
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s request failed (%s)\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", smb_errstr(inbuf)));
- return(False);
- }
-
- tot_data = this_ldata;
- tot_param = this_lparam;
-
- while (tot_data < ldata || tot_param < lparam)
- {
- this_lparam = MIN(lparam-tot_param,max_xmit - 500); /* hack */
- this_ldata = MIN(ldata-tot_data,max_xmit - (500+this_lparam));
-
- set_message(outbuf,trans==SMBtrans?8:9,0,True);
- CVAL(outbuf,smb_com) = trans==SMBtrans ? SMBtranss : SMBtranss2;
-
- outparam = smb_buf(outbuf);
- outdata = outparam+this_lparam;
-
- /* secondary request */
- SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */
- SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */
- SSVAL(outbuf,smb_spscnt,this_lparam); /* pscnt */
- SSVAL(outbuf,smb_spsoff,smb_offset(outparam,outbuf)); /* psoff */
- SSVAL(outbuf,smb_spsdisp,tot_param); /* psdisp */
- SSVAL(outbuf,smb_sdscnt,this_ldata); /* dscnt */
- SSVAL(outbuf,smb_sdsoff,smb_offset(outdata,outbuf)); /* dsoff */
- SSVAL(outbuf,smb_sdsdisp,tot_data); /* dsdisp */
- if (trans==SMBtrans2)
- SSVAL(outbuf,smb_sfid,fid); /* fid */
- if (this_lparam) /* param[] */
- memcpy(outparam,param,this_lparam);
- if (this_ldata) /* data[] */
- memcpy(outdata,data,this_ldata);
- set_message(outbuf,trans==SMBtrans?8:9, /* wcnt, bcc */
- PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- tot_data += this_ldata;
- tot_param += this_lparam;
- }
- }
-
- return(True);
-}
-
-/****************************************************************************
-try and browse available connections on a host
-****************************************************************************/
-static BOOL browse_host(BOOL sort)
-{
-#ifdef NOSTRCASECMP
-/* If strcasecmp is already defined, remove it. */
-#ifdef strcasecmp
-#undef strcasecmp
-#endif /* strcasecmp */
-#define strcasecmp StrCaseCmp
-#endif /* NOSTRCASECMP */
-
- extern int strcasecmp();
-
- char *rparam = NULL;
- char *rdata = NULL;
- char *p;
- int rdrcnt,rprcnt;
- pstring param;
- int count = -1;
-
- /* now send a SMBtrans command with api RNetShareEnum */
- p = param;
- SSVAL(p,0,0); /* api number */
- p += 2;
- strcpy(p,"WrLeh");
- p = skip_string(p,1);
- strcpy(p,"B13BWz");
- p = skip_string(p,1);
- SSVAL(p,0,1);
- SSVAL(p,2,BUFFER_SIZE);
- p += 4;
-
- if (call_api(PTR_DIFF(p,param),0,
- 1024,BUFFER_SIZE,
- &rprcnt,&rdrcnt,
- param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
- int i;
- BOOL long_share_name=False;
-
- if (res == 0)
- {
- count=SVAL(rparam,4);
- p = rdata;
-
- if (count > 0)
- {
- printf("\n\tSharename Type Comment\n");
- printf("\t--------- ---- -------\n");
- }
-
- if (sort)
- qsort(p,count,20,QSORT_CAST strcasecmp);
-
- for (i=0;i<count;i++)
- {
- char *sname = p;
- int type = SVAL(p,14);
- int comment_offset = IVAL(p,16) & 0xFFFF;
- fstring typestr;
- *typestr=0;
-
- switch (type)
- {
- case STYPE_DISKTREE:
- strcpy(typestr,"Disk"); break;
- case STYPE_PRINTQ:
- strcpy(typestr,"Printer"); break;
- case STYPE_DEVICE:
- strcpy(typestr,"Device"); break;
- case STYPE_IPC:
- strcpy(typestr,"IPC"); break;
- }
-
- printf("\t%-15.15s%-10.10s%s\n",
- sname,
- typestr,
- comment_offset?rdata+comment_offset-converter:"");
-
- if (strlen(sname)>8) long_share_name=True;
-
- p += 20;
- }
-
- if (long_share_name) {
- printf("\nNOTE: There were share names longer than 8 chars.\nOn older clients these may not be accessible or may give browsing errors\n");
- }
- }
- }
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return(count>0);
-}
-
-
-/****************************************************************************
-get some server info
-****************************************************************************/
-static void server_info()
-{
- char *rparam = NULL;
- char *rdata = NULL;
- char *p;
- int rdrcnt,rprcnt;
- pstring param;
-
- bzero(param,sizeof(param));
-
- p = param;
- SSVAL(p,0,63); /* NetServerGetInfo()? */
- p += 2;
- strcpy(p,"WrLh");
- p = skip_string(p,1);
- strcpy(p,"zzzBBzz");
- p = skip_string(p,1);
- SSVAL(p,0,10); /* level 10 */
- SSVAL(p,2,1000);
- p += 6;
-
- if (call_api(PTR_DIFF(p,param),0,
- 6,1000,
- &rprcnt,&rdrcnt,
- param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
-
- if (res == 0)
- {
- p = rdata;
-
- printf("\nServer=[%s] User=[%s] Workgroup=[%s] Domain=[%s]\n",
- rdata+SVAL(p,0)-converter,
- rdata+SVAL(p,4)-converter,
- rdata+SVAL(p,8)-converter,
- rdata+SVAL(p,14)-converter);
- }
- }
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return;
-}
-
-
-/****************************************************************************
-try and browse available connections on a host
-****************************************************************************/
-static BOOL list_servers(char *wk_grp)
-{
- char *rparam = NULL;
- char *rdata = NULL;
- int rdrcnt,rprcnt;
- char *p,*svtype_p;
- pstring param;
- int uLevel = 1;
- int count = 0;
- BOOL ok = False;
- BOOL generic_request = False;
-
-
- if (strequal(wk_grp,"WORKGROUP")) {
- /* we won't specify a workgroup */
- generic_request = True;
- }
-
- /* now send a SMBtrans command with api ServerEnum? */
- p = param;
- SSVAL(p,0,0x68); /* api number */
- p += 2;
-
- strcpy(p,generic_request?"WrLehDO":"WrLehDz");
- p = skip_string(p,1);
-
- strcpy(p,"B16BBDz");
-
- p = skip_string(p,1);
- SSVAL(p,0,uLevel);
- SSVAL(p,2,BUFFER_SIZE - SAFETY_MARGIN); /* buf length */
- p += 4;
-
- svtype_p = p;
- p += 4;
-
- if (!generic_request) {
- strcpy(p, wk_grp);
- p = skip_string(p,1);
- }
-
- /* first ask for a list of servers in this workgroup */
- SIVAL(svtype_p,0,SV_TYPE_ALL);
-
- if (call_api(PTR_DIFF(p+4,param),0,
- 8,BUFFER_SIZE - SAFETY_MARGIN,
- &rprcnt,&rdrcnt,
- param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
- int i;
-
- if (res == 0) {
- char *p2 = rdata;
- count=SVAL(rparam,4);
-
- if (count > 0) {
- printf("\n\nThis machine has a browse list:\n");
- printf("\n\tServer Comment\n");
- printf("\t--------- -------\n");
- }
-
- for (i=0;i<count;i++) {
- char *sname = p2;
- int comment_offset = IVAL(p2,22) & 0xFFFF;
- printf("\t%-16.16s %s\n",
- sname,
- comment_offset?rdata+comment_offset-converter:"");
-
- ok=True;
- p2 += 26;
- }
- }
- }
-
- if (rparam) {free(rparam); rparam = NULL;}
- if (rdata) {free(rdata); rdata = NULL;}
-
- /* now ask for a list of workgroups */
- SIVAL(svtype_p,0,SV_TYPE_DOMAIN_ENUM);
-
- if (call_api(PTR_DIFF(p+4,param),0,
- 8,BUFFER_SIZE - SAFETY_MARGIN,
- &rprcnt,&rdrcnt,
- param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
- int i;
-
- if (res == 0) {
- char *p2 = rdata;
- count=SVAL(rparam,4);
-
- if (count > 0) {
- printf("\n\nThis machine has a workgroup list:\n");
- printf("\n\tWorkgroup Master\n");
- printf("\t--------- -------\n");
- }
-
- for (i=0;i<count;i++) {
- char *sname = p2;
- int comment_offset = IVAL(p2,22) & 0xFFFF;
- printf("\t%-16.16s %s\n",
- sname,
- comment_offset?rdata+comment_offset-converter:"");
-
- ok=True;
- p2 += 26;
- }
- }
- }
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return(ok);
-}
-
-
-/* This defines the commands supported by this client */
-struct
-{
- char *name;
- void (*fn)();
- char *description;
-} commands[] =
-{
- {"ls",cmd_dir,"<mask> list the contents of the current directory"},
- {"dir",cmd_dir,"<mask> list the contents of the current directory"},
- {"lcd",cmd_lcd,"[directory] change/report the local current working directory"},
- {"cd",cmd_cd,"[directory] change/report the remote directory"},
- {"pwd",cmd_pwd,"show current remote directory (same as 'cd' with no args)"},
- {"get",cmd_get,"<remote name> [local name] get a file"},
- {"mget",cmd_mget,"<mask> get all the matching files"},
- {"put",cmd_put,"<local name> [remote name] put a file"},
- {"mput",cmd_mput,"<mask> put all matching files"},
- {"rename",cmd_rename,"<src> <dest> rename some files"},
- {"more",cmd_more,"<remote name> view a remote file with your pager"},
- {"mask",cmd_select,"<mask> mask all filenames against this"},
- {"del",cmd_del,"<mask> delete all matching files"},
- {"rm",cmd_del,"<mask> delete all matching files"},
- {"mkdir",cmd_mkdir,"<directory> make a directory"},
- {"md",cmd_mkdir,"<directory> make a directory"},
- {"rmdir",cmd_rmdir,"<directory> remove a directory"},
- {"rd",cmd_rmdir,"<directory> remove a directory"},
- {"pq",cmd_p_queue_4,"enumerate the print queue"},
- {"prompt",cmd_prompt,"toggle prompting for filenames for mget and mput"},
- {"recurse",cmd_recurse,"toggle directory recursion for mget and mput"},
- {"translate",cmd_translate,"toggle text translation for printing"},
- {"lowercase",cmd_lowercase,"toggle lowercasing of filenames for get"},
- {"print",cmd_print,"<file name> print a file"},
- {"printmode",cmd_printmode,"<graphics or text> set the print mode"},
- {"queue",cmd_queue,"show the print queue"},
- {"qinfo",cmd_qinfo,"show print queue information"},
- {"cancel",cmd_cancel,"<jobid> cancel a print queue entry"},
- {"stat",cmd_stat,"<file> get info on a file (experimental!)"},
- {"quit",send_logout,"logoff the server"},
- {"q",send_logout,"logoff the server"},
- {"exit",send_logout,"logoff the server"},
- {"newer",cmd_newer,"<file> only mget files newer than the specified local file"},
- {"archive",cmd_archive,"<level>\n0=ignore archive bit\n1=only get archive files\n2=only get archive files and reset archive bit\n3=get all files and reset archive bit"},
- {"tar",cmd_tar,"tar <c|x>[IXbgNa] current directory to/from <file name>" },
- {"blocksize",cmd_block,"blocksize <number> (default 20)" },
- {"tarmode",cmd_tarmode,
- "<full|inc|reset|noreset> tar's behaviour towards archive bits" },
- {"setmode",cmd_setmode,"filename <setmode string> change modes of file"},
- {"help",cmd_help,"[command] give help on a command"},
- {"?",cmd_help,"[command] give help on a command"},
- {"!",NULL,"run a shell command on the local system"},
- {"",NULL,NULL}
-};
-
-
-/*******************************************************************
- lookup a command string in the list of commands, including
- abbreviations
- ******************************************************************/
-static int process_tok(fstring tok)
-{
- int i = 0, matches = 0;
- int cmd=0;
- int tok_len = strlen(tok);
-
- while (commands[i].fn != NULL)
- {
- if (strequal(commands[i].name,tok))
- {
- matches = 1;
- cmd = i;
- break;
- }
- else if (strnequal(commands[i].name, tok, tok_len+1))
- {
- matches++;
- cmd = i;
- }
- i++;
- }
-
- if (matches == 0)
- return(-1);
- else if (matches == 1)
- return(cmd);
- else
- return(-2);
-}
-
-/****************************************************************************
-help
-****************************************************************************/
-void cmd_help(void)
-{
- int i=0,j;
- fstring buf;
-
- if (next_token(NULL,buf,NULL))
- {
- if ((i = process_tok(buf)) >= 0)
- DEBUG(0,("HELP %s:\n\t%s\n\n",commands[i].name,commands[i].description));
- }
- else
- while (commands[i].description)
- {
- for (j=0; commands[i].description && (j<5); j++) {
- DEBUG(0,("%-15s",commands[i].name));
- i++;
- }
- DEBUG(0,("\n"));
- }
-}
-
-/****************************************************************************
-open the client sockets
-****************************************************************************/
-static BOOL open_sockets(int port )
-{
- static int last_port;
- char *host;
- pstring service2;
- extern int Client;
-#ifdef USENMB
- BOOL failed = True;
-#endif
-
- if (port == 0) port=last_port;
- last_port=port;
-
- strupper(service);
-
- if (*desthost)
- {
- host = desthost;
- }
- else
- {
- strcpy(service2,service);
- host = strtok(service2,"\\/");
- if (!host) {
- DEBUG(0,("Badly formed host name\n"));
- return(False);
- }
- strcpy(desthost,host);
- }
-
- if (*myname == 0) {
- get_myname(myname,NULL);
- }
- strupper(myname);
-
- DEBUG(3,("Opening sockets\n"));
-
- if (!have_ip)
- {
- struct hostent *hp;
-
- if ((hp = Get_Hostbyname(host))) {
- putip((char *)&dest_ip,(char *)hp->h_addr);
- failed = False;
- } else {
-#ifdef USENMB
- /* Try and resolve the name with the netbios server */
- int bcast;
-
- if ((bcast = open_socket_in(SOCK_DGRAM, 0, 3,
- interpret_addr(lp_socket_address()))) != -1) {
- set_socket_options(bcast, "SO_BROADCAST");
-
- if (name_query(bcast, host, name_type, True, True, *iface_bcast(dest_ip),
- &dest_ip,0)) {
- failed = False;
- }
- close (bcast);
- }
-#endif
- if (failed) {
- DEBUG(0,("Get_Hostbyname: Unknown host %s.\n",host));
- return False;
- }
- }
- }
-
- Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
- if (Client == -1)
- return False;
-
- DEBUG(3,("Connected\n"));
-
- set_socket_options(Client,user_socket_options);
-
- return True;
-}
-
-/****************************************************************************
-wait for keyboard activity, swallowing network packets
-****************************************************************************/
-#ifdef CLIX
-static char wait_keyboard(char *buffer)
-#else
-static void wait_keyboard(char *buffer)
-#endif
-{
- fd_set fds;
- int selrtn;
- struct timeval timeout;
-
-#ifdef CLIX
- int delay = 0;
-#endif
-
- while (1)
- {
- extern int Client;
- FD_ZERO(&fds);
- FD_SET(Client,&fds);
-#ifndef CLIX
- FD_SET(fileno(stdin),&fds);
-#endif
-
- timeout.tv_sec = 20;
- timeout.tv_usec = 0;
-#ifdef CLIX
- timeout.tv_sec = 0;
-#endif
- selrtn = sys_select(&fds,&timeout);
-
-#ifndef CLIX
- if (FD_ISSET(fileno(stdin),&fds))
- return;
-#else
- {
- char ch;
- int readret;
-
- set_blocking(fileno(stdin), False);
- readret = read_data( fileno(stdin), &ch, 1);
- set_blocking(fileno(stdin), True);
- if (readret == -1)
- {
- if (errno != EAGAIN)
- {
- /* should crash here */
- DEBUG(1,("readchar stdin failed\n"));
- }
- }
- else if (readret != 0)
- {
- return ch;
- }
- }
-#endif
- if (FD_ISSET(Client,&fds))
- receive_smb(Client,buffer,0);
-
-#ifdef CLIX
- delay++;
- if (delay > 100000)
- {
- delay = 0;
- chkpath("\\",False);
- }
-#else
- chkpath("\\",False);
-#endif
- }
-}
-
-
-/****************************************************************************
-close and open the connection again
-****************************************************************************/
-BOOL reopen_connection(char *inbuf,char *outbuf)
-{
- static int open_count=0;
-
- open_count++;
-
- if (open_count>5) return(False);
-
- DEBUG(1,("Trying to re-open connection\n"));
-
- set_message(outbuf,0,0,True);
- SCVAL(outbuf,smb_com,SMBtdis);
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
-
- close_sockets();
- if (!open_sockets(0)) return(False);
-
- return(send_login(inbuf,outbuf,True,True));
-}
-
-/****************************************************************************
- process commands from the client
-****************************************************************************/
-static BOOL process(char *base_directory)
-{
- extern FILE *dbf;
- pstring line;
- char *cmd;
-
- char *InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- char *OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if ((InBuffer == NULL) || (OutBuffer == NULL))
- return(False);
-
- bzero(OutBuffer,smb_size);
-
- if (!send_login(InBuffer,OutBuffer,True,True))
- return(False);
-
- if (*base_directory) do_cd(base_directory);
-
- cmd = cmdstr;
- if (cmd[0] != '\0') while (cmd[0] != '\0')
- {
- char *p;
- fstring tok;
- int i;
-
- if ((p = strchr(cmd, ';')) == 0)
- {
- strncpy(line, cmd, 999);
- line[1000] = '\0';
- cmd += strlen(cmd);
- }
- else
- {
- if (p - cmd > 999) p = cmd + 999;
- strncpy(line, cmd, p - cmd);
- line[p - cmd] = '\0';
- cmd = p + 1;
- }
-
- /* input language code to internal one */
- CNV_INPUT (line);
-
- /* and get the first part of the command */
- {
- char *ptr = line;
- if (!next_token(&ptr,tok,NULL)) continue;
- }
-
- if ((i = process_tok(tok)) >= 0)
- commands[i].fn(InBuffer,OutBuffer);
- else if (i == -2)
- DEBUG(0,("%s: command abbreviation ambiguous\n",CNV_LANG(tok)));
- else
- DEBUG(0,("%s: command not found\n",CNV_LANG(tok)));
- }
- else while (!feof(stdin))
- {
- fstring tok;
- int i;
-
- bzero(OutBuffer,smb_size);
-
- /* display a prompt */
- DEBUG(0,("smb: %s> ", CNV_LANG(cur_dir)));
- fflush(dbf);
-
-#ifdef CLIX
- line[0] = wait_keyboard(InBuffer);
- /* this might not be such a good idea... */
- if ( line[0] == EOF)
- break;
-#else
- wait_keyboard(InBuffer);
-#endif
-
- /* and get a response */
-#ifdef CLIX
- fgets( &line[1],999, stdin);
-#else
- if (!fgets(line,1000,stdin))
- break;
-#endif
-
- /* input language code to internal one */
- CNV_INPUT (line);
-
- /* special case - first char is ! */
- if (*line == '!')
- {
- system(line + 1);
- continue;
- }
-
- /* and get the first part of the command */
- {
- char *ptr = line;
- if (!next_token(&ptr,tok,NULL)) continue;
- }
-
- if ((i = process_tok(tok)) >= 0)
- commands[i].fn(InBuffer,OutBuffer);
- else if (i == -2)
- DEBUG(0,("%s: command abbreviation ambiguous\n",CNV_LANG(tok)));
- else
- DEBUG(0,("%s: command not found\n",CNV_LANG(tok)));
- }
-
- send_logout();
- return(True);
-}
-
-
-/****************************************************************************
-usage on the program
-****************************************************************************/
-static void usage(char *pname)
-{
- DEBUG(0,("Usage: %s service <password> [-p port] [-d debuglevel] [-l log] ",
- pname));
-
- DEBUG(0,("\nVersion %s\n",VERSION));
- DEBUG(0,("\t-p port listen on the specified port\n"));
- DEBUG(0,("\t-d debuglevel set the debuglevel\n"));
- DEBUG(0,("\t-l log basename. Basename for log/debug files\n"));
- DEBUG(0,("\t-n netbios name. Use this name as my netbios name\n"));
- DEBUG(0,("\t-N don't ask for a password\n"));
- DEBUG(0,("\t-P connect to service as a printer\n"));
- DEBUG(0,("\t-M host send a winpopup message to the host\n"));
- DEBUG(0,("\t-m max protocol set the max protocol level\n"));
- DEBUG(0,("\t-L host get a list of shares available on a host\n"));
- DEBUG(0,("\t-I dest IP use this IP to connect to\n"));
- DEBUG(0,("\t-E write messages to stderr instead of stdout\n"));
- DEBUG(0,("\t-U username set the network username\n"));
- DEBUG(0,("\t-W workgroup set the workgroup name\n"));
- DEBUG(0,("\t-c command string execute semicolon separated commands\n"));
- DEBUG(0,("\t-t terminal code terminal i/o code {sjis|euc|jis7|jis8|junet|hex}\n"));
- DEBUG(0,("\t-T<c|x>IXgbNa command line tar\n"));
- DEBUG(0,("\t-D directory start from directory\n"));
- DEBUG(0,("\n"));
-}
-
-/****************************************************************************
- main program
-****************************************************************************/
- int main(int argc,char *argv[])
-{
- fstring base_directory;
- char *pname = argv[0];
- int port = SMB_PORT;
- int opt;
- extern FILE *dbf;
- extern char *optarg;
- extern int optind;
- pstring query_host;
- BOOL message = False;
- extern char tar_type;
- static pstring servicesf = CONFIGFILE;
- pstring term_code;
- char *p;
-
-#ifdef KANJI
- strcpy(term_code, KANJI);
-#else /* KANJI */
- *term_code = 0;
-#endif /* KANJI */
-
- *query_host = 0;
- *base_directory = 0;
-
- DEBUGLEVEL = 2;
-
- setup_logging(pname,True);
-
- TimeInit();
- charset_initialise();
-
- pid = getpid();
- uid = getuid();
- gid = getgid();
- mid = pid + 100;
- myumask = umask(0);
- umask(myumask);
-
- if (getenv("USER"))
- {
- strcpy(username,getenv("USER"));
-
- /* modification to support userid%passwd syntax in the USER var
- 25.Aug.97, jdblair@uab.edu */
-
- if ((p=strchr(username,'%')))
- {
- *p = 0;
- strcpy(password,p+1);
- got_pass = True;
- memset(strchr(getenv("USER"),'%')+1,'X',strlen(password));
- }
- strupper(username);
- }
-
- /* modification to support PASSWD environmental var
- 25.Aug.97, jdblair@uab.edu */
-
- if (getenv("PASSWD"))
- strcpy(password,getenv("PASSWD"));
-
- if (*username == 0 && getenv("LOGNAME"))
- {
- strcpy(username,getenv("LOGNAME"));
- strupper(username);
- }
-
- if (argc < 2)
- {
- usage(pname);
- exit(1);
- }
-
- if (*argv[1] != '-')
- {
-
- strcpy(service,argv[1]);
- /* Convert any '/' characters in the service name to '\' characters */
- string_replace( service, '/','\\');
- argc--;
- argv++;
-
- if (count_chars(service,'\\') < 3)
- {
- usage(pname);
- printf("\n%s: Not enough '\\' characters in service\n",service);
- exit(1);
- }
-
-/*
- if (count_chars(service,'\\') > 3)
- {
- usage(pname);
- printf("\n%s: Too many '\\' characters in service\n",service);
- exit(1);
- }
- */
-
- if (argc > 1 && (*argv[1] != '-'))
- {
- got_pass = True;
- strcpy(password,argv[1]);
- memset(argv[1],'X',strlen(argv[1]));
- argc--;
- argv++;
- }
- }
-
- while ((opt =
- getopt(argc, argv,"s:B:O:M:i:Nn:d:Pp:l:hI:EB:U:L:t:m:W:T:D:c:")) != EOF)
- switch (opt)
- {
- case 'm':
- max_protocol = interpret_protocol(optarg,max_protocol);
- break;
- case 'O':
- strcpy(user_socket_options,optarg);
- break;
- case 'M':
- name_type = 0x03; /* messages are sent to NetBIOS name type 0x3 */
- strcpy(desthost,optarg);
- strupper(desthost);
- message = True;
- break;
- case 'B':
- iface_set_default(NULL,optarg,NULL);
- break;
- case 'D':
- strcpy(base_directory,optarg);
- break;
- case 'T':
- if (!tar_parseargs(argc, argv, optarg, optind)) {
- usage(pname);
- exit(1);
- }
- break;
- case 'i':
- strcpy(scope,optarg);
- break;
- case 'L':
- got_pass = True;
- strcpy(query_host,optarg);
- break;
- case 'U':
- {
- char *lp;
- strcpy(username,optarg);
- if ((lp=strchr(username,'%')))
- {
- *lp = 0;
- strcpy(password,lp+1);
- got_pass = True;
- memset(strchr(optarg,'%')+1,'X',strlen(password));
- }
- }
-
- break;
- case 'W':
- strcpy(workgroup,optarg);
- break;
- case 'E':
- dbf = stderr;
- break;
- case 'I':
- {
- dest_ip = *interpret_addr2(optarg);
- if (zero_ip(dest_ip)) exit(1);
- have_ip = True;
- }
- break;
- case 'n':
- strcpy(myname,optarg);
- break;
- case 'N':
- got_pass = True;
- break;
- case 'P':
- connect_as_printer = True;
- break;
- case 'd':
- if (*optarg == 'A')
- DEBUGLEVEL = 10000;
- else
- DEBUGLEVEL = atoi(optarg);
- break;
- case 'l':
- sprintf(debugf,"%s.client",optarg);
- break;
- case 'p':
- port = atoi(optarg);
- break;
- case 'c':
- cmdstr = optarg;
- got_pass = True;
- break;
- case 'h':
- usage(pname);
- exit(0);
- break;
- case 's':
- strcpy(servicesf, optarg);
- break;
- case 't':
- strcpy(term_code, optarg);
- break;
- default:
- usage(pname);
- exit(1);
- }
-
- if (!tar_type && !*query_host && !*service && !message)
- {
- usage(pname);
- exit(1);
- }
-
-
- DEBUG(3,("%s client started (version %s)\n",timestring(),VERSION));
-
- if(!get_myname(myhostname,NULL))
- {
- DEBUG(0,("Failed to get my hostname.\n"));
- }
-
- if (!lp_load(servicesf,True)) {
- fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf);
- }
-
- codepage_initialise(lp_client_code_page());
-
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- if (!setup_term_code (term_code))
- {
- DEBUG(0, ("%s: unknown terminal code name\n", optarg));
- usage (pname);
- exit (1);
- }
- }
-
- if (*workgroup == 0)
- strcpy(workgroup,lp_workgroup());
-
- load_interfaces();
- get_myname(*myname?NULL:myname,NULL);
- strupper(myname);
-
- if (tar_type) {
- recurse=True;
-
- if (open_sockets(port)) {
- char *InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- char *OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- int ret;
-
- if ((InBuffer == NULL) || (OutBuffer == NULL))
- return(1);
-
- bzero(OutBuffer,smb_size);
- if (!send_login(InBuffer,OutBuffer,True,True))
- return(False);
-
- if (*base_directory) do_cd(base_directory);
-
- ret=process_tar(InBuffer, OutBuffer);
-
- send_logout();
- close_sockets();
- return(ret);
- } else
- return(1);
- }
-
- if (*query_host)
- {
- int ret = 0;
- sprintf(service,"\\\\%s\\IPC$",query_host);
- strupper(service);
- connect_as_ipc = True;
- if (open_sockets(port))
- {
-#if 0
- *username = 0;
-#endif
- if (!send_login(NULL,NULL,True,True))
- return(1);
-
- server_info();
- if (!browse_host(True)) {
- sleep(1);
- browse_host(True);
- }
- if (!list_servers(workgroup)) {
- sleep(1);
- list_servers(workgroup);
- }
-
- send_logout();
- close_sockets();
- }
-
- return(ret);
- }
-
- if (message)
- {
- int ret = 0;
- if (open_sockets(port))
- {
- pstring inbuf,outbuf;
- bzero(outbuf,smb_size);
- if (!send_session_request(inbuf,outbuf))
- return(1);
-
- send_message(inbuf,outbuf);
-
- close_sockets();
- }
-
- return(ret);
- }
-
- if (open_sockets(port))
- {
- if (!process(base_directory))
- {
- close_sockets();
- return(1);
- }
- close_sockets();
- }
- else
- return(1);
-
- return(0);
-}
-
-
-/* error code stuff - put together by Merik Karman
- merik@blackadder.dsh.oz.au */
-
-typedef struct
-{
- char *name;
- int code;
- char *message;
-} err_code_struct;
-
-/* Dos Error Messages */
-err_code_struct dos_msgs[] = {
- {"ERRbadfunc",1,"Invalid function."},
- {"ERRbadfile",2,"File not found."},
- {"ERRbadpath",3,"Directory invalid."},
- {"ERRnofids",4,"No file descriptors available"},
- {"ERRnoaccess",5,"Access denied."},
- {"ERRbadfid",6,"Invalid file handle."},
- {"ERRbadmcb",7,"Memory control blocks destroyed."},
- {"ERRnomem",8,"Insufficient server memory to perform the requested function."},
- {"ERRbadmem",9,"Invalid memory block address."},
- {"ERRbadenv",10,"Invalid environment."},
- {"ERRbadformat",11,"Invalid format."},
- {"ERRbadaccess",12,"Invalid open mode."},
- {"ERRbaddata",13,"Invalid data."},
- {"ERR",14,"reserved."},
- {"ERRbaddrive",15,"Invalid drive specified."},
- {"ERRremcd",16,"A Delete Directory request attempted to remove the server's current directory."},
- {"ERRdiffdevice",17,"Not same device."},
- {"ERRnofiles",18,"A File Search command can find no more files matching the specified criteria."},
- {"ERRbadshare",32,"The sharing mode specified for an Open conflicts with existing FIDs on the file."},
- {"ERRlock",33,"A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."},
- {"ERRfilexists",80,"The file named in a Create Directory, Make New File or Link request already exists."},
- {"ERRbadpipe",230,"Pipe invalid."},
- {"ERRpipebusy",231,"All instances of the requested pipe are busy."},
- {"ERRpipeclosing",232,"Pipe close in progress."},
- {"ERRnotconnected",233,"No process on other end of pipe."},
- {"ERRmoredata",234,"There is more data to be returned."},
- {"ERRinvgroup",2455,"Invalid workgroup (try the -W option)"},
- {NULL,-1,NULL}};
-
-/* Server Error Messages */
-err_code_struct server_msgs[] = {
- {"ERRerror",1,"Non-specific error code."},
- {"ERRbadpw",2,"Bad password - name/password pair in a Tree Connect or Session Setup are invalid."},
- {"ERRbadtype",3,"reserved."},
- {"ERRaccess",4,"The requester does not have the necessary access rights within the specified context for the requested function. The context is defined by the TID or the UID."},
- {"ERRinvnid",5,"The tree ID (TID) specified in a command was invalid."},
- {"ERRinvnetname",6,"Invalid network name in tree connect."},
- {"ERRinvdevice",7,"Invalid device - printer request made to non-printer connection or non-printer request made to printer connection."},
- {"ERRqfull",49,"Print queue full (files) -- returned by open print file."},
- {"ERRqtoobig",50,"Print queue full -- no space."},
- {"ERRqeof",51,"EOF on print queue dump."},
- {"ERRinvpfid",52,"Invalid print file FID."},
- {"ERRsmbcmd",64,"The server did not recognize the command received."},
- {"ERRsrverror",65,"The server encountered an internal error, e.g., system file unavailable."},
- {"ERRfilespecs",67,"The file handle (FID) and pathname parameters contained an invalid combination of values."},
- {"ERRreserved",68,"reserved."},
- {"ERRbadpermits",69,"The access permissions specified for a file or directory are not a valid combination. The server cannot set the requested attribute."},
- {"ERRreserved",70,"reserved."},
- {"ERRsetattrmode",71,"The attribute mode in the Set File Attribute request is invalid."},
- {"ERRpaused",81,"Server is paused."},
- {"ERRmsgoff",82,"Not receiving messages."},
- {"ERRnoroom",83,"No room to buffer message."},
- {"ERRrmuns",87,"Too many remote user names."},
- {"ERRtimeout",88,"Operation timed out."},
- {"ERRnoresource",89,"No resources currently available for request."},
- {"ERRtoomanyuids",90,"Too many UIDs active on this session."},
- {"ERRbaduid",91,"The UID is not known as a valid ID on this session."},
- {"ERRusempx",250,"Temp unable to support Raw, use MPX mode."},
- {"ERRusestd",251,"Temp unable to support Raw, use standard read/write."},
- {"ERRcontmpx",252,"Continue in MPX mode."},
- {"ERRreserved",253,"reserved."},
- {"ERRreserved",254,"reserved."},
- {"ERRnosupport",0xFFFF,"Function not supported."},
- {NULL,-1,NULL}};
-
-/* Hard Error Messages */
-err_code_struct hard_msgs[] = {
- {"ERRnowrite",19,"Attempt to write on write-protected diskette."},
- {"ERRbadunit",20,"Unknown unit."},
- {"ERRnotready",21,"Drive not ready."},
- {"ERRbadcmd",22,"Unknown command."},
- {"ERRdata",23,"Data error (CRC)."},
- {"ERRbadreq",24,"Bad request structure length."},
- {"ERRseek",25 ,"Seek error."},
- {"ERRbadmedia",26,"Unknown media type."},
- {"ERRbadsector",27,"Sector not found."},
- {"ERRnopaper",28,"Printer out of paper."},
- {"ERRwrite",29,"Write fault."},
- {"ERRread",30,"Read fault."},
- {"ERRgeneral",31,"General failure."},
- {"ERRbadshare",32,"An open conflicts with an existing open."},
- {"ERRlock",33,"A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."},
- {"ERRwrongdisk",34,"The wrong disk was found in a drive."},
- {"ERRFCBUnavail",35,"No FCBs are available to process request."},
- {"ERRsharebufexc",36,"A sharing buffer has been exceeded."},
- {NULL,-1,NULL}};
-
-
-struct
-{
- int code;
- char *class;
- err_code_struct *err_msgs;
-} err_classes[] = {
- {0,"SUCCESS",NULL},
- {0x01,"ERRDOS",dos_msgs},
- {0x02,"ERRSRV",server_msgs},
- {0x03,"ERRHRD",hard_msgs},
- {0x04,"ERRXOS",NULL},
- {0xE1,"ERRRMX1",NULL},
- {0xE2,"ERRRMX2",NULL},
- {0xE3,"ERRRMX3",NULL},
- {0xFF,"ERRCMD",NULL},
- {-1,NULL,NULL}};
-
-
-/****************************************************************************
-return a SMB error string from a SMB buffer
-****************************************************************************/
-char *smb_errstr(char *inbuf)
-{
- static pstring ret;
- int class = CVAL(inbuf,smb_rcls);
- int num = SVAL(inbuf,smb_err);
- int i,j;
-
- for (i=0;err_classes[i].class;i++)
- if (err_classes[i].code == class)
- {
- if (err_classes[i].err_msgs)
- {
- err_code_struct *err = err_classes[i].err_msgs;
- for (j=0;err[j].name;j++)
- if (num == err[j].code)
- {
- if (DEBUGLEVEL > 0)
- sprintf(ret,"%s - %s (%s)",err_classes[i].class,
- err[j].name,err[j].message);
- else
- sprintf(ret,"%s - %s",err_classes[i].class,err[j].name);
- return ret;
- }
- }
-
- sprintf(ret,"%s - %d",err_classes[i].class,num);
- return ret;
- }
-
- sprintf(ret,"Error: Unknown error (%d,%d)",class,num);
- return(ret);
-}
diff --git a/source/client/clientutil.c b/source/client/clientutil.c
deleted file mode 100644
index 01b4a093214..00000000000
--- a/source/client/clientutil.c
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB client
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-
-#ifndef REGISTER
-#define REGISTER 0
-#endif
-
-pstring service="";
-pstring desthost="";
-extern pstring myname;
-pstring password = "";
-pstring username="";
-pstring workgroup=WORKGROUP;
-BOOL got_pass = False;
-BOOL connect_as_printer = False;
-BOOL connect_as_ipc = False;
-
-char cryptkey[8];
-BOOL doencrypt=False;
-
-extern pstring user_socket_options;
-
-/* 30 second timeout on most commands */
-#define CLIENT_TIMEOUT (30*1000)
-#define SHORT_TIMEOUT (5*1000)
-
-int name_type = 0x20;
-
-int max_protocol = PROTOCOL_NT1;
-
-BOOL readbraw_supported = False;
-BOOL writebraw_supported = False;
-
-extern int DEBUGLEVEL;
-
-int cnum = 0;
-int pid = 0;
-int gid = 0;
-int uid = 0;
-int mid = 0;
-
-int max_xmit = BUFFER_SIZE;
-
-BOOL have_ip = False;
-
-struct in_addr dest_ip;
-
-extern int Protocol;
-
-extern int Client;
-
-
-/****************************************************************************
-setup basics in a outgoing packet
-****************************************************************************/
-void cli_setup_pkt(char *outbuf)
-{
- SSVAL(outbuf,smb_pid,pid);
- SSVAL(outbuf,smb_uid,uid);
- SSVAL(outbuf,smb_mid,mid);
- if (Protocol > PROTOCOL_CORE)
- {
- SCVAL(outbuf,smb_flg,0x8);
- SSVAL(outbuf,smb_flg2,0x1);
- }
-}
-
-/****************************************************************************
- receive a SMB trans or trans2 response allocating the necessary memory
- ****************************************************************************/
-BOOL cli_receive_trans_response(char *inbuf,int trans,int *data_len,
- int *param_len, char **data,char **param)
-{
- int total_data=0;
- int total_param=0;
- int this_data,this_param;
-
- *data_len = *param_len = 0;
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
- show_msg(inbuf);
-
- /* sanity check */
- if (CVAL(inbuf,smb_com) != trans)
- {
- DEBUG(0,("Expected %s response, got command 0x%02x\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com)));
- return(False);
- }
- if (CVAL(inbuf,smb_rcls) != 0)
- return(False);
-
- /* parse out the lengths */
- total_data = SVAL(inbuf,smb_tdrcnt);
- total_param = SVAL(inbuf,smb_tprcnt);
-
- /* allocate it */
- *data = Realloc(*data,total_data);
- *param = Realloc(*param,total_param);
-
- while (1)
- {
- this_data = SVAL(inbuf,smb_drcnt);
- this_param = SVAL(inbuf,smb_prcnt);
-
- if (this_data + *data_len > total_data ||
- this_param + *param_len > total_param) {
- DEBUG(1,("Data overflow in cli_receive_trans_response\n"));
- return False;
- }
-
- if (this_data)
- memcpy(*data + SVAL(inbuf,smb_drdisp),
- smb_base(inbuf) + SVAL(inbuf,smb_droff),
- this_data);
- if (this_param)
- memcpy(*param + SVAL(inbuf,smb_prdisp),
- smb_base(inbuf) + SVAL(inbuf,smb_proff),
- this_param);
- *data_len += this_data;
- *param_len += this_param;
-
- /* parse out the total lengths again - they can shrink! */
- total_data = SVAL(inbuf,smb_tdrcnt);
- total_param = SVAL(inbuf,smb_tprcnt);
-
- if (total_data <= *data_len && total_param <= *param_len)
- break;
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
- show_msg(inbuf);
-
- /* sanity check */
- if (CVAL(inbuf,smb_com) != trans)
- {
- DEBUG(0,("Expected %s response, got command 0x%02x\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", CVAL(inbuf,smb_com)));
- return(False);
- }
- if (CVAL(inbuf,smb_rcls) != 0)
- return(False);
- }
-
- return(True);
-}
-
-/****************************************************************************
-send a session request
-****************************************************************************/
-BOOL cli_send_session_request(char *inbuf, char *outbuf)
-{
- fstring dest;
- char *p;
- int len = 4;
- /* send a session request (RFC 8002) */
-
- fstrcpy(dest,desthost);
-
- p = strchr(dest,'.');
- if (p) *p = 0;
-
- /* put in the destination name */
- p = outbuf+len;
- name_mangle(dest,p,name_type);
- len += name_len(p);
-
- /* and my name */
- p = outbuf+len;
- name_mangle(myname,p,0);
- len += name_len(p);
-
- /* setup the packet length */
- _smb_setlen(outbuf,len);
- CVAL(outbuf,0) = 0x81;
-
- send_smb(Client,outbuf);
- DEBUG(5,("Sent session request\n"));
-
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,0) == 0x84) /* C. Hoch 9/14/95 Start */
- {
- /* For information, here is the response structure.
- * We do the byte-twiddling to for portability.
- struct RetargetResponse{
- unsigned char type;
- unsigned char flags;
- int16 length;
- int32 ip_addr;
- int16 port;
- };
- */
- extern int Client;
- int port = (CVAL(inbuf,8)<<8)+CVAL(inbuf,9);
- /* SESSION RETARGET */
- putip((char *)&dest_ip,inbuf+4);
-
- close_sockets();
- Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
- if (Client == -1)
- return False;
-
- DEBUG(5,("Retargeted\n"));
-
- set_socket_options(Client,user_socket_options);
-
- /* Try again */
- return cli_send_session_request(inbuf,outbuf);
- } /* C. Hoch 9/14/95 End */
-
-
- if (CVAL(inbuf,0) != 0x82)
- {
- int ecode = CVAL(inbuf,4);
- DEBUG(0,("Session request failed (%d,%d) with myname=%s destname=%s\n",
- CVAL(inbuf,0),ecode,myname,desthost));
- switch (ecode)
- {
- case 0x80:
- DEBUG(0,("Not listening on called name\n"));
- DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost));
- DEBUG(0,("You may find the -I option useful for this\n"));
- break;
- case 0x81:
- DEBUG(0,("Not listening for calling name\n"));
- DEBUG(0,("Try to connect as another name (instead of %s)\n",myname));
- DEBUG(0,("You may find the -n option useful for this\n"));
- break;
- case 0x82:
- DEBUG(0,("Called name not present\n"));
- DEBUG(0,("Try to connect to another name (instead of %s)\n",desthost));
- DEBUG(0,("You may find the -I option useful for this\n"));
- break;
- case 0x83:
- DEBUG(0,("Called name present, but insufficient resources\n"));
- DEBUG(0,("Perhaps you should try again later?\n"));
- break;
- default:
- DEBUG(0,("Unspecified error 0x%X\n",ecode));
- DEBUG(0,("Your server software is being unfriendly\n"));
- break;
- }
- return(False);
- }
- return(True);
-}
-
-
-static struct {
- int prot;
- char *name;
- }
-prots[] =
- {
- {PROTOCOL_CORE,"PC NETWORK PROGRAM 1.0"},
- {PROTOCOL_COREPLUS,"MICROSOFT NETWORKS 1.03"},
- {PROTOCOL_LANMAN1,"MICROSOFT NETWORKS 3.0"},
- {PROTOCOL_LANMAN1,"LANMAN1.0"},
- {PROTOCOL_LANMAN2,"LM1.2X002"},
- {PROTOCOL_LANMAN2,"Samba"},
- {PROTOCOL_NT1,"NT LM 0.12"},
- {PROTOCOL_NT1,"NT LANMAN 1.0"},
- {-1,NULL}
- };
-
-/****************************************************************************
-send a login command
-****************************************************************************/
-BOOL cli_send_login(char *inbuf, char *outbuf, BOOL start_session, BOOL use_setup)
-{
- BOOL was_null = (!inbuf && !outbuf);
- int sesskey=0;
- time_t servertime = 0;
- extern int serverzone;
- int sec_mode=0;
- int crypt_len;
- int max_vcs=0;
- char *pass = NULL;
- pstring dev;
- char *p;
- int numprots;
-
- if (was_null)
- {
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- }
-
- pstrcpy(dev,"A:");
- if (connect_as_printer)
- pstrcpy(dev,"LPT1:");
- if (connect_as_ipc)
- pstrcpy(dev,"IPC");
-
-
- if (start_session && !cli_send_session_request(inbuf,outbuf))
- {
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- bzero(outbuf,smb_size);
-
- /* setup the protocol strings */
- {
- int plength;
-
- for (plength=0,numprots=0;
- prots[numprots].name && prots[numprots].prot<=max_protocol;
- numprots++)
- plength += strlen(prots[numprots].name)+2;
-
- set_message(outbuf,0,plength,True);
-
- p = smb_buf(outbuf);
- for (numprots=0;
- prots[numprots].name && prots[numprots].prot<=max_protocol;
- numprots++)
- {
- *p++ = 2;
- strcpy(p,prots[numprots].name);
- p += strlen(p) + 1;
- }
- }
-
- CVAL(outbuf,smb_com) = SMBnegprot;
- cli_setup_pkt(outbuf);
-
- CVAL(smb_buf(outbuf),0) = 2;
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- show_msg(inbuf);
-
- if (CVAL(inbuf,smb_rcls) != 0 || ((int)SVAL(inbuf,smb_vwv0) >= numprots))
- {
- DEBUG(0,("SMBnegprot failed. myname=%s destname=%s - %s \n",
- myname,desthost,smb_errstr(inbuf)));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- Protocol = prots[SVAL(inbuf,smb_vwv0)].prot;
-
-
- if (Protocol < PROTOCOL_NT1) {
- sec_mode = SVAL(inbuf,smb_vwv1);
- max_xmit = SVAL(inbuf,smb_vwv2);
- sesskey = IVAL(inbuf,smb_vwv6);
- serverzone = SVALS(inbuf,smb_vwv10)*60;
- /* this time is converted to GMT by make_unix_date */
- servertime = make_unix_date(inbuf+smb_vwv8);
- if (Protocol >= PROTOCOL_COREPLUS) {
- readbraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x1) != 0);
- writebraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x2) != 0);
- }
- crypt_len = smb_buflen(inbuf);
- memcpy(cryptkey,smb_buf(inbuf),8);
- DEBUG(5,("max mux %d\n",SVAL(inbuf,smb_vwv3)));
- max_vcs = SVAL(inbuf,smb_vwv4);
- DEBUG(5,("max vcs %d\n",max_vcs));
- DEBUG(5,("max blk %d\n",SVAL(inbuf,smb_vwv5)));
- } else {
- /* NT protocol */
- sec_mode = CVAL(inbuf,smb_vwv1);
- max_xmit = IVAL(inbuf,smb_vwv3+1);
- sesskey = IVAL(inbuf,smb_vwv7+1);
- serverzone = SVALS(inbuf,smb_vwv15+1)*60;
- /* this time arrives in real GMT */
- servertime = interpret_long_date(inbuf+smb_vwv11+1);
- crypt_len = CVAL(inbuf,smb_vwv16+1);
- memcpy(cryptkey,smb_buf(inbuf),8);
- if (IVAL(inbuf,smb_vwv9+1) & 1)
- readbraw_supported = writebraw_supported = True;
- DEBUG(5,("max mux %d\n",SVAL(inbuf,smb_vwv1+1)));
- max_vcs = SVAL(inbuf,smb_vwv2+1);
- DEBUG(5,("max vcs %d\n",max_vcs));
- DEBUG(5,("max raw %d\n",IVAL(inbuf,smb_vwv5+1)));
- DEBUG(5,("capabilities 0x%x\n",IVAL(inbuf,smb_vwv9+1)));
- }
-
- DEBUG(5,("Sec mode %d\n",SVAL(inbuf,smb_vwv1)));
- DEBUG(5,("max xmt %d\n",max_xmit));
- DEBUG(5,("Got %d byte crypt key\n",crypt_len));
- DEBUG(5,("Chose protocol [%s]\n",prots[SVAL(inbuf,smb_vwv0)].name));
-
- doencrypt = ((sec_mode & 2) != 0);
-
- if (servertime) {
- static BOOL done_time = False;
- if (!done_time) {
- DEBUG(1,("Server time is %sTimezone is UTC%+02.1f\n",
- asctime(LocalTime(&servertime)),
- -(double)(serverzone/3600.0)));
- done_time = True;
- }
- }
-
- get_pass:
-
- if (got_pass)
- pass = password;
- else
- pass = (char *)getpass("Password: ");
-
- if(pass == NULL)
- {
- DEBUG(0, ("cli_send_login : no password available - logon failed.\n"));
- return False;
- }
-
- if (Protocol >= PROTOCOL_LANMAN1 && use_setup)
- {
- fstring pword;
- int passlen = strlen(pass)+1;
- fstrcpy(pword,pass);
-
- if (doencrypt && *pass) {
- DEBUG(5,("Using encrypted passwords\n"));
- passlen = 24;
- SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword);
- }
-
- /* if in share level security then don't send a password now */
- if (!(sec_mode & 1)) {fstrcpy(pword, "");passlen=1;}
-
- /* send a session setup command */
- bzero(outbuf,smb_size);
-
- if (passlen > MAX_PASS_LEN) {
- DEBUG(1,("password too long %d\n", passlen));
- return False;
- }
-
- if (Protocol < PROTOCOL_NT1) {
- set_message(outbuf,10,1 + strlen(username) + passlen,True);
- CVAL(outbuf,smb_com) = SMBsesssetupX;
- cli_setup_pkt(outbuf);
-
- CVAL(outbuf,smb_vwv0) = 0xFF;
- SSVAL(outbuf,smb_vwv2,max_xmit);
- SSVAL(outbuf,smb_vwv3,2);
- SSVAL(outbuf,smb_vwv4,max_vcs-1);
- SIVAL(outbuf,smb_vwv5,sesskey);
- SSVAL(outbuf,smb_vwv7,passlen);
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen);
- p += passlen;
- strcpy(p,username);
- } else {
- if (!doencrypt) passlen--;
- /* for Win95 */
- set_message(outbuf,13,0,True);
- CVAL(outbuf,smb_com) = SMBsesssetupX;
- cli_setup_pkt(outbuf);
-
- CVAL(outbuf,smb_vwv0) = 0xFF;
- SSVAL(outbuf,smb_vwv2,BUFFER_SIZE);
- SSVAL(outbuf,smb_vwv3,2);
- SSVAL(outbuf,smb_vwv4,getpid());
- SIVAL(outbuf,smb_vwv5,sesskey);
- SSVAL(outbuf,smb_vwv7,passlen);
- SSVAL(outbuf,smb_vwv8,0);
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen); p += SVAL(outbuf,smb_vwv7);
- strcpy(p,username);p = skip_string(p,1);
- strcpy(p,workgroup);p = skip_string(p,1);
- strcpy(p,"Unix");p = skip_string(p,1);
- strcpy(p,"Samba");p = skip_string(p,1);
- set_message(outbuf,13,PTR_DIFF(p,smb_buf(outbuf)),False);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- show_msg(inbuf);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- if (! *pass &&
- ((CVAL(inbuf,smb_rcls) == ERRDOS &&
- SVAL(inbuf,smb_err) == ERRnoaccess) ||
- (CVAL(inbuf,smb_rcls) == ERRSRV &&
- SVAL(inbuf,smb_err) == ERRbadpw)))
- {
- got_pass = False;
- DEBUG(5,("resending login\n"));
- goto get_pass;
- }
-
- DEBUG(0,("Session setup failed for username=%s myname=%s destname=%s %s\n",
- username,myname,desthost,smb_errstr(inbuf)));
- DEBUG(0,("You might find the -U or -n options useful\n"));
- DEBUG(0,("Sometimes you have to use `-n USERNAME' (particularly with OS/2)\n"));
- DEBUG(0,("Some servers also insist on uppercase-only passwords\n"));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
- if (Protocol >= PROTOCOL_NT1) {
- char *domain,*os,*lanman;
- p = smb_buf(inbuf);
- os = p;
- lanman = skip_string(os,1);
- domain = skip_string(lanman,1);
- if (*domain || *os || *lanman)
- DEBUG(1,("Domain=[%s] OS=[%s] Server=[%s]\n",domain,os,lanman));
- }
-
- /* use the returned uid from now on */
- if (SVAL(inbuf,smb_uid) != uid)
- DEBUG(5,("Server gave us a UID of %d. We gave %d\n",
- SVAL(inbuf,smb_uid),uid));
- uid = SVAL(inbuf,smb_uid);
- }
-
- /* now we've got a connection - send a tcon message */
- bzero(outbuf,smb_size);
-
- if (strncmp(service,"\\\\",2) != 0)
- {
- DEBUG(0,("\nWarning: Your service name doesn't start with \\\\. This is probably incorrect.\n"));
- DEBUG(0,("Perhaps try replacing each \\ with \\\\ on the command line?\n\n"));
- }
-
-
- again2:
-
- {
- int passlen = strlen(pass)+1;
- fstring pword;
- fstrcpy(pword,pass);
-
- if (doencrypt && *pass) {
- passlen=24;
- SMBencrypt((uchar *)pass,(uchar *)cryptkey,(uchar *)pword);
- }
-
- /* if in user level security then don't send a password now */
- if ((sec_mode & 1)) {
- fstrcpy(pword, ""); passlen=1;
- }
-
- set_message(outbuf,4,2 + strlen(service) + passlen + strlen(dev),True);
- CVAL(outbuf,smb_com) = SMBtconX;
- cli_setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0xFF);
- SSVAL(outbuf,smb_vwv3,passlen);
-
- p = smb_buf(outbuf);
- memcpy(p,pword,passlen);
- p += passlen;
- strcpy(p,service);
- p = skip_string(p,1);
- strcpy(p,dev);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- /* trying again with a blank password */
- if (CVAL(inbuf,smb_rcls) != 0 &&
- (int)strlen(pass) > 0 &&
- !doencrypt &&
- Protocol >= PROTOCOL_LANMAN1)
- {
- DEBUG(2,("first SMBtconX failed, trying again. %s\n",smb_errstr(inbuf)));
- strcpy(pass,"");
- goto again2;
- }
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("SMBtconX failed. %s\n",smb_errstr(inbuf)));
- DEBUG(0,("Perhaps you are using the wrong sharename, username or password?\n"));
- DEBUG(0,("Some servers insist that these be in uppercase\n"));
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return(False);
- }
-
-
- max_xmit = MIN(max_xmit,BUFFER_SIZE-4);
- if (max_xmit <= 0)
- max_xmit = BUFFER_SIZE - 4;
-
- cnum = SVAL(inbuf,smb_tid);
-
- DEBUG(5,("Connected with cnum=%d max_xmit=%d\n",cnum,max_xmit));
-
- if (was_null)
- {
- free(inbuf);
- free(outbuf);
- }
- return True;
-}
-
-
-/****************************************************************************
-send a logout command
-****************************************************************************/
-void cli_send_logout(void)
-{
- pstring inbuf,outbuf;
-
- bzero(outbuf,smb_size);
- set_message(outbuf,0,0,True);
- CVAL(outbuf,smb_com) = SMBtdis;
- SSVAL(outbuf,smb_tid,cnum);
- cli_setup_pkt(outbuf);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("SMBtdis failed %s\n",smb_errstr(inbuf)));
- }
-
-
-#ifdef STATS
- stats_report();
-#endif
- exit(0);
-}
-
-
-
-/****************************************************************************
-call a remote api
-****************************************************************************/
-BOOL cli_call_api(int prcnt,int drcnt,int mprcnt,int mdrcnt,int *rprcnt,
- int *rdrcnt, char *param,char *data, char **rparam,char **rdata)
-{
- static char *inbuf=NULL;
- static char *outbuf=NULL;
-
- if (!inbuf) inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if (!outbuf) outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- cli_send_trans_request(outbuf,SMBtrans,"\\PIPE\\LANMAN",0,0,
- data,param,NULL,
- drcnt,prcnt,0,
- mdrcnt,mprcnt,0);
-
- return (cli_receive_trans_response(inbuf,SMBtrans,
- rdrcnt,rprcnt,
- rdata,rparam));
-}
-
-/****************************************************************************
- send a SMB trans or trans2 request
- ****************************************************************************/
-BOOL cli_send_trans_request(char *outbuf, int trans, char *name, int fid, int flags,
- char *data,char *param,uint16 *setup, int ldata,int lparam,
- int lsetup,int mdata,int mparam,int msetup)
-{
- int i;
- int this_ldata,this_lparam;
- int tot_data=0,tot_param=0;
- char *outdata,*outparam;
- pstring inbuf;
- char *p;
-
- this_lparam = MIN(lparam,max_xmit - (500+lsetup*SIZEOFWORD)); /* hack */
- this_ldata = MIN(ldata,max_xmit - (500+lsetup*SIZEOFWORD+this_lparam));
-
- bzero(outbuf,smb_size);
- set_message(outbuf,14+lsetup,0,True);
- CVAL(outbuf,smb_com) = trans;
- SSVAL(outbuf,smb_tid,cnum);
- cli_setup_pkt(outbuf);
-
- outparam = smb_buf(outbuf)+(trans==SMBtrans ? strlen(name)+1 : 3);
- outdata = outparam+this_lparam;
-
- /* primary request */
- SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */
- SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */
- SSVAL(outbuf,smb_mprcnt,mparam); /* mprcnt */
- SSVAL(outbuf,smb_mdrcnt,mdata); /* mdrcnt */
- SCVAL(outbuf,smb_msrcnt,msetup); /* msrcnt */
- SSVAL(outbuf,smb_flags,flags); /* flags */
- SIVAL(outbuf,smb_timeout,0); /* timeout */
- SSVAL(outbuf,smb_pscnt,this_lparam); /* pscnt */
- SSVAL(outbuf,smb_psoff,smb_offset(outparam,outbuf)); /* psoff */
- SSVAL(outbuf,smb_dscnt,this_ldata); /* dscnt */
- SSVAL(outbuf,smb_dsoff,smb_offset(outdata,outbuf)); /* dsoff */
- SCVAL(outbuf,smb_suwcnt,lsetup); /* suwcnt */
- for (i=0;i<lsetup;i++) /* setup[] */
- SSVAL(outbuf,smb_setup+i*SIZEOFWORD,setup[i]);
- p = smb_buf(outbuf);
- if (trans==SMBtrans)
- strcpy(p,name); /* name[] */
- else
- {
- *p++ = 0; /* put in a null smb_name */
- *p++ = 'D'; *p++ = ' '; /* this was added because OS/2 does it */
- }
- if (this_lparam) /* param[] */
- memcpy(outparam,param,this_lparam);
- if (this_ldata) /* data[] */
- memcpy(outdata,data,this_ldata);
- set_message(outbuf,14+lsetup, /* wcnt, bcc */
- PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- if (this_ldata < ldata || this_lparam < lparam)
- {
- /* receive interim response */
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s request failed (%s)\n",
- trans==SMBtrans?"SMBtrans":"SMBtrans2", smb_errstr(inbuf)));
- return(False);
- }
-
- tot_data = this_ldata;
- tot_param = this_lparam;
-
- while (tot_data < ldata || tot_param < lparam)
- {
- this_lparam = MIN(lparam-tot_param,max_xmit - 500); /* hack */
- this_ldata = MIN(ldata-tot_data,max_xmit - (500+this_lparam));
-
- set_message(outbuf,trans==SMBtrans?8:9,0,True);
- CVAL(outbuf,smb_com) = trans==SMBtrans ? SMBtranss : SMBtranss2;
-
- outparam = smb_buf(outbuf);
- outdata = outparam+this_lparam;
-
- /* secondary request */
- SSVAL(outbuf,smb_tpscnt,lparam); /* tpscnt */
- SSVAL(outbuf,smb_tdscnt,ldata); /* tdscnt */
- SSVAL(outbuf,smb_spscnt,this_lparam); /* pscnt */
- SSVAL(outbuf,smb_spsoff,smb_offset(outparam,outbuf)); /* psoff */
- SSVAL(outbuf,smb_spsdisp,tot_param); /* psdisp */
- SSVAL(outbuf,smb_sdscnt,this_ldata); /* dscnt */
- SSVAL(outbuf,smb_sdsoff,smb_offset(outdata,outbuf)); /* dsoff */
- SSVAL(outbuf,smb_sdsdisp,tot_data); /* dsdisp */
- if (trans==SMBtrans2)
- SSVAL(outbuf,smb_sfid,fid); /* fid */
- if (this_lparam) /* param[] */
- memcpy(outparam,param,this_lparam);
- if (this_ldata) /* data[] */
- memcpy(outdata,data,this_ldata);
- set_message(outbuf,trans==SMBtrans?8:9, /* wcnt, bcc */
- PTR_DIFF(outdata+this_ldata,smb_buf(outbuf)),False);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- tot_data += this_ldata;
- tot_param += this_lparam;
- }
- }
-
- return(True);
-}
-
-
-/****************************************************************************
-open the client sockets
-****************************************************************************/
-BOOL cli_open_sockets(int port)
-{
- static int last_port;
- char *host;
- pstring service2;
- extern int Client;
-
- if (port == 0) port=last_port;
- last_port=port;
-
- strupper(service);
-
- if (*desthost)
- {
- host = desthost;
- }
- else
- {
- pstrcpy(service2,service);
- host = strtok(service2,"\\/");
- pstrcpy(desthost,host);
- }
-
- DEBUG(5,("Opening sockets\n"));
-
- if (*myname == 0)
- get_myname(myname,NULL);
- strupper(myname);
-
- if (!have_ip)
- {
- struct hostent *hp;
-
- if ((hp = Get_Hostbyname(host)) == 0)
- {
- DEBUG(0,("Get_Hostbyname: Unknown host %s.\n",host));
- return False;
- }
-
- putip((char *)&dest_ip,(char *)hp->h_addr);
- }
-
- Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
- if (Client == -1)
- return False;
-
- DEBUG(5,("Connected\n"));
-
- set_socket_options(Client,user_socket_options);
-
- return True;
-}
-
-/****************************************************************************
-close and open the connection again
-****************************************************************************/
-BOOL cli_reopen_connection(char *inbuf,char *outbuf)
-{
- static int open_count=0;
-
- open_count++;
-
- if (open_count>5) return(False);
-
- DEBUG(1,("Trying to re-open connection\n"));
-
- set_message(outbuf,0,0,True);
- SCVAL(outbuf,smb_com,SMBtdis);
- SSVAL(outbuf,smb_tid,cnum);
- cli_setup_pkt(outbuf);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
-
- close_sockets();
- if (!cli_open_sockets(0)) return(False);
-
- return(cli_send_login(inbuf,outbuf,True,True));
-}
-
-/* error code stuff - put together by Merik Karman
- merik@blackadder.dsh.oz.au */
-
-typedef struct
-{
- char *name;
- int code;
- char *message;
-} err_code_struct;
-
-/* Dos Error Messages */
-err_code_struct dos_msgs[] = {
- {"ERRbadfunc",1,"Invalid function."},
- {"ERRbadfile",2,"File not found."},
- {"ERRbadpath",3,"Directory invalid."},
- {"ERRnofids",4,"No file descriptors available"},
- {"ERRnoaccess",5,"Access denied."},
- {"ERRbadfid",6,"Invalid file handle."},
- {"ERRbadmcb",7,"Memory control blocks destroyed."},
- {"ERRnomem",8,"Insufficient server memory to perform the requested function."},
- {"ERRbadmem",9,"Invalid memory block address."},
- {"ERRbadenv",10,"Invalid environment."},
- {"ERRbadformat",11,"Invalid format."},
- {"ERRbadaccess",12,"Invalid open mode."},
- {"ERRbaddata",13,"Invalid data."},
- {"ERR",14,"reserved."},
- {"ERRbaddrive",15,"Invalid drive specified."},
- {"ERRremcd",16,"A Delete Directory request attempted to remove the server's current directory."},
- {"ERRdiffdevice",17,"Not same device."},
- {"ERRnofiles",18,"A File Search command can find no more files matching the specified criteria."},
- {"ERRbadshare",32,"The sharing mode specified for an Open conflicts with existing FIDs on the file."},
- {"ERRlock",33,"A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."},
- {"ERRfilexists",80,"The file named in a Create Directory, Make New File or Link request already exists."},
- {"ERRbadpipe",230,"Pipe invalid."},
- {"ERRpipebusy",231,"All instances of the requested pipe are busy."},
- {"ERRpipeclosing",232,"Pipe close in progress."},
- {"ERRnotconnected",233,"No process on other end of pipe."},
- {"ERRmoredata",234,"There is more data to be returned."},
- {NULL,-1,NULL}};
-
-/* Server Error Messages */
-err_code_struct server_msgs[] = {
- {"ERRerror",1,"Non-specific error code."},
- {"ERRbadpw",2,"Bad password - name/password pair in a Tree Connect or Session Setup are invalid."},
- {"ERRbadtype",3,"reserved."},
- {"ERRaccess",4,"The requester does not have the necessary access rights within the specified context for the requested function. The context is defined by the TID or the UID."},
- {"ERRinvnid",5,"The tree ID (TID) specified in a command was invalid."},
- {"ERRinvnetname",6,"Invalid network name in tree connect."},
- {"ERRinvdevice",7,"Invalid device - printer request made to non-printer connection or non-printer request made to printer connection."},
- {"ERRqfull",49,"Print queue full (files) -- returned by open print file."},
- {"ERRqtoobig",50,"Print queue full -- no space."},
- {"ERRqeof",51,"EOF on print queue dump."},
- {"ERRinvpfid",52,"Invalid print file FID."},
- {"ERRsmbcmd",64,"The server did not recognize the command received."},
- {"ERRsrverror",65,"The server encountered an internal error, e.g., system file unavailable."},
- {"ERRfilespecs",67,"The file handle (FID) and pathname parameters contained an invalid combination of values."},
- {"ERRreserved",68,"reserved."},
- {"ERRbadpermits",69,"The access permissions specified for a file or directory are not a valid combination. The server cannot set the requested attribute."},
- {"ERRreserved",70,"reserved."},
- {"ERRsetattrmode",71,"The attribute mode in the Set File Attribute request is invalid."},
- {"ERRpaused",81,"Server is paused."},
- {"ERRmsgoff",82,"Not receiving messages."},
- {"ERRnoroom",83,"No room to buffer message."},
- {"ERRrmuns",87,"Too many remote user names."},
- {"ERRtimeout",88,"Operation timed out."},
- {"ERRnoresource",89,"No resources currently available for request."},
- {"ERRtoomanyuids",90,"Too many UIDs active on this session."},
- {"ERRbaduid",91,"The UID is not known as a valid ID on this session."},
- {"ERRusempx",250,"Temp unable to support Raw, use MPX mode."},
- {"ERRusestd",251,"Temp unable to support Raw, use standard read/write."},
- {"ERRcontmpx",252,"Continue in MPX mode."},
- {"ERRreserved",253,"reserved."},
- {"ERRreserved",254,"reserved."},
- {"ERRnosupport",0xFFFF,"Function not supported."},
- {NULL,-1,NULL}};
-
-/* Hard Error Messages */
-err_code_struct hard_msgs[] = {
- {"ERRnowrite",19,"Attempt to write on write-protected diskette."},
- {"ERRbadunit",20,"Unknown unit."},
- {"ERRnotready",21,"Drive not ready."},
- {"ERRbadcmd",22,"Unknown command."},
- {"ERRdata",23,"Data error (CRC)."},
- {"ERRbadreq",24,"Bad request structure length."},
- {"ERRseek",25 ,"Seek error."},
- {"ERRbadmedia",26,"Unknown media type."},
- {"ERRbadsector",27,"Sector not found."},
- {"ERRnopaper",28,"Printer out of paper."},
- {"ERRwrite",29,"Write fault."},
- {"ERRread",30,"Read fault."},
- {"ERRgeneral",31,"General failure."},
- {"ERRbadshare",32,"A open conflicts with an existing open."},
- {"ERRlock",33,"A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process."},
- {"ERRwrongdisk",34,"The wrong disk was found in a drive."},
- {"ERRFCBUnavail",35,"No FCBs are available to process request."},
- {"ERRsharebufexc",36,"A sharing buffer has been exceeded."},
- {NULL,-1,NULL}};
-
-
-struct
-{
- int code;
- char *class;
- err_code_struct *err_msgs;
-} err_classes[] = {
- {0,"SUCCESS",NULL},
- {0x01,"ERRDOS",dos_msgs},
- {0x02,"ERRSRV",server_msgs},
- {0x03,"ERRHRD",hard_msgs},
- {0x04,"ERRXOS",NULL},
- {0xE1,"ERRRMX1",NULL},
- {0xE2,"ERRRMX2",NULL},
- {0xE3,"ERRRMX3",NULL},
- {0xFF,"ERRCMD",NULL},
- {-1,NULL,NULL}};
-
-
-/****************************************************************************
-return a SMB error string from a SMB buffer
-****************************************************************************/
-char *smb_errstr(char *inbuf)
-{
- static pstring ret;
- int class = CVAL(inbuf,smb_rcls);
- int num = SVAL(inbuf,smb_err);
- int i,j;
-
- for (i=0;err_classes[i].class;i++)
- if (err_classes[i].code == class)
- {
- if (err_classes[i].err_msgs)
- {
- err_code_struct *err = err_classes[i].err_msgs;
- for (j=0;err[j].name;j++)
- if (num == err[j].code)
- {
- if (DEBUGLEVEL > 0)
- sprintf(ret,"%s - %s (%s)",err_classes[i].class,
- err[j].name,err[j].message);
- else
- sprintf(ret,"%s - %s",err_classes[i].class,err[j].name);
- return ret;
- }
- }
-
- sprintf(ret,"%s - %d",err_classes[i].class,num);
- return ret;
- }
-
- sprintf(ret,"ERROR: Unknown error (%d,%d)",class,num);
- return(ret);
-}
diff --git a/source/client/clitar.c b/source/client/clitar.c
deleted file mode 100644
index c085cd9e5a1..00000000000
--- a/source/client/clitar.c
+++ /dev/null
@@ -1,1771 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Tar Extensions
- Copyright (C) Ricky Poulten 1995-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-#include "includes.h"
-#include "clitar.h"
-
-extern BOOL recurse;
-
-#define SEPARATORS " \t\n\r"
-extern int DEBUGLEVEL;
-extern int Client;
-
-/* These defines are for the do_setrattr routine, to indicate
- * setting and reseting of file attributes in the function call */
-#define ATTRSET 1
-#define ATTRRESET 0
-
-static int attribute = aDIR | aSYSTEM | aHIDDEN;
-
-#ifndef CLIENT_TIMEOUT
-#define CLIENT_TIMEOUT (30*1000)
-#endif
-
-static char *tarbuf;
-static int tp, ntarf, tbufsiz, ttarf;
-/* Incremental mode */
-BOOL tar_inc=False;
-/* Reset archive bit */
-BOOL tar_reset=False;
-/* Include / exclude mode (true=include, false=exclude) */
-BOOL tar_excl=True;
-char tar_type='\0';
-static char **cliplist=NULL;
-static int clipn=0;
-
-extern file_info def_finfo;
-extern BOOL lowercase;
-extern int cnum;
-extern BOOL readbraw_supported;
-extern int max_xmit;
-extern pstring cur_dir;
-extern int get_total_time_ms;
-extern int get_total_size;
-extern int Protocol;
-
-int blocksize=20;
-int tarhandle;
-
-static void writetarheader();
-static void do_atar();
-static void do_tar();
-static void oct_it();
-static void fixtarname();
-static int dotarbuf();
-static void dozerobuf();
-static void dotareof();
-static void initarbuf();
-static int do_setrattr();
-
-/* restore functions */
-static long readtarheader();
-static long unoct();
-static void do_tarput();
-static void unfixtarname();
-
-/*
- * tar specific utitlities
- */
-
-/****************************************************************************
-Write a tar header to buffer
-****************************************************************************/
-static void writetarheader(int f, char *aname, int size, time_t mtime,
- char *amode)
-{
- union hblock hb;
- int i, chk, l;
- char *jp;
-
- memset(hb.dummy, 0, sizeof(hb.dummy));
-
- l=strlen(aname);
- if (l >= NAMSIZ) {
- /* write a GNU tar style long header */
- char *b;
- b = (char *)malloc(l+TBLOCK+100);
- if (!b) {
- DEBUG(0,("out of memory\n"));
- exit(1);
- }
- writetarheader(f, "/./@LongLink", l+1, 0, " 0 \0");
- memset(b, 0, l+TBLOCK+100);
- fixtarname(b, aname, l+1);
- i = strlen(b)+1;
- dotarbuf(f, b, TBLOCK*((i+(TBLOCK-1)/TBLOCK)));
- free(b);
- }
-
- /* use l + 1 to do the null too */
- fixtarname(hb.dbuf.name, aname, (l >= NAMSIZ) ? NAMSIZ : l + 1);
-
- if (lowercase)
- strlower(hb.dbuf.name);
-
- /* write out a "standard" tar format header */
-
- hb.dbuf.name[NAMSIZ-1]='\0';
- strcpy(hb.dbuf.mode, amode);
- oct_it(0L, 8, hb.dbuf.uid);
- oct_it(0L, 8, hb.dbuf.gid);
- oct_it((long) size, 13, hb.dbuf.size);
- oct_it((long) mtime, 13, hb.dbuf.mtime);
- memcpy(hb.dbuf.chksum, " ", sizeof(hb.dbuf.chksum));
- memset(hb.dbuf.linkname, 0, NAMSIZ);
- if (strcmp("/./@LongLink", aname) == 0) {
- /* we're doing a GNU tar long filename */
- hb.dbuf.linkflag='L';
- } else {
- hb.dbuf.linkflag='0';
- }
-
- for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++);
-
- oct_it((long) chk, 8, hb.dbuf.chksum);
- hb.dbuf.chksum[6] = '\0';
-
- (void) dotarbuf(f, hb.dummy, sizeof(hb.dummy));
-}
-
-/****************************************************************************
-Read a tar header into a hblock structure, and validate
-***************************************************************************/
-static long readtarheader(union hblock *hb, file_info *finfo, char *prefix)
-{
- long chk, fchk;
- int i;
- char *jp;
-
- /*
- * read in a "standard" tar format header - we're not that interested
- * in that many fields, though
- */
-
- /* check the checksum */
- for (chk=0, i=sizeof(hb->dummy), jp=hb->dummy; --i>=0;) chk+=(0xFF & *jp++);
-
- if (chk == 0)
- return chk;
-
- /* compensate for blanks in chksum header */
- for (i=sizeof(hb->dbuf.chksum), jp=hb->dbuf.chksum; --i>=0;)
- chk-=(0xFF & *jp++);
-
- chk += ' ' * sizeof(hb->dbuf.chksum);
-
- fchk=unoct(hb->dbuf.chksum, sizeof(hb->dbuf.chksum));
-
- DEBUG(5, ("checksum totals chk=%d fchk=%d chksum=%s\n",
- chk, fchk, hb->dbuf.chksum));
-
- if (fchk != chk)
- {
- DEBUG(0, ("checksums don't match %d %d\n", fchk, chk));
- return -1;
- }
-
- strcpy(finfo->name, prefix);
-
- /* use l + 1 to do the null too; do prefix - prefcnt to zap leading slash */
- unfixtarname(finfo->name + strlen(prefix), hb->dbuf.name,
- strlen(hb->dbuf.name) + 1);
-
-/* can't handle links at present */
- if (hb->dbuf.linkflag != '0') {
- if (hb->dbuf.linkflag == 0) {
- DEBUG(6, ("Warning: NULL link flag (gnu tar archive ?) %s\n",
- finfo->name));
- } else {
- DEBUG(0, ("this tar file appears to contain some kind of link - ignoring\n"));
- return -2;
- }
- }
-
- if ((unoct(hb->dbuf.mode, sizeof(hb->dbuf.mode)) & S_IFDIR)
- || (*(finfo->name+strlen(finfo->name)-1) == '\\'))
- {
- finfo->mode=aDIR;
- }
- else
- finfo->mode=0; /* we don't care about mode at the moment, we'll
- * just make it a regular file */
- /*
- * Bug fix by richard@sj.co.uk
- *
- * REC: restore times correctly (as does tar)
- * We only get the modification time of the file; set the creation time
- * from the mod. time, and the access time to current time
- */
- finfo->mtime = finfo->ctime = strtol(hb->dbuf.mtime, NULL, 8);
- finfo->atime = time(NULL);
- finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
-
- return True;
-}
-
-/****************************************************************************
-Write out the tar buffer to tape or wherever
-****************************************************************************/
-static int dotarbuf(int f, char *b, int n)
-{
- int fail=1, writ=n;
-
- /* This routine and the next one should be the only ones that do write()s */
- if (tp + n >= tbufsiz)
- {
- int diff;
-
- diff=tbufsiz-tp;
- memcpy(tarbuf + tp, b, diff);
- fail=fail && (1+write(f, tarbuf, tbufsiz));
- n-=diff;
- b+=diff;
- tp=0;
-
- while (n >= tbufsiz)
- {
- fail=fail && (1 + write(f, b, tbufsiz));
- n-=tbufsiz;
- b+=tbufsiz;
- }
- }
- if (n>0) {
- memcpy(tarbuf+tp, b, n);
- tp+=n;
- }
-
- return(fail ? writ : 0);
-}
-
-/****************************************************************************
-Write a zeros to buffer / tape
-****************************************************************************/
-static void dozerobuf(int f, int n)
-{
- /* short routine just to write out n zeros to buffer -
- * used to round files to nearest block
- * and to do tar EOFs */
-
- if (n+tp >= tbufsiz)
- {
- memset(tarbuf+tp, 0, tbufsiz-tp);
- write(f, tarbuf, tbufsiz);
- memset(tarbuf, 0, (tp+=n-tbufsiz));
- }
- else
- {
- memset(tarbuf+tp, 0, n);
- tp+=n;
- }
-}
-
-/****************************************************************************
-Malloc tape buffer
-****************************************************************************/
-static void initarbuf()
-{
- /* initialize tar buffer */
- tbufsiz=blocksize*TBLOCK;
- tarbuf=malloc(tbufsiz);
-
- /* reset tar buffer pointer and tar file counter and total dumped */
- tp=0; ntarf=0; ttarf=0;
-}
-
-/****************************************************************************
-Write two zero blocks at end of file
-****************************************************************************/
-static void dotareof(int f)
-{
- struct stat stbuf;
- /* Two zero blocks at end of file, write out full buffer */
-
- (void) dozerobuf(f, TBLOCK);
- (void) dozerobuf(f, TBLOCK);
-
- if (fstat(f, &stbuf) == -1)
- {
- DEBUG(0, ("Couldn't stat file handle\n"));
- return;
- }
-
- /* Could be a pipe, in which case S_ISREG should fail,
- * and we should write out at full size */
- if (tp > 0) write(f, tarbuf, S_ISREG(stbuf.st_mode) ? tp : tbufsiz);
-}
-
-/****************************************************************************
-(Un)mangle DOS pathname, make nonabsolute
-****************************************************************************/
-static void fixtarname(char *tptr, char *fp, int l)
-{
- /* add a '.' to start of file name, convert from ugly dos \'s in path
- * to lovely unix /'s :-} */
-
- *tptr++='.';
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- while (l > 0) {
- if (is_shift_jis (*fp)) {
- *tptr++ = *fp++;
- *tptr++ = *fp++;
- l -= 2;
- } else if (is_kana (*fp)) {
- *tptr++ = *fp++;
- l--;
- } else if (*fp == '\\') {
- *tptr++ = '/';
- fp++;
- l--;
- } else {
- *tptr++ = *fp++;
- l--;
- }
- }
- }
- else
- {
- while (l--)
- {
- *tptr=(*fp == '\\') ? '/' : *fp;
- tptr++;
- fp++;
- }
- }
-}
-
-/****************************************************************************
-Convert from decimal to octal string
-****************************************************************************/
-static void oct_it (register long value, register int ndgs, register char *p)
-{
- /* Converts long to octal string, pads with leading zeros */
-
- /* skip final null, but do final space */
- --ndgs;
- p[--ndgs] = ' ';
-
- /* Loop does at least one digit */
- do {
- p[--ndgs] = '0' + (char) (value & 7);
- value >>= 3;
- }
- while (ndgs > 0 && value != 0);
-
- /* Do leading zeros */
- while (ndgs > 0)
- p[--ndgs] = '0';
-}
-
-/****************************************************************************
-Convert from octal string to long
-***************************************************************************/
-static long unoct(char *p, int ndgs)
-{
- long value=0;
- /* Converts octal string to long, ignoring any non-digit */
-
- while (--ndgs)
- {
- if (isdigit(*p))
- value = (value << 3) | (long) (*p - '0');
-
- p++;
- }
-
- return value;
-}
-
-/****************************************************************************
-Compare two strings in a slash insensitive way, allowing s1 to match s2
-if s1 is an "initial" string (up to directory marker). Thus, if s2 is
-a file in any subdirectory of s1, declare a match.
-***************************************************************************/
-static int strslashcmp(char *s1, char *s2)
-{
- char *s1_0=s1;
-
- while(*s1 && *s2 &&
- (*s1 == *s2
- || tolower(*s1) == tolower(*s2)
- || (*s1 == '\\' && *s2=='/')
- || (*s1 == '/' && *s2=='\\'))) {
- s1++; s2++;
- }
-
- /* if s1 has a trailing slash, it compared equal, so s1 is an "initial"
- string of s2.
- */
- if (!*s1 && s1 != s1_0 && (*(s1-1) == '/' || *(s1-1) == '\\')) return 0;
-
- /* ignore trailing slash on s1 */
- if (!*s2 && (*s1 == '/' || *s1 == '\\') && !*(s1+1)) return 0;
-
- /* check for s1 is an "initial" string of s2 */
- if (*s2 == '/' || *s2 == '\\') return 0;
-
- return *s1-*s2;
-}
-
-/*
- * general smb utility functions
- */
-/****************************************************************************
-Set DOS file attributes
-***************************************************************************/
-static int do_setrattr(char *fname, int attr, int setit)
-{
- /*
- * First get the existing attribs from existing file
- */
- char *inbuf,*outbuf;
- char *p;
- pstring name;
- int fattr;
-
- strcpy(name,fname);
- strcpy(fname,"\\");
- strcat(fname,name);
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return False;
- }
-
- /* send an smb getatr message */
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,0,2 + strlen(fname),True);
- CVAL(outbuf,smb_com) = SMBgetatr;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,fname);
- p += (strlen(fname)+1);
-
- *p++ = 4;
- *p++ = 0;
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- DEBUG(5,("getatr: %s\n",smb_errstr(inbuf)));
- else
- {
- DEBUG(5,("\nattr 0x%X time %d size %d\n",
- (int)CVAL(inbuf,smb_vwv0),
- SVAL(inbuf,smb_vwv1),
- SVAL(inbuf,smb_vwv3)));
- }
-
- fattr=CVAL(inbuf,smb_vwv0);
-
- /* combine found attributes with bits to be set or reset */
-
- attr=setit ? (fattr | attr) : (fattr & ~attr);
-
- /* now try and set attributes by sending smb reset message */
-
- /* clear out buffer and start again */
- memset(outbuf,0,smb_size);
- set_message(outbuf,8,4 + strlen(fname),True);
- CVAL(outbuf,smb_com) = SMBsetatr;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,attr);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,fname);
- p += (strlen(fname)+1);
-
- *p++ = 4;
- *p++ = 0;
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s setting attributes on file %s\n",
- smb_errstr(inbuf), fname));
- free(inbuf);free(outbuf);
- return(False);
- }
-
- free(inbuf);free(outbuf);
- return(True);
-}
-
-/****************************************************************************
-Create a file on a share
-***************************************************************************/
-static BOOL smbcreat(file_info finfo, int *fnum, char *inbuf, char *outbuf)
-{
- char *p;
- /* *must* be called with buffer ready malloc'ed */
- /* open remote file */
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,3,2 + strlen(finfo.name),True);
- CVAL(outbuf,smb_com) = SMBcreate;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,finfo.mode);
- put_dos_date3(outbuf,smb_vwv1,finfo.mtime);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,finfo.name);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s opening remote file %s\n",smb_errstr(inbuf),
- finfo.name));
- return 0;
- }
-
- *fnum = SVAL(inbuf,smb_vwv0);
- return True;
-}
-
-/****************************************************************************
-Write a file to a share
-***************************************************************************/
-static BOOL smbwrite(int fnum, int n, int low, int high, int left,
- char *bufferp, char *inbuf, char *outbuf)
-{
- /* *must* be called with buffer ready malloc'ed */
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,5,n + 3,True);
-
- memcpy(smb_buf(outbuf)+3, bufferp, n);
-
- set_message(outbuf,5,n + 3, False);
- CVAL(outbuf,smb_com) = SMBwrite;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,n);
- SIVAL(outbuf,smb_vwv2,low);
- SSVAL(outbuf,smb_vwv4,left);
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,n);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s writing remote file\n",smb_errstr(inbuf)));
- return False;
- }
-
- if (n != SVAL(inbuf,smb_vwv0))
- {
- DEBUG(0,("Error: only wrote %d bytes out of %d\n",
- SVAL(inbuf,smb_vwv0), n));
- return False;
- }
-
- return True;
-}
-
-/****************************************************************************
-Close a file on a share
-***************************************************************************/
-static BOOL smbshut(file_info finfo, int fnum, char *inbuf, char *outbuf)
-{
- /* *must* be called with buffer ready malloc'ed */
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,3,0,True);
- CVAL(outbuf,smb_com) = SMBclose;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- put_dos_date3(outbuf,smb_vwv1,finfo.mtime);
-
- DEBUG(3,("Setting date to %s (0x%X)",
- asctime(LocalTime(&finfo.mtime)),
- finfo.mtime));
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s closing remote file %s\n",smb_errstr(inbuf),
- finfo.name));
- return False;
- }
-
- return True;
-}
-
-/****************************************************************************
-Verify existence of path on share
-***************************************************************************/
-static BOOL smbchkpath(char *fname, char *inbuf, char *outbuf)
-{
- char *p;
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,0,4 + strlen(fname),True);
- CVAL(outbuf,smb_com) = SMBchkpth;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,fname);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- DEBUG(5,("smbchkpath: %s\n",smb_errstr(inbuf)));
-
- return(CVAL(inbuf,smb_rcls) == 0);
-}
-
-/****************************************************************************
-Make a directory on share
-***************************************************************************/
-static BOOL smbmkdir(char *fname, char *inbuf, char *outbuf)
-{
- /* *must* be called with buffer ready malloc'ed */
- char *p;
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,0,2 + strlen(fname),True);
-
- CVAL(outbuf,smb_com) = SMBmkdir;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- p = smb_buf(outbuf);
- *p++ = 4;
- strcpy(p,fname);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("%s making remote directory %s\n",
- smb_errstr(inbuf),fname));
- return(False);
- }
-
- return(True);
-}
-
-/****************************************************************************
-Ensure a remote path exists (make if necessary)
-***************************************************************************/
-static BOOL ensurepath(char *fname, char *inbuf, char *outbuf)
-{
- /* *must* be called with buffer ready malloc'ed */
- /* ensures path exists */
-
- pstring partpath, ffname;
- char *p=fname, *basehack;
-
- *partpath = 0;
-
- /* fname copied to ffname so can strtok */
-
- strcpy(ffname, fname);
-
- /* do a `basename' on ffname, so don't try and make file name directory */
- if ((basehack=strrchr(ffname, '\\')) == NULL)
- return True;
- else
- *basehack='\0';
-
- p=strtok(ffname, "\\");
-
- while (p)
- {
- strcat(partpath, p);
-
- if (!smbchkpath(partpath, inbuf, outbuf)) {
- if (!smbmkdir(partpath, inbuf, outbuf))
- {
- DEBUG(0, ("Error mkdirhiering\n"));
- return False;
- }
- else
- DEBUG(3, ("mkdirhiering %s\n", partpath));
-
- }
-
- strcat(partpath, "\\");
- p = strtok(NULL,"/\\");
- }
-
- return True;
-}
-
-int padit(char *buf, int bufsize, int padsize)
-{
- int berr= 0;
- int bytestowrite;
-
- DEBUG(0, ("Padding with %d zeros\n", padsize));
- memset(buf, 0, bufsize);
- while( !berr && padsize > 0 ) {
- bytestowrite= MIN(bufsize, padsize);
- berr = dotarbuf(tarhandle, buf, bytestowrite) != bytestowrite;
- padsize -= bytestowrite;
- }
-
- return berr;
-}
-
-/*
- * smbclient functions
- */
-/****************************************************************************
-append one remote file to the tar file
-***************************************************************************/
-static void do_atar(char *rname,char *lname,file_info *finfo1)
-{
- int fnum;
- uint32 nread=0;
- char *p;
- char *inbuf,*outbuf;
- file_info finfo;
- BOOL close_done = False;
- BOOL shallitime=True;
- BOOL ignore_close_error = False;
- char *dataptr=NULL;
- int datalen=0;
-
- struct timeval tp_start;
- GetTimeOfDay(&tp_start);
-
- if (finfo1)
- finfo = *finfo1;
- else
- finfo = def_finfo;
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- memset(outbuf,0,smb_size);
- set_message(outbuf,15,1 + strlen(rname),True);
-
- CVAL(outbuf,smb_com) = SMBopenX;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,0xFF);
- SSVAL(outbuf,smb_vwv2,1);
- SSVAL(outbuf,smb_vwv3,(DENY_NONE<<4));
- SSVAL(outbuf,smb_vwv4,aSYSTEM | aHIDDEN);
- SSVAL(outbuf,smb_vwv5,aSYSTEM | aHIDDEN);
- SSVAL(outbuf,smb_vwv8,1);
-
- p = smb_buf(outbuf);
- strcpy(p,rname);
- p = skip_string(p,1);
-
- dos_clean_name(rname);
-
- /* do a chained openX with a readX? */
- if (finfo.size > 0)
- {
- SSVAL(outbuf,smb_vwv0,SMBreadX);
- SSVAL(outbuf,smb_vwv1,PTR_DIFF(p,outbuf) - 4);
- memset(p,0,200);
- p -= smb_wct;
- SSVAL(p,smb_wct,10);
- SSVAL(p,smb_vwv0,0xFF);
- SSVAL(p,smb_vwv5,MIN(max_xmit-500,finfo.size));
- SSVAL(p,smb_vwv9,MIN(0xFFFF,finfo.size));
- smb_setlen(outbuf,smb_len(outbuf)+11*2+1);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- if (CVAL(inbuf,smb_rcls) == ERRSRV &&
- SVAL(inbuf,smb_err) == ERRnoresource &&
- reopen_connection(inbuf,outbuf))
- {
- do_atar(rname,lname,finfo1);
- free(inbuf);free(outbuf);
- return;
- }
-
- DEBUG(0,("%s opening remote file %s\n",smb_errstr(inbuf),rname));
- free(inbuf);free(outbuf);
- return;
- }
-
- strcpy(finfo.name,rname);
- if (!finfo1)
- {
- finfo.mode = SVAL(inbuf,smb_vwv3);
- finfo.size = IVAL(inbuf,smb_vwv4);
- finfo.mtime = make_unix_date3(inbuf+smb_vwv6);
- finfo.atime = finfo.ctime = finfo.mtime;
- }
-
- DEBUG(3,("file %s attrib 0x%X\n",finfo.name,finfo.mode));
-
- fnum = SVAL(inbuf,smb_vwv2);
-
- if (tar_inc && !(finfo.mode & aARCH))
- {
- DEBUG(4, ("skipping %s - archive bit not set\n", finfo.name));
- shallitime=0;
- }
- else
- {
- if (SVAL(inbuf,smb_vwv0) == SMBreadX)
- {
- p = (inbuf+4+SVAL(inbuf,smb_vwv1)) - smb_wct;
- datalen = SVAL(p,smb_vwv5);
- dataptr = inbuf + 4 + SVAL(p,smb_vwv6);
- }
- else
- {
- dataptr = NULL;
- datalen = 0;
- }
-
- DEBUG(1,("getting file %s of size %d bytes as a tar file %s",
- finfo.name,
- finfo.size,
- lname));
-
- /* write a tar header, don't bother with mode - just set to 100644 */
- writetarheader(tarhandle, rname, finfo.size, finfo.mtime, "100644 \0");
-
- while (nread < finfo.size && !close_done)
- {
- int method = -1;
- static BOOL can_chain_close=True;
-
- p=NULL;
-
- DEBUG(3,("nread=%d\n",nread));
-
- /* 3 possible read types. readbraw if a large block is required.
- readX + close if not much left and read if neither is supported */
-
- /* we might have already read some data from a chained readX */
- if (dataptr && datalen>0)
- method=3;
-
- /* if we can finish now then readX+close */
- if (method<0 && can_chain_close && (Protocol >= PROTOCOL_LANMAN1) &&
- ((finfo.size - nread) <
- (max_xmit - (2*smb_size + 13*SIZEOFWORD + 300))))
- method = 0;
-
- /* if we support readraw then use that */
- if (method<0 && readbraw_supported)
- method = 1;
-
- /* if we can then use readX */
- if (method<0 && (Protocol >= PROTOCOL_LANMAN1))
- method = 2;
-
-
- switch (method)
- {
- /* use readX */
- case 0:
- case 2:
- if (method == 0)
- close_done = True;
-
- /* use readX + close */
- memset(outbuf,0,smb_size);
- set_message(outbuf,10,0,True);
- CVAL(outbuf,smb_com) = SMBreadX;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- if (close_done)
- {
- CVAL(outbuf,smb_vwv0) = SMBclose;
- SSVAL(outbuf,smb_vwv1,PTR_DIFF(smb_buf(outbuf),outbuf) - 4);
- }
- else
- CVAL(outbuf,smb_vwv0) = 0xFF;
-
-
- SSVAL(outbuf,smb_vwv2,fnum);
- SIVAL(outbuf,smb_vwv3,nread);
- SSVAL(outbuf,smb_vwv5,MIN(max_xmit-200,finfo.size - nread));
- SSVAL(outbuf,smb_vwv6,0);
- SIVAL(outbuf,smb_vwv7,0);
- SSVAL(outbuf,smb_vwv9,MIN(0xFFFF,finfo.size-nread));
-
- if (close_done)
- {
- p = smb_buf(outbuf);
- memset(p,0,9);
-
- CVAL(p,0) = 3;
- SSVAL(p,1,fnum);
- SIVALS(p,3,-1);
-
- /* now set the total packet length */
- smb_setlen(outbuf,smb_len(outbuf)+9);
- }
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s reading remote file\n",smb_errstr(inbuf)));
- break;
- }
-
- if (close_done &&
- SVAL(inbuf,smb_vwv0) != SMBclose)
- {
- /* NOTE: WfWg sometimes just ignores the chained
- command! This seems to break the spec? */
- DEBUG(3,("Rejected chained close?\n"));
- close_done = False;
- can_chain_close = False;
- ignore_close_error = True;
- }
-
- datalen = SVAL(inbuf,smb_vwv5);
- dataptr = inbuf + 4 + SVAL(inbuf,smb_vwv6);
- break;
-
-
- /* use readbraw */
- case 1:
- {
- static int readbraw_size = 0xFFFF;
-
- extern int Client;
- memset(outbuf,0,smb_size);
- set_message(outbuf,8,0,True);
- CVAL(outbuf,smb_com) = SMBreadbraw;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
- SSVAL(outbuf,smb_vwv0,fnum);
- SIVAL(outbuf,smb_vwv1,nread);
- SSVAL(outbuf,smb_vwv3,MIN(finfo.size-nread,readbraw_size));
- SSVAL(outbuf,smb_vwv4,0);
- SIVALS(outbuf,smb_vwv5,-1);
- send_smb(Client,outbuf);
-
- /* Now read the raw data into the buffer and write it */
- if(read_smb_length(Client,inbuf,0) == -1) {
- DEBUG(0,("Failed to read length in readbraw\n"));
- exit(1);
- }
-
- /* Even though this is not an smb message, smb_len
- returns the generic length of an smb message */
- datalen = smb_len(inbuf);
-
- if (datalen == 0)
- {
- /* we got a readbraw error */
- DEBUG(4,("readbraw error - reducing size\n"));
- readbraw_size = (readbraw_size * 9) / 10;
-
- if (readbraw_size < max_xmit)
- {
- DEBUG(0,("disabling readbraw\n"));
- readbraw_supported = False;
- }
-
- dataptr=NULL;
- continue;
- }
-
- if(read_data(Client,inbuf,datalen) != datalen) {
- DEBUG(0,("Failed to read data in readbraw\n"));
- exit(1);
- }
- dataptr = inbuf;
- }
- break;
-
- case 3:
- /* we've already read some data with a chained readX */
- break;
-
- default:
- /* use plain read */
- memset(outbuf,0,smb_size);
- set_message(outbuf,5,0,True);
- CVAL(outbuf,smb_com) = SMBread;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,MIN(max_xmit-200,finfo.size - nread));
- SIVAL(outbuf,smb_vwv2,nread);
- SSVAL(outbuf,smb_vwv4,finfo.size - nread);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s reading remote file\n",smb_errstr(inbuf)));
- break;
- }
-
- datalen = SVAL(inbuf,smb_vwv0);
- dataptr = smb_buf(inbuf) + 3;
- break;
- }
-
-
- /* add received bits of file to buffer - dotarbuf will
- * write out in 512 byte intervals */
- if (dotarbuf(tarhandle,dataptr,datalen) != datalen)
- {
- DEBUG(0,("Error writing to tar file - %s\n", strerror(errno)));
- break;
- }
-
- nread += datalen;
- if (datalen == 0)
- {
- DEBUG(0,("Error reading file %s. Got 0 bytes\n", rname));
- break;
- }
-
- dataptr=NULL;
- datalen=0;
- }
-
- /* pad tar file with zero's if we couldn't get entire file */
- if (nread < finfo.size)
- {
- DEBUG(0, ("Didn't get entire file. size=%d, nread=%d\n", finfo.size, nread));
- if (padit(inbuf, BUFFER_SIZE, finfo.size - nread))
- DEBUG(0,("Error writing tar file - %s\n", strerror(errno)));
- }
-
- /* round tar file to nearest block */
- if (finfo.size % TBLOCK)
- dozerobuf(tarhandle, TBLOCK - (finfo.size % TBLOCK));
-
- ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK);
- ntarf++;
- }
-
- if (!close_done)
- {
- memset(outbuf,0,smb_size);
- set_message(outbuf,3,0,True);
- CVAL(outbuf,smb_com) = SMBclose;
- SSVAL(outbuf,smb_tid,cnum);
- setup_pkt(outbuf);
-
- SSVAL(outbuf,smb_vwv0,fnum);
- SIVALS(outbuf,smb_vwv1,-1);
-
- send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
-
- if (!ignore_close_error && CVAL(inbuf,smb_rcls) != 0)
- {
- DEBUG(0,("Error %s closing remote file\n",smb_errstr(inbuf)));
- free(inbuf);free(outbuf);
- return;
- }
- }
-
- if (shallitime)
- {
- struct timeval tp_end;
- int this_time;
-
- /* if shallitime is true then we didn't skip */
- if (tar_reset) (void) do_setrattr(finfo.name, aARCH, ATTRRESET);
-
- GetTimeOfDay(&tp_end);
- this_time =
- (tp_end.tv_sec - tp_start.tv_sec)*1000 +
- (tp_end.tv_usec - tp_start.tv_usec)/1000;
- get_total_time_ms += this_time;
- get_total_size += finfo.size;
-
- /* Thanks to Carel-Jan Engel (ease@mail.wirehub.nl) for this one */
- DEBUG(1,("(%g kb/s) (average %g kb/s)\n",
- finfo.size / MAX(0.001, (1.024*this_time)),
- get_total_size / MAX(0.001, (1.024*get_total_time_ms))));
- }
-
- free(inbuf);free(outbuf);
-}
-
-/****************************************************************************
-Append single file to tar file (or not)
-***************************************************************************/
-static void do_tar(file_info *finfo)
-{
- pstring rname;
-
- if (strequal(finfo->name,".") || strequal(finfo->name,".."))
- return;
-
- /* Is it on the exclude list ? */
- if (!tar_excl && clipn) {
- pstring exclaim;
-
- strcpy(exclaim, cur_dir);
- *(exclaim+strlen(exclaim)-1)='\0';
-
- strcat(exclaim, "\\");
- strcat(exclaim, finfo->name);
-
- if (clipfind(cliplist, clipn, exclaim)) {
- DEBUG(3,("Skipping file %s\n", exclaim));
- return;
- }
- }
-
- if (finfo->mode & aDIR)
- {
- pstring saved_curdir;
- pstring mtar_mask;
- char *inbuf,*outbuf;
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- strcpy(saved_curdir,cur_dir);
-
- strcat(cur_dir,finfo->name);
- strcat(cur_dir,"\\");
-
- /* write a tar directory, don't bother with mode - just set it to
- * 40755 */
- writetarheader(tarhandle, cur_dir, 0, finfo->mtime, "040755 \0");
- strcpy(mtar_mask,cur_dir);
- strcat(mtar_mask,"*");
-
- do_dir((char *)inbuf,(char *)outbuf,mtar_mask,attribute,do_tar,recurse);
- strcpy(cur_dir,saved_curdir);
- free(inbuf);free(outbuf);
- }
- else
- {
- strcpy(rname,cur_dir);
- strcat(rname,finfo->name);
- do_atar(rname,finfo->name,finfo);
- }
-}
-
-/****************************************************************************
-Convert from UNIX to DOS file names
-***************************************************************************/
-static void unfixtarname(char *tptr, char *fp, int l)
-{
- /* remove '.' from start of file name, convert from unix /'s to
- * dos \'s in path. Kill any absolute path names.
- */
-
- if (*fp == '.') fp++;
- if (*fp == '\\' || *fp == '/') fp++;
-
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- while (l > 0) {
- if (is_shift_jis (*fp)) {
- *tptr++ = *fp++;
- *tptr++ = *fp++;
- l -= 2;
- } else if (is_kana (*fp)) {
- *tptr++ = *fp++;
- l--;
- } else if (*fp == '/') {
- *tptr++ = '\\';
- fp++;
- l--;
- } else {
- *tptr++ = *fp++;
- l--;
- }
- }
- }
- else
- {
- while (l--)
- {
- *tptr=(*fp == '/') ? '\\' : *fp;
- tptr++;
- fp++;
- }
- }
-}
-
-static void do_tarput()
-{
- file_info finfo;
- int nread=0, bufread;
- char *inbuf,*outbuf;
- int fsize=0;
- int fnum;
- struct timeval tp_start;
- BOOL tskip=False; /* We'll take each file as it comes */
-
- GetTimeOfDay(&tp_start);
-
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
-
- if (!inbuf || !outbuf)
- {
- DEBUG(0,("out of memory\n"));
- return;
- }
-
- /*
- * Must read in tbufsiz dollops
- */
-
- /* These should be the only reads in clitar.c */
- while ((bufread=read(tarhandle, tarbuf, tbufsiz))>0) {
- char *bufferp, *endofbuffer;
- int chunk;
-
- /* Code to handle a short read.
- * We always need a TBLOCK full of stuff
- */
- if (bufread % TBLOCK) {
- int lchunk=TBLOCK-(bufread % TBLOCK);
- int lread;
-
- /* It's a shorty - a short read that is */
- DEBUG(3, ("Short read, read %d so far (need %d)\n", bufread, lchunk));
-
- while ((lread=read(tarhandle, tarbuf+bufread, lchunk))>0) {
- bufread+=lread;
- if (!(lchunk-=lread)) break;
- }
-
- /* If we've reached EOF then that must be a short file */
- if (lread<=0) break;
- }
-
- bufferp=tarbuf;
- endofbuffer=tarbuf+bufread;
-
- if (tskip) {
- if (fsize<bufread) {
- tskip=False;
- bufferp+=fsize;
- fsize=0;
- } else {
- if (fsize==bufread) tskip=False;
- fsize-=bufread;
- continue;
- }
- }
-
- do {
- if (!fsize)
- {
- switch (readtarheader((union hblock *) bufferp, &finfo, cur_dir))
- {
- case -2: /* something dodgy but not fatal about this */
- DEBUG(0, ("skipping %s...\n", finfo.name));
- bufferp+=TBLOCK; /* header - like a link */
- continue;
- case -1:
- DEBUG(0, ("abandoning restore\n"));
- free(inbuf); free(outbuf);
- return;
- case 0: /* chksum is zero - we assume that one all zero
- *header block will do for eof */
- DEBUG(0,
- ("total of %d tar files restored to share\n", ntarf));
- free(inbuf); free(outbuf);
- return;
- default:
- break;
- }
-
- tskip=clipn
- && (clipfind(cliplist, clipn, finfo.name) ^ tar_excl);
- if (tskip) {
- bufferp+=TBLOCK;
- if (finfo.mode & aDIR)
- continue;
- else if ((fsize=finfo.size) % TBLOCK) {
- fsize+=TBLOCK-(fsize%TBLOCK);
- }
- if (fsize<endofbuffer-bufferp) {
- bufferp+=fsize;
- fsize=0;
- continue;
- } else {
- fsize-=endofbuffer-bufferp;
- break;
- }
- }
-
- if (finfo.mode & aDIR)
- {
- if (!smbchkpath(finfo.name, inbuf, outbuf)
- && !smbmkdir(finfo.name, inbuf, outbuf))
- {
- DEBUG(0, ("abandoning restore\n"));
- free(inbuf); free(outbuf);
- return;
- }
- else
- {
- bufferp+=TBLOCK;
- continue;
- }
- }
-
- fsize=finfo.size;
-
- if (ensurepath(finfo.name, inbuf, outbuf)
- && !smbcreat(finfo, &fnum, inbuf, outbuf))
- {
- DEBUG(0, ("abandoning restore\n"));
- free(inbuf);free(outbuf);
- return;
- }
-
- DEBUG(0,("restore tar file %s of size %d bytes\n",
- finfo.name,finfo.size));
-
- nread=0;
- if ((bufferp+=TBLOCK) >= endofbuffer) break;
- } /* if (!fsize) */
-
- /* write out the file in chunk sized chunks - don't
- * go past end of buffer though */
- chunk=(fsize-nread < endofbuffer - bufferp)
- ? fsize - nread : endofbuffer - bufferp;
-
- while (chunk > 0) {
- int minichunk=MIN(chunk, max_xmit-200);
-
- if (!smbwrite(fnum, /* file descriptor */
- minichunk, /* n */
- nread, /* offset low */
- 0, /* offset high - not implemented */
- fsize-nread, /* left - only hint to server */
- bufferp,
- inbuf,
- outbuf))
- {
- DEBUG(0, ("Error writing remote file\n"));
- free(inbuf); free(outbuf);
- return;
- }
- DEBUG(5, ("chunk writing fname=%s fnum=%d nread=%d minichunk=%d chunk=%d size=%d\n", finfo.name, fnum, nread, minichunk, chunk, fsize));
-
- bufferp+=minichunk; nread+=minichunk;
- chunk-=minichunk;
- }
-
- if (nread>=fsize)
- {
- if (!smbshut(finfo, fnum, inbuf, outbuf))
- {
- DEBUG(0, ("Error closing remote file\n"));
- free(inbuf);free(outbuf);
- return;
- }
- if (fsize % TBLOCK) bufferp+=TBLOCK - (fsize % TBLOCK);
- DEBUG(5, ("bufferp is now %d (psn=%d)\n",
- (long) bufferp, (long)(bufferp - tarbuf)));
- ntarf++;
- fsize=0;
- }
- } while (bufferp < endofbuffer);
- }
-
- DEBUG(0, ("premature eof on tar file ?\n"));
- DEBUG(0,("total of %d tar files restored to share\n", ntarf));
-
- free(inbuf); free(outbuf);
-}
-
-/*
- * samba interactive commands
- */
-
-/****************************************************************************
-Blocksize command
-***************************************************************************/
-void cmd_block(void)
-{
- fstring buf;
- int block;
-
- if (!next_token(NULL,buf,NULL))
- {
- DEBUG(0, ("blocksize <n>\n"));
- return;
- }
-
- block=atoi(buf);
- if (block < 0 || block > 65535)
- {
- DEBUG(0, ("blocksize out of range"));
- return;
- }
-
- blocksize=block;
- DEBUG(1,("blocksize is now %d\n", blocksize));
-}
-
-/****************************************************************************
-command to set incremental / reset mode
-***************************************************************************/
-void cmd_tarmode(void)
-{
- fstring buf;
-
- while (next_token(NULL,buf,NULL)) {
- if (strequal(buf, "full"))
- tar_inc=False;
- else if (strequal(buf, "inc"))
- tar_inc=True;
- else if (strequal(buf, "reset"))
- tar_reset=True;
- else if (strequal(buf, "noreset"))
- tar_reset=False;
- else DEBUG(0, ("tarmode: unrecognised option %s\n", buf));
- }
-
- DEBUG(0, ("tarmode is now %s, %s\n",
- tar_inc ? "incremental" : "full",
- tar_reset ? "reset" : "noreset"));
-}
-
-/****************************************************************************
-Feeble attrib command
-***************************************************************************/
-void cmd_setmode(void)
-{
- char *q;
- fstring buf;
- pstring fname;
- int attra[2];
- int direct=1;
-
- attra[0] = attra[1] = 0;
-
- if (!next_token(NULL,buf,NULL))
- {
- DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n"));
- return;
- }
-
- strcpy(fname, cur_dir);
- strcat(fname, buf);
-
- while (next_token(NULL,buf,NULL)) {
- q=buf;
-
- while(*q)
- switch (*q++) {
- case '+': direct=1;
- break;
- case '-': direct=0;
- break;
- case 'r': attra[direct]|=aRONLY;
- break;
- case 'h': attra[direct]|=aHIDDEN;
- break;
- case 's': attra[direct]|=aSYSTEM;
- break;
- case 'a': attra[direct]|=aARCH;
- break;
- default: DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n"));
- return;
- }
- }
-
- if (attra[ATTRSET]==0 && attra[ATTRRESET]==0)
- {
- DEBUG(0, ("setmode <filename> <perm=[+|-]rsha>\n"));
- return;
- }
-
- DEBUG(1, ("\nperm set %d %d\n", attra[ATTRSET], attra[ATTRRESET]));
- (void) do_setrattr(fname, attra[ATTRSET], ATTRSET);
- (void) do_setrattr(fname, attra[ATTRRESET], ATTRRESET);
-}
-
-/****************************************************************************
-Principal command for creating / extracting
-***************************************************************************/
-void cmd_tar(char *inbuf, char *outbuf)
-{
- fstring buf;
- char **argl;
- int argcl;
-
- if (!next_token(NULL,buf,NULL))
- {
- DEBUG(0,("tar <c|x>[IXbga] <filename>\n"));
- return;
- }
-
- argl=toktocliplist(&argcl, NULL);
- if (!tar_parseargs(argcl, argl, buf, 0))
- return;
-
- process_tar(inbuf, outbuf);
-
- free(argl);
-}
-
-/****************************************************************************
-Command line (option) version
-***************************************************************************/
-int process_tar(char *inbuf, char *outbuf)
-{
- initarbuf();
- switch(tar_type) {
- case 'x':
- do_tarput();
- free(tarbuf);
- close(tarhandle);
- break;
- case 'r':
- case 'c':
- if (clipn && tar_excl) {
- int i;
- pstring tarmac;
-
- for (i=0; i<clipn; i++) {
- DEBUG(0,("arg %d = %s\n", i, cliplist[i]));
-
- if (*(cliplist[i]+strlen(cliplist[i])-1)=='\\') {
- *(cliplist[i]+strlen(cliplist[i])-1)='\0';
- }
-
- if (strrchr(cliplist[i], '\\')) {
- pstring saved_dir;
-
- strcpy(saved_dir, cur_dir);
-
- if (*cliplist[i]=='\\') {
- strcpy(tarmac, cliplist[i]);
- } else {
- strcpy(tarmac, cur_dir);
- strcat(tarmac, cliplist[i]);
- }
- strcpy(cur_dir, tarmac);
- *(strrchr(cur_dir, '\\')+1)='\0';
-
- do_dir((char *)inbuf,(char *)outbuf,tarmac,attribute,do_tar,recurse);
- strcpy(cur_dir,saved_dir);
- } else {
- strcpy(tarmac, cur_dir);
- strcat(tarmac, cliplist[i]);
- do_dir((char *)inbuf,(char *)outbuf,tarmac,attribute,do_tar,recurse);
- }
- }
- } else {
- pstring mask;
- strcpy(mask,cur_dir);
- strcat(mask,"\\*");
- do_dir((char *)inbuf,(char *)outbuf,mask,attribute,do_tar,recurse);
- }
-
- if (ntarf) dotareof(tarhandle);
- close(tarhandle);
- free(tarbuf);
-
- DEBUG(0, ("tar: dumped %d tar files\n", ntarf));
- DEBUG(0, ("Total bytes written: %d\n", ttarf));
- break;
- }
-
- return(0);
-}
-
-/****************************************************************************
-Find a token (filename) in a clip list
-***************************************************************************/
-int clipfind(char **aret, int ret, char *tok)
-{
- if (aret==NULL) return 0;
-
- /* ignore leading slashes or dots in token */
- while(strchr("/\\.", *tok)) tok++;
-
- while(ret--) {
- char *pkey=*aret++;
-
- /* ignore leading slashes or dots in list */
- while(strchr("/\\.", *pkey)) pkey++;
-
- if (!strslashcmp(pkey, tok)) return 1;
- }
-
- return 0;
-}
-
-/****************************************************************************
-Parse tar arguments. Sets tar_type, tar_excl, etc.
-***************************************************************************/
-int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind)
-{
- char tar_clipfl='\0';
-
- /* Reset back to defaults - could be from interactive version
- * reset mode and archive mode left as they are though
- */
- tar_type='\0';
- tar_excl=True;
-
- while (*Optarg)
- switch(*Optarg++) {
- case 'c':
- tar_type='c';
- break;
- case 'x':
- if (tar_type=='c') {
- printf("Tar must be followed by only one of c or x.\n");
- return 0;
- }
- tar_type='x';
- break;
- case 'b':
- if (Optind>=argc || !(blocksize=atoi(argv[Optind]))) {
- DEBUG(0,("Option b must be followed by valid blocksize\n"));
- return 0;
- } else {
- Optind++;
- }
- break;
- case 'g':
- tar_inc=True;
- break;
- case 'N':
- if (Optind>=argc) {
- DEBUG(0,("Option N must be followed by valid file name\n"));
- return 0;
- } else {
- struct stat stbuf;
- extern time_t newer_than;
-
- if (sys_stat(argv[Optind], &stbuf) == 0) {
- newer_than = stbuf.st_mtime;
- DEBUG(1,("Getting files newer than %s",
- asctime(LocalTime(&newer_than))));
- Optind++;
- } else {
- DEBUG(0,("Error setting newer-than time\n"));
- return 0;
- }
- }
- break;
- case 'a':
- tar_reset=True;
- break;
- case 'I':
- if (tar_clipfl) {
- DEBUG(0,("Only one of I,X must be specified\n"));
- return 0;
- }
- tar_clipfl='I';
- break;
- case 'X':
- if (tar_clipfl) {
- DEBUG(0,("Only one of I,X must be specified\n"));
- return 0;
- }
- tar_clipfl='X';
- break;
- default:
- DEBUG(0,("Unknown tar option\n"));
- return 0;
- }
-
- if (!tar_type) {
- printf("Option T must be followed by one of c or x.\n");
- return 0;
- }
-
- tar_excl=tar_clipfl!='X';
- if (Optind+1<argc) {
- cliplist=argv+Optind+1;
- clipn=argc-Optind-1;
- }
- if (Optind>=argc || !strcmp(argv[Optind], "-")) {
- /* Sets tar handle to either 0 or 1, as appropriate */
- tarhandle=(tar_type=='c');
- } else {
- if ((tar_type=='x' && (tarhandle = open(argv[Optind], O_RDONLY)) == -1)
- || (tar_type=='c' && (tarhandle=creat(argv[Optind], 0644)) < 0))
- {
- DEBUG(0,("Error opening local file %s - %s\n",
- argv[Optind], strerror(errno)));
- return(0);
- }
- }
-
- return 1;
-}
diff --git a/source/codepages/codepage_def.437 b/source/codepages/codepage_def.437
deleted file mode 100644
index d357c074e44..00000000000
--- a/source/codepages/codepage_def.437
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-# Codepage definition file for IBM Code Page 437 - MS-DOS Latin US
-# defines lower->upper mapping.
-# Written by Jeremy Allison <jallison@whistle.com>
-
-# The columns are :
-# lower upper map upper to lower map lower to upper
-#
- 0x87 0x80 True True
- 0x81 0x9A True True
- 0x82 0x90 True True
- 0x83 0x41 True False
- 0x84 0x8E True True
- 0x85 0x41 True False
- 0x86 0x8F True True
- 0x88 0x45 True False
- 0x89 0x45 True False
- 0x8A 0x45 True False
- 0x8B 0x49 True False
- 0x8C 0x49 True False
- 0x8D 0x49 True False
- 0x91 0x92 True True
- 0x93 0x4F True False
- 0x94 0x99 True True
- 0x95 0x4F True False
- 0x96 0x55 True False
- 0x97 0x55 True False
- 0x9B 0 False False
- 0x9C 0 False False
- 0x9D 0 False False
- 0xA0 0x41 True False
- 0xA1 0x49 True False
- 0xA2 0x4F True False
- 0xA3 0x55 True False
- 0xA4 0xA5 True True
- 0xA8 0 False False
- 0xAD 0 False False
- 0xAE 0 False False
- 0xAF 0 False False
- 0xE0 0 False False
- 0xE1 0 False False
- 0xE2 0 False False
- 0xE3 0 False False
- 0xE4 0 False False
- 0xE5 0 False False
- 0xE6 0 False False
- 0xE7 0 False False
- 0xE8 0 False False
- 0xE9 0 False False
- 0xEA 0 False False
- 0xEB 0 False False
- 0xEC 0 False False
- 0xED 0 False False
- 0xEE 0 False False
- 0xEF 0 False False
diff --git a/source/codepages/codepage_def.850 b/source/codepages/codepage_def.850
deleted file mode 100644
index e2466a707af..00000000000
--- a/source/codepages/codepage_def.850
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-# Codepage definition file for IBM Code Page 850 - MS-DOS Latin 1
-# defines lower->upper mapping.
-# Written by Jeremy Allison (jallison@whistle.com)
-
-# The columns are :
-# lower upper map upper to lower map lower to upper
-#
- 0x85 0xB7 True True
- 0xA0 0xB5 True True
- 0x83 0xB6 True True
- 0xC6 0xC7 True True
- 0x84 0x8E True True
- 0x86 0x8F True True
- 0x91 0x92 True True
- 0x87 0x80 True True
- 0x8A 0xD4 True True
- 0x82 0x90 True True
- 0x88 0xD2 True True
- 0x89 0xD3 True True
- 0x8D 0xDE True True
- 0xA1 0xD6 True True
- 0x8C 0xD7 True True
- 0x8B 0xD8 True True
- 0xD0 0xD1 True True
- 0xA4 0xA5 True True
- 0x95 0xE3 True True
- 0xA2 0xE0 True True
- 0x93 0xE2 True True
- 0xE4 0xE5 True True
- 0x94 0x99 True True
- 0x9B 0x9D True True
- 0x97 0xEB True True
- 0xA3 0xE9 True True
- 0x96 0xEA True True
- 0x81 0x9A True True
- 0xEC 0xED True True
- 0xE7 0xE8 True True
- 0x9C 0 False False
diff --git a/source/codepages/codepage_def.852 b/source/codepages/codepage_def.852
deleted file mode 100644
index ed1423428ca..00000000000
--- a/source/codepages/codepage_def.852
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-# Codepage definition file for IBM Code Page 852 - MS-DOS Latin 2
-# defines lower->upper mapping.
-# Written by Leos Bitto <bitto@altec.cz>
-
-# The columns are :
-# lower upper map upper to lower map lower to upper
-#
- 0x81 0x9A True True
- 0x82 0x90 True True
- 0x83 0xB6 True True
- 0x84 0x8E True True
- 0x85 0xDE True True
- 0x86 0x8F True True
- 0x87 0x80 True True
- 0x88 0x9D True True
- 0x89 0xD3 True True
- 0x8B 0x8A True True
- 0x8C 0xD7 True True
- 0x92 0x91 True True
- 0x93 0xE2 True True
- 0x94 0x99 True True
- 0x96 0x95 True True
- 0x98 0x97 True True
- 0x9C 0x9B True True
- 0x9F 0xAC True True
- 0xA0 0xB5 True True
- 0xA1 0xD6 True True
- 0xA2 0xE0 True True
- 0xA3 0xE9 True True
- 0xA5 0xA4 True True
- 0xA7 0xA6 True True
- 0xA9 0xA8 True True
- 0xAB 0x8D True True
- 0xAD 0xB8 True True
- 0xBE 0xBD True True
- 0xC7 0xC6 True True
- 0xD0 0xD1 True True
- 0xD4 0xD2 True True
- 0xD8 0xB7 True True
- 0xE4 0xE3 True True
- 0xE5 0xD5 True True
- 0xE7 0xE6 True True
- 0xEA 0xE8 True True
- 0xEC 0xED True True
- 0xEE 0xDD True True
- 0xFB 0xEB True True
- 0xFD 0xFC True True
diff --git a/source/codepages/codepage_def.932 b/source/codepages/codepage_def.932
deleted file mode 100644
index 8d9ff631fba..00000000000
--- a/source/codepages/codepage_def.932
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-
-# Codepage definition file for IBM Code Page 932 - MS-DOS Japanese SJIS
-# defines lower->upper mapping.
-# Written by Jeremy Allison <jallison@whistle.com>
-
-# The columns are :
-# lower upper map upper to lower map lower to upper
-#
-# This file is intentionaly empty - no mappings are done. \ No newline at end of file
diff --git a/source/include/byteorder.h b/source/include/byteorder.h
deleted file mode 100644
index 0664a338175..00000000000
--- a/source/include/byteorder.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB Byte handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- This file implements macros for machine independent short and
- int manipulation
-
-Here is a description of this file that I emailed to the samba list once:
-
-> I am confused about the way that byteorder.h works in Samba. I have
-> looked at it, and I would have thought that you might make a distinction
-> between LE and BE machines, but you only seem to distinguish between 386
-> and all other architectures.
->
-> Can you give me a clue?
-
-sure.
-
-The distinction between 386 and other architectures is only there as
-an optimisation. You can take it out completely and it will make no
-difference. The routines (macros) in byteorder.h are totally byteorder
-independent. The 386 optimsation just takes advantage of the fact that
-the x86 processors don't care about alignment, so we don't have to
-align ints on int boundaries etc. If there are other processors out
-there that aren't alignment sensitive then you could also define
-CAREFUL_ALIGNMENT=0 on those processors as well.
-
-Ok, now to the macros themselves. I'll take a simple example, say we
-want to extract a 2 byte integer from a SMB packet and put it into a
-type called uint16 that is in the local machines byte order, and you
-want to do it with only the assumption that uint16 is _at_least_ 16
-bits long (this last condition is very important for architectures
-that don't have any int types that are 2 bytes long)
-
-You do this:
-
-#define CVAL(buf,pos) (((unsigned char *)(buf))[pos])
-#define PVAL(buf,pos) ((unsigned)CVAL(buf,pos))
-#define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8)
-
-then to extract a uint16 value at offset 25 in a buffer you do this:
-
-char *buffer = foo_bar();
-uint16 xx = SVAL(buffer,25);
-
-We are using the byteoder independence of the ANSI C bitshifts to do
-the work. A good optimising compiler should turn this into efficient
-code, especially if it happens to have the right byteorder :-)
-
-I know these macros can be made a bit tidier by removing some of the
-casts, but you need to look at byteorder.h as a whole to see the
-reasoning behind them. byteorder.h defines the following macros:
-
-SVAL(buf,pos) - extract a 2 byte SMB value
-IVAL(buf,pos) - extract a 4 byte SMB value
-SVALS(buf,pos) signed version of SVAL()
-IVALS(buf,pos) signed version of IVAL()
-
-SSVAL(buf,pos,val) - put a 2 byte SMB value into a buffer
-SIVAL(buf,pos,val) - put a 4 byte SMB value into a buffer
-SSVALS(buf,pos,val) - signed version of SSVAL()
-SIVALS(buf,pos,val) - signed version of SIVAL()
-
-RSVAL(buf,pos) - like SVAL() but for NMB byte ordering
-RIVAL(buf,pos) - like IVAL() but for NMB byte ordering
-RSSVAL(buf,pos,val) - like SSVAL() but for NMB ordering
-RSIVAL(buf,pos,val) - like SIVAL() but for NMB ordering
-
-it also defines lots of intermediate macros, just ignore those :-)
-
-*/
-
-/* some switch macros that do both store and read to and from SMB buffers */
-
-#define RW_PCVAL(read,inbuf,outbuf,len) \
- if (read) { PCVAL (inbuf,0,outbuf,len) } \
- else { PSCVAL(inbuf,0,outbuf,len) }
-
-#define RW_PSVAL(read,inbuf,outbuf,len) \
- if (read) { PSVAL (inbuf,0,outbuf,len) } \
- else { PSSVAL(inbuf,0,outbuf,len) }
-
-#define RW_CVAL(read, inbuf, outbuf, offset) \
- if (read) (outbuf) = CVAL (inbuf,offset); \
- else SCVAL(inbuf,offset,outbuf);
-
-#define RW_IVAL(read, inbuf, outbuf, offset) \
- if (read) (outbuf)= IVAL (inbuf,offset); \
- else SIVAL(inbuf,offset,outbuf);
-
-#define RW_SVAL(read, inbuf, outbuf, offset) \
- if (read) (outbuf)= SVAL (inbuf,offset); \
- else SSVAL(inbuf,offset,outbuf);
-
-#undef CAREFUL_ALIGNMENT
-
-/* we know that the 386 can handle misalignment and has the "right"
- byteorder */
-#ifdef __i386__
-#define CAREFUL_ALIGNMENT 0
-#endif
-
-#ifndef CAREFUL_ALIGNMENT
-#define CAREFUL_ALIGNMENT 1
-#endif
-
-#define CVAL(buf,pos) (((unsigned char *)(buf))[pos])
-#define PVAL(buf,pos) ((unsigned)CVAL(buf,pos))
-#define SCVAL(buf,pos,val) (CVAL(buf,pos) = (val))
-
-
-#if CAREFUL_ALIGNMENT
-
-#define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8)
-#define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16)
-#define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8)
-#define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&0xFFFF),SSVALX(buf,pos+2,val>>16))
-#define SVALS(buf,pos) ((int16)SVAL(buf,pos))
-#define IVALS(buf,pos) ((int32)IVAL(buf,pos))
-#define SSVAL(buf,pos,val) SSVALX((buf),(pos),((uint16)(val)))
-#define SIVAL(buf,pos,val) SIVALX((buf),(pos),((uint32)(val)))
-#define SSVALS(buf,pos,val) SSVALX((buf),(pos),((int16)(val)))
-#define SIVALS(buf,pos,val) SIVALX((buf),(pos),((int32)(val)))
-
-#else
-
-/* this handles things for architectures like the 386 that can handle
- alignment errors */
-/*
- WARNING: This section is dependent on the length of int16 and int32
- being correct
-*/
-
-/* get single value from an SMB buffer */
-#define SVAL(buf,pos) (*(uint16 *)((char *)(buf) + (pos)))
-#define IVAL(buf,pos) (*(uint32 *)((char *)(buf) + (pos)))
-#define SVALS(buf,pos) (*(int16 *)((char *)(buf) + (pos)))
-#define IVALS(buf,pos) (*(int32 *)((char *)(buf) + (pos)))
-
-/* store single value in an SMB buffer */
-#define SSVAL(buf,pos,val) SVAL(buf,pos)=((uint16)(val))
-#define SIVAL(buf,pos,val) IVAL(buf,pos)=((uint32)(val))
-#define SSVALS(buf,pos,val) SVALS(buf,pos)=((int16)(val))
-#define SIVALS(buf,pos,val) IVALS(buf,pos)=((int32)(val))
-
-#endif
-
-
-/* macros for reading / writing arrays */
-
-#define SMBMACRO(macro,buf,pos,val,len,size) \
-{ int l; for (l = 0; l < (len); l++) (val)[l] = macro((buf), (pos) + (size)*l); }
-
-#define SSMBMACRO(macro,buf,pos,val,len,size) \
-{ int l; for (l = 0; l < (len); l++) macro((buf), (pos) + (size)*l, (val)[l]); }
-
-/* reads multiple data from an SMB buffer */
-#define PCVAL(buf,pos,val,len) SMBMACRO(CVAL,buf,pos,val,len,1)
-#define PSVAL(buf,pos,val,len) SMBMACRO(SVAL,buf,pos,val,len,2)
-#define PIVAL(buf,pos,val,len) SMBMACRO(IVAL,buf,pos,val,len,4)
-#define PCVALS(buf,pos,val,len) SMBMACRO(CVALS,buf,pos,val,len,1)
-#define PSVALS(buf,pos,val,len) SMBMACRO(SVALS,buf,pos,val,len,2)
-#define PIVALS(buf,pos,val,len) SMBMACRO(IVALS,buf,pos,val,len,4)
-
-/* stores multiple data in an SMB buffer */
-#define PSCVAL(buf,pos,val,len) SSMBMACRO(SCVAL,buf,pos,val,len,1)
-#define PSSVAL(buf,pos,val,len) SSMBMACRO(SSVAL,buf,pos,val,len,2)
-#define PSIVAL(buf,pos,val,len) SSMBMACRO(SIVAL,buf,pos,val,len,4)
-#define PSCVALS(buf,pos,val,len) SSMBMACRO(SCVALS,buf,pos,val,len,1)
-#define PSSVALS(buf,pos,val,len) SSMBMACRO(SSVALS,buf,pos,val,len,2)
-#define PSIVALS(buf,pos,val,len) SSMBMACRO(SIVALS,buf,pos,val,len,4)
-
-
-/* now the reverse routines - these are used in nmb packets (mostly) */
-#define SREV(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))
-#define IREV(x) ((SREV(x)<<16) | (SREV((x)>>16)))
-
-#define RSVAL(buf,pos) SREV(SVAL(buf,pos))
-#define RIVAL(buf,pos) IREV(IVAL(buf,pos))
-#define RSSVAL(buf,pos,val) SSVAL(buf,pos,SREV(val))
-#define RSIVAL(buf,pos,val) SIVAL(buf,pos,IREV(val))
-
diff --git a/source/include/charset.h b/source/include/charset.h
deleted file mode 100644
index fb184897c07..00000000000
--- a/source/include/charset.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Character set handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef CHARSET_C
-
-extern char *dos_char_map;
-extern char *upper_char_map;
-extern char *lower_char_map;
-extern void add_char_string(char *s);
-extern void charset_initialise(void);
-
-#ifdef toupper
-#undef toupper
-#endif
-
-#ifdef tolower
-#undef tolower
-#endif
-
-#ifdef isupper
-#undef isupper
-#endif
-
-#ifdef islower
-#undef islower
-#endif
-
-#ifdef isdoschar
-#undef isdoschar
-#endif
-
-#ifdef isspace
-#undef isspace
-#endif
-
-#define toupper(c) (upper_char_map[(c&0xff)] & 0xff)
-#define tolower(c) (lower_char_map[(c&0xff)] & 0xff)
-#define isupper(c) ((c&0xff) != tolower(c&0xff))
-#define islower(c) ((c&0xff) != toupper(c&0xff))
-#define isdoschar(c) (dos_char_map[(c&0xff)] != 0)
-#define isspace(c) ((c)==' ' || (c) == '\t')
-
-/* this is used to determine if a character is safe to use in
- something that may be put on a command line */
-#define issafe(c) (isalnum((c&0xff)) || strchr("-._",c))
-#endif
-
-/* Dynamic codepage files defines. */
-
-/* Version id for dynamically loadable codepage files. */
-#define CODEPAGE_FILE_VERSION_ID 0x1
-/* Version 1 codepage file header size. */
-#define CODEPAGE_HEADER_SIZE 8
-/* Offsets for codepage file header entries. */
-#define CODEPAGE_VERSION_OFFSET 0
-#define CODEPAGE_CLIENT_CODEPAGE_OFFSET 2
-#define CODEPAGE_LENGTH_OFFSET 4
diff --git a/source/include/clitar.h b/source/include/clitar.h
deleted file mode 100644
index 2305fceeec7..00000000000
--- a/source/include/clitar.h
+++ /dev/null
@@ -1,17 +0,0 @@
-
-#define TBLOCK 512
-#define NAMSIZ 100
-union hblock {
- char dummy[TBLOCK];
- struct header {
- char name[NAMSIZ];
- char mode[8];
- char uid[8];
- char gid[8];
- char size[12];
- char mtime[12];
- char chksum[8];
- char linkflag;
- char linkname[NAMSIZ];
- } dbuf;
-};
diff --git a/source/include/includes.h b/source/include/includes.h
deleted file mode 100644
index a877f1ffb35..00000000000
--- a/source/include/includes.h
+++ /dev/null
@@ -1,1290 +0,0 @@
-#ifndef _INCLUDES_H
-#define _INCLUDES_H
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Machine customisation and include handling
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-/*
- This file does all the #includes's. This makes it easier to
- port to a new unix. Hopefully a port will only have to edit the Makefile
- and add a section for the new unix below.
-*/
-
-
-/* the first OS dependent section is to setup what includes will be used.
- the main OS dependent section comes later on
-*/
-
-#ifdef ALTOS
-#define NO_UTIMEH
-#endif
-
-#ifdef MIPS
-#define POSIX_H
-#define NO_UTIMEH
-#endif
-
-#ifdef sun386
-#define NO_UTIMEH
-#endif
-
-#ifdef NEXT2
-#define NO_UTIMEH
-#endif
-
-#ifdef NEXT3_0
-#define NO_UTIMEH
-#define NO_UNISTDH
-#endif
-
-#ifdef APOLLO
-#define NO_UTIMEH
-#define NO_SYSMOUNTH
-#define NO_UNISTDH
-#endif
-
-#ifdef AIX
-#define NO_SYSMOUNTH
-#endif
-
-#ifdef M88K_R3
-#define SVR3H
-#define NO_RESOURCEH
-#endif
-
-#ifdef DNIX
-#define NO_SYSMOUNTH
-#define NO_NETIFH
-#define NO_RESOURCEH
-#define PRIME_NMBD 0
-#define NO_SETGROUPS
-#endif
-
-
-#ifdef ISC
-#define SYSSTREAMH
-#define NO_RESOURCEH
-#endif
-
-#ifdef QNX
-#define NO_RESOURCEH
-#define NO_SYSMOUNTH
-#define USE_MMAP 1
-#ifdef __386__
- #define __i386__
-#endif
-#endif
-
-#ifdef NEWS42
-#define NO_UTIMEH
-#define NO_STRFTIME
-#define NO_UTIMBUF
-#define REPLACE_MKTIME
-#define NO_TM_NAME
-#endif
-
-#ifdef OS2
-#define NO_SYSMOUNTH
-#define NO_NETIFH
-#endif
-
-#ifdef LYNX
-#define NO_SYSMOUNTH
-#endif
-
-
-#if (defined(SHADOW_PWD)||defined(OSF1_ENH_SEC)||defined(SecureWare)||defined(PWDAUTH))
-#define PASSWORD_LENGTH 16
-#endif
-
-/* here is the general includes section - with some ifdefs generated
- by the previous section
-*/
-#include "local.h"
-#include <stdio.h>
-#ifdef POSIX_STDLIBH
-#include <posix/stdlib.h>
-#else
-#include <stdlib.h>
-#endif
-#include <ctype.h>
-#include <time.h>
-#ifndef NO_UTIMEH
-#include <utime.h>
-#endif
-#include <sys/types.h>
-
-#ifdef SVR3H
-#include <sys/statfs.h>
-#include <sys/stream.h>
-#include <netinet/types.h>
-#include <netinet/ether.h>
-#include <netinet/ip_if.h>
-#endif
-
-#include <sys/socket.h>
-#ifdef AXPROC
-#include <termio.h>
-#endif
-#include <sys/ioctl.h>
-#include <stddef.h>
-#ifdef POSIX_H
-#include <posix/utime.h>
-#include <bsd/sys/time.h>
-#include <bsd/netinet/in.h>
-#else
-#include <sys/time.h>
-#include <netinet/in.h>
-#endif
-#include <netdb.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <grp.h>
-#ifndef NO_RESOURCEH
-#include <sys/resource.h>
-#endif
-#ifndef NO_SYSMOUNTH
-#include <sys/mount.h>
-#endif
-#include <pwd.h>
-#ifdef __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#ifndef NO_UNISTDH
-#include <unistd.h>
-#endif
-#include <sys/wait.h>
-#ifdef SYSSTREAMH
-#include <sys/stream.h>
-#endif
-#ifndef NO_NETIFH
-#ifdef POSIX_H
-#include <bsd/net/if.h>
-#else
-#include <net/if.h>
-#endif
-#endif
-
-#if defined(GETPWANAM)
-#include <sys/types.h>
-#include <sys/label.h>
-#include <sys/audit.h>
-#include <pwdadj.h>
-#endif
-
-#if defined(SHADOW_PWD) && !defined(NETBSD) && !defined(FreeBSD) && !defined(CONVEX)
-#include <shadow.h>
-#endif
-
-#ifdef SYSLOG
-#include <syslog.h>
-#endif
-
-
-
-/***************************************************************************
-Here come some platform specific sections
-***************************************************************************/
-
-
-#ifdef LINUX
-#include <arpa/inet.h>
-#include <dirent.h>
-#include <string.h>
-#include <sys/vfs.h>
-#include <netinet/in.h>
-#ifndef NO_ASMSIGNALH
-#include <asm/signal.h>
-#endif
-#ifdef GLIBC2
-#define _LINUX_C_LIB_VERSION_MAJOR 6
-#include <termios.h>
-#include <rpcsvc/ypclnt.h>
-#include <crypt.h>
-#include <netinet/tcp.h>
-#include <netinet/ip.h>
-#endif
-#define SIGNAL_CAST (__sighandler_t)
-#define USE_GETCWD
-#define USE_SETSID
-#define HAVE_BZERO
-#define HAVE_MEMMOVE
-#define USE_SIGPROCMASK
-#define USE_WAITPID
-#if 0
-/* SETFS disabled until we can check on some bug reports */
-#if _LINUX_C_LIB_VERSION_MAJOR >= 5
-#define USE_SETFS
-#endif
-#endif
-#ifdef SHADOW_PWD
-#if _LINUX_C_LIB_VERSION_MAJOR < 5
-#ifndef crypt
-#define crypt pw_encrypt
-#endif
-#endif
-#endif
-#endif
-
-#ifdef SUNOS4
-#define SIGNAL_CAST (void (*)(int))
-#include <netinet/tcp.h>
-#include <dirent.h>
-#include <sys/acct.h>
-#include <sys/vfs.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/wait.h>
-#include <signal.h>
-/* #include <termios.h> */
-#ifdef sun386
-#define NO_STRFTIME
-#define NO_UTIMBUF
-#define mktime timelocal
-typedef unsigned short mode_t;
-#else
-#include <utime.h>
-#define NO_STRERROR
-#endif
-#ifndef REPLACE_GETPASS
-#define REPLACE_GETPASS
-#endif
-#ifndef BSD_TERMIO
-#define BSD_TERMIO
-#endif
-#ifndef USE_SIGPROCMASK
-#define USE_SIGPROCMASK
-#endif
-#ifndef USE_WAITPID
-#define USE_WAITPID
-#endif
-/* SunOS doesn't have POSIX atexit */
-#define atexit on_exit
-#endif
-
-
-#ifdef SUNOS5
-#include <fcntl.h>
-#include <dirent.h>
-#include <sys/acct.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
-#include <sys/filio.h>
-#include <sys/sockio.h>
-#include <netinet/in_systm.h>
-#include <netinet/tcp.h>
-#include <netinet/ip.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <rpcsvc/ypclnt.h>
-#include <termios.h>
-#include <sys/stropts.h>
-#ifndef USE_LIBDES
-#include <crypt.h>
-#endif /* USE_LIBDES */
-extern int gettimeofday (struct timeval *, void *);
-extern int gethostname (char *name, int namelen);
-extern int innetgr (const char *, const char *, const char *, const char *);
-#define USE_SETVBUF
-#define SIGNAL_CAST (void (*)(int))
-#ifndef SYSV
-#define SYSV
-#endif
-#define USE_WAITPID
-#define REPLACE_STRLEN
-#define USE_STATVFS
-#define USE_GETCWD
-#define USE_SETSID
-#ifndef REPLACE_GETPASS
-#define REPLACE_GETPASS
-#endif /* REPLACE_GETPASS */
-#define USE_SIGPROCMASK
-#endif
-
-
-#ifdef ULTRIX
-#include <strings.h>
-#include <nfs/nfs_clnt.h>
-#include <nfs/vfs.h>
-#include <netinet/tcp.h>
-#ifdef ULTRIX_AUTH
-#include <auth.h>
-#endif
-char *getwd(char *);
-#define NOSTRDUP
-#ifdef __STDC__
-#define SIGNAL_CAST (void(*)(int))
-#endif
-#define USE_DIRECT
-#define USE_WAITPID
-#endif
-
-#ifdef SGI4
-#include <netinet/tcp.h>
-#include <sys/statfs.h>
-#include <string.h>
-#include <signal.h>
-#ifndef SYSV
-#define SYSV
-#endif
-#define SIGNAL_CAST (void (*)())
-#define STATFS4
-#define USE_WAITPID
-#define USE_DIRECT
-#define USE_SETSID
-#endif
-
-#if defined(SGI5) || defined(SGI6)
-#include <arpa/inet.h>
-#include <netinet/tcp.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <sys/statvfs.h>
-#include <string.h>
-#include <signal.h>
-#include <dirent.h>
-#define USE_WAITPID
-#define NETGROUP
-#ifndef SYSV
-#define SYSV
-#endif
-#define SIGNAL_CAST (void (*)())
-#define USE_STATVFS
-#define USE_WAITPID
-#define USE_SETSID
-#endif
-
-
-#ifdef MIPS
-#include <bsd/net/soioctl.h>
-#include <string.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <sys/statfs.h>
-#include <sys/wait.h>
-#include <sys/termio.h>
-#define SIGNAL_CAST (void (*)())
-typedef int mode_t;
-extern struct group *getgrnam();
-extern struct passwd *getpwnam();
-#define STATFS4
-#define NO_STRERROR
-#define REPLACE_STRSTR
-#endif /* MIPS */
-
-
-
-#ifdef DGUX
-#include <string.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
-#include <fcntl.h>
-#include <termios.h>
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-#define STATFS4
-#define USE_GETCWD
-#endif
-
-
-#ifdef SVR4
-#include <string.h>
-#include <sys/dir.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
-#include <sys/vfs.h>
-#include <sys/filio.h>
-#include <fcntl.h>
-#include <sys/sockio.h>
-#include <netinet/tcp.h>
-#include <stropts.h>
-#include <termios.h>
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-#define USE_STATVFS
-#define USE_GETCWD
-#define USE_SETSID
-#endif
-
-
-#ifdef OSF1
-#include <termios.h>
-#include <strings.h>
-#include <dirent.h>
-char *getwd(char *);
-char *mktemp(char *); /* No standard include */
-#include <netinet/in.h>
-#include <arpa/inet.h> /* both for inet_ntoa */
-#define SIGNAL_CAST ( void (*) (int) )
-#define STATFS3
-#define USE_F_FSIZE
-#define USE_SETSID
-#include <netinet/tcp.h>
-#ifdef OSF1_ENH_SEC
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/security.h>
-#include <prot.h>
-#include <unistd.h>
-#define PASSWORD_LENGTH 16
-#define NEED_AUTH_PARAMETERS
-#endif /* OSF1_ENH_SEC */
-#endif
-
-
-#ifdef CLIX
-#include <dirent.h>
-#define SIGNAL_CAST (void (*)())
-#include <sys/fcntl.h>
-#include <sys/statfs.h>
-#include <string.h>
-#define NO_EID
-#define USE_WAITPID
-#define STATFS4
-#define NO_FSYNC
-#define USE_GETCWD
-#define USE_SETSID
-#ifndef REPLACE_GETPASS
-#define REPLACE_GETPASS
-#endif /* REPLACE_GETPASS */
-#define NO_GETRLIMIT
-#endif /* CLIX */
-
-
-
-#ifdef BSDI
-#include <string.h>
-#include <netinet/tcp.h>
-#define SIGNAL_CAST (void (*)())
-#define USE_DIRECT
-#endif
-
-
-#ifdef NETBSD
-#include <strings.h>
-#include <netinet/tcp.h>
-/* you may not need this */
-#define NO_GETSPNAM
-#define SIGNAL_CAST (void (*)())
-#define USE_DIRECT
-#define REPLACE_INNETGR
-#endif
-
-
-
-#ifdef FreeBSD
-#include <arpa/inet.h>
-#include <strings.h>
-#include <netinet/tcp.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#define SIGNAL_CAST (void (*)())
-#define USE_SETVBUF
-#define USE_SETSID
-#define USE_GETCWD
-#define USE_WAITPID
-#define USE_DIRECT
-#define HAVE_MEMMOVE
-#define HAVE_BZERO
-#define HAVE_GETTIMEOFDAY
-#define HAVE_PATHCONF
-#define HAVE_GETGRNAM 1
-#endif
-
-
-
-#ifdef AIX
-#include <strings.h>
-#include <sys/dir.h>
-#include <sys/select.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <sys/vfs.h>
-#include <sys/id.h>
-#include <sys/priv.h>
-#include <netinet/tcp.h>
-#include <locale.h>
-#define SYSV
-#define USE_WAITPID
-#define USE_SIGBLOCK
-#define SIGNAL_CAST (void (*)())
-#define DEFAULT_PRINTING PRINT_AIX
-/* we undef this because sys/param.h is broken in aix. uggh. */
-#undef MAXHOSTNAMELEN
-#endif
-
-
-#ifdef HPUX
-#include <string.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <sys/vfs.h>
-#include <sys/types.h>
-#include <sys/termios.h>
-#include <netinet/tcp.h>
-#ifdef HPUX_10_TRUSTED
-#include <hpsecurity.h>
-#include <prot.h>
-#define NEED_AUTH_PARAMETERS
-#endif
-#define SIGNAL_CAST (void (*)(__harg))
-#ifndef HPUX10 /* This is only needed for HPUX 9.x */
-#define SELECT_CAST (int *)
-#endif /* HPUX10 */
-#define SYSV
-#define USE_WAITPID
-#define WAIT3_CAST2 (int *)
-#define USE_GETCWD
-#define USE_SETSID
-#define USE_SETRES
-#define DEFAULT_PRINTING PRINT_HPUX
-/* Ken Weiss <krweiss@ucdavis.edu> tells us that SIGCLD_IGNORE is
- not good for HPUX */
-/* #define SIGCLD_IGNORE */
-#endif /* HPUX */
-
-
-#ifdef SEQUENT
-#include <signal.h>
-#include <string.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/statfs.h>
-#include <sys/stat.h>
-#include <sys/buf.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <fcntl.h>
-#define SIGNAL_CAST (void (*)(int))
-#define USE_WAITPID
-#define USE_GETCWD
-#define NO_EID
-#define STATFS4
-#define USE_DIRECT
-#ifdef PTX4
-#undef USE_DIRECT
-#endif
-#endif
-
-
-
-#ifdef SEQUENT_PTX4
-#include <string.h>
-#include <sys/dir.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
-#include <sys/vfs.h>
-#include <fcntl.h>
-#include <sys/sockio.h>
-#include <netinet/tcp.h>
-#include <stropts.h>
-#include <termios.h>
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-#define USE_STATVFS
-#define USE_GETCWD
-#ifndef seteuid
-#define seteuid(uid) setreuid(-1,uid)
-#endif
-#ifndef setegid
-#define setegid(gid) setregid(-1,gid)
-#endif
-#endif
-
-
-#ifdef NEXT2
-#include <sys/types.h>
-#include <strings.h>
-#include <dirent.h>
-#include <sys/vfs.h>
-#define bzero(b,len) memset(b,0,len)
-#define mode_t int
-#define NO_UTIMBUF
-#include <libc.h>
-#define NOSTRDUP
-#define USE_DIRECT
-#define USE_WAITPID
-#endif
-
-
-#ifdef NEXT3_0
-#include <strings.h>
-#include <sys/dir.h>
-#include <sys/vfs.h>
-#define bzero(b,len) memset(b,0,len)
-#define NO_UTIMBUF
-#include <libc.h>
-#define NOSTRDUP
-#define USE_DIRECT
-#define mode_t int
-#define GID_TYPE int
-#define gid_t int
-#define pid_t int
-#define SIGNAL_CAST (void (*)(int))
-#define WAIT3_CAST1 (union wait *)
-#define HAVE_GMTOFF
-#endif
-
-
-
-#ifdef APOLLO
-#include <string.h>
-#include <fcntl.h>
-#include <sys/statfs.h>
-#define NO_UTIMBUF
-#define USE_DIRECT
-#define USE_GETCWD
-#define SIGNAL_CAST (void (*)())
-#define HAVE_FCNTL_LOCK 0
-#define HAVE_GETTIMEOFDAY
-#define STATFS4
-#endif
-
-
-
-#ifdef SCO
-#include <sys/netinet/tcp.h>
-#include <sys/netinet/in_systm.h>
-#include <sys/netinet/ip.h>
-#include <dirent.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/statfs.h>
-#include <sys/stropts.h>
-#include <limits.h>
-#include <locale.h>
-#ifdef EVEREST
-#include <unistd.h>
-#endif /* EVEREST */
-#ifdef NETGROUP
-#include <rpcsvc/ypclnt.h>
-#endif /* NETGROUP */
-#ifdef SecureWare
-#include <sys/security.h>
-#include <sys/audit.h>
-#include <prot.h>
-#define crypt bigcrypt
-#endif /* SecureWare */
-#define SIGNAL_CAST (void (*)(int))
-#define USE_WAITPID
-#define USE_GETCWD
-#define USE_SETSID
-#ifdef SCO3_2_2
-#define setuid(u) setreuid(u,-1)
-#define seteuid(u) setreuid(-1,u)
-#else /* SCO3_2_2 */
-#ifndef EVEREST
-#define ftruncate(f,l) syscall(0x0a28,f,l)
-#define USE_IFREQ
-#define NO_INITGROUPS
-#endif /* EVEREST */
-#endif /* SCO3_2_2 */
-#define STATFS4
-#define NO_FSYNC
-#define HAVE_PATHCONF
-#define NO_GETRLIMIT
-#endif /* SCO */
-
-
-
-/* Definitions for RiscIX */
-#ifdef RiscIX
-#define SIGNAL_CAST (void (*)(int))
-#include <sys/dirent.h>
-#include <sys/acct.h>
-#include <sys/vfs.h>
-#include <string.h>
-#include <utime.h>
-#include <signal.h>
-#define HAVE_GETTIMEOFDAY
-#define NOSTRCASECMP
-#define NOSTRDUP
-#endif
-
-
-
-#ifdef ISC
-#include <net/errno.h>
-#include <string.h>
-#include <sys/dir.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <fcntl.h>
-#include <sys/sioctl.h>
-#include <stropts.h>
-#include <limits.h>
-#include <netinet/tcp.h>
-#define FIONREAD FIORDCHK
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-#define USE_GETCWD
-#define USE_SETSID
-#define USE_IFREQ
-#define NO_FTRUNCATE
-#define STATFS4
-#define NO_FSYNC
-#endif
-
-
-
-#ifdef AUX
-#include <fstab.h>
-#include <string.h>
-#include <dirent.h>
-#include <sys/vfs.h>
-#include <fcntl.h>
-#include <termios.h>
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-char *strdup (char *);
-#define USE_GETCWD
-#endif
-
-
-#ifdef M88K_R3
-#include <string.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <termios.h>
-#define STATFS4
-#define SYSV
-#define USE_WAITPID
-#define SIGNAL_CAST (void (*)(int))
-char *strdup (char *);
-#define USE_GETCWD
-#define NO_FSYNC
-#define NO_EID
-#endif
-
-
-#ifdef DNIX
-#include <dirent.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/statfs.h>
-#include <sys/stropts.h>
-#define NO_GET_BROADCAST
-#define USE_WAITPID
-#define USE_GETCWD
-#define USE_SETSID
-#define STATFS4
-#define NO_EID
-#define PF_INET AF_INET
-#define NO_STRERROR
-#define ftruncate(f,l) chsize(f,l)
-#endif /* DNIX */
-
-#ifdef CONVEX
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <dirent.h>
-#include <string.h>
-#include <sys/vfs.h>
-#include <fcntl.h>
-#define DONT_REINSTALL_SIG
-#define USE_SIGBLOCK
-#define USE_WAITPID
-#define SIGNAL_CAST (_SigFunc_Ptr_t)
-#define NO_GETSPNAM
-#define HAVE_MEMMOVE
-extern char *mktemp(char *);
-extern int fsync(int);
-extern int seteuid(uid_t);
-extern int setgroups(int, int *);
-extern int initgroups(char *, int);
-extern int statfs(char *, struct statfs *);
-extern int setegid(gid_t);
-extern int getopt(int, char *const *, const char *);
-extern int chroot(char *);
-extern int gettimeofday(struct timeval *, struct timezone *);
-extern int gethostname(char *, int);
-extern char *crypt(char *, char *);
-extern char *getpass(char *);
-#endif
-
-
-#ifdef CRAY
-#define MAXPATHLEN 1024
-#include <dirent.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/statfs.h>
-#define SIGNAL_CAST (void (*)(int))
-#define SIGCLD_IGNORE
-#define HAVE_FCNTL_LOCK 1
-#define USE_SETSID
-#define STATFS4
-#endif
-
-
-#ifdef ALTOS
-#include <unistd.h>
-#include <string.h>
-#include <dirent.h>
-#include <sys/fcntl.h>
-#include <sys/statfs.h>
-#define const
-#define uid_t int
-#define gid_t int
-#define mode_t int
-#define ptrdiff_t int
-#define HAVE_GETGRNAM 0
-#define NO_EID
-#define NO_FSYNC
-#define NO_FTRUNCATE
-#define NO_GETRLIMIT
-#define NO_INITGROUPS
-#define NO_SELECT
-#define NO_SETGROUPS
-#define NO_STRERROR
-#define NO_STRFTIME
-#define NO_TM_NAME
-#define NO_UTIMEH
-#define NOSTRCASECMP
-#define REPLACE_MKTIME
-#define REPLACE_RENAME
-#define REPLACE_STRSTR
-#define STATFS4
-#define USE_GETCWD
-#endif
-
-#ifdef QNX
-#define STATFS4
-#include <sys/statfs.h>
-#include <sys/select.h>
-#include <signal.h>
-#include <sys/dir.h>
-#define SIGNAL_CAST (void (*)())
-#define USE_WAITPID
-#define NO_INITGROUPS
-#define NO_SETGROUPS
-#define HAVE_TIMEZONE
-#define USE_GETCWD
-#define USE_SETSID
-#define HAVE_FCNTL_LOCK 1
-#define DEFAULT_PRINTING PRINT_QNX
-#endif
-
-
-#ifdef NEWS42
-#include <string.h>
-#include <dirent.h>
-#include <sys/vfs.h>
-#include <sys/timeb.h>
-typedef int mode_t;
-#endif
-
-#ifdef OS2
-#include <dirent.h>
-#include <sys/statfs.h>
-#include <string.h>
-#include <limits.h>
-#define SIGNAL_CAST (void (*)())
-#define HAVE_FCNTL_LOCK 0
-#define USE_WAITPID
-#define NO_GET_BROADCAST
-#define NO_EID
-#define NO_SETGROUPS
-#define NO_INITGROUPS
-#define NO_CRYPT
-#define NO_STATFS
-#define NO_CHROOT
-#define NO_CHOWN
-#define strcasecmp stricmp
-#define strncasecmp strnicmp
-#endif
-
-
-#ifdef LYNX
-#define SIGNAL_CAST (void (*)())
-#define WAIT3_CAST1 (union wait *)
-#define STATFS4
-#include <fcntl.h>
-#include <resource.h>
-#include <stat.h>
-#include <string.h>
-#include <dirent.h>
-#include <sys/statfs.h>
-#define USE_GETCWD
-#define USE_GETSID
-#endif
-
-
-#ifdef BOS
-#define SIGNAL_CAST (void (*)(int))
-#include <string.h>
-#include <sys/dir.h>
-#include <sys/select.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/statfs.h>
-#include <sys/bsdioctl.h>
-#endif
-
-#ifdef AMIGA
-#include <arpa/inet.h>
-#include <dirent.h>
-#include <string.h>
-#include <netinet/tcp.h>
-#include <sys/acct.h>
-#include <sys/fcntl.h>
-#include <sys/filio.h>
-#include <sys/sockio.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <sys/termios.h>
-#include <limits.h>
-#include <sys/timeb.h>
-
-#define SIGNAL_CAST (void (*)(int))
-#define USE_GETCWD
-#define HAVE_BZERO
-#define HAVE_MEMMOVE
-#define USE_SIGPROCMASK
-#define USE_WAITPID
-#define USE_DIRECT
-#define USE_F_FSIZE
-#define HAVE_FCNTL_LOCK 0
-#define HAVE_GETTIMEOFDAY
-#define HAVE_PATHCONF
-
-#define HAVE_NO_PROC
-#define NO_FORK_DEBUG
-#define HAVE_FORK 0
-#define HAVE_VFORK 1
-#endif
-
-/* For UnixWare 2.x's ia_uinfo routines. (tangent@cyberport.com) */
-#ifdef IA_UINFO
-#include <iaf.h>
-#include <ia.h>
-#endif
-
-
-/*******************************************************************
-end of the platform specific sections
-********************************************************************/
-
-#if defined(USE_MMAP) || defined(FAST_SHARE_MODES)
-#include <sys/mman.h>
-#endif
-
-#ifdef SecureWare
-#define NEED_AUTH_PARAMETERS
-#endif
-
-#ifdef REPLACE_GETPASS
-extern char *getsmbpass(char *);
-#define getpass(s) getsmbpass(s)
-#endif
-
-#ifdef REPLACE_INNETGR
-#define innetgr(group,host,user,dom) InNetGr(group,host,user,dom)
-#endif
-
-#ifndef FD_SETSIZE
-#define FD_SETSIZE 255
-#endif
-
-#ifndef __STDC__
-#define const
-#endif
-
-/* Now for some other grungy stuff */
-#ifdef NO_GETSPNAM
-struct spwd { /* fake shadow password structure */
- char *sp_pwdp;
-};
-#endif
-
-#ifndef HAVE_BZERO
-#ifndef bzero
-#define bzero(p,s) memset(p,0,s)
-#endif
-#endif
-
-#ifndef HAVE_MEMMOVE
-#ifndef memmove
-#define memmove(d,s,n) MemMove(d,s,n)
-#endif
-#endif
-
-#ifdef USE_DIRECT
-#include <sys/dir.h>
-#endif
-
-/* some unixes have ENOTTY instead of TIOCNOTTY */
-#ifndef TIOCNOTTY
-#ifdef ENOTTY
-#define TIOCNOTTY ENOTTY
-#endif
-#endif
-
-#ifndef SIGHUP
-#define SIGHUP 1
-#endif
-
-/* if undefined then use bsd or sysv printing */
-#ifndef DEFAULT_PRINTING
-#ifdef SYSV
-#define DEFAULT_PRINTING PRINT_SYSV
-#else
-#define DEFAULT_PRINTING PRINT_BSD
-#endif
-#endif
-
-
-#ifdef AFS_AUTH
-#include <afs/stds.h>
-#include <afs/kautils.h>
-#endif
-
-#ifdef DFS_AUTH
-#include <dce/dce_error.h>
-#include <dce/sec_login.h>
-#endif
-
-#ifdef KRB5_AUTH
-#include <krb5.h>
-#endif
-
-#ifdef NO_UTIMBUF
-struct utimbuf {
- time_t actime;
- time_t modtime;
-};
-#endif
-
-#ifdef NO_STRERROR
-#ifndef strerror
-extern char *sys_errlist[];
-#define strerror(i) sys_errlist[i]
-#endif
-#endif
-
-#ifndef perror
-#define perror(m) printf("%s: %s\n",m,strerror(errno))
-#endif
-
-#ifndef MAXHOSTNAMELEN
-#define MAXHOSTNAMELEN 255
-#endif
-
-#include "version.h"
-#include "smb.h"
-#include "nameserv.h"
-#include "proto.h"
-#include "byteorder.h"
-
-#include "kanji.h"
-#include "charset.h"
-
-#ifndef S_IFREG
-#define S_IFREG 0100000
-#endif
-
-#ifndef S_ISREG
-#define S_ISREG(x) ((S_IFREG & (x))!=0)
-#endif
-
-#ifndef S_ISDIR
-#define S_ISDIR(x) ((S_IFDIR & (x))!=0)
-#endif
-
-#if !defined(S_ISLNK) && defined(S_IFLNK)
-#define S_ISLNK(x) ((S_IFLNK & (x))!=0)
-#endif
-
-#ifdef UFC_CRYPT
-#define crypt ufc_crypt
-#endif
-
-#ifdef REPLACE_STRLEN
-#define strlen(s) Strlen(s)
-#endif
-
-#ifdef REPLACE_STRSTR
-#define strstr(s,p) Strstr(s,p)
-#endif
-
-#ifdef REPLACE_MKTIME
-#define mktime(t) Mktime(t)
-#endif
-
-#ifndef NGROUPS_MAX
-#define NGROUPS_MAX 128
-#endif
-
-#ifndef EDQUOT
-#define EDQUOT ENOSPC
-#endif
-
-#ifndef HAVE_GETGRNAM
-#define HAVE_GETGRNAM 1
-#endif
-
-#ifndef SOL_TCP
-#define SOL_TCP 6
-#endif
-
-/* default to using ftruncate workaround as this is safer than assuming
-it works and getting lots of bug reports */
-#ifndef FTRUNCATE_CAN_EXTEND
-#define FTRUNCATE_CAN_EXTEND 0
-#endif
-
-/* maybe this unix doesn't separate RD and WR locks? */
-#ifndef F_RDLCK
-#define F_RDLCK F_WRLCK
-#endif
-
-#ifndef ENOTSOCK
-#define ENOTSOCK EINVAL
-#endif
-
-#ifndef SIGCLD
-#define SIGCLD SIGCHLD
-#endif
-
-#ifndef MAP_FILE
-#define MAP_FILE 0
-#endif
-
-#ifndef HAVE_FCNTL_LOCK
-#define HAVE_FCNTL_LOCK 1
-#endif
-
-#ifndef WAIT3_CAST2
-#define WAIT3_CAST2 (struct rusage *)
-#endif
-
-#ifndef WAIT3_CAST1
-#define WAIT3_CAST1 (int *)
-#endif
-
-#ifndef QSORT_CAST
-#define QSORT_CAST (int (*)())
-#endif
-
-#ifndef INADDR_LOOPBACK
-#define INADDR_LOOPBACK 0x7f000001
-#endif /* INADDR_LOOPBACK */
-
-/* this is a rough check to see if this machine has a lstat() call.
- it is not guaranteed to work */
-#if !defined(S_ISLNK)
-#define lstat stat
-#endif
-
-/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
-#ifndef errno
-extern int errno;
-#endif
-
-
-#ifdef NO_EID
-#define geteuid() getuid()
-#define getegid() getgid()
-#define seteuid(x) setuid(x)
-#define setegid(x) setgid(x)
-#endif
-
-
-#if (HAVE_FCNTL_LOCK == 0)
-/* since there is no locking available, system includes */
-/* for DomainOS 10.4 do not contain any of the following */
-/* #define's. So, to satisfy the compiler, add these */
-/* #define's, although they arn't really necessary. */
-#define F_GETLK 0
-#define F_SETLK 0
-#define F_WRLCK 0
-#define F_UNLCK 0
-#endif /* HAVE_FCNTL_LOCK == 0 */
-
-#ifdef NOSTRCASECMP
-#define strcasecmp(s1,s2) StrCaseCmp(s1,s2)
-#define strncasecmp(s1,s2,n) StrnCaseCmp(s1,s2,n)
-#endif
-
-#ifndef strcpy
-#define strcpy(dest,src) StrCpy(dest,src)
-#endif
-
-
-/* possibly wrap the malloc calls */
-#if WRAP_MALLOC
-
-/* undo the old malloc def if necessary */
-#ifdef malloc
-#define xx_old_malloc malloc
-#undef malloc
-#endif
-
-#define malloc(size) malloc_wrapped(size,__FILE__,__LINE__)
-
-/* undo the old realloc def if necessary */
-#ifdef realloc
-#define xx_old_realloc realloc
-#undef realloc
-#endif
-
-#define realloc(ptr,size) realloc_wrapped(ptr,size,__FILE__,__LINE__)
-
-/* undo the old free def if necessary */
-#ifdef free
-#define xx_old_free free
-#undef free
-#endif
-
-#define free(ptr) free_wrapped(ptr,__FILE__,__LINE__)
-
-/* and the malloc prototypes */
-void *malloc_wrapped(int,char *,int);
-void *realloc_wrapped(void *,int,char *,int);
-void free_wrapped(void *,char *,int);
-
-#endif
-
-
-#if WRAP_MEMCPY
-/* undo the old memcpy def if necessary */
-#ifdef memcpy
-#define xx_old_memcpy memcpy
-#undef memcpy
-#endif
-
-#define memcpy(d,s,l) memcpy_wrapped(d,s,l,__FILE__,__LINE__)
-void *memcpy_wrapped(void *d,void *s,int l,char *fname,int line);
-#endif
-
-#endif
diff --git a/source/include/kanji.h b/source/include/kanji.h
deleted file mode 100644
index cf303659208..00000000000
--- a/source/include/kanji.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Kanji Extensions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Adding for Japanese language by <fujita@ainix.isac.co.jp> 1994.9.5
- and extend coding system to EUC/SJIS/JIS/HEX at 1994.10.11
- and add all jis codes sequence at 1995.8.16
- Notes: Hexadecimal code by <ohki@gssm.otuka.tsukuba.ac.jp>
- and add upper/lower case conversion 1997.8.21
-*/
-#ifndef _KANJI_H_
-#define _KANJI_H_
-
-/* FOR SHIFT JIS CODE */
-#define is_shift_jis(c) \
- ((0x81 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0x9f) \
- || (0xe0 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xef))
-#define is_shift_jis2(c) \
- (0x40 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xfc \
- && ((unsigned char) (c)) != 0x7f)
-#define is_kana(c) ((0xa0 <= ((unsigned char) (c)) && ((unsigned char) (c)) <= 0xdf))
-
-/* case conversion */
-#define is_sj_upper2(c) \
- ((0x60 <= (unsigned char) (c)) && ((unsigned char) (c) <= 0x79))
-#define is_sj_lower2(c) \
- ((0x81 <= (unsigned char) (c)) && ((unsigned char) (c) <= 0x9A))
-#define sjis_alph 0x82
-#define is_sj_alph(c) (sjis_alph == (unsigned char) (c))
-#define is_sj_upper(c1, c2) (is_sj_alph (c1) && is_sj_upper2 (c2))
-#define is_sj_lower(c1, c2) (is_sj_alph (c1) && is_sj_lower2 (c2))
-#define sj_toupper2(c) \
- (is_sj_lower2 (c) ? ((int) ((unsigned char) (c) - 0x81 + 0x60)) : \
- ((int) (unsigned char) (c)))
-#define sj_tolower2(c) \
- (is_sj_upper2 (c) ? ((int) ((unsigned char) (c) - 0x60 + 0x81)) : \
- ((int) (unsigned char) (c)))
-
-#ifdef _KANJI_C_
-/* FOR EUC CODE */
-#define euc_kana (0x8e)
-#define is_euc_kana(c) (((unsigned char) (c)) == euc_kana)
-#define is_euc(c) (0xa0 < ((unsigned char) (c)) && ((unsigned char) (c)) < 0xff)
-
-/* FOR JIS CODE */
-/* default jis third shift code, use for output */
-#ifndef JIS_KSO
-#define JIS_KSO 'B'
-#endif
-#ifndef JIS_KSI
-#define JIS_KSI 'J'
-#endif
-/* in: \E$B or \E$@ */
-/* out: \E(J or \E(B or \E(H */
-#define jis_esc (0x1b)
-#define jis_so (0x0e)
-#define jis_so1 ('$')
-#define jis_so2 ('B')
-#define jis_si (0x0f)
-#define jis_si1 ('(')
-#define jis_si2 ('J')
-#define is_esc(c) (((unsigned char) (c)) == jis_esc)
-#define is_so1(c) (((unsigned char) (c)) == jis_so1)
-#define is_so2(c) (((unsigned char) (c)) == jis_so2 || ((unsigned char) (c)) == '@')
-#define is_si1(c) (((unsigned char) (c)) == jis_si1)
-#define is_si2(c) (((unsigned char) (c)) == jis_si2 || ((unsigned char) (c)) == 'B' \
- || ((unsigned char) (c)) == 'H')
-#define is_so(c) (((unsigned char) (c)) == jis_so)
-#define is_si(c) (((unsigned char) (c)) == jis_si)
-#define junet_kana1 ('(')
-#define junet_kana2 ('I')
-#define is_juk1(c) (((unsigned char) (c)) == junet_kana1)
-#define is_juk2(c) (((unsigned char) (c)) == junet_kana2)
-
-#define _KJ_ROMAN (0)
-#define _KJ_KANJI (1)
-#define _KJ_KANA (2)
-
-/* FOR HEX */
-#define HEXTAG ':'
-#define hex2bin(x) \
- ( ((int) '0' <= ((int) (x)) && ((int) (x)) <= (int)'9')? \
- (((int) (x))-(int)'0'): \
- ((int) 'a'<= ((int) (x)) && ((int) (x))<= (int) 'f')? \
- (((int) (x)) - (int)'a'+10): \
- (((int) (x)) - (int)'A'+10) )
-#define bin2hex(x) \
- ( (((int) (x)) >= 10)? (((int) (x))-10 + (int) 'a'): (((int) (x)) + (int) '0') )
-
-#else /* not _KANJI_C_ */
-
-extern char *(*_dos_to_unix)(char *str, BOOL overwrite);
-extern char *(*_unix_to_dos)(char *str, BOOL overwrite);
-
-#define strchr sj_strchr
-#define strrchr sj_strrchr
-#define strstr sj_strstr
-#define strtok sj_strtok
-
-#endif /* _KANJI_C_ */
-
-#define UNKNOWN_CODE (-1)
-#define SJIS_CODE (0)
-#define EUC_CODE (1)
-#define JIS7_CODE (2)
-#define JIS8_CODE (3)
-#define JUNET_CODE (4)
-#define HEX_CODE (5)
-#define CAP_CODE (6)
-#define DOSV_CODE SJIS_CODE
-
-int interpret_coding_system (char *str, int def);
-
-#define unix_to_dos(x,y) unix2dos_format(x,y)
-#define dos_to_unix(x,y) dos2unix_format(x,y)
-
-#endif /* _KANJI_H_ */
diff --git a/source/include/local.h b/source/include/local.h
deleted file mode 100644
index 97857727c74..00000000000
--- a/source/include/local.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/* local definitions for file server */
-#ifndef _LOCAL_H
-#define _LOCAL_H
-
-/* This defines the section name in the configuration file that will contain */
-/* global parameters - that is, parameters relating to the whole server, not */
-/* just services. This name is then reserved, and may not be used as a */
-/* a service name. It will default to "global" if not defined here. */
-#define GLOBAL_NAME "global"
-#define GLOBAL_NAME2 "globals"
-
-/* This defines the section name in the configuration file that will
- refer to the special "homes" service */
-#define HOMES_NAME "homes"
-
-/* This defines the section name in the configuration file that will
- refer to the special "printers" service */
-#define PRINTERS_NAME "printers"
-
-/* This defines the name of the printcap file. It is MOST UNLIKELY that
- this will change BUT! Specifying a file with the format of a printcap
- file but containing only a subset of the printers actually in your real
- printcap file is a quick-n-dirty way to allow dynamic access to a subset
- of available printers.
-*/
-#define PRINTCAP_NAME "/etc/printcap"
-
-/* set these to define the limits of the server. NOTE These are on a
- per-client basis. Thus any one machine can't connect to more than
- MAX_CONNECTIONS services, but any number of machines may connect at
- one time. */
-#define MAX_CONNECTIONS 127
-#define MAX_OPEN_FILES 100
-
-/* the max number of connections that the smbstatus program will show */
-#define MAXSTATUS 1000
-
-/* max number of directories open at once */
-/* note that with the new directory code this no longer requires a
- file handle per directory, but large numbers do use more memory */
-#define MAXDIR 64
-
-#define WORDMAX 0xFFFF
-
-/* the maximum password length before we declare a likely attack */
-#define MAX_PASS_LEN 200
-
-/* separators for lists */
-#define LIST_SEP " \t,;:\n\r"
-
-#ifndef LOCKDIR
-/* this should have been set in the Makefile */
-#define LOCKDIR "/tmp/samba"
-#endif
-
-/* this is where browse lists are kept in the lock dir */
-#define SERVER_LIST "browse.dat"
-
-/* shall guest entries in printer queues get changed to user entries,
- so they can be deleted using the windows print manager? */
-#define LPQ_GUEST_TO_USER
-
-/* shall filenames with illegal chars in them get mangled in long
- filename listings? */
-#define MANGLE_LONG_FILENAMES
-
-/* define this if you want to stop spoofing with .. and soft links
- NOTE: This also slows down the server considerably */
-#define REDUCE_PATHS
-
-/* the size of the directory cache */
-#define DIRCACHESIZE 20
-
-/* what type of filesystem do we want this to show up as in a NT file
- manager window? */
-#define FSTYPE_STRING "Samba"
-
-/* do you want smbd to send a 1 byte packet to nmbd to trigger it to start
- when smbd starts? */
-#ifndef PRIME_NMBD
-#define PRIME_NMBD 1
-#endif
-
-/* do you want session setups at user level security with a invalid
- password to be rejected or allowed in as guest? WinNT rejects them
- but it can be a pain as it means "net view" needs to use a password
-
- You have 3 choices:
-
- GUEST_SESSSETUP = 0 means session setups with an invalid password
- are rejected.
-
- GUEST_SESSSETUP = 1 means session setups with an invalid password
- are rejected, unless the username does not exist, in which case it
- is treated as a guest login
-
- GUEST_SESSSETUP = 2 means session setups with an invalid password
- are treated as a guest login
-
- Note that GUEST_SESSSETUP only has an effect in user or server
- level security.
- */
-#ifndef GUEST_SESSSETUP
-#define GUEST_SESSSETUP 0
-#endif
-
-/* the default pager to use for the client "more" command. Users can
- override this with the PAGER environment variable */
-#ifndef PAGER
-#define PAGER "more"
-#endif
-
-/* the size of the uid cache used to reduce valid user checks */
-#define UID_CACHE_SIZE 4
-
-/* the following control timings of various actions. Don't change
- them unless you know what you are doing. These are all in seconds */
-#define DEFAULT_SMBD_TIMEOUT (60*60*24*7)
-#define SMBD_RELOAD_CHECK (60)
-#define IDLE_CLOSED_TIMEOUT (60)
-#define DPTR_IDLE_TIMEOUT (120)
-#define SMBD_SELECT_LOOP (10)
-#define NMBD_SELECT_LOOP (10)
-#define BROWSE_INTERVAL (60)
-#define REGISTRATION_INTERVAL (10*60)
-#define NMBD_INETD_TIMEOUT (120)
-#define NMBD_MAX_TTL (24*60*60)
-#define LPQ_LOCK_TIMEOUT (5)
-
-/* the following are in milliseconds */
-#define LOCK_RETRY_TIMEOUT (100)
-
-/* do you want to dump core (carefully!) when an internal error is
- encountered? Samba will be careful to make the core file only
- accessible to root */
-#define DUMP_CORE 1
-
-/* what is the longest significant password available on your system?
- Knowing this speeds up password searches a lot */
-#ifndef PASSWORD_LENGTH
-#define PASSWORD_LENGTH 8
-#endif
-
-#define SMB_ALIGNMENT 1
-
-
-/* shall we support browse requests via a FIFO to nmbd? */
-#define ENABLE_FIFO 1
-
-/* keep the password server open, this uses up a aocket, but is needed
- by many apps */
-#define KEEP_PASSWORD_SERVER_OPEN 1
-
-/* how long to wait for a socket connect to happen */
-#define LONG_CONNECT_TIMEOUT 30
-#define SHORT_CONNECT_TIMEOUT 5
-
-
-/* the directory to sit in when idle */
-/* #define IDLE_DIR "/" */
-
-/* Timout (in seconds) to wait for an oplock break
- message to return. */
-
-#define OPLOCK_BREAK_TIMEOUT 30
-
-#endif
diff --git a/source/include/nameserv.h b/source/include/nameserv.h
deleted file mode 100644
index 83f3a3c5246..00000000000
--- a/source/include/nameserv.h
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios header - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#define GET_TTL(ttl) ((ttl)?MIN(ttl,lp_max_ttl()):lp_max_ttl())
-
-/* NTAS uses 2, NT uses 1, WfWg uses 0 */
-#define MAINTAIN_LIST 2
-#define ELECTION_VERSION 1
-
-#define MAX_DGRAM_SIZE (576) /* tcp/ip datagram limit is 576 bytes */
-#define MIN_DGRAM_SIZE 12
-
-#define NMB_QUERY 0x20
-#define NMB_STATUS 0x21
-
-#define NMB_REG 0x05 /* see rfc1002.txt 4.2.2,3,5,6,7,8 */
-#define NMB_REG_REFRESH 0x09 /* see rfc1002.txt 4.2.4 */
-#define NMB_REL 0x06 /* see rfc1002.txt 4.2.9,10,11 */
-#define NMB_WAIT_ACK 0x07 /* see rfc1002.txt 4.2.16 */
-/* XXXX what about all the other types?? 0x1, 0x2, 0x3, 0x4, 0x8? */
-
-#define FIND_SELF 0x01
-#define FIND_WINS 0x02
-#define FIND_LOCAL 0x04
-
-/* NetBIOS flags */
-#define NB_GROUP 0x80
-#define NB_PERM 0x02
-#define NB_ACTIVE 0x04
-#define NB_CONFL 0x08
-#define NB_DEREG 0x10
-#define NB_BFLAG 0x00 /* broadcast node type */
-#define NB_PFLAG 0x20 /* point-to-point node type */
-#define NB_MFLAG 0x40 /* mixed bcast & p-p node type */
-#define NB_HFLAG 0x60 /* microsoft 'hybrid' node type */
-#define NB_FLGMSK 0x60
-
-#define REFRESH_TIME (15*60)
-#define NAME_POLL_REFRESH_TIME (5*60)
-#define NAME_POLL_INTERVAL 15
-
-/* NetBIOS flag identifier */
-#define NAME_PERMANENT(p) ((p) & NB_PERM)
-#define NAME_ACTIVE(p) ((p) & NB_ACTIVE)
-#define NAME_CONFLICT(p) ((p) & NB_CONFL)
-#define NAME_DEREG(p) ((p) & NB_DEREG)
-#define NAME_GROUP(p) ((p) & NB_GROUP)
-
-#define NAME_BFLAG(p) (((p) & NB_FLGMSK) == NB_BFLAG)
-#define NAME_PFLAG(p) (((p) & NB_FLGMSK) == NB_PFLAG)
-#define NAME_MFLAG(p) (((p) & NB_FLGMSK) == NB_MFLAG)
-#define NAME_HFLAG(p) (((p) & NB_FLGMSK) == NB_HFLAG)
-
-/* server type identifiers */
-#define AM_MASTER(work) (work->ServerType & SV_TYPE_MASTER_BROWSER)
-#define AM_BACKUP(work) (work->ServerType & SV_TYPE_BACKUP_BROWSER)
-#define AM_DOMMST(work) (work->ServerType & SV_TYPE_DOMAIN_MASTER)
-#define AM_DOMMEM(work) (work->ServerType & SV_TYPE_DOMAIN_MEMBER)
-
-/* microsoft browser NetBIOS name */
-#define MSBROWSE "\001\002__MSBROWSE__\002"
-
-/* mail slots */
-#define BROWSE_MAILSLOT "\\MAILSLOT\\BROWSE"
-#define NET_LOGON_MAILSLOT "\\MAILSLOT\\NET\\NETLOGON"
-
-enum name_source {STATUS_QUERY, LMHOSTS, REGISTER, SELF, DNS, DNSFAIL};
-enum node_type {B_NODE=0, P_NODE=1, M_NODE=2, NBDD_NODE=3};
-enum packet_type {NMB_PACKET, DGRAM_PACKET};
-
-enum master_state
-{
- MST_POTENTIAL,
- MST_BACK,
- MST_MSB,
- MST_BROWSER
-};
-
-enum domain_state
-{
- DOMAIN_NONE,
- DOMAIN_WAIT,
- DOMAIN_MST
-};
-
-enum logon_state
-{
- LOGON_NONE,
- LOGON_WAIT,
- LOGON_SRV
-};
-
-enum state_type
-{
- NAME_STATUS_DOM_SRV_CHK,
- NAME_STATUS_SRV_CHK,
- NAME_REGISTER_CHALLENGE,
- NAME_REGISTER,
- NAME_RELEASE,
- NAME_QUERY_CONFIRM,
- NAME_QUERY_SYNC_LOCAL,
- NAME_QUERY_SYNC_REMOTE,
- NAME_QUERY_DOM_SRV_CHK,
- NAME_QUERY_SRV_CHK,
- NAME_QUERY_FIND_MST,
- NAME_QUERY_MST_CHK,
- NAME_QUERY_DOMAIN
-};
-
-/* a netbios name structure */
-struct nmb_name {
- char name[17];
- char scope[64];
- int name_type;
-};
-
-/* a netbios flags + ip address structure */
-/* this is used for multi-homed systems and for internet group names */
-struct nmb_ip
-{
- struct in_addr ip; /* ip address of host that owns this name */
- uint16 nb_flags; /* netbios flags */
-};
-
-/* this is the structure used for the local netbios name list */
-struct name_record
-{
- struct name_record *next;
- struct name_record *prev;
-
- struct nmb_name name; /* the netbios name */
- struct nmb_ip *ip_flgs; /* the ip + flags */
- int num_ips; /* number of ip+flags entries */
-
- enum name_source source; /* where the name came from */
-
- time_t death_time; /* time record must be removed (do not remove if 0) */
- time_t refresh_time; /* time record should be refreshed */
-};
-
-struct subnet_record;
-
-/* browse and backup server cache for synchronising browse list */
-struct browse_cache_record
-{
- struct browse_cache_record *next;
- struct browse_cache_record *prev;
-
- pstring name;
- int type;
- pstring group;
- struct in_addr ip;
- time_t sync_time;
- BOOL synced;
- BOOL local;
- struct subnet_record *subnet;
-};
-
-/* this is used to hold the list of servers in my domain, and is */
-/* contained within lists of domains */
-struct server_record
-{
- struct server_record *next;
- struct server_record *prev;
-
- struct server_info_struct serv;
- time_t death_time;
-};
-
-/* a workgroup structure. it contains a list of servers */
-struct work_record
-{
- struct work_record *next;
- struct work_record *prev;
-
- struct server_record *serverlist;
-
- /* stage of development from non-local-master up to local-master browser */
- enum master_state mst_state;
-
- /* stage of development from non-domain-master to domain master browser */
- enum domain_state dom_state;
-
- /* stage of development from non-logon-server to logon server */
- enum logon_state log_state;
-
- /* work group info */
- fstring work_group;
- int token; /* used when communicating with backup browsers */
- int ServerType;
-
- /* announce info */
- time_t lastannounce_time;
- int announce_interval;
- BOOL needannounce;
-
-
- /* election info */
- BOOL RunningElection;
- BOOL needelection;
- int ElectionCount;
- uint32 ElectionCriterion;
-};
-
-/* initiated name queries recorded in this list to track any responses... */
-/* sadly, we need to group everything together. i suppose that if this
- gets unwieldy, then a union ought to be considered. oh for c++... */
-struct response_record
-{
- struct response_record *next;
- struct response_record *prev;
-
- uint16 response_id;
- enum state_type state;
-
- int fd;
- int quest_type;
- struct nmb_name name;
- int nb_flags;
- time_t ttl;
-
- int server_type;
- fstring my_name;
- fstring my_comment;
-
- BOOL bcast;
- BOOL recurse;
- struct in_addr send_ip;
- struct in_addr reply_to_ip;
-
- int num_msgs;
-
- time_t repeat_time;
- time_t repeat_interval;
- int repeat_count;
-};
-
-/* a subnet structure. it contains a list of workgroups and netbios names*/
-
-/* note that a subnet of 255.255.255.255 contains all the WINS netbios names.
- all communication from such nodes are on a non-broadcast basis: they
- are point-to-point (P nodes) or mixed point-to-point and broadcast
- (M nodes). M nodes use point-to-point as a preference, and will use
- broadcasting for certain activities, or will resort to broadcasting as a
- last resort, if the WINS server fails (users of wfwg will notice that their
- machine often freezes for 30 seconds at a time intermittently, if the WINS
- server is down).
-
- B nodes will have their own, totally separate subnet record, with their
- own netbios name set. these do NOT interact with other subnet records'
- netbios names, INCLUDING the WINS one (with an ip "address", so called,
- of 255.255.255.255)
-
- there is a separate response list for each subnet record. in the case of
- the 255.255.255.255 subnet record (WINS), the WINS server will be able to
- use this to poll (infrequently!) each of its entries, to ensure that the
- names are still in use.
- XXXX this polling is a planned feature for a really over-cautious WINS server
-*/
-
-struct subnet_record
-{
- struct subnet_record *next;
- struct subnet_record *prev;
-
- struct work_record *workgrouplist; /* list of workgroups */
- struct name_record *namelist; /* list of netbios names */
- struct response_record *responselist; /* list of responses expected */
-
- struct in_addr bcast_ip;
- struct in_addr mask_ip;
- struct in_addr myip;
-};
-
-/* a resource record */
-struct res_rec {
- struct nmb_name rr_name;
- int rr_type;
- int rr_class;
- int ttl;
- int rdlength;
- char rdata[MAX_DGRAM_SIZE];
-};
-
-/* define a nmb packet. */
-struct nmb_packet
-{
- struct {
- int name_trn_id;
- int opcode;
- BOOL response;
- struct {
- BOOL bcast;
- BOOL recursion_available;
- BOOL recursion_desired;
- BOOL trunc;
- BOOL authoritative;
- } nm_flags;
- int rcode;
- int qdcount;
- int ancount;
- int nscount;
- int arcount;
- } header;
-
- struct {
- struct nmb_name question_name;
- int question_type;
- int question_class;
- } question;
-
- struct res_rec *answers;
- struct res_rec *nsrecs;
- struct res_rec *additional;
-};
-
-
-/* a datagram - this normally contains SMB data in the data[] array */
-struct dgram_packet {
- struct {
- int msg_type;
- struct {
- enum node_type node_type;
- BOOL first;
- BOOL more;
- } flags;
- int dgm_id;
- struct in_addr source_ip;
- int source_port;
- int dgm_length;
- int packet_offset;
- } header;
- struct nmb_name source_name;
- struct nmb_name dest_name;
- int datasize;
- char data[MAX_DGRAM_SIZE];
-};
-
-/* define a structure used to queue packets. this will be a linked
- list of nmb packets */
-struct packet_struct
-{
- struct packet_struct *next;
- struct packet_struct *prev;
- struct in_addr ip;
- int port;
- int fd;
- time_t timestamp;
- enum packet_type packet_type;
- union {
- struct nmb_packet nmb;
- struct dgram_packet dgram;
- } packet;
-};
-
-
-/* ids for netbios packet types */
-#define ANN_HostAnnouncement 1
-#define ANN_AnnouncementRequest 2
-#define ANN_Election 8
-#define ANN_GetBackupListReq 9
-#define ANN_GetBackupListResp 10
-#define ANN_BecomeBackup 11
-#define ANN_DomainAnnouncement 12
-#define ANN_MasterAnnouncement 13
-#define ANN_ResetBrowserState 14
-#define ANN_LocalMasterAnnouncement 15
-
-
-/* broadcast packet announcement intervals, in minutes */
-
-/* attempt to add domain logon and domain master names */
-#define CHECK_TIME_ADD_DOM_NAMES 5
-
-/* search for master browsers of workgroups samba knows about,
- except default */
-#define CHECK_TIME_MST_BROWSE 5
-
-/* request backup browser announcements from other servers */
-#define CHECK_TIME_ANNOUNCE_BACKUP 15
-
-/* request host announcements from other servers: min and max of interval */
-#define CHECK_TIME_MIN_HOST_ANNCE 3
-#define CHECK_TIME_MAX_HOST_ANNCE 12
-
-/* announce as master to WINS server and any Primary Domain Controllers */
-#define CHECK_TIME_MST_ANNOUNCE 15
-
-/* do all remote announcements this often */
-#define REMOTE_ANNOUNCE_INTERVAL 180
-
-/* Types of machine we can announce as */
-#define ANNOUNCE_AS_NT 1
-#define ANNOUNCE_AS_WIN95 2
-#define ANNOUNCE_AS_WFW 3
-
-/* Macro's to enumerate subnets either with or without
- the WINS subnet. */
-
-extern struct subnet_record *subnetlist;
-extern struct subnet_record *wins_subnet;
-
-#define FIRST_SUBNET subnetlist
-#define NEXT_SUBNET_EXCLUDING_WINS(x) ((x)->next)
-#define NEXT_SUBNET_INCLUDING_WINS(x) ( ((x) == wins_subnet) ? NULL : \
- (((x)->next == NULL) ? wins_subnet : \
- (x)->next))
-
diff --git a/source/include/nterr.h b/source/include/nterr.h
deleted file mode 100644
index 92f02612dbc..00000000000
--- a/source/include/nterr.h
+++ /dev/null
@@ -1,505 +0,0 @@
-/* these are the NT error codes less than 1000. They are here for when
- we start supporting NT error codes in Samba. They were extracted
- using a loop in smbclient then printing a netmon sniff to a file */
-
-#define NT_STATUS_UNSUCCESSFUL (1)
-#define NT_STATUS_NOT_IMPLEMENTED (2)
-#define NT_STATUS_INVALID_INFO_CLASS (3)
-#define NT_STATUS_INFO_LENGTH_MISMATCH (4)
-#define NT_STATUS_ACCESS_VIOLATION (5)
-#define NT_STATUS_IN_PAGE_ERROR (6)
-#define NT_STATUS_PAGEFILE_QUOTA (7)
-#define NT_STATUS_INVALID_HANDLE (8)
-#define NT_STATUS_BAD_INITIAL_STACK (9)
-#define NT_STATUS_BAD_INITIAL_PC (10)
-#define NT_STATUS_INVALID_CID (11)
-#define NT_STATUS_TIMER_NOT_CANCELED (12)
-#define NT_STATUS_INVALID_PARAMETER (13)
-#define NT_STATUS_NO_SUCH_DEVICE (14)
-#define NT_STATUS_NO_SUCH_FILE (15)
-#define NT_STATUS_INVALID_DEVICE_REQUEST (16)
-#define NT_STATUS_END_OF_FILE (17)
-#define NT_STATUS_WRONG_VOLUME (18)
-#define NT_STATUS_NO_MEDIA_IN_DEVICE (19)
-#define NT_STATUS_UNRECOGNIZED_MEDIA (20)
-#define NT_STATUS_NONEXISTENT_SECTOR (21)
-#define NT_STATUS_MORE_PROCESSING_REQUIRED (22)
-#define NT_STATUS_NO_MEMORY (23)
-#define NT_STATUS_CONFLICTING_ADDRESSES (24)
-#define NT_STATUS_NOT_MAPPED_VIEW (25)
-#define NT_STATUS_UNABLE_TO_FREE_VM (26)
-#define NT_STATUS_UNABLE_TO_DELETE_SECTION (27)
-#define NT_STATUS_INVALID_SYSTEM_SERVICE (28)
-#define NT_STATUS_ILLEGAL_INSTRUCTION (29)
-#define NT_STATUS_INVALID_LOCK_SEQUENCE (30)
-#define NT_STATUS_INVALID_VIEW_SIZE (31)
-#define NT_STATUS_INVALID_FILE_FOR_SECTION (32)
-#define NT_STATUS_ALREADY_COMMITTED (33)
-#define NT_STATUS_ACCESS_DENIED (34)
-#define NT_STATUS_BUFFER_TOO_SMALL (35)
-#define NT_STATUS_OBJECT_TYPE_MISMATCH (36)
-#define NT_STATUS_NONCONTINUABLE_EXCEPTION (37)
-#define NT_STATUS_INVALID_DISPOSITION (38)
-#define NT_STATUS_UNWIND (39)
-#define NT_STATUS_BAD_STACK (40)
-#define NT_STATUS_INVALID_UNWIND_TARGET (41)
-#define NT_STATUS_NOT_LOCKED (42)
-#define NT_STATUS_PARITY_ERROR (43)
-#define NT_STATUS_UNABLE_TO_DECOMMIT_VM (44)
-#define NT_STATUS_NOT_COMMITTED (45)
-#define NT_STATUS_INVALID_PORT_ATTRIBUTES (46)
-#define NT_STATUS_PORT_MESSAGE_TOO_LONG (47)
-#define NT_STATUS_INVALID_PARAMETER_MIX (48)
-#define NT_STATUS_INVALID_QUOTA_LOWER (49)
-#define NT_STATUS_DISK_CORRUPT_ERROR (50)
-#define NT_STATUS_OBJECT_NAME_INVALID (51)
-#define NT_STATUS_OBJECT_NAME_NOT_FOUND (52)
-#define NT_STATUS_OBJECT_NAME_COLLISION (53)
-#define NT_STATUS_HANDLE_NOT_WAITABLE (54)
-#define NT_STATUS_PORT_DISCONNECTED (55)
-#define NT_STATUS_DEVICE_ALREADY_ATTACHED (56)
-#define NT_STATUS_OBJECT_PATH_INVALID (57)
-#define NT_STATUS_OBJECT_PATH_NOT_FOUND (58)
-#define NT_STATUS_OBJECT_PATH_SYNTAX_BAD (59)
-#define NT_STATUS_DATA_OVERRUN (60)
-#define NT_STATUS_DATA_LATE_ERROR (61)
-#define NT_STATUS_DATA_ERROR (62)
-#define NT_STATUS_CRC_ERROR (63)
-#define NT_STATUS_SECTION_TOO_BIG (64)
-#define NT_STATUS_PORT_CONNECTION_REFUSED (65)
-#define NT_STATUS_INVALID_PORT_HANDLE (66)
-#define NT_STATUS_SHARING_VIOLATION (67)
-#define NT_STATUS_QUOTA_EXCEEDED (68)
-#define NT_STATUS_INVALID_PAGE_PROTECTION (69)
-#define NT_STATUS_MUTANT_NOT_OWNED (70)
-#define NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED (71)
-#define NT_STATUS_PORT_ALREADY_SET (72)
-#define NT_STATUS_SECTION_NOT_IMAGE (73)
-#define NT_STATUS_SUSPEND_COUNT_EXCEEDED (74)
-#define NT_STATUS_THREAD_IS_TERMINATING (75)
-#define NT_STATUS_BAD_WORKING_SET_LIMIT (76)
-#define NT_STATUS_INCOMPATIBLE_FILE_MAP (77)
-#define NT_STATUS_SECTION_PROTECTION (78)
-#define NT_STATUS_EAS_NOT_SUPPORTED (79)
-#define NT_STATUS_EA_TOO_LARGE (80)
-#define NT_STATUS_NONEXISTENT_EA_ENTRY (81)
-#define NT_STATUS_NO_EAS_ON_FILE (82)
-#define NT_STATUS_EA_CORRUPT_ERROR (83)
-#define NT_STATUS_FILE_LOCK_CONFLICT (84)
-#define NT_STATUS_LOCK_NOT_GRANTED (85)
-#define NT_STATUS_DELETE_PENDING (86)
-#define NT_STATUS_CTL_FILE_NOT_SUPPORTED (87)
-#define NT_STATUS_UNKNOWN_REVISION (88)
-#define NT_STATUS_REVISION_MISMATCH (89)
-#define NT_STATUS_INVALID_OWNER (90)
-#define NT_STATUS_INVALID_PRIMARY_GROUP (91)
-#define NT_STATUS_NO_IMPERSONATION_TOKEN (92)
-#define NT_STATUS_CANT_DISABLE_MANDATORY (93)
-#define NT_STATUS_NO_LOGON_SERVERS (94)
-#define NT_STATUS_NO_SUCH_LOGON_SESSION (95)
-#define NT_STATUS_NO_SUCH_PRIVILEGE (96)
-#define NT_STATUS_PRIVILEGE_NOT_HELD (97)
-#define NT_STATUS_INVALID_ACCOUNT_NAME (98)
-#define NT_STATUS_USER_EXISTS (99)
-#define NT_STATUS_NO_SUCH_USER (100)
-#define NT_STATUS_GROUP_EXISTS (101)
-#define NT_STATUS_NO_SUCH_GROUP (102)
-#define NT_STATUS_MEMBER_IN_GROUP (103)
-#define NT_STATUS_MEMBER_NOT_IN_GROUP (104)
-#define NT_STATUS_LAST_ADMIN (105)
-#define NT_STATUS_WRONG_PASSWORD (106)
-#define NT_STATUS_ILL_FORMED_PASSWORD (107)
-#define NT_STATUS_PASSWORD_RESTRICTION (108)
-#define NT_STATUS_LOGON_FAILURE (109)
-#define NT_STATUS_ACCOUNT_RESTRICTION (110)
-#define NT_STATUS_INVALID_LOGON_HOURS (111)
-#define NT_STATUS_INVALID_WORKSTATION (112)
-#define NT_STATUS_PASSWORD_EXPIRED (113)
-#define NT_STATUS_ACCOUNT_DISABLED (114)
-#define NT_STATUS_NONE_MAPPED (115)
-#define NT_STATUS_TOO_MANY_LUIDS_REQUESTED (116)
-#define NT_STATUS_LUIDS_EXHAUSTED (117)
-#define NT_STATUS_INVALID_SUB_AUTHORITY (118)
-#define NT_STATUS_INVALID_ACL (119)
-#define NT_STATUS_INVALID_SID (120)
-#define NT_STATUS_INVALID_SECURITY_DESCR (121)
-#define NT_STATUS_PROCEDURE_NOT_FOUND (122)
-#define NT_STATUS_INVALID_IMAGE_FORMAT (123)
-#define NT_STATUS_NO_TOKEN (124)
-#define NT_STATUS_BAD_INHERITANCE_ACL (125)
-#define NT_STATUS_RANGE_NOT_LOCKED (126)
-#define NT_STATUS_DISK_FULL (127)
-#define NT_STATUS_SERVER_DISABLED (128)
-#define NT_STATUS_SERVER_NOT_DISABLED (129)
-#define NT_STATUS_TOO_MANY_GUIDS_REQUESTED (130)
-#define NT_STATUS_GUIDS_EXHAUSTED (131)
-#define NT_STATUS_INVALID_ID_AUTHORITY (132)
-#define NT_STATUS_AGENTS_EXHAUSTED (133)
-#define NT_STATUS_INVALID_VOLUME_LABEL (134)
-#define NT_STATUS_SECTION_NOT_EXTENDED (135)
-#define NT_STATUS_NOT_MAPPED_DATA (136)
-#define NT_STATUS_RESOURCE_DATA_NOT_FOUND (137)
-#define NT_STATUS_RESOURCE_TYPE_NOT_FOUND (138)
-#define NT_STATUS_RESOURCE_NAME_NOT_FOUND (139)
-#define NT_STATUS_ARRAY_BOUNDS_EXCEEDED (140)
-#define NT_STATUS_FLOAT_DENORMAL_OPERAND (141)
-#define NT_STATUS_FLOAT_DIVIDE_BY_ZERO (142)
-#define NT_STATUS_FLOAT_INEXACT_RESULT (143)
-#define NT_STATUS_FLOAT_INVALID_OPERATION (144)
-#define NT_STATUS_FLOAT_OVERFLOW (145)
-#define NT_STATUS_FLOAT_STACK_CHECK (146)
-#define NT_STATUS_FLOAT_UNDERFLOW (147)
-#define NT_STATUS_INTEGER_DIVIDE_BY_ZERO (148)
-#define NT_STATUS_INTEGER_OVERFLOW (149)
-#define NT_STATUS_PRIVILEGED_INSTRUCTION (150)
-#define NT_STATUS_TOO_MANY_PAGING_FILES (151)
-#define NT_STATUS_FILE_INVALID (152)
-#define NT_STATUS_ALLOTTED_SPACE_EXCEEDED (153)
-#define NT_STATUS_INSUFFICIENT_RESOURCES (154)
-#define NT_STATUS_DFS_EXIT_PATH_FOUND (155)
-#define NT_STATUS_DEVICE_DATA_ERROR (156)
-#define NT_STATUS_DEVICE_NOT_CONNECTED (157)
-#define NT_STATUS_DEVICE_POWER_FAILURE (158)
-#define NT_STATUS_FREE_VM_NOT_AT_BASE (159)
-#define NT_STATUS_MEMORY_NOT_ALLOCATED (160)
-#define NT_STATUS_WORKING_SET_QUOTA (161)
-#define NT_STATUS_MEDIA_WRITE_PROTECTED (162)
-#define NT_STATUS_DEVICE_NOT_READY (163)
-#define NT_STATUS_INVALID_GROUP_ATTRIBUTES (164)
-#define NT_STATUS_BAD_IMPERSONATION_LEVEL (165)
-#define NT_STATUS_CANT_OPEN_ANONYMOUS (166)
-#define NT_STATUS_BAD_VALIDATION_CLASS (167)
-#define NT_STATUS_BAD_TOKEN_TYPE (168)
-#define NT_STATUS_BAD_MASTER_BOOT_RECORD (169)
-#define NT_STATUS_INSTRUCTION_MISALIGNMENT (170)
-#define NT_STATUS_INSTANCE_NOT_AVAILABLE (171)
-#define NT_STATUS_PIPE_NOT_AVAILABLE (172)
-#define NT_STATUS_INVALID_PIPE_STATE (173)
-#define NT_STATUS_PIPE_BUSY (174)
-#define NT_STATUS_ILLEGAL_FUNCTION (175)
-#define NT_STATUS_PIPE_DISCONNECTED (176)
-#define NT_STATUS_PIPE_CLOSING (177)
-#define NT_STATUS_PIPE_CONNECTED (178)
-#define NT_STATUS_PIPE_LISTENING (179)
-#define NT_STATUS_INVALID_READ_MODE (180)
-#define NT_STATUS_IO_TIMEOUT (181)
-#define NT_STATUS_FILE_FORCED_CLOSED (182)
-#define NT_STATUS_PROFILING_NOT_STARTED (183)
-#define NT_STATUS_PROFILING_NOT_STOPPED (184)
-#define NT_STATUS_COULD_NOT_INTERPRET (185)
-#define NT_STATUS_FILE_IS_A_DIRECTORY (186)
-#define NT_STATUS_NOT_SUPPORTED (187)
-#define NT_STATUS_REMOTE_NOT_LISTENING (188)
-#define NT_STATUS_DUPLICATE_NAME (189)
-#define NT_STATUS_BAD_NETWORK_PATH (190)
-#define NT_STATUS_NETWORK_BUSY (191)
-#define NT_STATUS_DEVICE_DOES_NOT_EXIST (192)
-#define NT_STATUS_TOO_MANY_COMMANDS (193)
-#define NT_STATUS_ADAPTER_HARDWARE_ERROR (194)
-#define NT_STATUS_INVALID_NETWORK_RESPONSE (195)
-#define NT_STATUS_UNEXPECTED_NETWORK_ERROR (196)
-#define NT_STATUS_BAD_REMOTE_ADAPTER (197)
-#define NT_STATUS_PRINT_QUEUE_FULL (198)
-#define NT_STATUS_NO_SPOOL_SPACE (199)
-#define NT_STATUS_PRINT_CANCELLED (200)
-#define NT_STATUS_NETWORK_NAME_DELETED (201)
-#define NT_STATUS_NETWORK_ACCESS_DENIED (202)
-#define NT_STATUS_BAD_DEVICE_TYPE (203)
-#define NT_STATUS_BAD_NETWORK_NAME (204)
-#define NT_STATUS_TOO_MANY_NAMES (205)
-#define NT_STATUS_TOO_MANY_SESSIONS (206)
-#define NT_STATUS_SHARING_PAUSED (207)
-#define NT_STATUS_REQUEST_NOT_ACCEPTED (208)
-#define NT_STATUS_REDIRECTOR_PAUSED (209)
-#define NT_STATUS_NET_WRITE_FAULT (210)
-#define NT_STATUS_PROFILING_AT_LIMIT (211)
-#define NT_STATUS_NOT_SAME_DEVICE (212)
-#define NT_STATUS_FILE_RENAMED (213)
-#define NT_STATUS_VIRTUAL_CIRCUIT_CLOSED (214)
-#define NT_STATUS_NO_SECURITY_ON_OBJECT (215)
-#define NT_STATUS_CANT_WAIT (216)
-#define NT_STATUS_PIPE_EMPTY (217)
-#define NT_STATUS_CANT_ACCESS_DOMAIN_INFO (218)
-#define NT_STATUS_CANT_TERMINATE_SELF (219)
-#define NT_STATUS_INVALID_SERVER_STATE (220)
-#define NT_STATUS_INVALID_DOMAIN_STATE (221)
-#define NT_STATUS_INVALID_DOMAIN_ROLE (222)
-#define NT_STATUS_NO_SUCH_DOMAIN (223)
-#define NT_STATUS_DOMAIN_EXISTS (224)
-#define NT_STATUS_DOMAIN_LIMIT_EXCEEDED (225)
-#define NT_STATUS_OPLOCK_NOT_GRANTED (226)
-#define NT_STATUS_INVALID_OPLOCK_PROTOCOL (227)
-#define NT_STATUS_INTERNAL_DB_CORRUPTION (228)
-#define NT_STATUS_INTERNAL_ERROR (229)
-#define NT_STATUS_GENERIC_NOT_MAPPED (230)
-#define NT_STATUS_BAD_DESCRIPTOR_FORMAT (231)
-#define NT_STATUS_INVALID_USER_BUFFER (232)
-#define NT_STATUS_UNEXPECTED_IO_ERROR (233)
-#define NT_STATUS_UNEXPECTED_MM_CREATE_ERR (234)
-#define NT_STATUS_UNEXPECTED_MM_MAP_ERROR (235)
-#define NT_STATUS_UNEXPECTED_MM_EXTEND_ERR (236)
-#define NT_STATUS_NOT_LOGON_PROCESS (237)
-#define NT_STATUS_LOGON_SESSION_EXISTS (238)
-#define NT_STATUS_INVALID_PARAMETER_1 (239)
-#define NT_STATUS_INVALID_PARAMETER_2 (240)
-#define NT_STATUS_INVALID_PARAMETER_3 (241)
-#define NT_STATUS_INVALID_PARAMETER_4 (242)
-#define NT_STATUS_INVALID_PARAMETER_5 (243)
-#define NT_STATUS_INVALID_PARAMETER_6 (244)
-#define NT_STATUS_INVALID_PARAMETER_7 (245)
-#define NT_STATUS_INVALID_PARAMETER_8 (246)
-#define NT_STATUS_INVALID_PARAMETER_9 (247)
-#define NT_STATUS_INVALID_PARAMETER_10 (248)
-#define NT_STATUS_INVALID_PARAMETER_11 (249)
-#define NT_STATUS_INVALID_PARAMETER_12 (250)
-#define NT_STATUS_REDIRECTOR_NOT_STARTED (251)
-#define NT_STATUS_REDIRECTOR_STARTED (252)
-#define NT_STATUS_STACK_OVERFLOW (253)
-#define NT_STATUS_NO_SUCH_PACKAGE (254)
-#define NT_STATUS_BAD_FUNCTION_TABLE (255)
-#define NT_STATUS_DIRECTORY_NOT_EMPTY (257)
-#define NT_STATUS_FILE_CORRUPT_ERROR (258)
-#define NT_STATUS_NOT_A_DIRECTORY (259)
-#define NT_STATUS_BAD_LOGON_SESSION_STATE (260)
-#define NT_STATUS_LOGON_SESSION_COLLISION (261)
-#define NT_STATUS_NAME_TOO_LONG (262)
-#define NT_STATUS_FILES_OPEN (263)
-#define NT_STATUS_CONNECTION_IN_USE (264)
-#define NT_STATUS_MESSAGE_NOT_FOUND (265)
-#define NT_STATUS_PROCESS_IS_TERMINATING (266)
-#define NT_STATUS_INVALID_LOGON_TYPE (267)
-#define NT_STATUS_NO_GUID_TRANSLATION (268)
-#define NT_STATUS_CANNOT_IMPERSONATE (269)
-#define NT_STATUS_IMAGE_ALREADY_LOADED (270)
-#define NT_STATUS_ABIOS_NOT_PRESENT (271)
-#define NT_STATUS_ABIOS_LID_NOT_EXIST (272)
-#define NT_STATUS_ABIOS_LID_ALREADY_OWNED (273)
-#define NT_STATUS_ABIOS_NOT_LID_OWNER (274)
-#define NT_STATUS_ABIOS_INVALID_COMMAND (275)
-#define NT_STATUS_ABIOS_INVALID_LID (276)
-#define NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE (277)
-#define NT_STATUS_ABIOS_INVALID_SELECTOR (278)
-#define NT_STATUS_NO_LDT (279)
-#define NT_STATUS_INVALID_LDT_SIZE (280)
-#define NT_STATUS_INVALID_LDT_OFFSET (281)
-#define NT_STATUS_INVALID_LDT_DESCRIPTOR (282)
-#define NT_STATUS_INVALID_IMAGE_NE_FORMAT (283)
-#define NT_STATUS_RXACT_INVALID_STATE (284)
-#define NT_STATUS_RXACT_COMMIT_FAILURE (285)
-#define NT_STATUS_MAPPED_FILE_SIZE_ZERO (286)
-#define NT_STATUS_TOO_MANY_OPENED_FILES (287)
-#define NT_STATUS_CANCELLED (288)
-#define NT_STATUS_CANNOT_DELETE (289)
-#define NT_STATUS_INVALID_COMPUTER_NAME (290)
-#define NT_STATUS_FILE_DELETED (291)
-#define NT_STATUS_SPECIAL_ACCOUNT (292)
-#define NT_STATUS_SPECIAL_GROUP (293)
-#define NT_STATUS_SPECIAL_USER (294)
-#define NT_STATUS_MEMBERS_PRIMARY_GROUP (295)
-#define NT_STATUS_FILE_CLOSED (296)
-#define NT_STATUS_TOO_MANY_THREADS (297)
-#define NT_STATUS_THREAD_NOT_IN_PROCESS (298)
-#define NT_STATUS_TOKEN_ALREADY_IN_USE (299)
-#define NT_STATUS_PAGEFILE_QUOTA_EXCEEDED (300)
-#define NT_STATUS_COMMITMENT_LIMIT (301)
-#define NT_STATUS_INVALID_IMAGE_LE_FORMAT (302)
-#define NT_STATUS_INVALID_IMAGE_NOT_MZ (303)
-#define NT_STATUS_INVALID_IMAGE_PROTECT (304)
-#define NT_STATUS_INVALID_IMAGE_WIN_16 (305)
-#define NT_STATUS_LOGON_SERVER_CONFLICT (306)
-#define NT_STATUS_TIME_DIFFERENCE_AT_DC (307)
-#define NT_STATUS_SYNCHRONIZATION_REQUIRED (308)
-#define NT_STATUS_DLL_NOT_FOUND (309)
-#define NT_STATUS_OPEN_FAILED (310)
-#define NT_STATUS_IO_PRIVILEGE_FAILED (311)
-#define NT_STATUS_ORDINAL_NOT_FOUND (312)
-#define NT_STATUS_ENTRYPOINT_NOT_FOUND (313)
-#define NT_STATUS_CONTROL_C_EXIT (314)
-#define NT_STATUS_LOCAL_DISCONNECT (315)
-#define NT_STATUS_REMOTE_DISCONNECT (316)
-#define NT_STATUS_REMOTE_RESOURCES (317)
-#define NT_STATUS_LINK_FAILED (318)
-#define NT_STATUS_LINK_TIMEOUT (319)
-#define NT_STATUS_INVALID_CONNECTION (320)
-#define NT_STATUS_INVALID_ADDRESS (321)
-#define NT_STATUS_DLL_INIT_FAILED (322)
-#define NT_STATUS_MISSING_SYSTEMFILE (323)
-#define NT_STATUS_UNHANDLED_EXCEPTION (324)
-#define NT_STATUS_APP_INIT_FAILURE (325)
-#define NT_STATUS_PAGEFILE_CREATE_FAILED (326)
-#define NT_STATUS_NO_PAGEFILE (327)
-#define NT_STATUS_INVALID_LEVEL (328)
-#define NT_STATUS_WRONG_PASSWORD_CORE (329)
-#define NT_STATUS_ILLEGAL_FLOAT_CONTEXT (330)
-#define NT_STATUS_PIPE_BROKEN (331)
-#define NT_STATUS_REGISTRY_CORRUPT (332)
-#define NT_STATUS_REGISTRY_IO_FAILED (333)
-#define NT_STATUS_NO_EVENT_PAIR (334)
-#define NT_STATUS_UNRECOGNIZED_VOLUME (335)
-#define NT_STATUS_SERIAL_NO_DEVICE_INITED (336)
-#define NT_STATUS_NO_SUCH_ALIAS (337)
-#define NT_STATUS_MEMBER_NOT_IN_ALIAS (338)
-#define NT_STATUS_MEMBER_IN_ALIAS (339)
-#define NT_STATUS_ALIAS_EXISTS (340)
-#define NT_STATUS_LOGON_NOT_GRANTED (341)
-#define NT_STATUS_TOO_MANY_SECRETS (342)
-#define NT_STATUS_SECRET_TOO_LONG (343)
-#define NT_STATUS_INTERNAL_DB_ERROR (344)
-#define NT_STATUS_FULLSCREEN_MODE (345)
-#define NT_STATUS_TOO_MANY_CONTEXT_IDS (346)
-#define NT_STATUS_LOGON_TYPE_NOT_GRANTED (347)
-#define NT_STATUS_NOT_REGISTRY_FILE (348)
-#define NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED (349)
-#define NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR (350)
-#define NT_STATUS_FT_MISSING_MEMBER (351)
-#define NT_STATUS_ILL_FORMED_SERVICE_ENTRY (352)
-#define NT_STATUS_ILLEGAL_CHARACTER (353)
-#define NT_STATUS_UNMAPPABLE_CHARACTER (354)
-#define NT_STATUS_UNDEFINED_CHARACTER (355)
-#define NT_STATUS_FLOPPY_VOLUME (356)
-#define NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND (357)
-#define NT_STATUS_FLOPPY_WRONG_CYLINDER (358)
-#define NT_STATUS_FLOPPY_UNKNOWN_ERROR (359)
-#define NT_STATUS_FLOPPY_BAD_REGISTERS (360)
-#define NT_STATUS_DISK_RECALIBRATE_FAILED (361)
-#define NT_STATUS_DISK_OPERATION_FAILED (362)
-#define NT_STATUS_DISK_RESET_FAILED (363)
-#define NT_STATUS_SHARED_IRQ_BUSY (364)
-#define NT_STATUS_FT_ORPHANING (365)
-#define NT_STATUS_PARTITION_FAILURE (370)
-#define NT_STATUS_INVALID_BLOCK_LENGTH (371)
-#define NT_STATUS_DEVICE_NOT_PARTITIONED (372)
-#define NT_STATUS_UNABLE_TO_LOCK_MEDIA (373)
-#define NT_STATUS_UNABLE_TO_UNLOAD_MEDIA (374)
-#define NT_STATUS_EOM_OVERFLOW (375)
-#define NT_STATUS_NO_MEDIA (376)
-#define NT_STATUS_NO_SUCH_MEMBER (378)
-#define NT_STATUS_INVALID_MEMBER (379)
-#define NT_STATUS_KEY_DELETED (380)
-#define NT_STATUS_NO_LOG_SPACE (381)
-#define NT_STATUS_TOO_MANY_SIDS (382)
-#define NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED (383)
-#define NT_STATUS_KEY_HAS_CHILDREN (384)
-#define NT_STATUS_CHILD_MUST_BE_VOLATILE (385)
-#define NT_STATUS_DEVICE_CONFIGURATION_ERROR (386)
-#define NT_STATUS_DRIVER_INTERNAL_ERROR (387)
-#define NT_STATUS_INVALID_DEVICE_STATE (388)
-#define NT_STATUS_IO_DEVICE_ERROR (389)
-#define NT_STATUS_DEVICE_PROTOCOL_ERROR (390)
-#define NT_STATUS_BACKUP_CONTROLLER (391)
-#define NT_STATUS_LOG_FILE_FULL (392)
-#define NT_STATUS_TOO_LATE (393)
-#define NT_STATUS_NO_TRUST_LSA_SECRET (394)
-#define NT_STATUS_NO_TRUST_SAM_ACCOUNT (395)
-#define NT_STATUS_TRUSTED_DOMAIN_FAILURE (396)
-#define NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE (397)
-#define NT_STATUS_EVENTLOG_FILE_CORRUPT (398)
-#define NT_STATUS_EVENTLOG_CANT_START (399)
-#define NT_STATUS_TRUST_FAILURE (400)
-#define NT_STATUS_MUTANT_LIMIT_EXCEEDED (401)
-#define NT_STATUS_NETLOGON_NOT_STARTED (402)
-#define NT_STATUS_ACCOUNT_EXPIRED (403)
-#define NT_STATUS_POSSIBLE_DEADLOCK (404)
-#define NT_STATUS_NETWORK_CREDENTIAL_CONFLICT (405)
-#define NT_STATUS_REMOTE_SESSION_LIMIT (406)
-#define NT_STATUS_EVENTLOG_FILE_CHANGED (407)
-#define NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT (408)
-#define NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT (409)
-#define NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT (410)
-#define NT_STATUS_DOMAIN_TRUST_INCONSISTENT (411)
-#define NT_STATUS_FS_DRIVER_REQUIRED (412)
-#define NT_STATUS_NO_USER_SESSION_KEY (514)
-#define NT_STATUS_USER_SESSION_DELETED (515)
-#define NT_STATUS_RESOURCE_LANG_NOT_FOUND (516)
-#define NT_STATUS_INSUFF_SERVER_RESOURCES (517)
-#define NT_STATUS_INVALID_BUFFER_SIZE (518)
-#define NT_STATUS_INVALID_ADDRESS_COMPONENT (519)
-#define NT_STATUS_INVALID_ADDRESS_WILDCARD (520)
-#define NT_STATUS_TOO_MANY_ADDRESSES (521)
-#define NT_STATUS_ADDRESS_ALREADY_EXISTS (522)
-#define NT_STATUS_ADDRESS_CLOSED (523)
-#define NT_STATUS_CONNECTION_DISCONNECTED (524)
-#define NT_STATUS_CONNECTION_RESET (525)
-#define NT_STATUS_TOO_MANY_NODES (526)
-#define NT_STATUS_TRANSACTION_ABORTED (527)
-#define NT_STATUS_TRANSACTION_TIMED_OUT (528)
-#define NT_STATUS_TRANSACTION_NO_RELEASE (529)
-#define NT_STATUS_TRANSACTION_NO_MATCH (530)
-#define NT_STATUS_TRANSACTION_RESPONDED (531)
-#define NT_STATUS_TRANSACTION_INVALID_ID (532)
-#define NT_STATUS_TRANSACTION_INVALID_TYPE (533)
-#define NT_STATUS_NOT_SERVER_SESSION (534)
-#define NT_STATUS_NOT_CLIENT_SESSION (535)
-#define NT_STATUS_CANNOT_LOAD_REGISTRY_FILE (536)
-#define NT_STATUS_DEBUG_ATTACH_FAILED (537)
-#define NT_STATUS_SYSTEM_PROCESS_TERMINATED (538)
-#define NT_STATUS_DATA_NOT_ACCEPTED (539)
-#define NT_STATUS_NO_BROWSER_SERVERS_FOUND (540)
-#define NT_STATUS_VDM_HARD_ERROR (541)
-#define NT_STATUS_DRIVER_CANCEL_TIMEOUT (542)
-#define NT_STATUS_REPLY_MESSAGE_MISMATCH (543)
-#define NT_STATUS_MAPPED_ALIGNMENT (544)
-#define NT_STATUS_IMAGE_CHECKSUM_MISMATCH (545)
-#define NT_STATUS_LOST_WRITEBEHIND_DATA (546)
-#define NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID (547)
-#define NT_STATUS_PASSWORD_MUST_CHANGE (548)
-#define NT_STATUS_NOT_FOUND (549)
-#define NT_STATUS_NOT_TINY_STREAM (550)
-#define NT_STATUS_RECOVERY_FAILURE (551)
-#define NT_STATUS_STACK_OVERFLOW_READ (552)
-#define NT_STATUS_FAIL_CHECK (553)
-#define NT_STATUS_DUPLICATE_OBJECTID (554)
-#define NT_STATUS_OBJECTID_EXISTS (555)
-#define NT_STATUS_CONVERT_TO_LARGE (556)
-#define NT_STATUS_RETRY (557)
-#define NT_STATUS_FOUND_OUT_OF_SCOPE (558)
-#define NT_STATUS_ALLOCATE_BUCKET (559)
-#define NT_STATUS_PROPSET_NOT_FOUND (560)
-#define NT_STATUS_MARSHALL_OVERFLOW (561)
-#define NT_STATUS_INVALID_VARIANT (562)
-#define NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND (563)
-#define NT_STATUS_ACCOUNT_LOCKED_OUT (564)
-#define NT_STATUS_HANDLE_NOT_CLOSABLE (565)
-#define NT_STATUS_CONNECTION_REFUSED (566)
-#define NT_STATUS_GRACEFUL_DISCONNECT (567)
-#define NT_STATUS_ADDRESS_ALREADY_ASSOCIATED (568)
-#define NT_STATUS_ADDRESS_NOT_ASSOCIATED (569)
-#define NT_STATUS_CONNECTION_INVALID (570)
-#define NT_STATUS_CONNECTION_ACTIVE (571)
-#define NT_STATUS_NETWORK_UNREACHABLE (572)
-#define NT_STATUS_HOST_UNREACHABLE (573)
-#define NT_STATUS_PROTOCOL_UNREACHABLE (574)
-#define NT_STATUS_PORT_UNREACHABLE (575)
-#define NT_STATUS_REQUEST_ABORTED (576)
-#define NT_STATUS_CONNECTION_ABORTED (577)
-#define NT_STATUS_BAD_COMPRESSION_BUFFER (578)
-#define NT_STATUS_USER_MAPPED_FILE (579)
-#define NT_STATUS_AUDIT_FAILED (580)
-#define NT_STATUS_TIMER_RESOLUTION_NOT_SET (581)
-#define NT_STATUS_CONNECTION_COUNT_LIMIT (582)
-#define NT_STATUS_LOGIN_TIME_RESTRICTION (583)
-#define NT_STATUS_LOGIN_WKSTA_RESTRICTION (584)
-#define NT_STATUS_IMAGE_MP_UP_MISMATCH (585)
-#define NT_STATUS_INSUFFICIENT_LOGON_INFO (592)
-#define NT_STATUS_BAD_DLL_ENTRYPOINT (593)
-#define NT_STATUS_BAD_SERVICE_ENTRYPOINT (594)
-#define NT_STATUS_LPC_REPLY_LOST (595)
-#define NT_STATUS_IP_ADDRESS_CONFLICT1 (596)
-#define NT_STATUS_IP_ADDRESS_CONFLICT2 (597)
-#define NT_STATUS_REGISTRY_QUOTA_LIMIT (598)
-#define NT_STATUS_PATH_NOT_COVERED (599)
-#define NT_STATUS_NO_CALLBACK_ACTIVE (600)
-#define NT_STATUS_LICENSE_QUOTA_EXCEEDED (601)
-#define NT_STATUS_PWD_TOO_SHORT (602)
-#define NT_STATUS_PWD_TOO_RECENT (603)
-#define NT_STATUS_PWD_HISTORY_CONFLICT (604)
-#define NT_STATUS_PLUGPLAY_NO_DEVICE (606)
-#define NT_STATUS_UNSUPPORTED_COMPRESSION (607)
-#define NT_STATUS_INVALID_HW_PROFILE (608)
-#define NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH (609)
-#define NT_STATUS_DRIVER_ORDINAL_NOT_FOUND (610)
-#define NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND (611)
-#define NT_STATUS_RESOURCE_NOT_OWNED (612)
-#define NT_STATUS_TOO_MANY_LINKS (613)
-#define NT_STATUS_QUOTA_LIST_INCONSISTENT (614)
-#define NT_STATUS_FILE_IS_OFFLINE (615)
diff --git a/source/include/proto.h b/source/include/proto.h
deleted file mode 100644
index 009d83db5c2..00000000000
--- a/source/include/proto.h
+++ /dev/null
@@ -1,1057 +0,0 @@
-/* This file is automatically generated with "make proto". DO NOT EDIT */
-
-
-/*The following definitions come from access.c */
-
-BOOL check_access(int snum);
-BOOL allow_access(char *deny_list,char *allow_list,char *cname,char *caddr);
-
-/*The following definitions come from charcnv.c */
-
-char *unix2dos_format(char *str,BOOL overwrite);
-char *dos2unix_format(char *str, BOOL overwrite);
-int interpret_character_set(char *str, int def);
-
-/*The following definitions come from charset.c */
-
-void charset_initialise();
-void codepage_initialise(int client_codepage);
-void add_char_string(char *s);
-
-/*The following definitions come from chgpasswd.c */
-
-BOOL chat_with_program(char *passwordprogram,char *name,char *chatsequence);
-BOOL chgpasswd(char *name,char *oldpass,char *newpass);
-BOOL chgpasswd(char *name,char *oldpass,char *newpass);
-
-/*The following definitions come from client.c */
-
-void setup_pkt(char *outbuf);
-void do_dir(char *inbuf,char *outbuf,char *Mask,int attribute,void (*fn)(),BOOL recurse_dir);
-void cmd_help(void);
-BOOL reopen_connection(char *inbuf,char *outbuf);
-char *smb_errstr(char *inbuf);
-
-/*The following definitions come from clientutil.c */
-
-void cli_setup_pkt(char *outbuf);
-BOOL cli_receive_trans_response(char *inbuf,int trans,int *data_len,
- int *param_len, char **data,char **param);
-BOOL cli_send_session_request(char *inbuf, char *outbuf);
-BOOL cli_send_login(char *inbuf, char *outbuf, BOOL start_session, BOOL use_setup);
-void cli_send_logout(void);
-BOOL cli_call_api(int prcnt,int drcnt,int mprcnt,int mdrcnt,int *rprcnt,
- int *rdrcnt, char *param,char *data, char **rparam,char **rdata);
-BOOL cli_send_trans_request(char *outbuf, int trans, char *name, int fid, int flags,
- char *data,char *param,uint16 *setup, int ldata,int lparam,
- int lsetup,int mdata,int mparam,int msetup);
-BOOL cli_open_sockets(int port);
-BOOL cli_reopen_connection(char *inbuf,char *outbuf);
-char *smb_errstr(char *inbuf);
-
-/*The following definitions come from clitar.c */
-
-int padit(char *buf, int bufsize, int padsize);
-void cmd_block(void);
-void cmd_tarmode(void);
-void cmd_setmode(void);
-void cmd_tar(char *inbuf, char *outbuf);
-int process_tar(char *inbuf, char *outbuf);
-int clipfind(char **aret, int ret, char *tok);
-int tar_parseargs(int argc, char *argv[], char *Optarg, int Optind);
-
-/*The following definitions come from dir.c */
-
-void init_dptrs(void);
-char *dptr_path(int key);
-char *dptr_wcard(int key);
-BOOL dptr_set_wcard(int key, char *wcard);
-BOOL dptr_set_attr(int key, uint16 attr);
-uint16 dptr_attr(int key);
-void dptr_close(int key);
-void dptr_closecnum(int cnum);
-void dptr_idlecnum(int cnum);
-void dptr_closepath(char *path,int pid);
-int dptr_create(int cnum,char *path, BOOL expect_close,int pid);
-BOOL dptr_fill(char *buf1,unsigned int key);
-BOOL dptr_zero(char *buf);
-void *dptr_fetch(char *buf,int *num);
-void *dptr_fetch_lanman2(char *params,int dptr_num);
-BOOL dir_check_ftype(int cnum,int mode,struct stat *st,int dirtype);
-BOOL get_dir_entry(int cnum,char *mask,int dirtype,char *fname,int *size,int *mode,time_t *date,BOOL check_descend);
-void *OpenDir(int cnum, char *name, BOOL use_veto);
-void CloseDir(void *p);
-char *ReadDirName(void *p);
-BOOL SeekDir(void *p,int pos);
-int TellDir(void *p);
-void DirCacheAdd(char *path,char *name,char *dname,int snum);
-char *DirCacheCheck(char *path,char *name,int snum);
-void DirCacheFlush(int snum);
-
-/*The following definitions come from fault.c */
-
-void fault_setup(void (*fn)());
-
-/*The following definitions come from getsmbpass.c */
-
-char *getsmbpass(char *prompt) ;
-
-/*The following definitions come from interface.c */
-
-void load_interfaces(void);
-void iface_set_default(char *ip,char *bcast,char *nmask);
-BOOL ismyip(struct in_addr ip);
-BOOL ismybcast(struct in_addr bcast);
-int iface_count(void);
-struct in_addr *iface_n_ip(int n);
-struct in_addr *iface_bcast(struct in_addr ip);
-struct in_addr *iface_nmask(struct in_addr ip);
-struct in_addr *iface_ip(struct in_addr ip);
-
-/*The following definitions come from ipc.c */
-
-int reply_trans(char *inbuf,char *outbuf);
-
-/*The following definitions come from kanji.c */
-
-char *sj_strtok(char *s1, char *s2);
-char *sj_strstr(char *s1, char *s2);
-char *sj_strchr (char *s, int c);
-char *sj_strrchr(char *s, int c);
-int interpret_coding_system(char *str, int def);
-
-/*The following definitions come from loadparm.c */
-
-char *lp_string(char *s);
-char *lp_logfile(void);
-char *lp_smbrun(void);
-char *lp_configfile(void);
-char *lp_smb_passwd_file(void);
-char *lp_serverstring(void);
-char *lp_printcapname(void);
-char *lp_lockdir(void);
-char *lp_rootdir(void);
-char *lp_defaultservice(void);
-char *lp_msg_command(void);
-char *lp_dfree_command(void);
-char *lp_hosts_equiv(void);
-char *lp_auto_services(void);
-char *lp_passwd_program(void);
-char *lp_passwd_chat(void);
-char *lp_passwordserver(void);
-char *lp_workgroup(void);
-char *lp_domain_controller(void);
-char *lp_username_map(void);
-char *lp_character_set(void);
-char *lp_logon_script(void);
-char *lp_logon_path(void);
-char *lp_remote_announce(void);
-char *lp_wins_server(void);
-char *lp_interfaces(void);
-char *lp_socket_address(void);
-char *lp_nis_home_map_name(void);
-char *lp_announce_version(void);
-char *lp_netbios_aliases(void);
-char *lp_domainsid(void);
-BOOL lp_dns_proxy(void);
-BOOL lp_wins_support(void);
-BOOL lp_wins_proxy(void);
-BOOL lp_local_master(void);
-BOOL lp_domain_master(void);
-BOOL lp_domain_logons(void);
-BOOL lp_preferred_master(void);
-BOOL lp_load_printers(void);
-BOOL lp_use_rhosts(void);
-BOOL lp_getwdcache(void);
-BOOL lp_readprediction(void);
-BOOL lp_readbmpx(void);
-BOOL lp_readraw(void);
-BOOL lp_writeraw(void);
-BOOL lp_null_passwords(void);
-BOOL lp_strip_dot(void);
-BOOL lp_encrypted_passwords(void);
-BOOL lp_syslog_only(void);
-BOOL lp_browse_list(void);
-BOOL lp_unix_realname(void);
-BOOL lp_nis_home_map(void);
-BOOL lp_time_server(void);
-int lp_os_level(void);
-int lp_max_ttl(void);
-int lp_max_log_size(void);
-int lp_mangledstack(void);
-int lp_maxxmit(void);
-int lp_maxmux(void);
-int lp_maxpacket(void);
-int lp_keepalive(void);
-int lp_passwordlevel(void);
-int lp_usernamelevel(void);
-int lp_readsize(void);
-int lp_shmem_size(void);
-int lp_shmem_hash_size(void);
-int lp_deadtime(void);
-int lp_maxprotocol(void);
-int lp_security(void);
-int lp_printing(void);
-int lp_maxdisksize(void);
-int lp_lpqcachetime(void);
-int lp_syslog(void);
-int lp_client_code_page(void);
-int lp_announce_as(void);
-char *lp_preexec(int );
-char *lp_postexec(int );
-char *lp_rootpreexec(int );
-char *lp_rootpostexec(int );
-char *lp_servicename(int );
-char *lp_pathname(int );
-char *lp_dontdescend(int );
-char *lp_username(int );
-char *lp_guestaccount(int );
-char *lp_invalid_users(int );
-char *lp_valid_users(int );
-char *lp_admin_users(int );
-char *lp_printcommand(int );
-char *lp_lpqcommand(int );
-char *lp_lprmcommand(int );
-char *lp_lppausecommand(int );
-char *lp_lpresumecommand(int );
-char *lp_printername(int );
-char *lp_printerdriver(int );
-char *lp_hostsallow(int );
-char *lp_hostsdeny(int );
-char *lp_magicscript(int );
-char *lp_magicoutput(int );
-char *lp_comment(int );
-char *lp_force_user(int );
-char *lp_force_group(int );
-char *lp_readlist(int );
-char *lp_writelist(int );
-char *lp_volume(int );
-char *lp_mangled_map(int );
-char *lp_veto_files(int );
-char *lp_hide_files(int );
-BOOL lp_alternate_permissions(int );
-BOOL lp_revalidate(int );
-BOOL lp_casesensitive(int );
-BOOL lp_preservecase(int );
-BOOL lp_shortpreservecase(int );
-BOOL lp_casemangle(int );
-BOOL lp_status(int );
-BOOL lp_hide_dot_files(int );
-BOOL lp_browseable(int );
-BOOL lp_readonly(int );
-BOOL lp_no_set_dir(int );
-BOOL lp_guest_ok(int );
-BOOL lp_guest_only(int );
-BOOL lp_print_ok(int );
-BOOL lp_postscript(int );
-BOOL lp_map_hidden(int );
-BOOL lp_map_archive(int );
-BOOL lp_locking(int );
-BOOL lp_strict_locking(int );
-BOOL lp_share_modes(int );
-BOOL lp_oplocks(int );
-BOOL lp_onlyuser(int );
-BOOL lp_manglednames(int );
-BOOL lp_widelinks(int );
-BOOL lp_symlinks(int );
-BOOL lp_syncalways(int );
-BOOL lp_map_system(int );
-BOOL lp_delete_readonly(int );
-BOOL lp_fake_oplocks(int );
-BOOL lp_recursive_veto_delete(int );
-int lp_create_mode(int );
-int lp_force_create_mode(int );
-int lp_dir_mode(int );
-int lp_force_dir_mode(int );
-int lp_max_connections(int );
-int lp_defaultcase(int );
-int lp_minprintspace(int );
-char lp_magicchar(int );
-BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir);
-int lp_add_service(char *pszService, int iDefaultService);
-BOOL lp_add_printer(char *pszPrintername, int iDefaultService);
-BOOL lp_file_list_changed(void);
-BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue);
-int lp_next_parameter(int snum, int *i, char *label,
- char *value, int allparameters);
-BOOL lp_snum_ok(int iService);
-BOOL lp_loaded(void);
-void lp_killunused(BOOL (*snumused)(int ));
-BOOL lp_load(char *pszFname,BOOL global_only);
-int lp_numservices(void);
-void lp_dump(FILE *f);
-int lp_servicenumber(char *pszServiceName);
-char *volume_label(int snum);
-void lp_rename_service(int snum, char *new_name);
-void lp_remove_service(int snum);
-void lp_copy_service(int snum, char *new_name);
-int lp_default_server_announce(void);
-int lp_major_announce_version(void);
-int lp_minor_announce_version(void);
-
-/*The following definitions come from locking.c */
-
-BOOL is_locked(int fnum,int cnum,uint32 count,uint32 offset);
-BOOL do_lock(int fnum,int cnum,uint32 count,uint32 offset,int *eclass,uint32 *ecode);
-BOOL do_unlock(int fnum,int cnum,uint32 count,uint32 offset,int *eclass,uint32 *ecode);
-BOOL start_share_mode_mgmt(void);
-BOOL stop_share_mode_mgmt(void);
-BOOL lock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token *ptok);
-BOOL unlock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token token);
-int get_share_modes(int cnum, share_lock_token token, uint32 dev, uint32 inode,
- min_share_mode_entry **old_shares);
-void del_share_mode(share_lock_token token, int fnum);
-BOOL set_share_mode(share_lock_token token, int fnum, uint16 port, uint16 op_type);
-BOOL remove_share_oplock(int fnum, share_lock_token token);
-BOOL lock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token *ptok);
-BOOL unlock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token token);
-int get_share_modes(int cnum, share_lock_token token, uint32 dev, uint32 inode,
- min_share_mode_entry **old_shares);
-void del_share_mode(share_lock_token token, int fnum);
-BOOL set_share_mode(share_lock_token token,int fnum, uint16 port, uint16 op_type);
-BOOL remove_share_oplock(int fnum, share_lock_token token);
-
-/*The following definitions come from lsaparse.c */
-
-char* lsa_io_r_open_pol(BOOL io, LSA_R_OPEN_POL *r_p, char *q, char *base, int align);
-char* lsa_io_q_query(BOOL io, LSA_Q_QUERY_INFO *q_q, char *q, char *base, int align);
-char* lsa_io_r_query(BOOL io, LSA_R_QUERY_INFO *r_q, char *q, char *base, int align);
-char* lsa_io_q_lookup_sids(BOOL io, LSA_Q_LOOKUP_SIDS *q_s, char *q, char *base, int align);
-char* lsa_io_r_lookup_sids(BOOL io, LSA_R_LOOKUP_SIDS *r_s, char *q, char *base, int align);
-char* lsa_io_q_lookup_rids(BOOL io, LSA_Q_LOOKUP_RIDS *q_r, char *q, char *base, int align);
-char* lsa_io_r_lookup_rids(BOOL io, LSA_R_LOOKUP_RIDS *r_r, char *q, char *base, int align);
-char* lsa_io_q_req_chal(BOOL io, LSA_Q_REQ_CHAL *q_c, char *q, char *base, int align);
-char* lsa_io_r_req_chal(BOOL io, LSA_R_REQ_CHAL *r_c, char *q, char *base, int align);
-char* lsa_io_q_auth2(BOOL io, LSA_Q_AUTH_2 *q_a, char *q, char *base, int align);
-char* lsa_io_r_auth_2(BOOL io, LSA_R_AUTH_2 *r_a, char *q, char *base, int align);
-char* lsa_io_q_srv_pwset(BOOL io, LSA_Q_SRV_PWSET *q_s, char *q, char *base, int align);
-char* lsa_io_r_srv_pwset(BOOL io, LSA_R_SRV_PWSET *r_s, char *q, char *base, int align);
-char* lsa_io_user_info(BOOL io, LSA_USER_INFO *usr, char *q, char *base, int align);
-char* lsa_io_q_sam_logon(BOOL io, LSA_Q_SAM_LOGON *q_l, char *q, char *base, int align);
-char* lsa_io_r_sam_logon(BOOL io, LSA_R_SAM_LOGON *r_l, char *q, char *base, int align);
-char* lsa_io_q_sam_logoff(BOOL io, LSA_Q_SAM_LOGOFF *q_l, char *q, char *base, int align);
-char* lsa_io_r_sam_logoff(BOOL io, LSA_R_SAM_LOGOFF *r_l, char *q, char *base, int align);
-
-/*The following definitions come from mangle.c */
-
-int str_checksum(char *s);
-BOOL is_8_3(char *fname, BOOL check_case);
-void create_mangled_stack(int size);
-BOOL check_mangled_stack(char *s);
-BOOL is_mangled(char *s);
-void mangle_name_83(char *s);
-BOOL name_map_mangle(char *OutName,BOOL need83,int snum);
-
-/*The following definitions come from md4.c */
-
-void mdfour(unsigned char *out, unsigned char *in, int n);
-
-/*The following definitions come from message.c */
-
-int reply_sends(char *inbuf,char *outbuf);
-int reply_sendstrt(char *inbuf,char *outbuf);
-int reply_sendtxt(char *inbuf,char *outbuf);
-int reply_sendend(char *inbuf,char *outbuf);
-
-/*The following definitions come from nameannounce.c */
-
-void announce_request(struct work_record *work, struct in_addr ip);
-void do_announce_request(char *info, char *to_name, int announce_type,
- int from,
- int to, struct in_addr dest_ip);
-void sync_server(enum state_type state, char *serv_name, char *work_name,
- int name_type,
- struct subnet_record *d,
- struct in_addr ip);
-void do_announce_host(int command,
- char *from_name, int from_type, struct in_addr from_ip,
- char *to_name , int to_type , struct in_addr to_ip,
- time_t announce_interval,
- char *server_name, int server_type, char *server_comment);
-void announce_my_servers_removed(void);
-void announce_server(struct subnet_record *d, struct work_record *work,
- char *name, char *comment, time_t ttl, int server_type);
-void announce_host(time_t t);
-void reset_announce_timer();
-void announce_master(time_t t);
-void announce_remote(time_t t);
-
-/*The following definitions come from namebrowse.c */
-
-void expire_browse_cache(time_t t);
-struct browse_cache_record *add_browser_entry(char *name, int type, char *wg,
- time_t ttl, struct subnet_record *d,
- struct in_addr ip, BOOL local);
-void do_browser_lists(time_t t);
-
-/*The following definitions come from namedbname.c */
-
-void set_samba_nb_type(void);
-BOOL name_equal(struct nmb_name *n1,struct nmb_name *n2);
-BOOL ms_browser_name(char *name, int type);
-void remove_name(struct subnet_record *d, struct name_record *n);
-struct name_record *find_name(struct name_record *n,
- struct nmb_name *name, int search);
-struct name_record *find_name_search(struct subnet_record **d,
- struct nmb_name *name,
- int search, struct in_addr ip);
-void dump_names(void);
-void load_netbios_names(void);
-void remove_netbios_name(struct subnet_record *d,
- char *name,int type, enum name_source source,
- struct in_addr ip);
-struct name_record *add_netbios_entry(struct subnet_record *d,
- char *name, int type, int nb_flags,
- int ttl, enum name_source source, struct in_addr ip,
- BOOL new_only,BOOL wins);
-void expire_names(time_t t);
-struct name_record *dns_name_search(struct nmb_name *question, int Time);
-
-/*The following definitions come from namedbresp.c */
-
-void add_response_record(struct subnet_record *d,
- struct response_record *n);
-void remove_response_record(struct subnet_record *d,
- struct response_record *n);
-struct response_record *make_response_queue_record(enum state_type state,
- int id,uint16 fd,
- int quest_type, char *name,int type, int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- BOOL bcast,BOOL recurse,
- struct in_addr send_ip, struct in_addr reply_to_ip);
-struct response_record *find_response_record(struct subnet_record **d,
- uint16 id);
-
-/*The following definitions come from namedbserver.c */
-
-void remove_old_servers(struct work_record *work, time_t t,
- BOOL remove_all);
-struct server_record *find_server(struct work_record *work, char *name);
-struct server_record *add_server_entry(struct subnet_record *d,
- struct work_record *work,
- char *name,int servertype,
- int ttl,char *comment,
- BOOL replace);
-void expire_servers(time_t t);
-
-/*The following definitions come from namedbsubnet.c */
-
-struct subnet_record *find_subnet(struct in_addr bcast_ip);
-struct subnet_record *find_req_subnet(struct in_addr ip, BOOL bcast);
-struct subnet_record *find_subnet_all(struct in_addr bcast_ip);
-void add_workgroup_to_subnet( struct subnet_record *d, char *group);
-void add_my_subnets(char *group);
-void write_browse_list(time_t t);
-
-/*The following definitions come from namedbwork.c */
-
-struct work_record *remove_workgroup(struct subnet_record *d,
- struct work_record *work,
- BOOL remove_all_servers);
-struct work_record *find_workgroupstruct(struct subnet_record *d,
- fstring name, BOOL add);
-void dump_workgroups(void);
-
-/*The following definitions come from nameelect.c */
-
-void check_master_browser(time_t t);
-void browser_gone(char *work_name, struct in_addr ip);
-void send_election(struct subnet_record *d, char *group,uint32 criterion,
- int timeup,char *name);
-void name_unregister_work(struct subnet_record *d, char *name, int name_type);
-void name_register_work(struct subnet_record *d, char *name, int name_type,
- int nb_flags, time_t ttl, struct in_addr ip, BOOL bcast);
-void become_local_master(struct subnet_record *d, struct work_record *work);
-void become_domain_master(struct subnet_record *d, struct work_record *work);
-void become_logon_server(struct subnet_record *d, struct work_record *work);
-void unbecome_local_master(struct subnet_record *d, struct work_record *work,
- int remove_type);
-void unbecome_domain_master(struct subnet_record *d, struct work_record *work,
- int remove_type);
-void unbecome_logon_server(struct subnet_record *d, struct work_record *work,
- int remove_type);
-void run_elections(time_t t);
-void process_election(struct packet_struct *p,char *buf);
-BOOL check_elections(void);
-
-/*The following definitions come from namelogon.c */
-
-void process_logon_packet(struct packet_struct *p,char *buf,int len);
-
-/*The following definitions come from namepacket.c */
-
-void debug_browse_data(char *outbuf, int len);
-void initiate_netbios_packet(uint16 *id,
- int fd,int quest_type,char *name,int name_type,
- int nb_flags,BOOL bcast,BOOL recurse,
- struct in_addr to_ip);
-void reply_netbios_packet(struct packet_struct *p1,int trn_id,
- int rcode, int rcv_code, int opcode,
- BOOL recursion_available,
- BOOL recursion_desired,
- struct nmb_name *rr_name,int rr_type,int rr_class,int ttl,
- char *data,int len);
-void queue_packet(struct packet_struct *packet);
-void run_packet_queue();
-void listen_for_packets(BOOL run_election);
-BOOL send_mailslot_reply(BOOL unique, char *mailslot,int fd,char *buf,int len,char *srcname,
- char *dstname,int src_type,int dest_type,
- struct in_addr dest_ip,struct in_addr src_ip);
-
-/*The following definitions come from namequery.c */
-
-BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
- struct in_addr to_ip,char *master,char *rname,
- void (*fn)());
-BOOL name_query(int fd,char *name,int name_type,
- BOOL bcast,BOOL recurse,
- struct in_addr to_ip, struct in_addr *ip,void (*fn)());
-
-/*The following definitions come from nameresp.c */
-
-void expire_netbios_response_entries(time_t t);
-struct response_record *queue_netbios_pkt_wins(
- int fd,int quest_type,enum state_type state,
- char *name,int name_type,int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- struct in_addr send_ip, struct in_addr reply_to_ip);
-struct response_record *queue_netbios_packet(struct subnet_record *d,
- int fd,int quest_type,enum state_type state,char *name,
- int name_type,int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- BOOL bcast,BOOL recurse,
- struct in_addr send_ip, struct in_addr reply_to_ip);
-
-/*The following definitions come from nameserv.c */
-
-void remove_name_entry(struct subnet_record *d, char *name,int type);
-void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags);
-void add_domain_logon_names(void);
-void add_domain_master_bcast(void);
-void add_domain_master_wins(void);
-void add_domain_names(time_t t);
-void add_my_names(void);
-void remove_my_names();
-void refresh_my_names(time_t t);
-void query_refresh_names(time_t t);
-
-/*The following definitions come from nameservreply.c */
-
-void add_name_respond(struct subnet_record *d, int fd, struct in_addr from_ip,
- uint16 response_id,
- struct nmb_name *name,
- int nb_flags, int ttl, struct in_addr register_ip,
- BOOL new_owner, struct in_addr reply_to_ip);
-void reply_name_release(struct packet_struct *p);
-void reply_name_reg(struct packet_struct *p);
-void reply_name_status(struct packet_struct *p);
-void reply_name_query(struct packet_struct *p);
-
-/*The following definitions come from nameservresp.c */
-
-void debug_state_type(int state);
-void response_netbios_packet(struct packet_struct *p);
-
-/*The following definitions come from namework.c */
-
-void reset_server(char *name, int state, struct in_addr ip);
-void tell_become_backup(void);
-BOOL same_context(struct dgram_packet *dgram);
-void process_browse_packet(struct packet_struct *p,char *buf,int len);
-
-/*The following definitions come from nmbd.c */
-
-BOOL reload_services(BOOL test);
-
-/*The following definitions come from nmblib.c */
-
-char *lookup_opcode_name( int opcode );
-void debug_nmb_packet(struct packet_struct *p);
-char *namestr(struct nmb_name *n);
-void free_nmb_packet(struct nmb_packet *nmb);
-void free_packet(struct packet_struct *packet);
-struct packet_struct *read_packet(int fd,enum packet_type packet_type);
-void make_nmb_name(struct nmb_name *n,char *name,int type,char *this_scope);
-BOOL send_packet(struct packet_struct *p);
-struct packet_struct *receive_packet(int fd,enum packet_type type,int t);
-
-/*The following definitions come from nmblookup.c */
-
-int main(int argc,char *argv[]);
-
-/*The following definitions come from nmbsync.c */
-
-char *getsmbpass(char *pass);
-void sync_browse_lists(struct subnet_record *d, struct work_record *work,
- char *name, int nm_type, struct in_addr ip, BOOL local);
-
-/*The following definitions come from params.c */
-
-BOOL pm_process( char *FileName,
- BOOL (*sfunc)(char *),
- BOOL (*pfunc)(char *, char *) );
-
-/*The following definitions come from password.c */
-
-void generate_next_challenge(char *challenge);
-BOOL set_challenge(char *challenge);
-BOOL last_challenge(char *challenge);
-user_struct *get_valid_user_struct(uint16 vuid);
-void invalidate_vuid(uint16 vuid);
-char *validated_username(uint16 vuid);
-uint16 register_vuid(int uid,int gid, char *name,BOOL guest);
-void add_session_user(char *user);
-void dfs_unlogin(void);
-BOOL password_check(char *password);
-BOOL smb_password_check(char *password, unsigned char *part_passwd, unsigned char *c8);
-BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd);
-BOOL user_ok(char *user,int snum);
-BOOL authorise_login(int snum,char *user,char *password, int pwlen,
- BOOL *guest,BOOL *force,uint16 vuid);
-BOOL check_hosts_equiv(char *user);
-BOOL server_cryptkey(char *buf);
-BOOL server_validate(char *buf);
-
-/*The following definitions come from pcap.c */
-
-BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname);
-void pcap_printer_fn(void (*fn)());
-
-/*The following definitions come from pipes.c */
-
-int reply_open_pipe_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-BOOL api_LsarpcSNPHS(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len);
-BOOL api_LsarpcTNP(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len);
-char *dom_sid_to_string(DOM_SID *sid);
-BOOL api_ntlsarpcTNP(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len);
-
-/*The following definitions come from predict.c */
-
-int read_predict(int fd,int offset,char *buf,char **ptr,int num);
-void do_read_prediction();
-void invalidate_read_prediction(int fd);
-
-/*The following definitions come from printing.c */
-
-void lpq_reset(int snum);
-void print_file(int fnum);
-int get_printqueue(int snum,int cnum,print_queue_struct **queue,
- print_status_struct *status);
-void del_printqueue(int cnum,int snum,int jobid);
-void status_printjob(int cnum,int snum,int jobid,int status);
-int printjob_encode(int snum, int job);
-void printjob_decode(int jobid, int *snum, int *job);
-
-/*The following definitions come from quotas.c */
-
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize);
-
-/*The following definitions come from replace.c */
-
-char *Strstr(char *s, char *p);
-time_t Mktime(struct tm *t);
-int InNetGr(char *group,char *host,char *user,char *dom);
-void *malloc_wrapped(int size,char *file,int line);
-void *realloc_wrapped(void *ptr,int size,char *file,int line);
-void free_wrapped(void *ptr,char *file,int line);
-void *memcpy_wrapped(void *d,void *s,int l,char *fname,int line);
-
-/*The following definitions come from reply.c */
-
-int reply_special(char *inbuf,char *outbuf);
-int reply_tcon(char *inbuf,char *outbuf);
-int reply_tcon_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_unknown(char *inbuf,char *outbuf);
-int reply_ioctl(char *inbuf,char *outbuf);
-int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_chkpth(char *inbuf,char *outbuf);
-int reply_getatr(char *inbuf,char *outbuf);
-int reply_setatr(char *inbuf,char *outbuf);
-int reply_dskattr(char *inbuf,char *outbuf);
-int reply_search(char *inbuf,char *outbuf);
-int reply_fclose(char *inbuf,char *outbuf);
-int reply_open(char *inbuf,char *outbuf);
-int reply_open_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_ulogoffX(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_mknew(char *inbuf,char *outbuf);
-int reply_ctemp(char *inbuf,char *outbuf);
-int reply_unlink(char *inbuf,char *outbuf);
-int reply_readbraw(char *inbuf, char *outbuf);
-int reply_lockread(char *inbuf,char *outbuf);
-int reply_read(char *inbuf,char *outbuf);
-int reply_read_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebraw(char *inbuf,char *outbuf);
-int reply_writeunlock(char *inbuf,char *outbuf);
-int reply_write(char *inbuf,char *outbuf,int dum1,int dum2);
-int reply_write_and_X(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_lseek(char *inbuf,char *outbuf);
-int reply_flush(char *inbuf,char *outbuf);
-int reply_exit(char *inbuf,char *outbuf);
-int reply_close(char *inbuf,char *outbuf);
-int reply_writeclose(char *inbuf,char *outbuf);
-int reply_lock(char *inbuf,char *outbuf);
-int reply_unlock(char *inbuf,char *outbuf);
-int reply_tdis(char *inbuf,char *outbuf);
-int reply_echo(char *inbuf,char *outbuf);
-int reply_printopen(char *inbuf,char *outbuf);
-int reply_printclose(char *inbuf,char *outbuf);
-int reply_printqueue(char *inbuf,char *outbuf);
-int reply_printwrite(char *inbuf,char *outbuf);
-int reply_mkdir(char *inbuf,char *outbuf);
-int reply_rmdir(char *inbuf,char *outbuf);
-int reply_mv(char *inbuf,char *outbuf);
-int reply_copy(char *inbuf,char *outbuf);
-int reply_setdir(char *inbuf,char *outbuf);
-int reply_lockingX(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_readbmpx(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebmpx(char *inbuf,char *outbuf);
-int reply_writebs(char *inbuf,char *outbuf);
-int reply_setattrE(char *inbuf,char *outbuf);
-int reply_getattrE(char *inbuf,char *outbuf);
-
-/*The following definitions come from server.c */
-
-void *dflt_sig(void);
-void killkids(void);
-mode_t unix_mode(int cnum,int dosmode);
-int dos_mode(int cnum,char *path,struct stat *sbuf);
-int dos_chmod(int cnum,char *fname,int dosmode,struct stat *st);
-BOOL unix_convert(char *name,int cnum,pstring saved_last_component, BOOL *bad_path);
-int disk_free(char *path,int *bsize,int *dfree,int *dsize);
-int sys_disk_free(char *path,int *bsize,int *dfree,int *dsize);
-BOOL check_name(char *name,int cnum);
-void sync_file(int fnum);
-void close_file(int fnum);
-BOOL check_file_sharing(int cnum,char *fname);
-int check_share_mode( min_share_mode_entry *share, int deny_mode, char *fname,
- BOOL fcbopen, int *flags);
-void open_file_shared(int fnum,int cnum,char *fname,int share_mode,int ofun,
- int mode,int oplock_request, int *Access,int *action);
-int seek_file(int fnum,uint32 pos);
-int read_file(int fnum,char *data,uint32 pos,int n);
-int write_file(int fnum,char *data,int n);
-BOOL become_service(int cnum,BOOL do_chdir);
-int find_service(char *service);
-int cached_error_packet(char *inbuf,char *outbuf,int fnum,int line);
-int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line);
-int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int line);
-BOOL oplock_break(uint32 dev, uint32 inode, struct timeval *tval);
-BOOL request_oplock_break(min_share_mode_entry *share_entry,
- uint32 dev, uint32 inode);
-BOOL snum_used(int snum);
-BOOL reload_services(BOOL test);
-int setup_groups(char *user, int uid, int gid, int *p_ngroups,
- int **p_igroups, gid_t **p_groups);
-int make_connection(char *service,char *user,char *password, int pwlen, char *dev,uint16 vuid);
-int find_free_file(void );
-int reply_corep(char *outbuf);
-int reply_coreplus(char *outbuf);
-int reply_lanman1(char *outbuf);
-int reply_lanman2(char *outbuf);
-int reply_nt1(char *outbuf);
-void close_cnum(int cnum, uint16 vuid);
-BOOL yield_connection(int cnum,char *name,int max_connections);
-BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear);
-void exit_server(char *reason);
-void standard_sub(int cnum,char *str);
-char *smb_fn_name(int type);
-int chain_reply(char *inbuf,char *outbuf,int size,int bufsize);
-int construct_reply(char *inbuf,char *outbuf,int size,int bufsize);
-
-/*The following definitions come from shmem.c */
-
-BOOL smb_shm_create_hash_table( unsigned int size );
-BOOL smb_shm_open( char *file_name, int size);
-BOOL smb_shm_close( void );
-smb_shm_offset_t smb_shm_alloc(int size);
-BOOL smb_shm_free(smb_shm_offset_t offset);
-smb_shm_offset_t smb_shm_get_userdef_off(void);
-BOOL smb_shm_set_userdef_off(smb_shm_offset_t userdef_off);
-void *smb_shm_offset2addr(smb_shm_offset_t offset);
-smb_shm_offset_t smb_shm_addr2offset(void *addr);
-BOOL smb_shm_lock_hash_entry( unsigned int entry);
-BOOL smb_shm_unlock_hash_entry( unsigned int entry );
-BOOL smb_shm_get_usage(int *bytes_free,
- int *bytes_used,
- int *bytes_overhead);
-
-/*The following definitions come from smbdes.c */
-
-void E_P16(unsigned char *p14,unsigned char *p16);
-void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24);
-
-/*The following definitions come from smbencrypt.c */
-
-void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24);
-void E_md4hash(uchar *passwd, uchar *p16);
-void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24);
-
-/*The following definitions come from smbparse.c */
-
-char* smb_io_utime(BOOL io, UTIME *t, char *q, char *base, int align);
-char* smb_io_time(BOOL io, NTTIME *nttime, char *q, char *base, int align);
-char* smb_io_dom_sid(BOOL io, DOM_SID *sid, char *q, char *base, int align);
-char* smb_io_unihdr(BOOL io, UNIHDR *hdr, char *q, char *base, int align);
-char* smb_io_unihdr2(BOOL io, UNIHDR2 *hdr2, char *q, char *base, int align);
-char* smb_io_unistr(BOOL io, UNISTR *uni, char *q, char *base, int align);
-char* smb_io_unistr2(BOOL io, UNISTR2 *uni2, char *q, char *base, int align);
-char* smb_io_dom_sid2(BOOL io, DOM_SID2 *sid2, char *q, char *base, int align);
-char* smb_io_dom_rid2(BOOL io, DOM_RID2 *rid2, char *q, char *base, int align);
-char* smb_io_log_info(BOOL io, DOM_LOG_INFO *log, char *q, char *base, int align);
-char* smb_io_chal(BOOL io, DOM_CHAL *chal, char *q, char *base, int align);
-char* smb_io_cred(BOOL io, DOM_CRED *cred, char *q, char *base, int align);
-char* smb_io_clnt_info(BOOL io, DOM_CLNT_INFO *clnt, char *q, char *base, int align);
-char* smb_io_logon_id(BOOL io, DOM_LOGON_ID *log, char *q, char *base, int align);
-char* smb_io_arc4_owf(BOOL io, ARC4_OWF *hash, char *q, char *base, int align);
-char* smb_io_id_info1(BOOL io, DOM_ID_INFO_1 *id, char *q, char *base, int align);
-char* smb_io_sam_info(BOOL io, DOM_SAM_INFO *sam, char *q, char *base, int align);
-char* smb_io_gid(BOOL io, DOM_GID *gid, char *q, char *base, int align);
-char* smb_io_rpc_hdr(BOOL io, RPC_HDR *rpc, char *q, char *base, int align);
-char* smb_io_pol_hnd(BOOL io, LSA_POL_HND *pol, char *q, char *base, int align);
-char* smb_io_dom_query_3(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align);
-char* smb_io_dom_query_5(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align);
-char* smb_io_dom_query(BOOL io, DOM_QUERY *d_q, char *q, char *base, int align);
-char* smb_io_dom_r_ref(BOOL io, DOM_R_REF *r_r, char *q, char *base, int align);
-char* smb_io_dom_name(BOOL io, DOM_NAME *name, char *q, char *base, int align);
-char* smb_io_neg_flags(BOOL io, NEG_FLAGS *neg, char *q, char *base, int align);
-
-/*The following definitions come from smbpass.c */
-
-int pw_file_lock(char *name, int type, int secs);
-int pw_file_unlock(int fd);
-struct smb_passwd *get_smbpwnam(char *name);
-
-/*The following definitions come from smbpasswd.c */
-
-
-/*The following definitions come from smbrun.c */
-
-
-/*The following definitions come from status.c */
-
-void Ucrit_addUsername(pstring username);
-unsigned int Ucrit_checkUsername(pstring username);
-void Ucrit_addPid(int pid);
-unsigned int Ucrit_checkPid(int pid);
-
-/*The following definitions come from system.c */
-
-int sys_select(fd_set *fds,struct timeval *tval);
-int sys_select(fd_set *fds,struct timeval *tval);
-int sys_unlink(char *fname);
-int sys_open(char *fname,int flags,int mode);
-DIR *sys_opendir(char *dname);
-int sys_stat(char *fname,struct stat *sbuf);
-int sys_waitpid(pid_t pid,int *status,int options);
-int sys_lstat(char *fname,struct stat *sbuf);
-int sys_mkdir(char *dname,int mode);
-int sys_rmdir(char *dname);
-int sys_chdir(char *dname);
-int sys_utime(char *fname,struct utimbuf *times);
-int sys_rename(char *from, char *to);
-int sys_chmod(char *fname,int mode);
-char *sys_getwd(char *s);
-int sys_chown(char *fname,int uid,int gid);
-int sys_chroot(char *dname);
-struct hostent *sys_gethostbyname(char *name);
-
-/*The following definitions come from testparm.c */
-
-
-/*The following definitions come from testprns.c */
-
-int main(int argc, char *argv[]);
-
-/*The following definitions come from time.c */
-
-void GetTimeOfDay(struct timeval *tval);
-void TimeInit(void);
-int TimeDiff(time_t t);
-struct tm *LocalTime(time_t *t);
-time_t interpret_long_date(char *p);
-void put_long_date(char *p,time_t t);
-void put_dos_date(char *buf,int offset,time_t unixdate);
-void put_dos_date2(char *buf,int offset,time_t unixdate);
-void put_dos_date3(char *buf,int offset,time_t unixdate);
-time_t make_unix_date(void *date_ptr);
-time_t make_unix_date2(void *date_ptr);
-time_t make_unix_date3(void *date_ptr);
-BOOL set_filetime(char *fname,time_t mtime);
-char *timestring(void );
-
-/*The following definitions come from trans2.c */
-
-int reply_findclose(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_findnclose(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_transs2(char *inbuf,char *outbuf,int length,int bufsize);
-int reply_trans2(char *inbuf,char *outbuf,int length,int bufsize);
-
-/*The following definitions come from ufc.c */
-
-char *ufc_crypt(char *key,char *salt);
-
-/*The following definitions come from uid.c */
-
-void init_uid(void);
-BOOL become_guest(void);
-BOOL become_user(int cnum, uint16 vuid);
-BOOL unbecome_user(void );
-int smbrun(char *cmd,char *outfile,BOOL shared);
-
-/*The following definitions come from username.c */
-
-char *get_home_dir(char *user);
-void map_username(char *user);
-struct passwd *Get_Pwnam(char *user,BOOL allow_change);
-BOOL user_in_list(char *user,char *list);
-
-/*The following definitions come from util.c */
-
-void setup_logging(char *pname,BOOL interactive);
-void reopen_logs(void);
-char *tmpdir(void);
-BOOL is_a_socket(int fd);
-BOOL next_token(char **ptr,char *buff,char *sep);
-char **toktocliplist(int *ctok, char *sep);
-void *MemMove(void *dest,void *src,int size);
-void array_promote(char *array,int elsize,int element);
-void set_socket_options(int fd, char *options);
-void close_sockets(void );
-BOOL in_group(gid_t group, int current_gid, int ngroups, int *groups);
-char *StrCpy(char *dest,char *src);
-char *StrnCpy(char *dest,char *src,int n);
-void putip(void *dest,void *src);
-int name_mangle( char *In, char *Out, char name_type );
-BOOL file_exist(char *fname,struct stat *sbuf);
-time_t file_modtime(char *fname);
-BOOL directory_exist(char *dname,struct stat *st);
-uint32 file_size(char *file_name);
-char *attrib_string(int mode);
-int StrCaseCmp(char *s, char *t);
-int StrnCaseCmp(char *s, char *t, int n);
-BOOL strequal(char *s1, char *s2);
-BOOL strnequal(char *s1,char *s2,int n);
-BOOL strcsequal(char *s1,char *s2);
-void strlower(char *s);
-void strupper(char *s);
-void strnorm(char *s);
-BOOL strisnormal(char *s);
-void string_replace(char *s,char oldc,char newc);
-void unix_format(char *fname);
-void dos_format(char *fname);
-void show_msg(char *buf);
-int smb_len(char *buf);
-void _smb_setlen(char *buf,int len);
-void smb_setlen(char *buf,int len);
-int set_message(char *buf,int num_words,int num_bytes,BOOL zero);
-int smb_numwords(char *buf);
-int smb_buflen(char *buf);
-int smb_buf_ofs(char *buf);
-char *smb_buf(char *buf);
-int smb_offset(char *p,char *buf);
-char *skip_string(char *buf,int n);
-BOOL trim_string(char *s,char *front,char *back);
-void dos_clean_name(char *s);
-void unix_clean_name(char *s);
-int ChDir(char *path);
-char *GetWd(char *str);
-BOOL reduce_name(char *s,char *dir,BOOL widelinks);
-void expand_mask(char *Mask,BOOL doext);
-BOOL strhasupper(char *s);
-BOOL strhaslower(char *s);
-int count_chars(char *s,char c);
-void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date);
-void close_low_fds(void);
-int set_blocking(int fd, BOOL set);
-int write_socket(int fd,char *buf,int len);
-int read_udp_socket(int fd,char *buf,int len);
-int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out);
-int read_max_udp(int fd,char *buffer,int bufsize,int maxtime);
-int TvalDiff(struct timeval *tvalold,struct timeval *tvalnew);
-BOOL send_keepalive(int client);
-int read_data(int fd,char *buffer,int N);
-int write_data(int fd,char *buffer,int N);
-int transfer_file(int infd,int outfd,int n,char *header,int headlen,int align);
-int read_smb_length(int fd,char *inbuf,int timeout);
-BOOL receive_smb(int fd,char *buffer, int timeout);
-BOOL receive_local_message(int fd, char *buffer, int buffer_len, int timeout);
-BOOL push_local_message(char *buf, int msg_len);
-BOOL receive_message_or_smb(int smbfd, int oplock_fd,
- char *buffer, int buffer_len,
- int timeout, BOOL *got_smb);
-BOOL send_smb(int fd,char *buffer);
-char *name_ptr(char *buf,int ofs);
-int name_extract(char *buf,int ofs,char *name);
-int name_len( char *s );
-BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type);
-void msleep(int t);
-BOOL in_list(char *s,char *list,BOOL casesensitive);
-BOOL string_init(char **dest,char *src);
-void string_free(char **s);
-BOOL string_set(char **dest,char *src);
-BOOL string_sub(char *s,char *pattern,char *insert);
-BOOL do_match(char *str, char *regexp, int case_sig);
-BOOL mask_match(char *str, char *regexp, int case_sig,BOOL trans2);
-void become_daemon(void);
-BOOL yesno(char *p);
-char *fgets_slash(char *s2,int maxlen,FILE *f);
-int set_filelen(int fd, long len);
-int byte_checksum(char *buf,int len);
-char *dirname_dos(char *path,char *buf);
-void *Realloc(void *p,int size);
-void Abort(void );
-BOOL get_myname(char *my_name,struct in_addr *ip);
-BOOL ip_equal(struct in_addr ip1,struct in_addr ip2);
-int open_socket_in(int type, int port, int dlevel,uint32 socket_addr);
-int open_socket_out(int type, struct in_addr *addr, int port ,int timeout);
-int interpret_protocol(char *str,int def);
-int interpret_security(char *str,int def);
-uint32 interpret_addr(char *str);
-struct in_addr *interpret_addr2(char *str);
-BOOL zero_ip(struct in_addr ip);
-void reset_globals_after_fork();
-char *client_name(void);
-char *client_addr(void);
-void standard_sub_basic(char *str);
-BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask);
-int PutUniCode(char *dst,char *src);
-struct hostent *Get_Hostbyname(char *name);
-BOOL process_exists(int pid);
-char *uidtoname(int uid);
-char *gidtoname(int gid);
-void BlockSignals(BOOL block,int signum);
-void ajt_panic(void);
-char *readdirname(void *p);
-BOOL is_in_path(char *name, name_compare_entry *namelist);
-void set_namearray(name_compare_entry **ppname_array, char *namelist);
-void free_namearray(name_compare_entry *name_array);
-BOOL fcntl_lock(int fd,int op,uint32 offset,uint32 count,int type);
-int file_lock(char *name,int timeout);
-void file_unlock(int fd);
-BOOL is_myname(char *s);
-void set_remote_arch(enum remote_arch_types type);
-enum remote_arch_types get_remote_arch();
-char *skip_unicode_string(char *buf,int n);
-char *unistr2(uint16 *buf);
-char *unistr(char *buf);
-int unistrncpy(char *dst, char *src, int len);
-int unistrcpy(char *dst, char *src);
-void fstrcpy(char *dest, char *src);
-void pstrcpy(char *dest, char *src);
-char *align4(char *q, char *base);
-char *align2(char *q, char *base);
-char *align_offset(char *q, char *base, int align_offset_len);
diff --git a/source/include/smb.h b/source/include/smb.h
deleted file mode 100644
index 54ce9e88e88..00000000000
--- a/source/include/smb.h
+++ /dev/null
@@ -1,1694 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB parameters and setup
- Copyright (C) Andrew Tridgell 1992-1997
- Copyright (C) John H Terpstra 1996-1997
- Copyright (C) Luke Kenneth Casson Leighton 1996-1997
- Copyright (C) Paul Ashton 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-#ifndef _SMB_H
-#define _SMB_H
-
-#ifndef MAX_CONNECTIONS
-#define MAX_CONNECTIONS 127
-#endif
-
-#ifndef MAX_OPEN_FILES
-#define MAX_OPEN_FILES 50
-#endif
-
-#ifndef GUEST_ACCOUNT
-#define GUEST_ACCOUNT "nobody"
-#endif
-
-#define BUFFER_SIZE (0xFFFF)
-#define SAFETY_MARGIN 1024
-
-/* Default size of shared memory used for share mode locking */
-#ifndef SHMEM_SIZE
-#define SHMEM_SIZE 102400
-#endif
-
-/* Default number of hash buckets used in shared memory share mode */
-#ifndef SHMEM_HASH_SIZE
-#define SHMEM_HASH_SIZE 113
-#endif
-
-#define NMB_PORT 137
-#define DGRAM_PORT 138
-#define SMB_PORT 139
-
-#define False (0)
-#define True (1)
-#define BOOLSTR(b) ((b) ? "Yes" : "No")
-#define BITSETB(ptr,bit) ((((char *)ptr)[0] & (1<<(bit)))!=0)
-#define BITSETW(ptr,bit) ((SVAL(ptr,0) & (1<<(bit)))!=0)
-#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((char *)(p1)) - (char *)(p2)))
-
-typedef int BOOL;
-
-/* offset in shared memory */
-typedef int smb_shm_offset_t;
-#define NULL_OFFSET (smb_shm_offset_t)(0)
-
-
-/*
- Samba needs type definitions for int16, int32, uint16 and uint32.
-
- Normally these are signed and unsigned 16 and 32 bit integers, but
- they actually only need to be at least 16 and 32 bits
- respectively. Thus if your word size is 8 bytes just defining them
- as signed and unsigned int will work.
-*/
-
-/* afs/stds.h defines int16 and int32 */
-#ifndef AFS_AUTH
-typedef short int16;
-typedef int int32;
-#endif
-
-#ifndef uint8
-typedef unsigned char uint8;
-#endif
-
-#ifndef uint16
-typedef unsigned short uint16;
-#endif
-
-#ifndef uint32
-typedef unsigned int uint32;
-#endif
-
-#ifndef uchar
-#define uchar unsigned char
-#endif
-#ifndef int16
-#define int16 short
-#endif
-#ifndef uint16
-#define uint16 unsigned short
-#endif
-#ifndef uint32
-#define uint32 unsigned int
-#endif
-
-#define SIZEOFWORD 2
-
-#ifndef DEF_CREATE_MASK
-#define DEF_CREATE_MASK (0755)
-#endif
-
-/* how long to wait for secondary SMB packets (milli-seconds) */
-#define SMB_SECONDARY_WAIT (60*1000)
-
-/* debugging code */
-#ifndef SYSLOG
-#define DEBUG(level,body) ((DEBUGLEVEL>=(level))?(Debug1 body):0)
-#else
-extern int syslog_level;
-
-#define DEBUG(level,body) ((DEBUGLEVEL>=(level))? (syslog_level = (level), Debug1 body):0)
-#endif
-
-/* this defines the error codes that receive_smb can put in smb_read_error */
-#define READ_TIMEOUT 1
-#define READ_EOF 2
-#define READ_ERROR 3
-
-
-#define DIR_STRUCT_SIZE 43
-
-/* these define all the command types recognised by the server - there
-are lots of gaps so probably there are some rare commands that are not
-implemented */
-
-#define pSETDIR '\377'
-
-/* these define the attribute byte as seen by DOS */
-#define aRONLY (1L<<0)
-#define aHIDDEN (1L<<1)
-#define aSYSTEM (1L<<2)
-#define aVOLID (1L<<3)
-#define aDIR (1L<<4)
-#define aARCH (1L<<5)
-
-/* deny modes */
-#define DENY_DOS 0
-#define DENY_ALL 1
-#define DENY_WRITE 2
-#define DENY_READ 3
-#define DENY_NONE 4
-#define DENY_FCB 7
-
-/* share types */
-#define STYPE_DISKTREE 0 /* Disk drive */
-#define STYPE_PRINTQ 1 /* Spooler queue */
-#define STYPE_DEVICE 2 /* Serial device */
-#define STYPE_IPC 3 /* Interprocess communication (IPC) */
-
-/* SMB X/Open error codes for the ERRdos error class */
-#define ERRbadfunc 1 /* Invalid function (or system call) */
-#define ERRbadfile 2 /* File not found (pathname error) */
-#define ERRbadpath 3 /* Directory not found */
-#define ERRnofids 4 /* Too many open files */
-#define ERRnoaccess 5 /* Access denied */
-#define ERRbadfid 6 /* Invalid fid */
-#define ERRnomem 8 /* Out of memory */
-#define ERRbadmem 9 /* Invalid memory block address */
-#define ERRbadenv 10 /* Invalid environment */
-#define ERRbadaccess 12 /* Invalid open mode */
-#define ERRbaddata 13 /* Invalid data (only from ioctl call) */
-#define ERRres 14 /* reserved */
-#define ERRbaddrive 15 /* Invalid drive */
-#define ERRremcd 16 /* Attempt to delete current directory */
-#define ERRdiffdevice 17 /* rename/move across different filesystems */
-#define ERRnofiles 18 /* no more files found in file search */
-#define ERRbadshare 32 /* Share mode on file conflict with open mode */
-#define ERRlock 33 /* Lock request conflicts with existing lock */
-#define ERRfilexists 80 /* File in operation already exists */
-#define ERRcannotopen 110 /* Cannot open the file specified */
-#define ERRunknownlevel 124
-#define ERRbadpipe 230 /* Named pipe invalid */
-#define ERRpipebusy 231 /* All instances of pipe are busy */
-#define ERRpipeclosing 232 /* named pipe close in progress */
-#define ERRnotconnected 233 /* No process on other end of named pipe */
-#define ERRmoredata 234 /* More data to be returned */
-#define ERRbaddirectory 267 /* Invalid directory name in a path. */
-#define ERROR_EAS_DIDNT_FIT 275 /* Extended attributes didn't fit */
-#define ERROR_EAS_NOT_SUPPORTED 282 /* Extended attributes not supported */
-#define ERRunknownipc 2142
-
-
-/* here's a special one from observing NT */
-#define ERRnoipc 66 /* don't support ipc */
-
-/* Error codes for the ERRSRV class */
-
-#define ERRerror 1 /* Non specific error code */
-#define ERRbadpw 2 /* Bad password */
-#define ERRbadtype 3 /* reserved */
-#define ERRaccess 4 /* No permissions to do the requested operation */
-#define ERRinvnid 5 /* tid invalid */
-#define ERRinvnetname 6 /* Invalid servername */
-#define ERRinvdevice 7 /* Invalid device */
-#define ERRqfull 49 /* Print queue full */
-#define ERRqtoobig 50 /* Queued item too big */
-#define ERRinvpfid 52 /* Invalid print file in smb_fid */
-#define ERRsmbcmd 64 /* Unrecognised command */
-#define ERRsrverror 65 /* smb server internal error */
-#define ERRfilespecs 67 /* fid and pathname invalid combination */
-#define ERRbadlink 68 /* reserved */
-#define ERRbadpermits 69 /* Access specified for a file is not valid */
-#define ERRbadpid 70 /* reserved */
-#define ERRsetattrmode 71 /* attribute mode invalid */
-#define ERRpaused 81 /* Message server paused */
-#define ERRmsgoff 82 /* Not receiving messages */
-#define ERRnoroom 83 /* No room for message */
-#define ERRrmuns 87 /* too many remote usernames */
-#define ERRtimeout 88 /* operation timed out */
-#define ERRnoresource 89 /* No resources currently available for request. */
-#define ERRtoomanyuids 90 /* too many userids */
-#define ERRbaduid 91 /* bad userid */
-#define ERRuseMPX 250 /* temporarily unable to use raw mode, use MPX mode */
-#define ERRuseSTD 251 /* temporarily unable to use raw mode, use standard mode */
-#define ERRcontMPX 252 /* resume MPX mode */
-#define ERRbadPW /* reserved */
-#define ERRnosupport 0xFFFF
-#define ERRunknownsmb 22 /* from NT 3.5 response */
-
-
-/* Error codes for the ERRHRD class */
-
-#define ERRnowrite 19 /* read only media */
-#define ERRbadunit 20 /* Unknown device */
-#define ERRnotready 21 /* Drive not ready */
-#define ERRbadcmd 22 /* Unknown command */
-#define ERRdata 23 /* Data (CRC) error */
-#define ERRbadreq 24 /* Bad request structure length */
-#define ERRseek 25
-#define ERRbadmedia 26
-#define ERRbadsector 27
-#define ERRnopaper 28
-#define ERRwrite 29 /* write fault */
-#define ERRread 30 /* read fault */
-#define ERRgeneral 31 /* General hardware failure */
-#define ERRwrongdisk 34
-#define ERRFCBunavail 35
-#define ERRsharebufexc 36 /* share buffer exceeded */
-#define ERRdiskfull 39
-
-
-typedef char pstring[1024];
-typedef char fstring[128];
-typedef fstring string;
-
-
-/* NETLOGON opcodes and data structures */
-
-#define NET_QUERYFORPDC 7 /* Query for PDC */
-#define NET_QUERYFORPDC_R 12 /* Response to Query for PDC */
-#define NET_SAMLOGON 18
-#define NET_SAMLOGON_R 19
-
-/* Allowable account control bits */
-#define ACB_DISABLED 1 /* 1 = User account disabled */
-#define ACB_HOMDIRREQ 2 /* 1 = Home directory required */
-#define ACB_PWNOTREQ 4 /* 1 = User password not required */
-#define ACB_TEMPDUP /* 1 = Temporary duplicate account */
-#define ACB_NORMAL /* 1 = Normal user account */
-#define ACB_MNS /* 1 = MNS logon user account */
-#define ACB_DOMTRUST /* 1 = Interdomain trust account */
-#define ACB_WSTRUST /* 1 = Workstation trust account */
-#define ACB_SVRTRUST /* 1 = Server trust account */
-#define ACB_PWNOEXP /* 1 = User password does not expire */
-#define ACB_AUTOLOCK /* 1 = Account auto locked */
-
-#define LSA_OPENPOLICY 0x2c
-#define LSA_QUERYINFOPOLICY 0x07
-#define LSA_ENUMTRUSTDOM 0x0d
-#define LSA_REQCHAL 0x04
-#define LSA_SVRPWSET 0x06
-#define LSA_SAMLOGON 0x02
-#define LSA_AUTH2 0x0f
-#define LSA_CLOSE 0x00
-
-/* unknown .... */
-#define LSA_OPENSECRET 0xFF
-#define LSA_LOOKUPSIDS 0xFE
-#define LSA_LOOKUPNAMES 0xFD
-#define LSA_SAMLOGOFF 0xFC
-
-
-/* 32 bit time (sec) since 01jan1970 - cifs6.txt, section 3.5, page 30 */
-typedef struct time_info
-{
- uint32 time;
-
-} UTIME;
-
-/* 64 bit time (100usec) since ????? - cifs6.txt, section 3.5, page 30 */
-typedef struct nttime_info
-{
- uint32 low;
- uint32 high;
-
-} NTTIME;
-
-
-#define MAXSUBAUTHS 10 /* max sub authorities in a SID */
-
-/* DOM_SID - security id */
-typedef struct sid_info
-{
- uint8 sid_no; /* SID revision number */
- uint8 num_auths; /* number of sub-authorities */
- uint8 id_auth[6]; /* Identifier Authority */
- uint16 sub_auths[MAXSUBAUTHS]; /* pointer to sub-authorities. */
-
-} DOM_SID;
-
-/* UNIHDR - unicode string header */
-typedef struct unihdr_info
-{
- uint16 uni_max_len;
- uint16 uni_str_len;
- uint32 undoc; /* usually has a value of 4 */
-
-} UNIHDR;
-
-/* UNIHDR2 - unicode string header and undocumented buffer */
-typedef struct unihdr2_info
-{
- UNIHDR unihdr;
- uint32 undoc_buffer; /* undocumented 32 bit buffer pointer */
-
-} UNIHDR2;
-
-/* clueless as to what maximum length should be */
-#define MAX_UNISTRLEN 1024
-
-/* UNISTR - unicode string size and buffer */
-typedef struct unistr_info
-{
- uint16 buffer[MAX_UNISTRLEN]; /* unicode characters. ***MUST*** be null-terminated */
-
-} UNISTR;
-
-/* UNISTR2 - unicode string size and buffer */
-typedef struct unistr2_info
-{
- uint32 uni_max_len;
- uint32 undoc;
- uint32 uni_str_len;
- uint16 buffer[MAX_UNISTRLEN]; /* unicode characters. **NOT** necessarily null-terminated */
-
-} UNISTR2;
-
-/* DOM_SID2 - domain SID structure - SIDs stored in unicode */
-typedef struct domsid2_info
-{
- uint32 type; /* value is 5 */
- uint32 undoc; /* value is 0 */
-
- UNIHDR2 hdr; /* XXXX conflict between hdr and str for length */
- UNISTR str; /* XXXX conflict between hdr and str for length */
-
-} DOM_SID2;
-
-/* DOM_RID2 - domain RID structure */
-typedef struct domrid2_info
-{
- uint32 type; /* value is 5 */
- uint32 undoc; /* value is 5 */
- uint32 rid;
- uint32 rid_idx; /* don't know what this is */
-
-} DOM_RID2;
-
-/* DOM_LOG_INFO - login info */
-typedef struct log_info
-{
- uint32 undoc_buffer; /* undocumented 32 bit buffer pointer */
- UNISTR2 uni_logon_srv; /* logon server name */
- UNISTR2 uni_acct_name; /* account name */
- uint16 sec_chan; /* secure channel type */
- UNISTR2 uni_comp_name; /* client machine name */
-
-} DOM_LOG_INFO;
-
-/* DOM_CHAL - challenge info */
-typedef struct chal_info
-{
- uint8 data[8]; /* credentials */
-
-} DOM_CHAL;
-
-/* DOM_CREDs - timestamped client or server credentials */
-typedef struct cred_info
-{
- DOM_CHAL challenge; /* credentials */
- UTIME timestamp; /* credential time-stamp */
-
-} DOM_CRED;
-
-/* DOM_CLNT_INFO - client info */
-typedef struct clnt_info
-{
- DOM_LOG_INFO login;
- DOM_CRED cred;
-
-} DOM_CLNT_INFO;
-
-/* DOM_LOGON_ID - logon id */
-typedef struct logon_info
-{
- uint32 low;
- uint32 high;
-
-} DOM_LOGON_ID;
-
-/* ARC4_OWF */
-typedef struct arc4_owf_info
-{
- uint8 data[16];
-
-} ARC4_OWF;
-
-
-/* DOM_ID_INFO_1 */
-typedef struct id_info_1
-{
- UNIHDR hdr_domain_name; /* domain name unicode header */
- uint32 param; /* param control */
- DOM_LOGON_ID logon_id; /* logon ID */
- UNIHDR hdr_user_name; /* user name unicode header */
- UNIHDR hdr_workgroup_name; /* workgroup name unicode header */
- ARC4_OWF arc4_lm_owf; /* arc4 LM OWF Password */
- ARC4_OWF arc4_nt_owf; /* arc4 NT OWF Password */
- UNISTR2 uni_domain_name; /* domain name unicode string */
- UNISTR2 uni_user_name; /* user name unicode string */
- UNISTR2 uni_workgroup_name; /* workgroup name unicode string */
-
-} DOM_ID_INFO_1;
-
-/* SAM_INFO - sam logon/off id structure */
-typedef struct sam_info
-{
- DOM_CLNT_INFO client;
- DOM_CRED rtn_cred; /* return credentials */
- uint16 logon_level;
- uint32 auth_level; /* undocumented */
-
- union
- {
- DOM_ID_INFO_1 id1; /* auth-level 1 */
-
- } auth;
-
-} DOM_SAM_INFO;
-
-/* DOM_GID - group id + user attributes */
-typedef struct gid_info
-{
- uint32 gid; /* group id */
- uint32 attr;
-
-} DOM_GID;
-
-/* RPC_HDR - ms rpc header */
-typedef struct rpc_hdr_info
-{
- uint8 major; /* 5 - RPC major version */
- uint8 minor; /* 0 - RPC minor version */
- uint8 pkt_type; /* 2 - RPC response packet */
- uint8 frag; /* 3 - first frag + last frag */
- uint32 pack_type; /* 0x0000 0010 - packed data representation */
- uint16 frag_len; /* fragment length - data size (bytes) inc header and tail. */
- uint16 auth_len; /* 0 - authentication length */
- uint32 call_id; /* call identifier. matches 12th uint32 of incoming RPC data. */
- uint32 alloc_hint; /* allocation hint - data size (bytes) minus header and tail. */
- uint16 context_id; /* 0 - presentation context identifier */
- uint8 cancel_count; /* 0 - cancel count */
- uint8 reserved; /* 0 - reserved */
-
-} RPC_HDR;
-
-/* DOM_QUERY - info class 3 and 5 LSA Query response */
-typedef struct dom_query_info
-{
- uint16 uni_dom_max_len; /* domain name string length * 2 */
- uint16 padding; /* 2 padding bytes? */
- uint16 uni_dom_str_len; /* domain name string length * 2 */
- uint32 buffer_dom_name; /* undocumented domain name string buffer pointer */
- uint32 buffer_dom_sid; /* undocumented domain SID string buffer pointer */
- UNISTR2 uni_domain_name; /* domain name (unicode string) */
- DOM_SID dom_sid; /* domain SID */
-
-} DOM_QUERY;
-
-/* level 5 is same as level 3. we hope. */
-typedef DOM_QUERY DOM_QUERY_3;
-typedef DOM_QUERY DOM_QUERY_5;
-
-#define POL_HND_SIZE 20
-
-/* LSA_POL_HND */
-typedef struct lsa_policy_info
-{
- uint8 data[POL_HND_SIZE]; /* policy handle */
-
-} LSA_POL_HND;
-
-
-/* LSA_R_OPEN_POL - response to LSA Open Policy */
-typedef struct lsa_r_open_pol_info
-{
- LSA_POL_HND pol; /* policy handle */
-
- uint32 status; /* return code */
-
-} LSA_R_OPEN_POL;
-
-/* LSA_Q_QUERY_INFO - LSA query info policy */
-typedef struct lsa_query_info
-{
- LSA_POL_HND pol; /* policy handle */
- uint16 info_class; /* info class */
-
-} LSA_Q_QUERY_INFO;
-
-/* LSA_R_QUERY_INFO - response to LSA query info policy */
-typedef struct lsa_r_query_info
-{
- uint32 undoc_buffer; /* undocumented buffer pointer */
- uint16 info_class; /* info class (same as info class in request) */
-
- union
- {
- DOM_QUERY_3 id3;
- DOM_QUERY_5 id5;
- } dom;
-
- uint32 status; /* return code */
-
-} LSA_R_QUERY_INFO;
-
-#define MAX_REF_DOMAINS 10
-
-/* DOM_R_REF */
-typedef struct dom_ref_info
-{
- uint32 undoc_buffer; /* undocumented buffer pointer. */
- uint32 num_ref_doms_1; /* num referenced domains? */
- uint32 buffer_dom_name; /* undocumented domain name buffer pointer. */
- uint32 max_entries; /* 32 - max number of entries */
- uint32 num_ref_doms_2; /* 4 - num referenced domains? */
-
- UNIHDR2 hdr_dom_name; /* domain name unicode string header */
- UNIHDR2 hdr_ref_dom[MAX_REF_DOMAINS]; /* referenced domain unicode string headers */
-
- UNISTR uni_dom_name; /* domain name unicode string */
- DOM_SID ref_dom[MAX_REF_DOMAINS]; /* referenced domain SIDs */
-
-} DOM_R_REF;
-
-#define MAX_LOOKUP_SIDS 10
-
-/* LSA_Q_LOOKUP_SIDS - LSA Lookup SIDs */
-typedef struct lsa_q_lookup_sids
-{
- LSA_POL_HND pol_hnd; /* policy handle */
- uint32 num_entries;
- uint32 buffer_dom_sid; /* undocumented domain SID buffer pointer */
- uint32 buffer_dom_name; /* undocumented domain name buffer pointer */
- uint32 buffer_lookup_sids[MAX_LOOKUP_SIDS]; /* undocumented domain SID pointers to be looked up. */
- DOM_SID dom_sids[MAX_LOOKUP_SIDS]; /* domain SIDs to be looked up. */
- uint8 undoc[16]; /* completely undocumented 16 bytes */
-
-} LSA_Q_LOOKUP_SIDS;
-
-/* LSA_R_LOOKUP_SIDS - response to LSA Lookup SIDs */
-typedef struct lsa_r_lookup_sids
-{
- DOM_R_REF dom_ref; /* domain reference info */
-
- uint32 num_entries;
- uint32 undoc_buffer; /* undocumented buffer pointer */
- uint32 num_entries2;
-
- DOM_SID2 dom_sid[MAX_LOOKUP_SIDS]; /* domain SIDs being looked up */
-
- uint32 num_entries3;
-
- uint32 status; /* return code */
-
-} LSA_R_LOOKUP_SIDS;
-
-/* DOM_NAME - XXXX not sure about this structure */
-typedef struct dom_name_info
-{
- uint32 uni_str_len;
- UNISTR str;
-
-} DOM_NAME;
-
-
-#define UNKNOWN_LEN 1
-
-/* LSA_Q_LOOKUP_RIDS - LSA Lookup RIDs */
-typedef struct lsa_q_lookup_rids
-{
-
- LSA_POL_HND pol_hnd; /* policy handle */
- uint32 num_entries;
- uint32 num_entries2;
- uint32 buffer_dom_sid; /* undocumented domain SID buffer pointer */
- uint32 buffer_dom_name; /* undocumented domain name buffer pointer */
- DOM_NAME lookup_name[MAX_LOOKUP_SIDS]; /* names to be looked up */
- uint8 undoc[UNKNOWN_LEN]; /* completely undocumented bytes of unknown length */
-
-} LSA_Q_LOOKUP_RIDS;
-
-/* LSA_R_LOOKUP_RIDS - response to LSA Lookup Names */
-typedef struct lsa_r_lookup_rids
-{
- DOM_R_REF dom_ref; /* domain reference info */
-
- uint32 num_entries;
- uint32 undoc_buffer; /* undocumented buffer pointer */
-
- uint32 num_entries2;
- DOM_RID2 dom_rid[MAX_LOOKUP_SIDS]; /* domain RIDs being looked up */
-
- uint32 num_entries3;
-
- uint32 status; /* return code */
-
-} LSA_R_LOOKUP_RIDS;
-
-
-
-/* NEG_FLAGS */
-typedef struct lsa_neg_flags_info
-{
- uint32 neg_flags; /* negotiated flags */
-
-} NEG_FLAGS;
-
-
-/* LSA_Q_REQ_CHAL */
-typedef struct lsa_q_req_chal_info
-{
- uint32 undoc_buffer; /* undocumented buffer pointer */
- UNISTR2 uni_logon_srv; /* logon server unicode string */
- UNISTR2 uni_logon_clnt; /* logon client unicode string */
- DOM_CHAL clnt_chal; /* client challenge */
-
-} LSA_Q_REQ_CHAL;
-
-
-/* LSA_R_REQ_CHAL */
-typedef struct lsa_r_req_chal_info
-{
- DOM_CHAL srv_chal; /* server challenge */
-
- uint32 status; /* return code */
-
-} LSA_R_REQ_CHAL;
-
-
-
-/* LSA_Q_AUTH_2 */
-typedef struct lsa_q_auth2_info
-{
- DOM_LOG_INFO clnt_id; /* client identification info */
- DOM_CHAL clnt_chal; /* client-calculated credentials */
-
- NEG_FLAGS clnt_flgs; /* usually 0x0000 01ff */
-
-} LSA_Q_AUTH_2;
-
-
-/* LSA_R_AUTH_2 */
-typedef struct lsa_r_auth2_info
-{
- DOM_CHAL srv_chal; /* server-calculated credentials */
- NEG_FLAGS srv_flgs; /* usually 0x0000 01ff */
-
- uint32 status; /* return code */
-
-} LSA_R_AUTH_2;
-
-
-/* LSA_Q_SRV_PWSET */
-typedef struct lsa_q_srv_pwset_info
-{
- DOM_CLNT_INFO clnt_id; /* client identification/authentication info */
- char pwd[16]; /* new password - undocumented. */
-
-} LSA_Q_SRV_PWSET;
-
-/* LSA_R_SRV_PWSET */
-typedef struct lsa_r_srv_pwset_info
-{
- DOM_CRED srv_cred; /* server-calculated credentials */
-
- uint32 status; /* return code */
-
-} LSA_R_SRV_PWSET;
-
-#define LSA_MAX_GROUPS 32
-#define LSA_MAX_SIDS 32
-
-/* LSA_USER_INFO */
-typedef struct lsa_q_user_info
-{
- uint32 undoc_buffer;
-
- NTTIME logon_time; /* logon time */
- NTTIME logoff_time; /* logoff time */
- NTTIME kickoff_time; /* kickoff time */
- NTTIME pass_last_set_time; /* password last set time */
- NTTIME pass_can_change_time; /* password can change time */
- NTTIME pass_must_change_time; /* password must change time */
-
- UNIHDR hdr_user_name; /* username unicode string header */
- UNIHDR hdr_full_name; /* user's full name unicode string header */
- UNIHDR hdr_logon_script; /* logon script unicode string header */
- UNIHDR hdr_profile_path; /* profile path unicode string header */
- UNIHDR hdr_home_dir; /* home directory unicode string header */
- UNIHDR hdr_dir_drive; /* home directory drive unicode string header */
-
- uint16 logon_count; /* logon count */
- uint16 bad_pw_count; /* bad password count */
-
- uint32 user_id; /* User ID */
- uint32 group_id; /* Group ID */
- uint32 num_groups; /* num groups */
- uint32 buffer_groups; /* undocumented buffer pointer to groups. */
- uint32 user_flgs; /* user flags */
-
- char sess_key[16]; /* unused user session key */
-
- UNIHDR hdr_logon_srv; /* logon server unicode string header */
- UNIHDR hdr_logon_dom; /* logon domain unicode string header */
-
- uint32 buffer_dom_id; /* undocumented logon domain id pointer */
- char padding[40]; /* unused padding bytes? */
-
- uint32 num_other_sids; /* 0 - num_sids */
- uint32 buffer_other_sids; /* NULL - undocumented pointer to SIDs. */
-
- UNISTR2 uni_user_name; /* username unicode string */
- UNISTR2 uni_full_name; /* user's full name unicode string */
- UNISTR2 uni_logon_script; /* logon script unicode string */
- UNISTR2 uni_profile_path; /* profile path unicode string */
- UNISTR2 uni_home_dir; /* home directory unicode string */
- UNISTR2 uni_dir_drive; /* home directory drive unicode string */
-
- uint32 num_groups2; /* num groups */
- DOM_GID gids[LSA_MAX_GROUPS]; /* group info */
-
- UNISTR2 uni_logon_srv; /* logon server unicode string */
- UNISTR2 uni_logon_dom; /* logon domain unicode string */
-
- DOM_SID dom_sid; /* domain SID */
- DOM_SID other_sids[LSA_MAX_SIDS]; /* undocumented - domain SIDs */
-
-} LSA_USER_INFO;
-
-
-/* LSA_Q_SAM_LOGON */
-typedef struct lsa_q_sam_logon_info
-{
- DOM_SAM_INFO sam_id;
-
-} LSA_Q_SAM_LOGON;
-
-/* LSA_R_SAM_LOGON */
-typedef struct lsa_r_sam_logon_info
-{
- uint32 buffer_creds; /* undocumented buffer pointer */
- DOM_CRED srv_creds; /* server credentials. server time stamp appears to be ignored. */
-
- uint32 buffer_user;
- LSA_USER_INFO *user;
-
- uint32 auth_resp; /* 1 - Authoritative response; 0 - Non-Auth? */
-
- uint32 status; /* return code */
-
-} LSA_R_SAM_LOGON;
-
-
-/* LSA_Q_SAM_LOGOFF */
-typedef struct lsa_q_sam_logoff_info
-{
- DOM_SAM_INFO sam_id;
-
-} LSA_Q_SAM_LOGOFF;
-
-/* LSA_R_SAM_LOGOFF */
-typedef struct lsa_r_sam_logoff_info
-{
- uint32 buffer_creds; /* undocumented buffer pointer */
- DOM_CRED srv_creds; /* server credentials. server time stamp appears to be ignored. */
-
- uint32 status; /* return code */
-
-} LSA_R_SAM_LOGOFF;
-
-/*
-
-Yet to be turned into structures:
-
-6) \\MAILSLOT\NET\NTLOGON
--------------------------
-
-6.1) Query for PDC
-------------------
-
-Request:
-
- uint16 0x0007 - Query for PDC
- STR machine name
- STR response mailslot
- uint8[] padding to 2-byte align with start of mailslot.
- UNISTR machine name
- uint32 NTversion
- uint16 LMNTtoken
- uint16 LM20token
-
-Response:
-
- uint16 0x000A - Respose to Query for PDC
- STR machine name (in uppercase)
- uint8[] padding to 2-byte align with start of mailslot.
- UNISTR machine name
- UNISTR domain name
- uint32 NTversion (same as received in request)
- uint16 LMNTtoken (same as received in request)
- uint16 LM20token (same as received in request)
-
-
-6.2) SAM Logon
---------------
-
-Request:
-
- uint16 0x0012 - SAM Logon
- uint16 request count
- UNISTR machine name
- UNISTR user name
- STR response mailslot
- uint32 alloweable account
- uint32 domain SID size
- char[sid_size] domain SID, of sid_size bytes.
- uint8[] ???? padding to 4? 2? -byte align with start of mailslot.
- uint32 NTversion
- uint16 LMNTtoken
- uint16 LM20token
-
-Response:
-
- uint16 0x0013 - Response to SAM Logon
- UNISTR machine name
- UNISTR user name - workstation trust account
- UNISTR domain name
- uint32 NTversion
- uint16 LMNTtoken
- uint16 LM20token
-
-*/
-
-
-struct smb_passwd {
- int smb_userid;
- char *smb_name;
- unsigned char *smb_passwd; /* Null if no password */
- unsigned char *smb_nt_passwd; /* Null if no password */
- /* Other fields / flags may be added later */
-};
-
-
-struct current_user {
- int cnum, id;
- int uid, gid;
- int ngroups;
- gid_t *groups;
- int *igroups;
-};
-
-typedef struct
-{
- int size;
- int mode;
- int uid;
- int gid;
- /* these times are normally kept in GMT */
- time_t mtime;
- time_t atime;
- time_t ctime;
- pstring name;
-} file_info;
-
-
-/* Structure used when SMBwritebmpx is active */
-typedef struct
- {
- int wr_total_written; /* So we know when to discard this */
- int32 wr_timeout;
- int32 wr_errclass;
- int32 wr_error; /* Cached errors */
- BOOL wr_mode; /* write through mode) */
- BOOL wr_discard; /* discard all further data */
- } write_bmpx_struct;
-
-/*
- * Structure used to indirect fd's from the files_struct.
- * Needed as POSIX locking is based on file and process, not
- * file descriptor and process.
- */
-
-typedef struct
-{
- uint16 ref_count;
- uint32 dev;
- uint32 inode;
- int fd;
- int fd_readonly;
- int fd_writeonly;
- int real_open_flags;
-} file_fd_struct;
-
-typedef struct
-{
- int cnum;
- file_fd_struct *fd_ptr;
- int pos;
- uint32 size;
- int mode;
- int uid;
- char *mmap_ptr;
- uint32 mmap_size;
- write_bmpx_struct *wbmpx_ptr;
- struct timeval open_time;
- BOOL open;
- BOOL can_lock;
- BOOL can_read;
- BOOL can_write;
- BOOL share_mode;
- BOOL print_file;
- BOOL modified;
- BOOL granted_oplock;
- char *name;
-} files_struct;
-
-
-struct uid_cache {
- int entries;
- int list[UID_CACHE_SIZE];
-};
-
-typedef struct
-{
- char *name;
- BOOL is_wild;
-} name_compare_entry;
-
-typedef struct
-{
- int service;
- BOOL force_user;
- struct uid_cache uid_cache;
- void *dirptr;
- BOOL open;
- BOOL printer;
- BOOL ipc;
- BOOL read_only;
- BOOL admin_user;
- char *dirpath;
- char *connectpath;
- char *origpath;
- char *user; /* name of user who *opened* this connection */
- int uid; /* uid of user who *opened* this connection */
- int gid; /* gid of user who *opened* this connection */
- uint16 vuid; /* vuid of user who *opened* this connection, or UID_FIELD_INVALID */
- /* following groups stuff added by ih */
- /* This groups info is valid for the user that *opened* the connection */
- int ngroups;
- gid_t *groups;
- int *igroups; /* an integer version - some OSes are broken :-( */
- time_t lastused;
- BOOL used;
- int num_files_open;
- name_compare_entry *hide_list; /* Per-share list of files to return as hidden. */
- name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
-} connection_struct;
-
-
-typedef struct
-{
- int uid; /* uid of a validated user */
- int gid; /* gid of a validated user */
- fstring name; /* name of a validated user */
- BOOL guest;
- /* following groups stuff added by ih */
- /* This groups info is needed for when we become_user() for this uid */
- int user_ngroups;
- gid_t *user_groups;
- int *user_igroups; /* an integer version - some OSes are broken :-( */
-#if (defined(NETGROUP) && defined(AUTOMOUNT))
- char *home_share; /* to store NIS home of a user - simeon */
-#endif
- char *real_name; /* to store real name from password file - simeon */
-} user_struct;
-
-
-enum {LPQ_QUEUED,LPQ_PAUSED,LPQ_SPOOLING,LPQ_PRINTING};
-
-typedef struct
-{
- int job;
- int size;
- int status;
- int priority;
- time_t time;
- char user[30];
- char file[100];
-} print_queue_struct;
-
-enum {LPSTAT_OK, LPSTAT_STOPPED, LPSTAT_ERROR};
-
-typedef struct
-{
- fstring message;
- int status;
-} print_status_struct;
-
-/* used for server information: client, nameserv and ipc */
-struct server_info_struct
-{
- fstring name;
- uint32 type;
- fstring comment;
- fstring domain; /* used ONLY in ipc.c NOT namework.c */
- BOOL server_added; /* used ONLY in ipc.c NOT namework.c */
-};
-
-
-/* used for network interfaces */
-struct interface
-{
- struct interface *next;
- struct in_addr ip;
- struct in_addr bcast;
- struct in_addr nmask;
-};
-
-/* share mode record pointed to in shared memory hash bucket */
-typedef struct
-{
- smb_shm_offset_t next_offset; /* offset of next record in chain from hash bucket */
- int locking_version;
- int32 st_dev;
- int32 st_ino;
- int num_share_mode_entries;
- smb_shm_offset_t share_mode_entries; /* Chain of share mode entries for this file */
- char file_name[1];
-} share_mode_record;
-
-/* share mode entry pointed to by share_mode_record struct */
-typedef struct
-{
- smb_shm_offset_t next_share_mode_entry;
- int pid;
- uint16 op_port;
- uint16 op_type;
- int share_mode;
- struct timeval time;
-} share_mode_entry;
-
-/* struct returned by get_share_modes */
-typedef struct
-{
- int pid;
- uint16 op_port;
- uint16 op_type;
- int share_mode;
- struct timeval time;
-} min_share_mode_entry;
-
-/* Token returned by lock_share_entry (actually ignored by FAST_SHARE_MODES code) */
-typedef int share_lock_token;
-
-/* Conversion to hash entry index from device and inode numbers. */
-#define HASH_ENTRY(dev,ino) ((( (uint32)(dev) )* ( (uint32)(ino) )) % lp_shmem_hash_size())
-
-/* this is used for smbstatus */
-struct connect_record
-{
- int magic;
- int pid;
- int cnum;
- int uid;
- int gid;
- char name[24];
- char addr[24];
- char machine[128];
- time_t start;
-};
-
-#ifndef LOCKING_VERSION
-#define LOCKING_VERSION 4
-#endif /* LOCKING_VERSION */
-
-#if !defined(FAST_SHARE_MODES)
-/*
- * Defines for slow share modes.
- */
-
-/*
- * Locking file header lengths & offsets.
- */
-#define SMF_VERSION_OFFSET 0
-#define SMF_NUM_ENTRIES_OFFSET 4
-#define SMF_FILENAME_LEN_OFFSET 8
-#define SMF_HEADER_LENGTH 10
-
-#define SMF_ENTRY_LENGTH 20
-
-/*
- * Share mode record offsets.
- */
-
-#define SME_SEC_OFFSET 0
-#define SME_USEC_OFFSET 4
-#define SME_SHAREMODE_OFFSET 8
-#define SME_PID_OFFSET 12
-#define SME_PORT_OFFSET 16
-#define SME_OPLOCK_TYPE_OFFSET 18
-
-#endif /* FAST_SHARE_MODES */
-
-/* these are useful macros for checking validity of handles */
-#define VALID_FNUM(fnum) (((fnum) >= 0) && ((fnum) < MAX_OPEN_FILES))
-#define OPEN_FNUM(fnum) (VALID_FNUM(fnum) && Files[fnum].open)
-#define VALID_CNUM(cnum) (((cnum) >= 0) && ((cnum) < MAX_CONNECTIONS))
-#define OPEN_CNUM(cnum) (VALID_CNUM(cnum) && Connections[cnum].open)
-#define IS_IPC(cnum) (VALID_CNUM(cnum) && Connections[cnum].ipc)
-#define IS_PRINT(cnum) (VALID_CNUM(cnum) && Connections[cnum].printer)
-#define FNUM_OK(fnum,c) (OPEN_FNUM(fnum) && (c)==Files[fnum].cnum)
-
-#define CHECK_FNUM(fnum,c) if (!FNUM_OK(fnum,c)) \
- return(ERROR(ERRDOS,ERRbadfid))
-#define CHECK_READ(fnum) if (!Files[fnum].can_read) \
- return(ERROR(ERRDOS,ERRbadaccess))
-#define CHECK_WRITE(fnum) if (!Files[fnum].can_write) \
- return(ERROR(ERRDOS,ERRbadaccess))
-#define CHECK_ERROR(fnum) if (HAS_CACHED_ERROR(fnum)) \
- return(CACHED_ERROR(fnum))
-
-/* translates a connection number into a service number */
-#define SNUM(cnum) (Connections[cnum].service)
-
-/* access various service details */
-#define SERVICE(snum) (lp_servicename(snum))
-#define PRINTCAP (lp_printcapname())
-#define PRINTCOMMAND(snum) (lp_printcommand(snum))
-#define PRINTERNAME(snum) (lp_printername(snum))
-#define CAN_WRITE(cnum) (OPEN_CNUM(cnum) && !Connections[cnum].read_only)
-#define VALID_SNUM(snum) (lp_snum_ok(snum))
-#define GUEST_OK(snum) (VALID_SNUM(snum) && lp_guest_ok(snum))
-#define GUEST_ONLY(snum) (VALID_SNUM(snum) && lp_guest_only(snum))
-#define CAN_SETDIR(snum) (!lp_no_set_dir(snum))
-#define CAN_PRINT(cnum) (OPEN_CNUM(cnum) && lp_print_ok(SNUM(cnum)))
-#define POSTSCRIPT(cnum) (OPEN_CNUM(cnum) && lp_postscript(SNUM(cnum)))
-#define MAP_HIDDEN(cnum) (OPEN_CNUM(cnum) && lp_map_hidden(SNUM(cnum)))
-#define MAP_SYSTEM(cnum) (OPEN_CNUM(cnum) && lp_map_system(SNUM(cnum)))
-#define MAP_ARCHIVE(cnum) (OPEN_CNUM(cnum) && lp_map_archive(SNUM(cnum)))
-#define IS_HIDDEN_PATH(cnum,path) (is_in_path((path),Connections[(cnum)].hide_list))
-#define IS_VETO_PATH(cnum,path) (is_in_path((path),Connections[(cnum)].veto_list))
-
-#define SMBENCRYPT() (lp_encrypted_passwords())
-
-/* the basic packet size, assuming no words or bytes */
-#define smb_size 39
-
-/* offsets into message for common items */
-#define smb_com 8
-#define smb_rcls 9
-#define smb_reh 10
-#define smb_err 11
-#define smb_flg 13
-#define smb_flg2 14
-#define smb_reb 13
-#define smb_tid 28
-#define smb_pid 30
-#define smb_uid 32
-#define smb_mid 34
-#define smb_wct 36
-#define smb_vwv 37
-#define smb_vwv0 37
-#define smb_vwv1 39
-#define smb_vwv2 41
-#define smb_vwv3 43
-#define smb_vwv4 45
-#define smb_vwv5 47
-#define smb_vwv6 49
-#define smb_vwv7 51
-#define smb_vwv8 53
-#define smb_vwv9 55
-#define smb_vwv10 57
-#define smb_vwv11 59
-#define smb_vwv12 61
-#define smb_vwv13 63
-#define smb_vwv14 65
-#define smb_vwv15 67
-#define smb_vwv16 69
-#define smb_vwv17 71
-
-
-/* the complete */
-#define SMBmkdir 0x00 /* create directory */
-#define SMBrmdir 0x01 /* delete directory */
-#define SMBopen 0x02 /* open file */
-#define SMBcreate 0x03 /* create file */
-#define SMBclose 0x04 /* close file */
-#define SMBflush 0x05 /* flush file */
-#define SMBunlink 0x06 /* delete file */
-#define SMBmv 0x07 /* rename file */
-#define SMBgetatr 0x08 /* get file attributes */
-#define SMBsetatr 0x09 /* set file attributes */
-#define SMBread 0x0A /* read from file */
-#define SMBwrite 0x0B /* write to file */
-#define SMBlock 0x0C /* lock byte range */
-#define SMBunlock 0x0D /* unlock byte range */
-#define SMBctemp 0x0E /* create temporary file */
-#define SMBmknew 0x0F /* make new file */
-#define SMBchkpth 0x10 /* check directory path */
-#define SMBexit 0x11 /* process exit */
-#define SMBlseek 0x12 /* seek */
-#define SMBtcon 0x70 /* tree connect */
-#define SMBtconX 0x75 /* tree connect and X*/
-#define SMBtdis 0x71 /* tree disconnect */
-#define SMBnegprot 0x72 /* negotiate protocol */
-#define SMBdskattr 0x80 /* get disk attributes */
-#define SMBsearch 0x81 /* search directory */
-#define SMBsplopen 0xC0 /* open print spool file */
-#define SMBsplwr 0xC1 /* write to print spool file */
-#define SMBsplclose 0xC2 /* close print spool file */
-#define SMBsplretq 0xC3 /* return print queue */
-#define SMBsends 0xD0 /* send single block message */
-#define SMBsendb 0xD1 /* send broadcast message */
-#define SMBfwdname 0xD2 /* forward user name */
-#define SMBcancelf 0xD3 /* cancel forward */
-#define SMBgetmac 0xD4 /* get machine name */
-#define SMBsendstrt 0xD5 /* send start of multi-block message */
-#define SMBsendend 0xD6 /* send end of multi-block message */
-#define SMBsendtxt 0xD7 /* send text of multi-block message */
-
-/* Core+ protocol */
-#define SMBlockread 0x13 /* Lock a range and read */
-#define SMBwriteunlock 0x14 /* Unlock a range then write */
-#define SMBreadbraw 0x1a /* read a block of data with no smb header */
-#define SMBwritebraw 0x1d /* write a block of data with no smb header */
-#define SMBwritec 0x20 /* secondary write request */
-#define SMBwriteclose 0x2c /* write a file then close it */
-
-/* dos extended protocol */
-#define SMBreadBraw 0x1A /* read block raw */
-#define SMBreadBmpx 0x1B /* read block multiplexed */
-#define SMBreadBs 0x1C /* read block (secondary response) */
-#define SMBwriteBraw 0x1D /* write block raw */
-#define SMBwriteBmpx 0x1E /* write block multiplexed */
-#define SMBwriteBs 0x1F /* write block (secondary request) */
-#define SMBwriteC 0x20 /* write complete response */
-#define SMBsetattrE 0x22 /* set file attributes expanded */
-#define SMBgetattrE 0x23 /* get file attributes expanded */
-#define SMBlockingX 0x24 /* lock/unlock byte ranges and X */
-#define SMBtrans 0x25 /* transaction - name, bytes in/out */
-#define SMBtranss 0x26 /* transaction (secondary request/response) */
-#define SMBioctl 0x27 /* IOCTL */
-#define SMBioctls 0x28 /* IOCTL (secondary request/response) */
-#define SMBcopy 0x29 /* copy */
-#define SMBmove 0x2A /* move */
-#define SMBecho 0x2B /* echo */
-#define SMBopenX 0x2D /* open and X */
-#define SMBreadX 0x2E /* read and X */
-#define SMBwriteX 0x2F /* write and X */
-#define SMBsesssetupX 0x73 /* Session Set Up & X (including User Logon) */
-#define SMBffirst 0x82 /* find first */
-#define SMBfunique 0x83 /* find unique */
-#define SMBfclose 0x84 /* find close */
-#define SMBinvalid 0xFE /* invalid command */
-
-/* Extended 2.0 protocol */
-#define SMBtrans2 0x32 /* TRANS2 protocol set */
-#define SMBtranss2 0x33 /* TRANS2 protocol set, secondary command */
-#define SMBfindclose 0x34 /* Terminate a TRANSACT2_FINDFIRST */
-#define SMBfindnclose 0x35 /* Terminate a TRANSACT2_FINDNOTIFYFIRST */
-#define SMBulogoffX 0x74 /* user logoff */
-
-/* NT SMB extensions. */
-#define SMBnttrans 0xA0 /* NT transact */
-#define SMBnttranss 0xA1 /* NT transact secondary */
-#define SMBntcreateX 0xA2 /* NT create and X */
-#define SMBntcancel 0xA4 /* NT cancel */
-
-/* These are the TRANS2 sub commands */
-#define TRANSACT2_OPEN 0
-#define TRANSACT2_FINDFIRST 1
-#define TRANSACT2_FINDNEXT 2
-#define TRANSACT2_QFSINFO 3
-#define TRANSACT2_SETFSINFO 4
-#define TRANSACT2_QPATHINFO 5
-#define TRANSACT2_SETPATHINFO 6
-#define TRANSACT2_QFILEINFO 7
-#define TRANSACT2_SETFILEINFO 8
-#define TRANSACT2_FSCTL 9
-#define TRANSACT2_IOCTL 0xA
-#define TRANSACT2_FINDNOTIFYFIRST 0xB
-#define TRANSACT2_FINDNOTIFYNEXT 0xC
-#define TRANSACT2_MKDIR 0xD
-#define TRANSACT2_SESSION_SETUP 0xE
-#define TRANSACT2_GET_DFS_REFERRAL 0x10
-#define TRANSACT2_REPORT_DFS_INCONSISTANCY 0x11
-
-/* These are the NT transact sub commands. */
-#define NT_TRANSACT_CREATE 1
-#define NT_TRANSACT_IOCTL 2
-#define NT_TRANSACT_SET_SECURITY_DESC 3
-#define NT_TRANSACT_NOTIFY_CHANGE 4
-#define NT_TRANSACT_RENAME 5
-#define NT_TRANSACT_QUERY_SECURITY_DESC 6
-
-/* these are the trans2 sub fields for primary requests */
-#define smb_tpscnt smb_vwv0
-#define smb_tdscnt smb_vwv1
-#define smb_mprcnt smb_vwv2
-#define smb_mdrcnt smb_vwv3
-#define smb_msrcnt smb_vwv4
-#define smb_flags smb_vwv5
-#define smb_timeout smb_vwv6
-#define smb_pscnt smb_vwv9
-#define smb_psoff smb_vwv10
-#define smb_dscnt smb_vwv11
-#define smb_dsoff smb_vwv12
-#define smb_suwcnt smb_vwv13
-#define smb_setup smb_vwv14
-#define smb_setup0 smb_setup
-#define smb_setup1 (smb_setup+2)
-#define smb_setup2 (smb_setup+4)
-
-/* these are for the secondary requests */
-#define smb_spscnt smb_vwv2
-#define smb_spsoff smb_vwv3
-#define smb_spsdisp smb_vwv4
-#define smb_sdscnt smb_vwv5
-#define smb_sdsoff smb_vwv6
-#define smb_sdsdisp smb_vwv7
-#define smb_sfid smb_vwv8
-
-/* and these for responses */
-#define smb_tprcnt smb_vwv0
-#define smb_tdrcnt smb_vwv1
-#define smb_prcnt smb_vwv3
-#define smb_proff smb_vwv4
-#define smb_prdisp smb_vwv5
-#define smb_drcnt smb_vwv6
-#define smb_droff smb_vwv7
-#define smb_drdisp smb_vwv8
-
-/* where to find the base of the SMB packet proper */
-#define smb_base(buf) (((char *)(buf))+4)
-
-
-#define SUCCESS 0 /* The request was successful. */
-#define ERRDOS 0x01 /* Error is from the core DOS operating system set. */
-#define ERRSRV 0x02 /* Error is generated by the server network file manager.*/
-#define ERRHRD 0x03 /* Error is an hardware error. */
-#define ERRCMD 0xFF /* Command was not in the "SMB" format. */
-
-#ifdef __STDC__
-int Debug1(char *, ...);
-#else
-int Debug1();
-#endif
-
-#ifdef DFS_AUTH
-void dfs_unlogin(void);
-extern int dcelogin_atmost_once;
-#endif
-
-#if AJT
-void ajt_panic(void);
-#endif
-
-#ifdef NOSTRDUP
-char *strdup(char *s);
-#endif
-
-#ifdef REPLACE_STRLEN
-int Strlen(char *);
-#endif
-
-#ifdef REPLACE_STRSTR
-char *Strstr(char *s, char *p);
-#endif
-
-#ifndef MIN
-#define MIN(a,b) ((a)<(b)?(a):(b))
-#endif
-#ifndef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
-#endif
-
-#ifndef ABS
-#define ABS(a) ((a)>0?(a):(-(a)))
-#endif
-
-#ifndef SIGNAL_CAST
-#define SIGNAL_CAST
-#endif
-
-#ifndef SELECT_CAST
-#define SELECT_CAST
-#endif
-
-
-/* Some POSIX definitions for those without */
-
-#ifndef S_IFDIR
-#define S_IFDIR 0x4000
-#endif
-#ifndef S_ISDIR
-#define S_ISDIR(mode) ((mode & 0xF000) == S_IFDIR)
-#endif
-#ifndef S_IRWXU
-#define S_IRWXU 00700 /* read, write, execute: owner */
-#endif
-#ifndef S_IRUSR
-#define S_IRUSR 00400 /* read permission: owner */
-#endif
-#ifndef S_IWUSR
-#define S_IWUSR 00200 /* write permission: owner */
-#endif
-#ifndef S_IXUSR
-#define S_IXUSR 00100 /* execute permission: owner */
-#endif
-#ifndef S_IRWXG
-#define S_IRWXG 00070 /* read, write, execute: group */
-#endif
-#ifndef S_IRGRP
-#define S_IRGRP 00040 /* read permission: group */
-#endif
-#ifndef S_IWGRP
-#define S_IWGRP 00020 /* write permission: group */
-#endif
-#ifndef S_IXGRP
-#define S_IXGRP 00010 /* execute permission: group */
-#endif
-#ifndef S_IRWXO
-#define S_IRWXO 00007 /* read, write, execute: other */
-#endif
-#ifndef S_IROTH
-#define S_IROTH 00004 /* read permission: other */
-#endif
-#ifndef S_IWOTH
-#define S_IWOTH 00002 /* write permission: other */
-#endif
-#ifndef S_IXOTH
-#define S_IXOTH 00001 /* execute permission: other */
-#endif
-
-
-/* these are used in NetServerEnum to choose what to receive */
-#define SV_TYPE_WORKSTATION 0x00000001
-#define SV_TYPE_SERVER 0x00000002
-#define SV_TYPE_SQLSERVER 0x00000004
-#define SV_TYPE_DOMAIN_CTRL 0x00000008
-#define SV_TYPE_DOMAIN_BAKCTRL 0x00000010
-#define SV_TYPE_TIME_SOURCE 0x00000020
-#define SV_TYPE_AFP 0x00000040
-#define SV_TYPE_NOVELL 0x00000080
-#define SV_TYPE_DOMAIN_MEMBER 0x00000100
-#define SV_TYPE_PRINTQ_SERVER 0x00000200
-#define SV_TYPE_DIALIN_SERVER 0x00000400
-#define SV_TYPE_SERVER_UNIX 0x00000800
-#define SV_TYPE_NT 0x00001000
-#define SV_TYPE_WFW 0x00002000
-#define SV_TYPE_SERVER_MFPN 0x00004000
-#define SV_TYPE_SERVER_NT 0x00008000
-#define SV_TYPE_POTENTIAL_BROWSER 0x00010000
-#define SV_TYPE_BACKUP_BROWSER 0x00020000
-#define SV_TYPE_MASTER_BROWSER 0x00040000
-#define SV_TYPE_DOMAIN_MASTER 0x00080000
-#define SV_TYPE_SERVER_OSF 0x00100000
-#define SV_TYPE_SERVER_VMS 0x00200000
-#define SV_TYPE_WIN95_PLUS 0x00400000
-#define SV_TYPE_ALTERNATE_XPORT 0x20000000
-#define SV_TYPE_LOCAL_LIST_ONLY 0x40000000
-#define SV_TYPE_DOMAIN_ENUM 0x80000000
-#define SV_TYPE_ALL 0xFFFFFFFF
-
-/* what server type are we currently - JHT Says we ARE 4.20 */
-/* this was set by JHT in liaison with Jeremy Allison early 1997 */
-/* setting to 4.20 at same time as announcing ourselves as NT Server */
-/* History: */
-/* Version 4.0 - never made public */
-/* Version 4.10 - New to 1.9.16p2, lost in space 1.9.16p3 to 1.9.16p9 */
-/* - Reappeared in 1.9.16p11 with fixed smbd services */
-/* Version 4.20 - To indicate that nmbd and browsing now works better */
-
-#define DEFAULT_MAJOR_VERSION 0x04
-#define DEFAULT_MINOR_VERSION 0x02
-
-/* Browser Election Values */
-#define BROWSER_ELECTION_VERSION 0x010f
-#define BROWSER_CONSTANT 0xaa55
-
-
-/* Capabilities. see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
-
-#define CAP_RAW_MODE 0x0001
-#define CAP_MPX_MODE 0x0002
-#define CAP_UNICODE 0x0004
-#define CAP_LARGE_FILES 0x0008
-#define CAP_NT_SMBS 0x0010
-#define CAP_RPC_REMOTE_APIS 0x0020
-#define CAP_STATUS32 0x0040
-#define CAP_LEVEL_II_OPLOCKS 0x0080
-#define CAP_LOCK_AND_READ 0x0100
-#define CAP_NT_FIND 0x0200
-#define CAP_DFS 0x1000
-#define CAP_LARGE_READX 0x4000
-
-/* protocol types. It assumes that higher protocols include lower protocols
- as subsets */
-enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
-
-/* security levels */
-enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER};
-
-/* printing types */
-enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
- PRINT_QNX,PRINT_PLP,PRINT_LPRNG};
-
-/* Remote architectures we know about. */
-enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT, RA_SAMBA};
-
-/* case handling */
-enum case_handling {CASE_LOWER,CASE_UPPER};
-
-
-/* Macros to get at offsets within smb_lkrng and smb_unlkrng
- structures. We cannot define these as actual structures
- due to possible differences in structure packing
- on different machines/compilers. */
-
-#define SMB_LPID_OFFSET(indx) (10 * (indx))
-#define SMB_LKOFF_OFFSET(indx) ( 2 + (10 * (indx)))
-#define SMB_LKLEN_OFFSET(indx) ( 6 + (10 * (indx)))
-
-/* Macro to cache an error in a write_bmpx_struct */
-#define CACHE_ERROR(w,c,e) ((w)->wr_errclass = (c), (w)->wr_error = (e), \
- w->wr_discard = True, -1)
-/* Macro to test if an error has been cached for this fnum */
-#define HAS_CACHED_ERROR(fnum) (Files[(fnum)].open && \
- Files[(fnum)].wbmpx_ptr && \
- Files[(fnum)].wbmpx_ptr->wr_discard)
-/* Macro to turn the cached error into an error packet */
-#define CACHED_ERROR(fnum) cached_error_packet(inbuf,outbuf,fnum,__LINE__)
-
-/* these are the datagram types */
-#define DGRAM_DIRECT_UNIQUE 0x10
-
-#define ERROR(class,x) error_packet(inbuf,outbuf,class,x,__LINE__)
-
-/* this is how errors are generated */
-#define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,__LINE__)
-
-#define ROUNDUP(x,g) (((x)+((g)-1))&~((g)-1))
-
-/*
- * Global value meaing that the smb_uid field should be
- * ingored (in share level security and protocol level == CORE)
- */
-
-#define UID_FIELD_INVALID 0
-#define VUID_OFFSET 100 /* Amount to bias returned vuid numbers */
-
-#endif
-
-/* Defines needed for multi-codepage support. */
-#define KANJI_CODEPAGE 932
-
-#ifdef KANJI
-/*
- * Default client code page - Japanese
- */
-#define DEFAULT_CLIENT_CODE_PAGE KANJI_CODEPAGE
-#else /* KANJI */
-/*
- * Default client code page - 850 - Western European
- */
-#define DEFAULT_CLIENT_CODE_PAGE 850
-#endif /* KANJI */
-
-/*
- * Size of buffer to use when moving files across filesystems.
- */
-#define COPYBUF_SIZE (8*1024)
-
-/*
- * Integers used to override error codes.
- */
-extern int unix_ERR_class;
-extern int unix_ERR_code;
-
-/*
- * Map the Core and Extended Oplock requesst bits down
- * to common bits (EXCLUSIVE_OPLOCK & BATCH_OPLOCK).
- */
-
-/*
- * Core protocol.
- */
-#define CORE_OPLOCK_REQUEST(inbuf) (((CVAL(inbuf,smb_flg)|(1<<5))>>5) | \
- ((CVAL(inbuf,smb_flg)|(1<<6))>>5))
-
-/*
- * Extended protocol.
- */
-#define EXTENDED_OPLOCK_REQUEST(inbuf) (((SVAL(inbuf,smb_vwv2)|(1<<1))>>1) | \
- ((SVAL(inbuf,smb_vwv2)|(1<<2))>>1))
-
-/* Lock types. */
-#define LOCKING_ANDX_SHARED_LOCK 0x1
-#define LOCKING_ANDX_OPLOCK_RELEASE 0x2
-#define LOCKING_ANDX_CHANGE_LOCKTYPE 0x4
-#define LOCKING_ANDX_CANCEL_LOCK 0x8
-#define LOCKING_ANDX_LARGE_FILES 0x10
-
-/* Oplock levels */
-#define OPLOCKLEVEL_NONE 0
-#define OPLOCKLEVEL_II 1
-
-/*
- * Bits we test with.
- */
-#define EXCLUSIVE_OPLOCK 1
-#define BATCH_OPLOCK 2
-
-#define CORE_OPLOCK_GRANTED (1<<5)
-#define EXTENDED_OPLOCK_GRANTED (1<<15)
-
-/*
- * Loopback command offsets.
- */
-
-#define UDP_CMD_LEN_OFFSET 0
-#define UDP_CMD_PORT_OFFSET 4
-#define UDP_CMD_HEADER_LEN 6
-
-#define UDP_MESSAGE_CMD_OFFSET 0
-
-/*
- * Oplock break command code to send over the udp socket.
- *
- * Form of this is :
- *
- * 0 2 6 10 14 18 22
- * +----+--------+--------+--------+-------+--------+
- * | cmd| pid | dev | inode | sec | usec |
- * +----+--------+--------+--------+-------+--------+
- */
-
-#define OPLOCK_BREAK_CMD 0x1
-#define OPLOCK_BREAK_PID_OFFSET 2
-#define OPLOCK_BREAK_DEV_OFFSET 6
-#define OPLOCK_BREAK_INODE_OFFSET 10
-#define OPLOCK_BREAK_SEC_OFFSET 14
-#define OPLOCK_BREAK_USEC_OFFSET 18
-#define OPLOCK_BREAK_MSG_LEN 22
-
-
-#define CMD_REPLY 0x8000
-
-/* _SMB_H */
diff --git a/source/include/trans2.h b/source/include/trans2.h
deleted file mode 100644
index 9a2de631095..00000000000
--- a/source/include/trans2.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB transaction2 handling
- Copyright (C) Jeremy Allison 1994-1997
-
- Extensively modified by Andrew Tridgell, 1995
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _TRANS2_H_
-#define _TRANS2_H_
-
-/* Define the structures needed for the trans2 calls. */
-
-/*******************************************************
- For DosFindFirst/DosFindNext - level 1
-
-MAXFILENAMELEN = 255;
-FDATE == uint16
-FTIME == uint16
-ULONG == uint32
-USHORT == uint16
-
-typedef struct _FILEFINDBUF {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 FDATE fdateCreation;
-2 FTIME ftimeCreation;
-4 FDATE fdateLastAccess;
-6 FTIME ftimeLastAccess;
-8 FDATE fdateLastWrite;
-10 FTIME ftimeLastWrite;
-12 ULONG cbFile file length in bytes
-16 ULONG cbFileAlloc size of file allocation unit
-20 USHORT attrFile
-22 UCHAR cchName length of name to follow (not including zero)
-23 UCHAR achName[MAXFILENAMELEN]; Null terminated name
-} FILEFINDBUF;
-*********************************************************/
-
-#define l1_fdateCreation 0
-#define l1_fdateLastAccess 4
-#define l1_fdateLastWrite 8
-#define l1_cbFile 12
-#define l1_cbFileAlloc 16
-#define l1_attrFile 20
-#define l1_cchName 22
-#define l1_achName 23
-
-/**********************************************************
-For DosFindFirst/DosFindNext - level 2
-
-typedef struct _FILEFINDBUF2 {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 FDATE fdateCreation;
-2 FTIME ftimeCreation;
-4 FDATE fdateLastAccess;
-6 FTIME ftimeLastAccess;
-8 FDATE fdateLastWrite;
-10 FTIME ftimeLastWrite;
-12 ULONG cbFile file length in bytes
-16 ULONG cbFileAlloc size of file allocation unit
-20 USHORT attrFile
-22 ULONG cbList Extended attribute list (always 0)
-26 UCHAR cchName length of name to follow (not including zero)
-27 UCHAR achName[MAXFILENAMELEN]; Null terminated name
-} FILEFINDBUF2;
-*************************************************************/
-
-#define l2_fdateCreation 0
-#define l2_fdateLastAccess 4
-#define l2_fdateLastWrite 8
-#define l2_cbFile 12
-#define l2_cbFileAlloc 16
-#define l2_attrFile 20
-#define l2_cbList 22
-#define l2_cchName 26
-#define l2_achName 27
-
-
-/**********************************************************
-For DosFindFirst/DosFindNext - level 260
-
-typedef struct _FILEFINDBUF260 {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 ULONG NextEntryOffset;
-4 ULONG FileIndex;
-8 LARGE_INTEGER CreationTime;
-16 LARGE_INTEGER LastAccessTime;
-24 LARGE_INTEGER LastWriteTime;
-32 LARGE_INTEGER ChangeTime;
-40 LARGE_INTEGER EndOfFile;
-48 LARGE_INTEGER AllocationSize;
-56 ULONG FileAttributes;
-60 ULONG FileNameLength;
-64 ULONG EaSize;
-68 CHAR ShortNameLength;
-70 UNICODE ShortName[12];
-94 UNICODE FileName[];
-*************************************************************/
-
-#define l260_achName 94
-
-
-/**********************************************************
-For DosQueryPathInfo/DosQueryFileInfo/DosSetPathInfo/
-DosSetFileInfo - level 1
-
-typedef struct _FILESTATUS {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 FDATE fdateCreation;
-2 FTIME ftimeCreation;
-4 FDATE fdateLastAccess;
-6 FTIME ftimeLastAccess;
-8 FDATE fdateLastWrite;
-10 FTIME ftimeLastWrite;
-12 ULONG cbFile file length in bytes
-16 ULONG cbFileAlloc size of file allocation unit
-20 USHORT attrFile
-} FILESTATUS;
-*************************************************************/
-
-/* Use the l1_ defines from DosFindFirst */
-
-/**********************************************************
-For DosQueryPathInfo/DosQueryFileInfo/DosSetPathInfo/
-DosSetFileInfo - level 2
-
-typedef struct _FILESTATUS2 {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 FDATE fdateCreation;
-2 FTIME ftimeCreation;
-4 FDATE fdateLastAccess;
-6 FTIME ftimeLastAccess;
-8 FDATE fdateLastWrite;
-10 FTIME ftimeLastWrite;
-12 ULONG cbFile file length in bytes
-16 ULONG cbFileAlloc size of file allocation unit
-20 USHORT attrFile
-22 ULONG cbList Length of EA's (0)
-} FILESTATUS2;
-*************************************************************/
-
-/* Use the l2_ #defines from DosFindFirst */
-
-/**********************************************************
-For DosQFSInfo/DosSetFSInfo - level 1
-
-typedef struct _FSALLOCATE {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 ULONG idFileSystem id of file system
-4 ULONG cSectorUnit number of sectors per allocation unit
-8 ULONG cUnit number of allocation units
-12 ULONG cUnitAvail Available allocation units
-16 USHORT cbSector bytes per sector
-} FSALLOCATE;
-*************************************************************/
-
-#define l1_idFileSystem 0
-#define l1_cSectorUnit 4
-#define l1_cUnit 8
-#define l1_cUnitAvail 12
-#define l1_cbSector 16
-
-/**********************************************************
-For DosQFSInfo/DosSetFSInfo - level 2
-
-typedef struct _FSINFO {
-Byte offset Type name description
--------------+-------+-------------------+--------------
-0 FDATE vol_fdateCreation
-2 FTIME vol_ftimeCreation
-4 UCHAR vol_cch length of volume name (excluding NULL)
-5 UCHAR vol_szVolLabel[12] volume name
-} FSINFO;
-*************************************************************/
-
-#define SMB_INFO_STANDARD 1
-#define SMB_INFO_QUERY_EA_SIZE 2
-#define SMB_INFO_QUERY_EAS_FROM_LIST 3
-#define SMB_INFO_QUERY_ALL_EAS 4
-#define SMB_INFO_IS_NAME_VALID 6
-#define SMB_QUERY_FS_LABEL_INFO 0x101
-#define SMB_QUERY_FS_VOLUME_INFO 0x102
-#define SMB_QUERY_FS_SIZE_INFO 0x103
-#define SMB_QUERY_FS_DEVICE_INFO 0x104
-#define SMB_QUERY_FS_ATTRIBUTE_INFO 0x105
-
-
-#define l2_vol_fdateCreation 0
-#define l2_vol_cch 4
-#define l2_vol_szVolLabel 5
-
-
-#define SMB_QUERY_FILE_BASIC_INFO 0x101
-#define SMB_QUERY_FILE_STANDARD_INFO 0x102
-#define SMB_QUERY_FILE_EA_INFO 0x103
-#define SMB_QUERY_FILE_NAME_INFO 0x104
-#define SMB_QUERY_FILE_ALLOCATION_INFO 0x105
-#define SMB_QUERY_FILE_END_OF_FILEINFO 0x106
-#define SMB_QUERY_FILE_ALL_INFO 0x107
-#define SMB_QUERY_FILE_ALT_NAME_INFO 0x108
-#define SMB_QUERY_FILE_STREAM_INFO 0x109
-
-#define SMB_FIND_FILE_DIRECTORY_INFO 0x101
-#define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
-#define SMB_FIND_FILE_NAMES_INFO 0x103
-#define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
-
-#define SMB_SET_FILE_BASIC_INFO 0x101
-#define SMB_SET_FILE_DISPOSITION_INFO 0x102
-#define SMB_SET_FILE_ALLOCATION_INFO 0x103
-#define SMB_SET_FILE_END_OF_FILE_INFO 0x104
-
-#define DIRLEN_GUESS (45+MAX(l1_achName,l2_achName))
-
-/* NT uses a FILE_ATTRIBUTE_NORMAL when no other attributes
- are set. */
-
-#define NT_FILE_ATTRIBUTE_NORMAL 0x80
-
-/* Function prototypes */
-
-
-int reply_findnclose(char *inbuf,char *outbuf,int length,int bufsize);
-
-int reply_findclose(char *inbuf,char *outbuf,int length,int bufsize);
-
-#endif
-
-
-
diff --git a/source/include/version.h b/source/include/version.h
deleted file mode 100644
index 33c9d240baf..00000000000
--- a/source/include/version.h
+++ /dev/null
@@ -1 +0,0 @@
-#define VERSION "1.9.18alpha1"
diff --git a/source/include/vt_mode.h b/source/include/vt_mode.h
deleted file mode 100644
index 85b481122ee..00000000000
--- a/source/include/vt_mode.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* vt_mode.h */
-/*
-support vtp-sessions
-
-written by Christian A. Lademann <cal@zls.com>
-*/
-
-/*
-02.05.95:cal:ported to samba-1.9.13
-*/
-
-#ifndef __vt_mode_h__
-# define __vt_mode_h__
-
-# define VT_CLOSED 0
-# define VT_OPEN 1
-
-# define MS_NONE 0
-# define MS_PTY 1
-# define MS_STREAM 2
-# define MS_VTY 3
-
-# define VT_MAXREAD 32
-
-
-# undef EXTERN
-
-# ifndef __vt_mode_c__
-# define EXTERN extern
-# define DEFAULT(v)
-# else
-# define EXTERN
-# define DEFAULT(v) =(v)
-# endif
-
- EXTERN int VT_Status DEFAULT(VT_CLOSED),
- VT_Fd DEFAULT(-1),
- VT_ChildPID DEFAULT(-1);
-
- EXTERN BOOL VT_Mode DEFAULT(False),
- VT_ChildDied DEFAULT(False);
-
- EXTERN char *VT_Line DEFAULT(NULL);
-
-# undef EXTERN
-
-
-#endif /* __vt_mode_h__ */
diff --git a/source/internals.doc b/source/internals.doc
deleted file mode 100644
index 971f2567388..00000000000
--- a/source/internals.doc
+++ /dev/null
@@ -1,212 +0,0 @@
-internals.txt, 8 May 1996
-Written by David Chappell <David.Chappell@mail.trincoll.edu>.
-
-This document describes some of the internal functions which must be
-understood by anyone wishing to add features to Samba.
-
-
-
-
-
-=============================================================================
-This section describes the macros defined in byteorder.h. These macros
-are used extensively in the Samba code.
-
------------------------------------------------------------------------------
-CVAL(buf,pos)
-
-returns the byte at offset pos within buffer buf as an unsigned character.
-
------------------------------------------------------------------------------
-PVAL(buf,pos)
-
-returns the value of CVAL(buf,pos) cast to type unsigned integer.
-
------------------------------------------------------------------------------
-SCVAL(buf,pos,val)
-
-sets the byte at offset pos within buffer buf to value val.
-
------------------------------------------------------------------------------
-SVAL(buf,pos)
-
-returns the value of the unsigned short (16 bit) little-endian integer at
-offset pos within buffer buf. An integer of this type is sometimes
-refered to as "USHORT".
-
------------------------------------------------------------------------------
-IVAL(buf,pos)
-
-returns the value of the unsigned 32 bit little-endian integer at offset
-pos within buffer buf.
-
------------------------------------------------------------------------------
-SVALS(buf,pos)
-
-returns the value of the signed short (16 bit) little-endian integer at
-offset pos within buffer buf.
-
------------------------------------------------------------------------------
-IVALS(buf,pos)
-
-returns the value of the signed 32 bit little-endian integer at offset pos
-within buffer buf.
-
------------------------------------------------------------------------------
-SSVAL(buf,pos,val)
-
-sets the unsigned short (16 bit) little-endian integer at offset pos within
-buffer buf to value val.
-
------------------------------------------------------------------------------
-SIVAL(buf,pos,val)
-
-sets the unsigned 32 bit little-endian integer at offset pos within buffer
-buf to the value val.
-
------------------------------------------------------------------------------
-SSVALS(buf,pos,val)
-
-sets the short (16 bit) signed little-endian integer at offset pos within
-buffer buf to the value val.
-
------------------------------------------------------------------------------
-SIVALS(buf,pos,val)
-
-sets the signed 32 bit little-endian integer at offset pos withing buffer
-buf to the value val.
-
------------------------------------------------------------------------------
-RSVAL(buf,pos)
-
-returns the value of the unsigned short (16 bit) big-endian integer at
-offset pos within buffer buf.
-
------------------------------------------------------------------------------
-RIVAL(buf,pos)
-
-returns the value of the unsigned 32 bit big-endian integer at offset
-pos within buffer buf.
-
------------------------------------------------------------------------------
-RSSVAL(buf,pos,val)
-
-sets the value of the unsigned short (16 bit) big-endian integer at
-offset pos within buffer buf to value val.
-refered to as "USHORT".
-
------------------------------------------------------------------------------
-RSIVAL(buf,pos,val)
-
-sets the value of the unsigned 32 bit big-endian integer at offset
-pos within buffer buf to value val.
-
-
-
-
-
-=============================================================================
-This section describes the functions need to make a LAN Manager RPC call.
-This information had been obtained by examining the Samba code and the LAN
-Manager 2.0 API documentation. It should not be considered entirely
-reliable.
-
------------------------------------------------------------------------------
-call_api(int prcnt, int drcnt, int mprcnt, int mdrcnt,
- char *param, char *data, char **rparam, char **rdata);
-
-This function is defined in client.c. It uses an SMB transaction to call a
-remote api.
-
-The parameters are as follows:
-
-prcnt: the number of bytes of parameters begin sent.
-drcnt: the number of bytes of data begin sent.
-mprcnt: the maximum number of bytes of parameters which should be returned
-mdrcnt: the maximum number of bytes of data which should be returned
-param: a pointer to the parameters to be sent.
-data: a pointer to the data to be sent.
-rparam: a pointer to a pointer which will be set to point to the returned
- paramters. The caller of call_api() must deallocate this memory.
-rdata: a pointer to a pointer which will be set to point to the returned
- data. The caller of call_api() must deallocate this memory.
-
------------------------------------------------------------------------------
-These are the parameters which you ought to send, in the order of their
-appearance in the parameter block:
-
-* An unsigned 16 bit integer API number. You should set this value with
-SSVAL(). I do not know where these numbers are described.
-
-* An ASCIIZ string describing the parameters to the API function as defined
-in the LAN Manager documentation. The first parameter, which is the server
-name, is ommited. This string is based uppon the API function as described
-in the manual, not the data which is actually passed.
-
-* An ASCIIZ string describing the data structure which ought to be returned.
-
-* Any parameters which appear in the function call, as defined in the LAN
-Manager API documentation, after the "Server" and up to and including the
-"uLevel" parameters.
-
-* An unsigned 16 bit integer which gives the size in bytes of the buffer we
-will use to receive the returned array of data structures. Presumably this
-should be the same as mdrcnt. This value should be set with SSVAL().
-
-* An ASCIIZ string describing substructures which should be returned. If no
-substructures apply, this string is of zero length.
-
------------------------------------------------------------------------------
-The code in client.c always calls call_api() with no data. It is unclear
-when a non-zero length data buffer would be sent.
-
------------------------------------------------------------------------------
-The returned parameters (pointed to by rparam), in their order of appearance
-are:
-
-* An unsigned 16 bit integer which contains the API function's return code.
-This value should be read with SVAL().
-
-* An adjustment which tells the amount by which pointers in the returned
-data should be adjusted. This value should be read with SVAL(). Basically,
-the address of the start of the returned data buffer should have the returned
-pointer value added to it and then have this value subtracted from it in
-order to obtain the currect offset into the returned data buffer.
-
-* A count of the number of elements in the array of structures returned.
-It is also possible that this may sometimes be the number of bytes returned.
-
------------------------------------------------------------------------------
-When call_api() returns, rparam points to the returned parameters. The
-first if these is the result code. It will be zero if the API call
-suceeded. This value by be read with "SVAL(rparam,0)".
-
-The second parameter may be read as "SVAL(rparam,2)". It is a 16 bit offset
-which indicates what the base address of the returned data buffer was when
-it was built on the server. It should be used to correct pointer before
-use.
-
-The returned data buffer contains the array of returned data structures.
-Note that all pointers must be adjusted before use. The function
-fix_char_ptr() in client.c can be used for this purpose.
-
-The third parameter (which may be read as "SVAL(rparam,4)") has something to
-do with indicating the amount of data returned or possibly the amount of
-data which can be returned if enough buffer space is allowed.
-
------------------------------------------------------------------------------
-Certain data structures are described by means of ASCIIz strings containing
-code characters. These are the code characters:
-
-W a type byte little-endian unsigned integer
-N a count of substructures which follow
-D a four byte little-endian unsigned integer
-B a byte (with optional count expressed as trailing ASCII digits)
-z a four byte offset to a NULL terminated string
-l a four byte offset to non-string user data
-b an offset to data (with count expressed as trailing ASCII digits)
-r pointer to returned data buffer???
-L length in bytes of returned data buffer???
-h number of bytes of information available???
-
-----------------------------------------------------------------------------
diff --git a/source/lib/access.c b/source/lib/access.c
deleted file mode 100644
index c338517ed67..00000000000
--- a/source/lib/access.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
-This module is an adaption of code from the tcpd-1.4 package written
-by Wietse Venema, Eindhoven University of Technology, The Netherlands.
-
-The code is used here with permission.
-
-The code has been considerably changed from the original. Bug reports
-should be sent to samba-bugs@samba.anu.edu.au
-*/
-
-#include "includes.h"
-
-#define ALLOW_PURE_ADDRESSES
-
-extern int DEBUGLEVEL;
-
-#ifndef INADDR_NONE
-#define INADDR_NONE ((uint32)~0)
-#endif
-
-
-#define Good True
-#define Bad False
-
-#define CLIENT_MATCH client_match
-
-/* Delimiters for lists of daemons or clients. */
-
-static char sep[] = ", \t";
-
-/* Constants to be used in assignments only, not in comparisons... */
-
-#define YES 1
-#define NO 0
-#define FAIL (-1)
-
-/* Forward declarations. */
-static int list_match(char *list,char *item, int (*match_fn)());
-static int client_match(char *tok,char *item);
-static int string_match(char *tok,char *s);
-static int masked_match(char *tok, char *slash, char *s);
-
-/* Size of logical line buffer. */
-#define BUFLEN 2048
-
-/* return true if access should be allowed to a service*/
-BOOL check_access(int snum)
-{
- char *denyl,*allowl;
- BOOL ret = False;
-
- denyl = lp_hostsdeny(snum);
- if (denyl) denyl = strdup(denyl);
-
- allowl = lp_hostsallow(snum);
- if (allowl) allowl = strdup(allowl);
-
- if ((!denyl || *denyl==0) && (!allowl || *allowl==0))
- ret = True;
-
- if (!ret)
- {
- if (allow_access(denyl,allowl,client_name(),client_addr()))
- {
- if (snum >= 0)
- DEBUG(2,("Allowed connection from %s (%s) to %s\n",
- client_name(),client_addr(),
- lp_servicename(snum)));
- ret = True;
- }
- else
- if (snum >= 0)
- DEBUG(0,("%s Denied connection from %s (%s) to %s\n",
- timestring(), client_name(),client_addr(),
- lp_servicename(snum)));
- }
-
- if (denyl) free(denyl);
- if (allowl) free(allowl);
- return(ret);
-}
-
-
-/* return true if access should be allowed */
-BOOL allow_access(char *deny_list,char *allow_list,char *cname,char *caddr)
-{
- char *client[2];
-
- client[0] = cname;
- client[1] = caddr;
-
- /* if theres no deny list and no allow list then allow access */
- if ((!deny_list || *deny_list == 0) && (!allow_list || *allow_list == 0))
- return(True);
-
- /* if there is an allow list but no deny list then allow only hosts
- on the allow list */
- if (!deny_list || *deny_list == 0)
- return(list_match(allow_list,(char *)client,CLIENT_MATCH));
-
- /* if theres a deny list but no allow list then allow
- all hosts not on the deny list */
- if (!allow_list || *allow_list == 0)
- return(!list_match(deny_list,(char *)client,CLIENT_MATCH));
-
- /* if there are both type of list then allow all hosts on the allow list */
- if (list_match(allow_list,(char *)client,CLIENT_MATCH))
- return (True);
-
- /* if there are both type of list and it's not on the allow then
- allow it if its not on the deny */
- if (list_match(deny_list,(char *)client,CLIENT_MATCH))
- return (False);
-
- return (True);
-}
-
-/* list_match - match an item against a list of tokens with exceptions */
-/* (All modifications are marked with the initials "jkf") */
-static int list_match(char *list,char *item, int (*match_fn)())
-{
- char *tok;
- char *listcopy; /* jkf */
- int match = NO;
-
- /*
- * jkf@soton.ac.uk -- 31 August 1994 -- Stop list_match()
- * overwriting the list given as its first parameter.
- */
-
- /* jkf -- can get called recursively with NULL list */
- listcopy = (list == 0) ? (char *)0 : strdup(list);
-
- /*
- * Process tokens one at a time. We have exhausted all possible matches
- * when we reach an "EXCEPT" token or the end of the list. If we do find
- * a match, look for an "EXCEPT" list and recurse to determine whether
- * the match is affected by any exceptions.
- */
-
- for (tok = strtok(listcopy, sep); tok ; tok = strtok(NULL, sep)) {
- if (strcasecmp(tok, "EXCEPT") == 0) /* EXCEPT: give up */
- break;
- if ((match = (*match_fn) (tok, item))) /* YES or FAIL */
- break;
- }
- /* Process exceptions to YES or FAIL matches. */
-
- if (match != NO) {
- while ((tok = strtok((char *) 0, sep)) && strcasecmp(tok, "EXCEPT"))
- /* VOID */ ;
- if (tok == 0 || list_match((char *) 0, item, match_fn) == NO) {
- if (listcopy != 0) free(listcopy); /* jkf */
- return (match);
- }
- }
-
- if (listcopy != 0) free(listcopy); /* jkf */
- return (NO);
-}
-
-
-/* client_match - match host name and address against token */
-static int client_match(char *tok,char *item)
-{
- char **client = (char **)item;
- int match;
-
- /*
- * Try to match the address first. If that fails, try to match the host
- * name if available.
- */
-
- if ((match = string_match(tok, client[1])) == 0)
- if (client[0][0] != 0)
- match = string_match(tok, client[0]);
- return (match);
-}
-
-/* string_match - match string against token */
-static int string_match(char *tok,char *s)
-{
- int tok_len;
- int str_len;
- char *cut;
-
- /*
- * Return YES if a token has the magic value "ALL". Return FAIL if the
- * token is "FAIL". If the token starts with a "." (domain name), return
- * YES if it matches the last fields of the string. If the token has the
- * magic value "LOCAL", return YES if the string does not contain a "."
- * character. If the token ends on a "." (network number), return YES if
- * it matches the first fields of the string. If the token begins with a
- * "@" (netgroup name), return YES if the string is a (host) member of
- * the netgroup. Return YES if the token fully matches the string. If the
- * token is a netnumber/netmask pair, return YES if the address is a
- * member of the specified subnet.
- */
-
- if (tok[0] == '.') { /* domain: match last fields */
- if ((str_len = strlen(s)) > (tok_len = strlen(tok))
- && strcasecmp(tok, s + str_len - tok_len) == 0)
- return (YES);
- } else if (tok[0] == '@') { /* netgroup: look it up */
-#ifdef NETGROUP
- static char *mydomain = NULL;
- char *hostname = NULL;
- BOOL netgroup_ok = False;
-
- if (!mydomain) yp_get_default_domain(&mydomain);
-
- if (!mydomain) {
- DEBUG(0,("Unable to get default yp domain.\n"));
- return NO;
- }
- if (!(hostname = strdup(s))) {
- DEBUG(1,("out of memory for strdup!\n"));
- return NO;
- }
-
- netgroup_ok = innetgr(tok + 1, hostname, (char *) 0, mydomain);
-
- DEBUG(5,("looking for %s of domain %s in netgroup %s gave %s\n",
- hostname,
- mydomain,
- tok+1,
- BOOLSTR(netgroup_ok)));
-
-#ifdef NETGROUP_INSECURE
- /* if you really want netgroups that match non qualified names
- then define NETGROUP_INSECURE. It can, however, be a big
- security hole */
- {
- char *clnt_domain;
- if (!netgroup_ok && (clnt_domain=strchr(hostname,'.'))) {
- *clnt_domain++ = '\0';
- netgroup_ok = innetgr(tok + 1, hostname, (char *) 0, mydomain);
- }
- }
-#endif
-
- free(hostname);
-
- if (netgroup_ok) return(YES);
-#else
- DEBUG(0,("access: netgroup support is not configured\n"));
- return (NO);
-#endif
- } else if (strcasecmp(tok, "ALL") == 0) { /* all: match any */
- return (YES);
- } else if (strcasecmp(tok, "FAIL") == 0) { /* fail: match any */
- return (FAIL);
- } else if (strcasecmp(tok, "LOCAL") == 0) { /* local: no dots */
- if (strchr(s, '.') == 0 && strcasecmp(s, "unknown") != 0)
- return (YES);
- } else if (!strcasecmp(tok, s)) { /* match host name or address */
- return (YES);
- } else if (tok[(tok_len = strlen(tok)) - 1] == '.') { /* network */
- if (strncmp(tok, s, tok_len) == 0)
- return (YES);
- } else if ((cut = strchr(tok, '/')) != 0) { /* netnumber/netmask */
- if (isdigit(s[0]) && masked_match(tok, cut, s))
- return (YES);
- }
- return (NO);
-}
-
-/* masked_match - match address against netnumber/netmask */
-static int masked_match(char *tok, char *slash, char *s)
-{
- uint32 net;
- uint32 mask;
- uint32 addr;
-
- if ((addr = interpret_addr(s)) == INADDR_NONE)
- return (NO);
- *slash = 0;
- net = interpret_addr(tok);
- *slash = '/';
- if (net == INADDR_NONE || (mask = interpret_addr(slash + 1)) == INADDR_NONE) {
- DEBUG(0,("access: bad net/mask access control: %s", tok));
- return (NO);
- }
- return ((addr & mask) == net);
-}
-
-
-
-
diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c
deleted file mode 100644
index a7dff4224be..00000000000
--- a/source/lib/charcnv.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Character set conversion Extensions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-#include "includes.h"
-#define CTRLZ 26
-extern int DEBUGLEVEL;
-
-static char cvtbuf[1024];
-
-static BOOL mapsinited = 0;
-
-static char unix2dos[256];
-static char dos2unix[256];
-
-static void initmaps() {
- int k;
-
- for (k = 0; k < 256; k++) unix2dos[k] = k;
- for (k = 0; k < 256; k++) dos2unix[k] = k;
-
- mapsinited = True;
-}
-
-static void update_map(char * str) {
- char *p;
-
- for (p = str; *p; p++) {
- if (p[1]) {
- unix2dos[(unsigned char)*p] = p[1];
- dos2unix[(unsigned char)p[1]] = *p;
- p++;
- }
- }
-}
-
-static void init_iso8859_1() {
-
- int i;
- if (!mapsinited) initmaps();
-
- /* Do not map undefined characters to some accidental code */
- for (i = 128; i < 256; i++)
- {
- unix2dos[i] = CTRLZ;
- dos2unix[i] = CTRLZ;
- }
-
-/* MSDOS Code Page 850 -> ISO-8859 */
-update_map("\240\377\241\255\242\275\243\234\244\317\245\276\246\335\247\365");
-update_map("\250\371\251\270\252\246\253\256\254\252\255\360\256\251\257\356");
-update_map("\260\370\261\361\262\375\263\374\264\357\265\346\266\364\267\372");
-update_map("\270\367\271\373\272\247\273\257\274\254\275\253\276\363\277\250");
-update_map("\300\267\301\265\302\266\303\307\304\216\305\217\306\222\307\200");
-update_map("\310\324\311\220\312\322\313\323\314\336\315\326\316\327\317\330");
-update_map("\320\321\321\245\322\343\323\340\324\342\325\345\326\231\327\236");
-update_map("\330\235\331\353\332\351\333\352\334\232\335\355\336\350\337\341");
-update_map("\340\205\341\240\342\203\343\306\344\204\345\206\346\221\347\207");
-update_map("\350\212\351\202\352\210\353\211\354\215\355\241\356\214\357\213");
-update_map("\360\320\361\244\362\225\363\242\364\223\365\344\366\224\367\366");
-update_map("\370\233\371\227\372\243\373\226\374\201\375\354\376\347\377\230");
-
-}
-
-/* Init for eastern european languages. May need more work ? */
-
-static void init_iso8859_2() {
-
- int i;
- if (!mapsinited) initmaps();
-
- /* Do not map undefined characters to some accidental code */
- for (i = 128; i < 256; i++)
- {
- unix2dos[i] = CTRLZ;
- dos2unix[i] = CTRLZ;
- }
-
-update_map("\241\244\306\217\312\250\243\235\321\343\323\340\246\227\254\215");
-update_map("\257\275\261\245\346\206\352\251\263\210\361\344\363\242\266\230");
-update_map("\274\253\277\276");
-}
-
-/*
- * Convert unix to dos
- */
-char *unix2dos_format(char *str,BOOL overwrite)
-{
- char *p;
- char *dp;
-
- if (!mapsinited) initmaps();
-
- if(lp_client_code_page() == KANJI_CODEPAGE)
- return (*_unix_to_dos)(str, overwrite);
- else {
- if (overwrite) {
- for (p = str; *p; p++) *p = unix2dos[(unsigned char)*p];
- return str;
- } else {
- for (p = str, dp = cvtbuf; *p; p++,dp++) *dp = unix2dos[(unsigned char)*p];
- *dp = 0;
- return cvtbuf;
- }
- }
-}
-
-/*
- * Convert dos to unix
- */
-char *dos2unix_format(char *str, BOOL overwrite)
-{
- char *p;
- char *dp;
-
- if (!mapsinited) initmaps();
-
- if(lp_client_code_page() == KANJI_CODEPAGE)
- return (*_dos_to_unix)(str, overwrite);
- else {
- if (overwrite) {
- for (p = str; *p; p++) *p = dos2unix[(unsigned char)*p];
- return str;
- } else {
- for (p = str, dp = cvtbuf; *p; p++,dp++) *dp = dos2unix[(unsigned char)*p];
- *dp = 0;
- return cvtbuf;
- }
- }
-}
-
-
-/*
- * Interpret character set.
- */
-int interpret_character_set(char *str, int def)
-{
-
- if (strequal (str, "iso8859-1")) {
- init_iso8859_1();
- } else if (strequal (str, "iso8859-2")) {
- init_iso8859_2();
- } else {
- DEBUG(0,("unrecognized character set\n"));
- }
- return def;
-}
diff --git a/source/lib/charset.c b/source/lib/charset.c
deleted file mode 100644
index 4869e09fecf..00000000000
--- a/source/lib/charset.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Character set handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#define CHARSET_C
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-/*
- * Codepage definitions.
- */
-
-#if !defined(KANJI)
-/* lower->upper mapping for IBM Code Page 850 - MS-DOS Latin 1 */
-unsigned char cp_850[][4] = {
-/* dec col/row oct hex description */
-/* 133 08/05 205 85 a grave */
-/* 183 11/07 267 B7 A grave */ {0x85,0xB7,1,1},
-/* 160 10/00 240 A0 a acute */
-/* 181 11/05 265 B5 A acute */ {0xA0,0xB5,1,1},
-/* 131 08/03 203 83 a circumflex */
-/* 182 11/06 266 B6 A circumflex */ {0x83,0xB6,1,1},
-/* 198 12/06 306 C6 a tilde */
-/* 199 12/07 307 C7 A tilde */ {0xC6,0xC7,1,1},
-/* 132 08/04 204 84 a diaeresis */
-/* 142 08/14 216 8E A diaeresis */ {0x84,0x8E,1,1},
-/* 134 08/06 206 86 a ring */
-/* 143 08/15 217 8F A ring */ {0x86,0x8F,1,1},
-/* 145 09/01 221 91 ae diphthong */
-/* 146 09/02 222 92 AE diphthong */ {0x91,0x92,1,1},
-/* 135 08/07 207 87 c cedilla */
-/* 128 08/00 200 80 C cedilla */ {0x87,0x80,1,1},
-/* 138 08/10 212 8A e grave */
-/* 212 13/04 324 D4 E grave */ {0x8A,0xD4,1,1},
-/* 130 08/02 202 82 e acute */
-/* 144 09/00 220 90 E acute */ {0x82,0x90,1,1},
-/* 136 08/08 210 88 e circumflex */
-/* 210 13/02 322 D2 E circumflex */ {0x88,0xD2,1,1},
-/* 137 08/09 211 89 e diaeresis */
-/* 211 13/03 323 D3 E diaeresis */ {0x89,0xD3,1,1},
-/* 141 08/13 215 8D i grave */
-/* 222 13/14 336 DE I grave */ {0x8D,0xDE,1,1},
-/* 161 10/01 241 A1 i acute */
-/* 214 13/06 326 D6 I acute */ {0xA1,0xD6,1,1},
-/* 140 08/12 214 8C i circumflex */
-/* 215 13/07 327 D7 I circumflex */ {0x8C,0xD7,1,1},
-/* 139 08/11 213 8B i diaeresis */
-/* 216 13/08 330 D8 I diaeresis */ {0x8B,0xD8,1,1},
-/* 208 13/00 320 D0 Icelandic eth */
-/* 209 13/01 321 D1 Icelandic Eth */ {0xD0,0xD1,1,1},
-/* 164 10/04 244 A4 n tilde */
-/* 165 10/05 245 A5 N tilde */ {0xA4,0xA5,1,1},
-/* 149 09/05 225 95 o grave */
-/* 227 14/03 343 E3 O grave */ {0x95,0xE3,1,1},
-/* 162 10/02 242 A2 o acute */
-/* 224 14/00 340 E0 O acute */ {0xA2,0xE0,1,1},
-/* 147 09/03 223 93 o circumflex */
-/* 226 14/02 342 E2 O circumflex */ {0x93,0xE2,1,1},
-/* 228 14/04 344 E4 o tilde */
-/* 229 14/05 345 E5 O tilde */ {0xE4,0xE5,1,1},
-/* 148 09/04 224 94 o diaeresis */
-/* 153 09/09 231 99 O diaeresis */ {0x94,0x99,1,1},
-/* 155 09/11 233 9B o slash */
-/* 157 09/13 235 9D O slash */ {0x9B,0x9D,1,1},
-/* 151 09/07 227 97 u grave */
-/* 235 14/11 353 EB U grave */ {0x97,0xEB,1,1},
-/* 163 10/03 243 A3 u acute */
-/* 233 14/09 351 E9 U acute */ {0xA3,0xE9,1,1},
-/* 150 09/06 226 96 u circumflex */
-/* 234 14/10 352 EA U circumflex */ {0x96,0xEA,1,1},
-/* 129 08/01 201 81 u diaeresis */
-/* 154 09/10 232 9A U diaeresis */ {0x81,0x9A,1,1},
-/* 236 14/12 354 EC y acute */
-/* 237 14/13 355 ED Y acute */ {0xEC,0xED,1,1},
-/* 231 14/07 347 E7 Icelandic thorn */
-/* 232 14/08 350 E8 Icelandic Thorn */ {0xE7,0xE8,1,1},
-
- {0x9C,0,0,0}, /* Pound */
- {0,0,0,0}
-};
-#else /* KANJI */
-/* lower->upper mapping for IBM Code Page 932 - MS-DOS Japanese SJIS */
-unsigned char cp_932[][4] = {
- {0,0,0,0}
-};
-#endif /* KANJI */
-
-char xx_dos_char_map[256];
-char xx_upper_char_map[256];
-char xx_lower_char_map[256];
-
-char *dos_char_map = xx_dos_char_map;
-char *upper_char_map = xx_upper_char_map;
-char *lower_char_map = xx_lower_char_map;
-
-/*
- * This code has been extended to deal with ascynchronous mappings
- * like MS-DOS Latin US (Code page 437) where things like :
- * a acute are capitalized to 'A', but the reverse mapping
- * must not hold true. This allows the filename case insensitive
- * matching in do_match() to work, as the DOS/Win95/NT client
- * uses 'A' as a mask to match against characters like a acute.
- * This is the meaning behind the parameters that allow a
- * mapping from lower to upper, but not upper to lower.
- */
-
-static void add_dos_char(int lower, BOOL map_lower_to_upper,
- int upper, BOOL map_upper_to_lower)
-{
- lower &= 0xff;
- upper &= 0xff;
- DEBUG(6,("Adding chars 0x%x 0x%x (l->u = %s) (u->l = %s)\n",lower,upper,
- map_lower_to_upper ? "True" : "False",
- map_upper_to_lower ? "True" : "False"));
- if (lower) dos_char_map[lower] = 1;
- if (upper) dos_char_map[upper] = 1;
- if (lower && upper) {
- if(map_upper_to_lower)
- lower_char_map[upper] = (char)lower;
- if(map_lower_to_upper)
- upper_char_map[lower] = (char)upper;
- }
-}
-
-/****************************************************************************
-initialise the charset arrays
-****************************************************************************/
-void charset_initialise()
-{
- int i;
-
-#ifdef LC_ALL
- /* include <locale.h> in includes.h if available for OS */
- /* we take only standard 7-bit ASCII definitions from ctype */
- setlocale(LC_ALL,"C");
-#endif
-
- for (i= 0;i<=255;i++) {
- dos_char_map[i] = 0;
- }
-
- for (i=0;i<=127;i++) {
- if (isalnum((char)i) || strchr("._^$~!#%&-{}()@'`",(char)i))
- add_dos_char(i,False,0,False);
- }
-
- for (i=0; i<=255; i++) {
- char c = (char)i;
- upper_char_map[i] = lower_char_map[i] = c;
- if (isupper(c)) lower_char_map[i] = tolower(c);
- if (islower(c)) upper_char_map[i] = toupper(c);
- }
-}
-
-/****************************************************************************
-load the client codepage.
-****************************************************************************/
-
-typedef unsigned char (*codepage_p)[4];
-
-static codepage_p load_client_codepage( int client_codepage )
-{
- pstring codepage_file_name;
- unsigned char buf[8];
- FILE *fp = NULL;
- unsigned int size;
- codepage_p cp_p = NULL;
- struct stat st;
-
- DEBUG(5, ("load_client_codepage: loading codepage %d.\n", client_codepage));
-
- if(strlen(CODEPAGEDIR) + 14 > sizeof(codepage_file_name))
- {
- DEBUG(0,("load_client_codepage: filename too long to load\n"));
- return NULL;
- }
-
- strcpy(codepage_file_name, CODEPAGEDIR);
- strcat(codepage_file_name, "/");
- strcat(codepage_file_name, "codepage.");
- sprintf( &codepage_file_name[strlen(codepage_file_name)], "%03d",
- client_codepage);
-
- if(!file_exist(codepage_file_name,&st))
- {
- DEBUG(0,("load_client_codepage: filename %s does not exist.\n",
- codepage_file_name));
- return NULL;
- }
-
- /* Check if it is at least big enough to hold the required
- data. Should be 2 byte version, 2 byte codepage, 4 byte length,
- plus zero or more bytes of data. Note that the data cannot be more
- than 512 bytes - giving a max size of 520.
- */
- size = (unsigned int)st.st_size;
-
- if( size < CODEPAGE_HEADER_SIZE || size > (CODEPAGE_HEADER_SIZE + 256))
- {
- DEBUG(0,("load_client_codepage: file %s is an incorrect size for a \
-code page file.\n", codepage_file_name));
- return NULL;
- }
-
- /* Read the first 8 bytes of the codepage file - check
- the version number and code page number. All the data
- is held in little endian format.
- */
-
- if((fp = fopen( codepage_file_name, "r")) == NULL)
- {
- DEBUG(0,("load_client_codepage: cannot open file %s. Error was %s\n",
- codepage_file_name, strerror(errno)));
- return NULL;
- }
-
- if(fread( buf, 1, CODEPAGE_HEADER_SIZE, fp)!=CODEPAGE_HEADER_SIZE)
- {
- DEBUG(0,("load_client_codepage: cannot read header from file %s. Error was %s\n",
- codepage_file_name, strerror(errno)));
- goto clean_and_exit;
- }
-
- /* Check the version value */
- if(SVAL(buf,CODEPAGE_VERSION_OFFSET) != CODEPAGE_FILE_VERSION_ID)
- {
- DEBUG(0,("load_client_codepage: filename %s has incorrect version id. \
-Needed %hu, got %hu.\n",
- codepage_file_name, (uint16)CODEPAGE_FILE_VERSION_ID,
- SVAL(buf,CODEPAGE_VERSION_OFFSET)));
- goto clean_and_exit;
- }
-
- /* Check the codepage matches */
- if(SVAL(buf,CODEPAGE_CLIENT_CODEPAGE_OFFSET) != (uint16)client_codepage)
- {
- DEBUG(0,("load_client_codepage: filename %s has incorrect codepage. \
-Needed %hu, got %hu.\n",
- codepage_file_name, (uint16)client_codepage,
- SVAL(buf,CODEPAGE_CLIENT_CODEPAGE_OFFSET)));
- goto clean_and_exit;
- }
-
- /* Check the length is correct. */
- if(IVAL(buf,CODEPAGE_LENGTH_OFFSET) !=
- (unsigned int)(size - CODEPAGE_HEADER_SIZE))
- {
- DEBUG(0,("load_client_codepage: filename %s has incorrect size headers. \
-Needed %u, got %u.\n", codepage_file_name, size - CODEPAGE_HEADER_SIZE,
- IVAL(buf,CODEPAGE_LENGTH_OFFSET)));
- goto clean_and_exit;
- }
-
- size -= CODEPAGE_HEADER_SIZE; /* Remove header */
-
- /* Make sure the size is a multiple of 4. */
- if((size % 4 ) != 0)
- {
- DEBUG(0,("load_client_codepage: filename %s has a codepage size not a \
-multiple of 4.\n", codepage_file_name));
- goto clean_and_exit;
- }
-
- /* Allocate space for the code page file and read it all in. */
- if((cp_p = (codepage_p)malloc( size + 4 )) == NULL)
- {
- DEBUG(0,("load_client_codepage: malloc fail.\n"));
- goto clean_and_exit;
- }
-
- if(fread( (char *)cp_p, 1, size, fp)!=size)
- {
- DEBUG(0,("load_client_codepage: read fail on file %s. Error was %s.\n",
- codepage_file_name, strerror(errno)));
- goto clean_and_exit;
- }
-
- /* Ensure array is correctly terminated. */
- memset(((char *)cp_p) + size, '\0', 4);
-
- fclose(fp);
- return cp_p;
-
-clean_and_exit:
-
- /* pseudo destructor :-) */
-
- if(fp != NULL)
- fclose(fp);
- if(cp_p)
- free((char *)cp_p);
- return NULL;
-}
-
-/****************************************************************************
-initialise the client codepage.
-****************************************************************************/
-void codepage_initialise(int client_codepage)
-{
- int i;
- codepage_p cp = NULL;
- static BOOL done = False;
-
- if(done == True)
- {
- DEBUG(6,
- ("codepage_initialise: called twice - ignoring second client code page = %d\n",
- client_codepage));
- return;
- }
-
- DEBUG(6,("codepage_initialise: client code page = %d\n", client_codepage));
-
- /*
- * Known client codepages - these can be added to.
- */
- cp = load_client_codepage( client_codepage );
-
- if(cp == NULL)
- {
-#ifdef KANJI
- DEBUG(6,("codepage_initialise: loading dynamic codepage file %s/codepage.%d \
-for code page %d failed. Using default client codepage 932\n",
- CODEPAGEDIR, client_codepage, client_codepage));
- cp = cp_932;
-#else /* KANJI */
- DEBUG(6,("codepage_initialise: loading dynamic codepage file %s/codepage.%d \
-for code page %d failed. Using default client codepage 850\n",
- CODEPAGEDIR, client_codepage, client_codepage));
- cp = cp_850;
-#endif /* KANJI */
- }
-
- if(cp)
- {
- for(i = 0; !((cp[i][0] == '\0') && (cp[i][1] == '\0')); i++)
- add_dos_char(cp[i][0], (BOOL)cp[i][2], cp[i][1], (BOOL)cp[i][3]);
- }
-
- done = True;
-}
-
-/*******************************************************************
-add characters depending on a string passed by the user
-********************************************************************/
-void add_char_string(char *s)
-{
- char *extra_chars = (char *)strdup(s);
- char *t;
- if (!extra_chars) return;
-
- for (t=strtok(extra_chars," \t\r\n"); t; t=strtok(NULL," \t\r\n")) {
- char c1=0,c2=0;
- int i1=0,i2=0;
- if (isdigit((unsigned char)*t) || (*t)=='-') {
- sscanf(t,"%i:%i",&i1,&i2);
- add_dos_char(i1,True,i2,True);
- } else {
- sscanf(t,"%c:%c",&c1,&c2);
- add_dos_char((unsigned char)c1,True,(unsigned char)c2, True);
- }
- }
-
- free(extra_chars);
-}
diff --git a/source/lib/fault.c b/source/lib/fault.c
deleted file mode 100644
index 61715a4f225..00000000000
--- a/source/lib/fault.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Critical Fault handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-extern int DEBUGLEVEL;
-
-
-static void (*cont_fn)();
-
-
-/*******************************************************************
-report a fault
-********************************************************************/
-static void fault_report(int sig)
-{
- DEBUG(0,("===============================================================\n"));
- DEBUG(0,("INTERNAL ERROR: Signal %d in pid %d (%s)",sig,(int)getpid(),VERSION));
- DEBUG(0,("\nPlease read the file BUGS.txt in the distribution\n"));
- DEBUG(0,("===============================================================\n"));
-
-#if AJT
- ajt_panic();
-#endif
-
- if (cont_fn)
- {
- fault_setup(cont_fn);
- cont_fn(NULL);
-#ifdef SIGSEGV
- signal(SIGSEGV,SIGNAL_CAST SIG_DFL);
-#endif
-#ifdef SIGBUS
- signal(SIGBUS,SIGNAL_CAST SIG_DFL);
-#endif
- return; /* this should cause a core dump */
- }
- exit(1);
-}
-
-/****************************************************************************
-catch serious errors
-****************************************************************************/
-static void sig_fault(int sig)
-{
- fault_report(sig);
-}
-
-/*******************************************************************
-setup our fault handlers
-********************************************************************/
-void fault_setup(void (*fn)())
-{
- cont_fn = fn;
-
-#ifdef SIGSEGV
- signal(SIGSEGV,SIGNAL_CAST sig_fault);
-#endif
-#ifdef SIGBUS
- signal(SIGBUS,SIGNAL_CAST sig_fault);
-#endif
-}
-
-
-
diff --git a/source/lib/getsmbpass.c b/source/lib/getsmbpass.c
deleted file mode 100644
index e8cb683d0b1..00000000000
--- a/source/lib/getsmbpass.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* Copyright (C) 1992-1997 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-/* Modified to use with samba by Jeremy Allison, 8th July 1995. */
-
-#include "includes.h"
-
-#ifdef REPLACE_GETPASS
-
-#ifdef SYSV_TERMIO
-
-/* SYSTEM V TERMIO HANDLING */
-
-static struct termio t;
-
-#define ECHO_IS_ON(t) ((t).c_lflag & ECHO)
-#define TURN_ECHO_OFF(t) ((t).c_lflag &= ~ECHO)
-#define TURN_ECHO_ON(t) ((t).c_lflag |= ECHO)
-
-#ifndef TCSAFLUSH
-#define TCSAFLUSH 1
-#endif
-
-#ifndef TCSANOW
-#define TCSANOW 0
-#endif
-
- int tcgetattr(int fd, struct termio *t)
-{
- return ioctl(fd, TCGETA, t);
-}
-
- int tcsetattr(int fd, int flags, struct termio *t)
-{
- if(flags & TCSAFLUSH)
- ioctl(fd, TCFLSH, TCIOFLUSH);
- return ioctl(fd, TCSETS, t);
-}
-
-#else /* SYSV_TERMIO */
-#ifdef BSD_TERMIO
-
-/* BSD TERMIO HANDLING */
-
-static struct sgttyb t;
-
-#define ECHO_IS_ON(t) ((t).sg_flags & ECHO)
-#define TURN_ECHO_OFF(t) ((t).sg_flags &= ~ECHO)
-#define TURN_ECHO_ON(t) ((t).sg_flags |= ECHO)
-
-#ifndef TCSAFLUSH
-#define TCSAFLUSH 1
-#endif
-
-#ifndef TCSANOW
-#define TCSANOW 0
-#endif
-
- int tcgetattr(int fd, struct sgttyb *t)
-{
- return ioctl(fd, TIOCGETP, (char *)t);
-}
-
- int tcsetattr(int fd, int flags, struct sgttyb *t)
-{
- return ioctl(fd, TIOCSETP, (char *)t);
-}
-
-#else /* BSD_TERMIO */
-
-/* POSIX TERMIO HANDLING */
-#define ECHO_IS_ON(t) ((t).c_lflag & ECHO)
-#define TURN_ECHO_OFF(t) ((t).c_lflag &= ~ECHO)
-#define TURN_ECHO_ON(t) ((t).c_lflag |= ECHO)
-
-static struct termios t;
-#endif /* BSD_TERMIO */
-#endif /* SYSV_TERMIO */
-
-char *getsmbpass(char *prompt)
-{
- FILE *in, *out;
- int echo_off;
- static char buf[256];
- static size_t bufsize = sizeof(buf);
- size_t nread;
-
- /* Catch problematic signals */
- signal(SIGINT, SIGNAL_CAST SIG_IGN);
-
- /* Try to write to and read from the terminal if we can.
- If we can't open the terminal, use stderr and stdin. */
-
- in = fopen ("/dev/tty", "w+");
- if (in == NULL)
- {
- in = stdin;
- out = stderr;
- }
- else
- out = in;
-
- setvbuf(in, NULL, _IONBF, 0);
-
- /* Turn echoing off if it is on now. */
-
- if (tcgetattr (fileno (in), &t) == 0)
- {
- if (ECHO_IS_ON(t))
- {
- TURN_ECHO_OFF(t);
- echo_off = tcsetattr (fileno (in), TCSAFLUSH, &t) == 0;
- TURN_ECHO_ON(t);
- }
- else
- echo_off = 0;
- }
- else
- echo_off = 0;
-
- /* Write the prompt. */
- fputs (prompt, out);
- fflush (out);
-
- /* Read the password. */
- buf[0] = 0;
- fgets(buf, bufsize, in);
- nread = strlen(buf);
- if (buf[nread - 1] == '\n')
- buf[nread - 1] = '\0';
-
- /* Restore echoing. */
- if (echo_off)
- (void) tcsetattr (fileno (in), TCSANOW, &t);
-
- if (in != stdin)
- /* We opened the terminal; now close it. */
- fclose (in);
-
- /* Catch problematic signals */
- signal(SIGINT, SIGNAL_CAST SIG_DFL);
-
- printf("\n");
- return buf;
-}
-
-#else
-
- void getsmbpasswd_dummy() {;}
-#endif
diff --git a/source/lib/interface.c b/source/lib/interface.c
deleted file mode 100644
index 147425d0fc1..00000000000
--- a/source/lib/interface.c
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- multiple interface handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-struct in_addr ipzero;
-struct in_addr wins_ip;
-static struct in_addr default_ip;
-static struct in_addr default_bcast;
-static struct in_addr default_nmask;
-static BOOL got_ip=False;
-static BOOL got_bcast=False;
-static BOOL got_nmask=False;
-
-struct interface *local_interfaces = NULL;
-
-struct interface *last_iface;
-
-/****************************************************************************
-calculate the default netmask for an address
-****************************************************************************/
-static void default_netmask(struct in_addr *inm, struct in_addr *iad)
-{
- uint32 ad = ntohl(iad->s_addr);
- uint32 nm;
- /*
- ** Guess a netmask based on the class of the IP address given.
- */
- if ( (ad & 0x80000000) == 0 ) {
- /* class A address */
- nm = 0xFF000000;
- } else if ( (ad & 0xC0000000) == 0x80000000 ) {
- /* class B address */
- nm = 0xFFFF0000;
- } else if ( (ad & 0xE0000000) == 0xC0000000 ) {
- /* class C address */
- nm = 0xFFFFFF00;
- } else {
- /* class D or E; netmask doesn't make much sense - guess 4 bits */
- nm = 0xFFFFFFF0;
- }
- inm->s_addr = htonl(nm);
-}
-
-
-/****************************************************************************
- get the broadcast address for our address
-(troyer@saifr00.ateng.az.honeywell.com)
-****************************************************************************/
-static void get_broadcast(struct in_addr *if_ipaddr,
- struct in_addr *if_bcast,
- struct in_addr *if_nmask)
-{
- BOOL found = False;
-#ifndef NO_GET_BROADCAST
- int sock = -1; /* AF_INET raw socket desc */
- char buff[1024];
- struct ifreq *ifr=NULL;
- int i;
-
-#if defined(EVEREST)
- int n_interfaces;
- struct ifconf ifc;
- struct ifreq *ifreqs;
-#elif defined(USE_IFREQ)
- struct ifreq ifreq;
- struct strioctl strioctl;
- struct ifconf *ifc;
-#else
- struct ifconf ifc;
-#endif
-#endif
-
- /* get a default netmask and broadcast */
- default_netmask(if_nmask, if_ipaddr);
-
-#ifndef NO_GET_BROADCAST
- /* Create a socket to the INET kernel. */
-#if USE_SOCKRAW
- if ((sock = socket(AF_INET, SOCK_RAW, PF_INET )) < 0)
-#else
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0 )) < 0)
-#endif
- {
- DEBUG(0,( "Unable to open socket to get broadcast address\n"));
- return;
- }
-
- /* Get a list of the configured interfaces */
-#ifdef EVEREST
- /* This is part of SCO Openserver 5: The ioctls are no longer part
- if the lower level STREAMS interface glue. They are now real
- ioctl calls */
-
- if (ioctl(sock, SIOCGIFANUM, &n_interfaces) < 0) {
- DEBUG(0,( "SIOCGIFANUM: %s\n", strerror(errno)));
- } else {
- DEBUG(0,( "number of interfaces returned is: %d\n", n_interfaces));
-
- ifc.ifc_len = sizeof(struct ifreq) * n_interfaces;
- ifc.ifc_buf = (caddr_t) alloca(ifc.ifc_len);
-
- if (ioctl(sock, SIOCGIFCONF, &ifc) < 0)
- DEBUG(0, ( "SIOCGIFCONF: %s\n", strerror(errno)));
- else {
- ifr = ifc.ifc_req;
-
- for (i = 0; i < n_interfaces; ++i) {
- if (if_ipaddr->s_addr ==
- ((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr.s_addr) {
- found = True;
- break;
- }
- }
- }
- }
-#elif defined(USE_IFREQ)
- ifc = (struct ifconf *)buff;
- ifc->ifc_len = BUFSIZ - sizeof(struct ifconf);
- strioctl.ic_cmd = SIOCGIFCONF;
- strioctl.ic_dp = (char *)ifc;
- strioctl.ic_len = sizeof(buff);
- if (ioctl(sock, I_STR, &strioctl) < 0) {
- DEBUG(0,( "I_STR/SIOCGIFCONF: %s\n", strerror(errno)));
- } else {
- ifr = (struct ifreq *)ifc->ifc_req;
-
- /* Loop through interfaces, looking for given IP address */
- for (i = ifc->ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
- if (if_ipaddr->s_addr ==
- (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
- found = True;
- break;
- }
- }
- }
-#elif defined(__FreeBSD__) || defined(NETBSD) || defined(AMIGA) || defined(_AIX41)
- ifc.ifc_len = sizeof(buff);
- ifc.ifc_buf = buff;
- if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
- DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
- } else {
- ifr = ifc.ifc_req;
- /* Loop through interfaces, looking for given IP address */
- i = ifc.ifc_len;
- while (i > 0) {
- if (if_ipaddr->s_addr ==
- (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
- found = True;
- break;
- }
- i -= ifr->ifr_addr.sa_len + IFNAMSIZ;
- ifr = (struct ifreq*) ((char*) ifr + ifr->ifr_addr.sa_len + IFNAMSIZ);
- }
- }
-#else
- ifc.ifc_len = sizeof(buff);
- ifc.ifc_buf = buff;
- if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
- DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
- } else {
- ifr = ifc.ifc_req;
-
- /* Loop through interfaces, looking for given IP address */
- for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
-#ifdef BSDI
- if (ioctl(sock, SIOCGIFADDR, ifr) < 0) break;
-#endif
- if (if_ipaddr->s_addr ==
- (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
- found = True;
- break;
- }
- }
- }
-#endif
-
- if (!found) {
- DEBUG(0,("No interface found for address %s\n", inet_ntoa(*if_ipaddr)));
- } else {
- /* Get the netmask address from the kernel */
-#ifdef USE_IFREQ
- ifreq = *ifr;
-
- strioctl.ic_cmd = SIOCGIFNETMASK;
- strioctl.ic_dp = (char *)&ifreq;
- strioctl.ic_len = sizeof(struct ifreq);
- if (ioctl(sock, I_STR, &strioctl) < 0)
- DEBUG(0,("Failed I_STR/SIOCGIFNETMASK: %s\n", strerror(errno)));
- else
- *if_nmask = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
-#else
- if (ioctl(sock, SIOCGIFNETMASK, ifr) < 0)
- DEBUG(0,("SIOCGIFNETMASK failed\n"));
- else
- *if_nmask = ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
-#endif
-
- DEBUG(4,("Netmask for %s = %s\n", ifr->ifr_name,
- inet_ntoa(*if_nmask)));
- }
-
- /* Close up shop */
- (void) close(sock);
-
-#endif
-
- /* sanity check on the netmask */
- {
- uint32 nm = ntohl(if_nmask->s_addr);
- if ((nm >> 24) != 0xFF) {
- DEBUG(0,("Impossible netmask %s - using defaults\n",inet_ntoa(*if_nmask)));
- default_netmask(if_nmask, if_ipaddr);
- }
- }
-
- /* derive the broadcast assuming a 1's broadcast, as this is what
- all MS operating systems do, we have to comply even if the unix
- box is setup differently */
- {
- uint32 ad = ntohl(if_ipaddr->s_addr);
- uint32 nm = ntohl(if_nmask->s_addr);
- uint32 bc = (ad & nm) | (0xffffffff & ~nm);
- if_bcast->s_addr = htonl(bc);
- }
-
- DEBUG(4,("Derived broadcast address %s\n", inet_ntoa(*if_bcast)));
-} /* get_broadcast */
-
-
-
-/****************************************************************************
-load a list of network interfaces
-****************************************************************************/
-static void interpret_interfaces(char *s, struct interface **interfaces,
- char *description)
-{
- char *ptr = s;
- fstring token;
- struct interface *iface;
- struct in_addr ip;
-
- ipzero = *interpret_addr2("0.0.0.0");
- wins_ip = *interpret_addr2("255.255.255.255");
-
- while (next_token(&ptr,token,NULL)) {
- /* parse it into an IP address/netmasklength pair */
- char *p = strchr(token,'/');
- if (p) *p = 0;
-
- ip = *interpret_addr2(token);
-
- /* maybe we already have it listed */
- {
- struct interface *i;
- for (i=(*interfaces);i;i=i->next)
- if (ip_equal(ip,i->ip)) break;
- if (i) continue;
- }
-
- iface = (struct interface *)malloc(sizeof(*iface));
- if (!iface) return;
-
- iface->ip = ip;
-
- if (p) {
- if (strlen(p+1)>2)
- iface->nmask = *interpret_addr2(p+1);
- else
- iface->nmask.s_addr = htonl(~((1<<(32-atoi(p+1)))-1));
- } else {
- default_netmask(&iface->nmask,&iface->ip);
- }
- iface->bcast.s_addr = iface->ip.s_addr | ~iface->nmask.s_addr;
- iface->next = NULL;
-
- if (!(*interfaces)) {
- (*interfaces) = iface;
- } else {
- last_iface->next = iface;
- }
- last_iface = iface;
- DEBUG(1,("Added %s ip=%s ",description,inet_ntoa(iface->ip)));
- DEBUG(1,("bcast=%s ",inet_ntoa(iface->bcast)));
- DEBUG(1,("nmask=%s\n",inet_ntoa(iface->nmask)));
- }
-
- if (*interfaces) return;
-
- /* setup a default interface */
- iface = (struct interface *)malloc(sizeof(*iface));
- if (!iface) return;
-
- iface->next = NULL;
-
- if (got_ip) {
- iface->ip = default_ip;
- } else {
- get_myname(NULL,&iface->ip);
- }
-
- if (got_bcast) {
- iface->bcast = default_bcast;
- } else {
- get_broadcast(&iface->ip,&iface->bcast,&iface->nmask);
- }
-
- if (got_nmask) {
- iface->nmask = default_nmask;
- iface->bcast.s_addr = iface->ip.s_addr | ~iface->nmask.s_addr;
- }
-
- if (iface->bcast.s_addr != (iface->ip.s_addr | ~iface->nmask.s_addr)) {
- DEBUG(2,("Warning: inconsistant interface %s\n",inet_ntoa(iface->ip)));
- }
-
- iface->next = NULL;
- (*interfaces) = last_iface = iface;
-
- DEBUG(2,("Added interface ip=%s ",inet_ntoa(iface->ip)));
- DEBUG(2,("bcast=%s ",inet_ntoa(iface->bcast)));
- DEBUG(2,("nmask=%s\n",inet_ntoa(iface->nmask)));
-}
-
-
-/****************************************************************************
-load the remote and local interfaces
-****************************************************************************/
-void load_interfaces(void)
-{
- /* add the machine's interfaces to local interface structure*/
- interpret_interfaces(lp_interfaces(), &local_interfaces,"interface");
-}
-
-
-/****************************************************************************
- override the defaults
- **************************************************************************/
-void iface_set_default(char *ip,char *bcast,char *nmask)
-{
- if (ip) {
- got_ip = True;
- default_ip = *interpret_addr2(ip);
- }
-
- if (bcast) {
- got_bcast = True;
- default_bcast = *interpret_addr2(bcast);
- }
-
- if (nmask) {
- got_nmask = True;
- default_nmask = *interpret_addr2(nmask);
- }
-}
-
-
-/****************************************************************************
- check if an IP is one of mine
- **************************************************************************/
-BOOL ismyip(struct in_addr ip)
-{
- struct interface *i;
- for (i=local_interfaces;i;i=i->next)
- if (ip_equal(i->ip,ip)) return True;
- return False;
-}
-
-/****************************************************************************
- check if a bcast is one of mine
- **************************************************************************/
-BOOL ismybcast(struct in_addr bcast)
-{
- struct interface *i;
- for (i=local_interfaces;i;i=i->next)
- if (ip_equal(i->bcast,bcast)) return True;
- return False;
-}
-
-/****************************************************************************
- how many interfaces do we have
- **************************************************************************/
-int iface_count(void)
-{
- int ret = 0;
- struct interface *i;
-
- for (i=local_interfaces;i;i=i->next)
- ret++;
- return ret;
-}
-
-/****************************************************************************
- return IP of the Nth interface
- **************************************************************************/
-struct in_addr *iface_n_ip(int n)
-{
- struct interface *i;
-
- for (i=local_interfaces;i && n;i=i->next)
- n--;
-
- if (i) return &i->ip;
- return NULL;
-}
-
-static struct interface *iface_find(struct in_addr ip)
-{
- struct interface *i;
- if (zero_ip(ip)) return local_interfaces;
-
- for (i=local_interfaces;i;i=i->next)
- if (same_net(i->ip,ip,i->nmask)) return i;
-
- return local_interfaces;
-}
-
-/* these 3 functions return the ip/bcast/nmask for the interface
- most appropriate for the given ip address */
-
-struct in_addr *iface_bcast(struct in_addr ip)
-{
- return(&iface_find(ip)->bcast);
-}
-
-struct in_addr *iface_nmask(struct in_addr ip)
-{
- return(&iface_find(ip)->nmask);
-}
-
-struct in_addr *iface_ip(struct in_addr ip)
-{
- return(&iface_find(ip)->ip);
-}
-
-
-
diff --git a/source/lib/kanji.c b/source/lib/kanji.c
deleted file mode 100644
index 5d7de87248d..00000000000
--- a/source/lib/kanji.c
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Kanji Extensions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Adding for Japanese language by <fujita@ainix.isac.co.jp> 1994.9.5
- and extend coding system to EUC/SJIS/JIS/HEX at 1994.10.11
- and add all jis codes sequence type at 1995.8.16
- Notes: Hexadecimal code by <ohki@gssm.otuka.tsukuba.ac.jp>
-*/
-
-#define _KANJI_C_
-#include "includes.h"
-
-/* coding system keep in */
-int coding_system = SJIS_CODE;
-
-/* jis si/so sequence */
-char jis_kso = JIS_KSO;
-char jis_ksi = JIS_KSI;
-char hex_tag = HEXTAG;
-
-/*******************************************************************
- SHIFT JIS functions
-********************************************************************/
-/*******************************************************************
- search token from S1 separated any char of S2
- S1 contain SHIFT JIS chars.
-********************************************************************/
-char *sj_strtok(char *s1, char *s2)
-{
- static char *s = NULL;
- char *q;
- if (!s1) {
- if (!s) {
- return NULL;
- }
- s1 = s;
- }
- for (q = s1; *s1; ) {
- if (is_shift_jis (*s1)) {
- s1 += 2;
- } else if (is_kana (*s1)) {
- s1++;
- } else {
- char *p = strchr (s2, *s1);
- if (p) {
- if (s1 != q) {
- s = s1 + 1;
- *s1 = '\0';
- return q;
- }
- q = s1 + 1;
- }
- s1++;
- }
- }
- s = NULL;
- if (*q) {
- return q;
- }
- return NULL;
-}
-
-/*******************************************************************
- search string S2 from S1
- S1 contain SHIFT JIS chars.
-********************************************************************/
-char *sj_strstr(char *s1, char *s2)
-{
- int len = strlen ((char *) s2);
- if (!*s2)
- return (char *) s1;
- for (;*s1;) {
- if (*s1 == *s2) {
- if (strncmp (s1, s2, len) == 0)
- return (char *) s1;
- }
- if (is_shift_jis (*s1)) {
- s1 += 2;
- } else {
- s1++;
- }
- }
- return 0;
-}
-
-/*******************************************************************
- Search char C from beginning of S.
- S contain SHIFT JIS chars.
-********************************************************************/
-char *sj_strchr (char *s, int c)
-{
- for (; *s; ) {
- if (*s == c)
- return (char *) s;
- if (is_shift_jis (*s)) {
- s += 2;
- } else {
- s++;
- }
- }
- return 0;
-}
-
-/*******************************************************************
- Search char C end of S.
- S contain SHIFT JIS chars.
-********************************************************************/
-char *sj_strrchr(char *s, int c)
-{
- char *q;
-
- for (q = 0; *s; ) {
- if (*s == c) {
- q = (char *) s;
- }
- if (is_shift_jis (*s)) {
- s += 2;
- } else {
- s++;
- }
- }
- return q;
-}
-
-/*******************************************************************
- Code conversion
-********************************************************************/
-/* convesion buffer */
-static char cvtbuf[1024];
-
-/*******************************************************************
- EUC <-> SJIS
-********************************************************************/
-static int euc2sjis (int hi, int lo)
-{
- if (hi & 1)
- return ((hi / 2 + (hi < 0xdf ? 0x31 : 0x71)) << 8) |
- (lo - (lo >= 0xe0 ? 0x60 : 0x61));
- else
- return ((hi / 2 + (hi < 0xdf ? 0x30 : 0x70)) << 8) | (lo - 2);
-}
-
-static int sjis2euc (int hi, int lo)
-{
- if (lo >= 0x9f)
- return ((hi * 2 - (hi >= 0xe0 ? 0xe0 : 0x60)) << 8) | (lo + 2);
- else
- return ((hi * 2 - (hi >= 0xe0 ? 0xe1 : 0x61)) << 8) |
- (lo + (lo >= 0x7f ? 0x60 : 0x61));
-}
-
-/*******************************************************************
- Convert FROM contain SHIFT JIS codes to EUC codes
- return converted buffer
-********************************************************************/
-static char *sj_to_euc(char *from, BOOL overwrite)
-{
- char *out;
- char *save;
-
- save = (char *) from;
- for (out = cvtbuf; *from;) {
- if (is_shift_jis (*from)) {
- int code = sjis2euc ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- } else if (is_kana (*from)) {
- *out++ = euc_kana;
- *out++ = *from++;
- } else {
- *out++ = *from++;
- }
- }
- *out = 0;
- if (overwrite) {
- strcpy((char *) save, (char *) cvtbuf);
- return (char *) save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain EUC codes to SHIFT JIS codes
- return converted buffer
-********************************************************************/
-static char *euc_to_sj(char *from, BOOL overwrite)
-{
- char *out;
- char *save;
-
- save = (char *) from;
- for (out = cvtbuf; *from; ) {
- if (is_euc (*from)) {
- int code = euc2sjis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- } else if (is_euc_kana (*from)) {
- *out++ = from[1];
- from += 2;
- } else {
- *out++ = *from++;
- }
- }
- *out = 0;
- if (overwrite) {
- strcpy(save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- JIS7,JIS8,JUNET <-> SJIS
-********************************************************************/
-static int sjis2jis(int hi, int lo)
-{
- if (lo >= 0x9f)
- return ((hi * 2 - (hi >= 0xe0 ? 0x160 : 0xe0)) << 8) | (lo - 0x7e);
- else
- return ((hi * 2 - (hi >= 0xe0 ? 0x161 : 0xe1)) << 8) |
- (lo - (lo >= 0x7f ? 0x20 : 0x1f));
-}
-
-static int jis2sjis(int hi, int lo)
-{
- if (hi & 1)
- return ((hi / 2 + (hi < 0x5f ? 0x71 : 0xb1)) << 8) |
- (lo + (lo >= 0x60 ? 0x20 : 0x1f));
- else
- return ((hi / 2 + (hi < 0x5f ? 0x70 : 0xb0)) << 8) | (lo + 0x7e);
-}
-
-/*******************************************************************
- Convert FROM contain JIS codes to SHIFT JIS codes
- return converted buffer
-********************************************************************/
-static char *jis8_to_sj(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from;) {
- if (is_esc (*from)) {
- if (is_so1 (from[1]) && is_so2 (from[2])) {
- shifted = _KJ_KANJI;
- from += 3;
- } else if (is_si1 (from[1]) && is_si2 (from[2])) {
- shifted = _KJ_ROMAN;
- from += 3;
- } else { /* sequence error */
- goto normal;
- }
- } else {
- normal:
- switch (shifted) {
- default:
- case _KJ_ROMAN:
- *out++ = *from++;
- break;
- case _KJ_KANJI:
- {
- int code = jis2sjis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- }
- break;
- }
- }
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain SHIFT JIS codes to JIS codes
- return converted buffer
-********************************************************************/
-static char *sj_to_jis8(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from; ) {
- if (is_shift_jis (*from)) {
- int code;
- switch (shifted) {
- case _KJ_ROMAN: /* to KANJI */
- *out++ = jis_esc;
- *out++ = jis_so1;
- *out++ = jis_kso;
- shifted = _KJ_KANJI;
- break;
- }
- code = sjis2jis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- } else {
- switch (shifted) {
- case _KJ_KANJI: /* to ROMAN/KANA */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_ksi;
- shifted = _KJ_ROMAN;
- break;
- }
- *out++ = *from++;
- }
- }
- switch (shifted) {
- case _KJ_KANJI: /* to ROMAN/KANA */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_ksi;
- shifted = _KJ_ROMAN;
- break;
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain 7 bits JIS codes to SHIFT JIS codes
- return converted buffer
-********************************************************************/
-static char *jis7_to_sj(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from;) {
- if (is_esc (*from)) {
- if (is_so1 (from[1]) && is_so2 (from[2])) {
- shifted = _KJ_KANJI;
- from += 3;
- } else if (is_si1 (from[1]) && is_si2 (from[2])) {
- shifted = _KJ_ROMAN;
- from += 3;
- } else { /* sequence error */
- goto normal;
- }
- } else if (is_so (*from)) {
- shifted = _KJ_KANA; /* to KANA */
- from++;
- } else if (is_si (*from)) {
- shifted = _KJ_ROMAN; /* to ROMAN */
- from++;
- } else {
- normal:
- switch (shifted) {
- default:
- case _KJ_ROMAN:
- *out++ = *from++;
- break;
- case _KJ_KANJI:
- {
- int code = jis2sjis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- }
- break;
- case _KJ_KANA:
- *out++ = ((int) from[0]) + 0x80;
- break;
- }
- }
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain SHIFT JIS codes to 7 bits JIS codes
- return converted buffer
-********************************************************************/
-static char *sj_to_jis7(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from; ) {
- if (is_shift_jis (*from)) {
- int code;
- switch (shifted) {
- case _KJ_KANA:
- *out++ = jis_si; /* to ROMAN and through down */
- case _KJ_ROMAN: /* to KANJI */
- *out++ = jis_esc;
- *out++ = jis_so1;
- *out++ = jis_kso;
- shifted = _KJ_KANJI;
- break;
- }
- code = sjis2jis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- } else if (is_kana (from[0])) {
- switch (shifted) {
- case _KJ_KANJI: /* to ROMAN */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_ksi;
- case _KJ_ROMAN: /* to KANA */
- *out++ = jis_so;
- shifted = _KJ_KANA;
- break;
- }
- *out++ = ((int) *from++) - 0x80;
- } else {
- switch (shifted) {
- case _KJ_KANA:
- *out++ = jis_si; /* to ROMAN */
- shifted = _KJ_ROMAN;
- break;
- case _KJ_KANJI: /* to ROMAN */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_ksi;
- shifted = _KJ_ROMAN;
- break;
- }
- *out++ = *from++;
- }
- }
- switch (shifted) {
- case _KJ_KANA:
- *out++ = jis_si; /* to ROMAN */
- break;
- case _KJ_KANJI: /* to ROMAN */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_ksi;
- break;
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain 7 bits JIS(junet) codes to SHIFT JIS codes
- return converted buffer
-********************************************************************/
-static char *junet_to_sj(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from;) {
- if (is_esc (*from)) {
- if (is_so1 (from[1]) && is_so2 (from[2])) {
- shifted = _KJ_KANJI;
- from += 3;
- } else if (is_si1 (from[1]) && is_si2 (from[2])) {
- shifted = _KJ_ROMAN;
- from += 3;
- } else if (is_juk1(from[1]) && is_juk2 (from[2])) {
- shifted = _KJ_KANA;
- from += 3;
- } else { /* sequence error */
- goto normal;
- }
- } else {
- normal:
- switch (shifted) {
- default:
- case _KJ_ROMAN:
- *out++ = *from++;
- break;
- case _KJ_KANJI:
- {
- int code = jis2sjis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- }
- break;
- case _KJ_KANA:
- *out++ = ((int) from[0]) + 0x80;
- break;
- }
- }
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- Convert FROM contain SHIFT JIS codes to 7 bits JIS(junet) codes
- return converted buffer
-********************************************************************/
-static char *sj_to_junet(char *from, BOOL overwrite)
-{
- char *out;
- int shifted;
- char *save;
-
- shifted = _KJ_ROMAN;
- save = (char *) from;
- for (out = cvtbuf; *from; ) {
- if (is_shift_jis (*from)) {
- int code;
- switch (shifted) {
- case _KJ_KANA:
- case _KJ_ROMAN: /* to KANJI */
- *out++ = jis_esc;
- *out++ = jis_so1;
- *out++ = jis_so2;
- shifted = _KJ_KANJI;
- break;
- }
- code = sjis2jis ((int) from[0] & 0xff, (int) from[1] & 0xff);
- *out++ = (code >> 8) & 0xff;
- *out++ = code;
- from += 2;
- } else if (is_kana (from[0])) {
- switch (shifted) {
- case _KJ_KANJI: /* to ROMAN */
- case _KJ_ROMAN: /* to KANA */
- *out++ = jis_esc;
- *out++ = junet_kana1;
- *out++ = junet_kana2;
- shifted = _KJ_KANA;
- break;
- }
- *out++ = ((int) *from++) - 0x80;
- } else {
- switch (shifted) {
- case _KJ_KANA:
- case _KJ_KANJI: /* to ROMAN */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_si2;
- shifted = _KJ_ROMAN;
- break;
- }
- *out++ = *from++;
- }
- }
- switch (shifted) {
- case _KJ_KANA:
- case _KJ_KANJI: /* to ROMAN */
- *out++ = jis_esc;
- *out++ = jis_si1;
- *out++ = jis_si2;
- break;
- }
- *out = 0;
- if (overwrite) {
- strcpy (save, (char *) cvtbuf);
- return save;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- HEX <-> SJIS
-********************************************************************/
-/* ":xx" -> a byte */
-static char *hex_to_sj(char *from, BOOL overwrite)
-{
- char *sp, *dp;
-
- sp = (char *) from;
- dp = cvtbuf;
- while (*sp) {
- if (*sp == hex_tag && isxdigit (sp[1]) && isxdigit (sp[2])) {
- *dp++ = (hex2bin (sp[1])<<4) | (hex2bin (sp[2]));
- sp += 3;
- } else
- *dp++ = *sp++;
- }
- *dp = '\0';
- if (overwrite) {
- strcpy ((char *) from, (char *) cvtbuf);
- return (char *) from;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- kanji/kana -> ":xx"
-********************************************************************/
-static char *sj_to_hex(char *from, BOOL overwrite)
-{
- unsigned char *sp, *dp;
-
- sp = (unsigned char*) from;
- dp = (unsigned char*) cvtbuf;
- while (*sp) {
- if (is_kana(*sp)) {
- *dp++ = hex_tag;
- *dp++ = bin2hex (((*sp)>>4)&0x0f);
- *dp++ = bin2hex ((*sp)&0x0f);
- sp++;
- } else if (is_shift_jis (*sp) && is_shift_jis2 (sp[1])) {
- *dp++ = hex_tag;
- *dp++ = bin2hex (((*sp)>>4)&0x0f);
- *dp++ = bin2hex ((*sp)&0x0f);
- sp++;
- *dp++ = hex_tag;
- *dp++ = bin2hex (((*sp)>>4)&0x0f);
- *dp++ = bin2hex ((*sp)&0x0f);
- sp++;
- } else
- *dp++ = *sp++;
- }
- *dp = '\0';
- if (overwrite) {
- strcpy ((char *) from, (char *) cvtbuf);
- return (char *) from;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- kanji/kana -> ":xx"
-********************************************************************/
-static char *sj_to_cap(char *from, BOOL overwrite)
-{
- unsigned char *sp, *dp;
-
- sp = (unsigned char*) from;
- dp = (unsigned char*) cvtbuf;
- while (*sp) {
- if (*sp >= 0x80) {
- *dp++ = hex_tag;
- *dp++ = bin2hex (((*sp)>>4)&0x0f);
- *dp++ = bin2hex ((*sp)&0x0f);
- sp++;
- } else {
- *dp++ = *sp++;
- }
- }
- *dp = '\0';
- if (overwrite) {
- strcpy ((char *) from, (char *) cvtbuf);
- return (char *) from;
- } else {
- return cvtbuf;
- }
-}
-
-/*******************************************************************
- sj to sj
-********************************************************************/
-static char *sj_to_sj(char *from, BOOL overwrite)
-{
- if (!overwrite) {
- strcpy (cvtbuf, (char *) from);
- return cvtbuf;
- } else {
- return (char *) from;
- }
-}
-
-/************************************************************************
- conversion:
- _dos_to_unix _unix_to_dos
-************************************************************************/
-
-char *(*_dos_to_unix)(char *str, BOOL overwrite) = sj_to_sj;
-char *(*_unix_to_dos)(char *str, BOOL overwrite) = sj_to_sj;
-
-static int setup_string_function(int codes)
-{
- switch (codes) {
- default:
- case SJIS_CODE:
- _dos_to_unix = sj_to_sj;
- _unix_to_dos = sj_to_sj;
-
- break;
-
- case EUC_CODE:
- _dos_to_unix = sj_to_euc;
- _unix_to_dos = euc_to_sj;
- break;
-
- case JIS7_CODE:
- _dos_to_unix = sj_to_jis7;
- _unix_to_dos = jis7_to_sj;
- break;
-
- case JIS8_CODE:
- _dos_to_unix = sj_to_jis8;
- _unix_to_dos = jis8_to_sj;
- break;
-
- case JUNET_CODE:
- _dos_to_unix = sj_to_junet;
- _unix_to_dos = junet_to_sj;
- break;
-
- case HEX_CODE:
- _dos_to_unix = sj_to_hex;
- _unix_to_dos = hex_to_sj;
- break;
-
- case CAP_CODE:
- _dos_to_unix = sj_to_cap;
- _unix_to_dos = hex_to_sj;
- break;
- }
- return codes;
-}
-
-/*
- * Interpret coding system.
- */
-int interpret_coding_system(char *str, int def)
-{
- int codes = def;
-
- if (strequal (str, "sjis")) {
- codes = SJIS_CODE;
- } else if (strequal (str, "euc")) {
- codes = EUC_CODE;
- } else if (strequal (str, "cap")) {
- codes = CAP_CODE;
- hex_tag = HEXTAG;
- } else if (strequal (str, "hex")) {
- codes = HEX_CODE;
- hex_tag = HEXTAG;
- } else if (strncasecmp (str, "hex", 3)) {
- codes = HEX_CODE;
- hex_tag = (str[3] ? str[3] : HEXTAG);
- } else if (strequal (str, "j8bb")) {
- codes = JIS8_CODE;
- jis_kso = 'B';
- jis_ksi = 'B';
- } else if (strequal (str, "j8bj") || strequal (str, "jis8")) {
- codes = JIS8_CODE;
- jis_kso = 'B';
- jis_ksi = 'J';
- } else if (strequal (str, "j8bh")) {
- codes = JIS8_CODE;
- jis_kso = 'B';
- jis_ksi = 'H';
- } else if (strequal (str, "j8@b")) {
- codes = JIS8_CODE;
- jis_kso = '@';
- jis_ksi = 'B';
- } else if (strequal (str, "j8@j")) {
- codes = JIS8_CODE;
- jis_kso = '@';
- jis_ksi = 'J';
- } else if (strequal (str, "j8@h")) {
- codes = JIS8_CODE;
- jis_kso = '@';
- jis_ksi = 'H';
- } else if (strequal (str, "j7bb")) {
- codes = JIS7_CODE;
- jis_kso = 'B';
- jis_ksi = 'B';
- } else if (strequal (str, "j7bj") || strequal (str, "jis7")) {
- codes = JIS7_CODE;
- jis_kso = 'B';
- jis_ksi = 'J';
- } else if (strequal (str, "j7bh")) {
- codes = JIS7_CODE;
- jis_kso = 'B';
- jis_ksi = 'H';
- } else if (strequal (str, "j7@b")) {
- codes = JIS7_CODE;
- jis_kso = '@';
- jis_ksi = 'B';
- } else if (strequal (str, "j7@j")) {
- codes = JIS7_CODE;
- jis_kso = '@';
- jis_ksi = 'J';
- } else if (strequal (str, "j7@h")) {
- codes = JIS7_CODE;
- jis_kso = '@';
- jis_ksi = 'H';
- } else if (strequal (str, "jubb")) {
- codes = JUNET_CODE;
- jis_kso = 'B';
- jis_ksi = 'B';
- } else if (strequal (str, "jubj") || strequal (str, "junet")) {
- codes = JUNET_CODE;
- jis_kso = 'B';
- jis_ksi = 'J';
- } else if (strequal (str, "jubh")) {
- codes = JUNET_CODE;
- jis_kso = 'B';
- jis_ksi = 'H';
- } else if (strequal (str, "ju@b")) {
- codes = JUNET_CODE;
- jis_kso = '@';
- jis_ksi = 'B';
- } else if (strequal (str, "ju@j")) {
- codes = JUNET_CODE;
- jis_kso = '@';
- jis_ksi = 'J';
- } else if (strequal (str, "ju@h")) {
- codes = JUNET_CODE;
- jis_kso = '@';
- jis_ksi = 'H';
- }
- return setup_string_function (codes);
-}
diff --git a/source/lib/md4.c b/source/lib/md4.c
deleted file mode 100644
index 1c9c2e6ecd5..00000000000
--- a/source/lib/md4.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- a implementation of MD4 designed for use in the SMB authentication protocol
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-/* NOTE: This code makes no attempt to be fast!
-
- It assumes that a int is at least 32 bits long
-*/
-
-typedef unsigned int uint32;
-
-static uint32 A, B, C, D;
-
-static uint32 F(uint32 X, uint32 Y, uint32 Z)
-{
- return (X&Y) | ((~X)&Z);
-}
-
-static uint32 G(uint32 X, uint32 Y, uint32 Z)
-{
- return (X&Y) | (X&Z) | (Y&Z);
-}
-
-static uint32 H(uint32 X, uint32 Y, uint32 Z)
-{
- return X^Y^Z;
-}
-
-static uint32 lshift(uint32 x, int s)
-{
- x &= 0xFFFFFFFF;
- return ((x<<s)&0xFFFFFFFF) | (x>>(32-s));
-}
-
-#define ROUND1(a,b,c,d,k,s) a = lshift(a + F(b,c,d) + X[k], s)
-#define ROUND2(a,b,c,d,k,s) a = lshift(a + G(b,c,d) + X[k] + (uint32)0x5A827999,s)
-#define ROUND3(a,b,c,d,k,s) a = lshift(a + H(b,c,d) + X[k] + (uint32)0x6ED9EBA1,s)
-
-/* this applies md4 to 64 byte chunks */
-static void mdfour64(uint32 *M)
-{
- int j;
- uint32 AA, BB, CC, DD;
- uint32 X[16];
-
- for (j=0;j<16;j++)
- X[j] = M[j];
-
- AA = A; BB = B; CC = C; DD = D;
-
- ROUND1(A,B,C,D, 0, 3); ROUND1(D,A,B,C, 1, 7);
- ROUND1(C,D,A,B, 2, 11); ROUND1(B,C,D,A, 3, 19);
- ROUND1(A,B,C,D, 4, 3); ROUND1(D,A,B,C, 5, 7);
- ROUND1(C,D,A,B, 6, 11); ROUND1(B,C,D,A, 7, 19);
- ROUND1(A,B,C,D, 8, 3); ROUND1(D,A,B,C, 9, 7);
- ROUND1(C,D,A,B, 10, 11); ROUND1(B,C,D,A, 11, 19);
- ROUND1(A,B,C,D, 12, 3); ROUND1(D,A,B,C, 13, 7);
- ROUND1(C,D,A,B, 14, 11); ROUND1(B,C,D,A, 15, 19);
-
- ROUND2(A,B,C,D, 0, 3); ROUND2(D,A,B,C, 4, 5);
- ROUND2(C,D,A,B, 8, 9); ROUND2(B,C,D,A, 12, 13);
- ROUND2(A,B,C,D, 1, 3); ROUND2(D,A,B,C, 5, 5);
- ROUND2(C,D,A,B, 9, 9); ROUND2(B,C,D,A, 13, 13);
- ROUND2(A,B,C,D, 2, 3); ROUND2(D,A,B,C, 6, 5);
- ROUND2(C,D,A,B, 10, 9); ROUND2(B,C,D,A, 14, 13);
- ROUND2(A,B,C,D, 3, 3); ROUND2(D,A,B,C, 7, 5);
- ROUND2(C,D,A,B, 11, 9); ROUND2(B,C,D,A, 15, 13);
-
- ROUND3(A,B,C,D, 0, 3); ROUND3(D,A,B,C, 8, 9);
- ROUND3(C,D,A,B, 4, 11); ROUND3(B,C,D,A, 12, 15);
- ROUND3(A,B,C,D, 2, 3); ROUND3(D,A,B,C, 10, 9);
- ROUND3(C,D,A,B, 6, 11); ROUND3(B,C,D,A, 14, 15);
- ROUND3(A,B,C,D, 1, 3); ROUND3(D,A,B,C, 9, 9);
- ROUND3(C,D,A,B, 5, 11); ROUND3(B,C,D,A, 13, 15);
- ROUND3(A,B,C,D, 3, 3); ROUND3(D,A,B,C, 11, 9);
- ROUND3(C,D,A,B, 7, 11); ROUND3(B,C,D,A, 15, 15);
-
- A += AA; B += BB; C += CC; D += DD;
-
- A &= 0xFFFFFFFF; B &= 0xFFFFFFFF;
- C &= 0xFFFFFFFF; D &= 0xFFFFFFFF;
-
- for (j=0;j<16;j++)
- X[j] = 0;
-}
-
-static void copy64(uint32 *M, unsigned char *in)
-{
- int i;
-
- for (i=0;i<16;i++)
- M[i] = (in[i*4+3]<<24) | (in[i*4+2]<<16) |
- (in[i*4+1]<<8) | (in[i*4+0]<<0);
-}
-
-static void copy4(unsigned char *out,uint32 x)
-{
- out[0] = x&0xFF;
- out[1] = (x>>8)&0xFF;
- out[2] = (x>>16)&0xFF;
- out[3] = (x>>24)&0xFF;
-}
-
-/* produce a md4 message digest from data of length n bytes */
-void mdfour(unsigned char *out, unsigned char *in, int n)
-{
- unsigned char buf[128];
- uint32 M[16];
- uint32 b = n * 8;
- int i;
-
- A = 0x67452301;
- B = 0xefcdab89;
- C = 0x98badcfe;
- D = 0x10325476;
-
- while (n > 64) {
- copy64(M, in);
- mdfour64(M);
- in += 64;
- n -= 64;
- }
-
- for (i=0;i<128;i++)
- buf[i] = 0;
- memcpy(buf, in, n);
- buf[n] = 0x80;
-
- if (n <= 55) {
- copy4(buf+56, b);
- copy64(M, buf);
- mdfour64(M);
- } else {
- copy4(buf+120, b);
- copy64(M, buf);
- mdfour64(M);
- copy64(M, buf+64);
- mdfour64(M);
- }
-
- for (i=0;i<128;i++)
- buf[i] = 0;
- copy64(M, buf);
-
- copy4(out, A);
- copy4(out+4, B);
- copy4(out+8, C);
- copy4(out+12, D);
-
- A = B = C = D = 0;
-}
-
-
diff --git a/source/lib/replace.c b/source/lib/replace.c
deleted file mode 100644
index 67c18a15237..00000000000
--- a/source/lib/replace.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- replacement routines for broken systems
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-
- void replace_dummy(void)
-{}
-
-#ifdef REPLACE_STRLEN
-/****************************************************************************
-a replacement strlen() that returns int for solaris
-****************************************************************************/
- int Strlen(char *s)
-{
- int ret=0;
- if (!s) return(0);
- while (*s++) ret++;
- return(ret);
-}
-#endif
-
-#ifdef NO_FTRUNCATE
- /*******************************************************************
-ftruncate for operating systems that don't have it
-********************************************************************/
- int ftruncate(int f,long l)
-{
- struct flock fl;
-
- fl.l_whence = 0;
- fl.l_len = 0;
- fl.l_start = l;
- fl.l_type = F_WRLCK;
- return fcntl(f, F_FREESP, &fl);
-}
-#endif
-
-
-#ifdef REPLACE_STRSTR
-/****************************************************************************
-Mips version of strstr doesn't seem to work correctly.
-There is a #define in includes.h to redirect calls to this function.
-****************************************************************************/
-char *Strstr(char *s, char *p)
-{
- int len = strlen(p);
-
- while ( *s != '\0' ) {
- if ( strncmp(s, p, len) == 0 )
- return s;
- s++;
- }
-
- return NULL;
-}
-#endif /* REPLACE_STRSTR */
-
-
-#ifdef REPLACE_MKTIME
-/*******************************************************************
-a mktime() replacement for those who don't have it - contributed by
-C.A. Lademann <cal@zls.com>
-********************************************************************/
-#define MINUTE 60
-#define HOUR 60*MINUTE
-#define DAY 24*HOUR
-#define YEAR 365*DAY
-time_t Mktime(struct tm *t)
-{
- struct tm *u;
- time_t epoch = 0;
- int mon [] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- y, m, i;
-
- if(t->tm_year < 70)
- return((time_t)-1);
-
- epoch = (t->tm_year - 70) * YEAR +
- (t->tm_year / 4 - 70 / 4 - t->tm_year / 100) * DAY;
-
- y = t->tm_year;
- m = 0;
-
- for(i = 0; i < t->tm_mon; i++) {
- epoch += mon [m] * DAY;
- if(m == 1 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0))
- epoch += DAY;
-
- if(++m > 11) {
- m = 0;
- y++;
- }
- }
-
- epoch += (t->tm_mday - 1) * DAY;
- epoch += t->tm_hour * HOUR + t->tm_min * MINUTE + t->tm_sec;
-
- if((u = localtime(&epoch)) != NULL) {
- t->tm_sec = u->tm_sec;
- t->tm_min = u->tm_min;
- t->tm_hour = u->tm_hour;
- t->tm_mday = u->tm_mday;
- t->tm_mon = u->tm_mon;
- t->tm_year = u->tm_year;
- t->tm_wday = u->tm_wday;
- t->tm_yday = u->tm_yday;
- t->tm_isdst = u->tm_isdst;
-#ifndef NO_TM_NAME
- memcpy(t->tm_name, u->tm_name, LTZNMAX);
-#endif
- }
-
- return(epoch);
-}
-#endif /* REPLACE_MKTIME */
-
-
-
-#ifdef REPLACE_RENAME
-/* Rename a file. (from libiberty in GNU binutils) */
- int rename (zfrom, zto)
- const char *zfrom;
- const char *zto;
-{
- if (link (zfrom, zto) < 0)
- {
- if (errno != EEXIST)
- return -1;
- if (unlink (zto) < 0
- || link (zfrom, zto) < 0)
- return -1;
- }
- return unlink (zfrom);
-}
-#endif
-
-
-#ifdef REPLACE_INNETGR
-/*
- * Search for a match in a netgroup. This replaces it on broken systems.
- */
-int InNetGr(char *group,char *host,char *user,char *dom)
-{
- char *hst, *usr, *dm;
-
- setnetgrent(group);
- while (getnetgrent(&hst, &usr, &dm))
- if (((host == 0) || (hst == 0) || !strcmp(host, hst)) &&
- ((user == 0) || (usr == 0) || !strcmp(user, usr)) &&
- ((dom == 0) || (dm == 0) || !strcmp(dom, dm))) {
- endnetgrent();
- return (1);
- }
- endnetgrent();
- return (0);
-}
-#endif
-
-
-
-#ifdef NO_INITGROUPS
-#include <sys/types.h>
-#include <limits.h>
-#include <grp.h>
-
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-/****************************************************************************
- some systems don't have an initgroups call
-****************************************************************************/
- int initgroups(char *name,gid_t id)
-{
-#ifdef NO_SETGROUPS
- /* yikes! no SETGROUPS or INITGROUPS? how can this work? */
- return(0);
-#else
- gid_t grouplst[NGROUPS_MAX];
- int i,j;
- struct group *g;
- char *gr;
-
- grouplst[0] = id;
- i = 1;
- while (i < NGROUPS_MAX &&
- ((g = (struct group *)getgrent()) != (struct group *)NULL))
- {
- if (g->gr_gid == id)
- continue;
- j = 0;
- gr = g->gr_mem[0];
- while (gr && (*gr != (char)NULL)) {
- if (strcmp(name,gr) == 0) {
- grouplst[i] = g->gr_gid;
- i++;
- gr = (char *)NULL;
- break;
- }
- gr = g->gr_mem[++j];
- }
- }
- endgrent();
- return(setgroups(i,grouplst));
-#endif
-}
-#endif
-
-
-#if (defined(SecureWare) && defined(SCO))
-/* This is needed due to needing the nap() function but we don't want
- to include the Xenix libraries since that will break other things...
- BTW: system call # 0x0c28 is the same as calling nap() */
-long nap(long milliseconds) {
- return syscall(0x0c28, milliseconds);
-}
-#endif
-
-
-
-#if WRAP_MALLOC
-
-/* undo the wrapping temporarily */
-#undef malloc
-#undef realloc
-#undef free
-
-/****************************************************************************
-wrapper for malloc() to catch memory errors
-****************************************************************************/
-void *malloc_wrapped(int size,char *file,int line)
-{
-#ifdef xx_old_malloc
- void *res = xx_old_malloc(size);
-#else
- void *res = malloc(size);
-#endif
- DEBUG(3,("Malloc called from %s(%d) with size=%d gave ptr=0x%X\n",
- file,line,
- size,(unsigned int)res));
- return(res);
-}
-
-/****************************************************************************
-wrapper for realloc() to catch memory errors
-****************************************************************************/
-void *realloc_wrapped(void *ptr,int size,char *file,int line)
-{
-#ifdef xx_old_realloc
- void *res = xx_old_realloc(ptr,size);
-#else
- void *res = realloc(ptr,size);
-#endif
- DEBUG(3,("Realloc\n"));
- DEBUG(3,("free called from %s(%d) with ptr=0x%X\n",
- file,line,
- (unsigned int)ptr));
- DEBUG(3,("Malloc called from %s(%d) with size=%d gave ptr=0x%X\n",
- file,line,
- size,(unsigned int)res));
- return(res);
-}
-
-/****************************************************************************
-wrapper for free() to catch memory errors
-****************************************************************************/
-void free_wrapped(void *ptr,char *file,int line)
-{
-#ifdef xx_old_free
- xx_old_free(ptr);
-#else
- free(ptr);
-#endif
- DEBUG(3,("free called from %s(%d) with ptr=0x%X\n",
- file,line,(unsigned int)ptr));
- return;
-}
-
-/* and re-do the define for spots lower in this file */
-#define malloc(size) malloc_wrapped(size,__FILE__,__LINE__)
-#define realloc(ptr,size) realloc_wrapped(ptr,size,__FILE__,__LINE__)
-#define free(ptr) free_wrapped(ptr,__FILE__,__LINE__)
-
-#endif
-
-
-#if WRAP_MEMCPY
-#undef memcpy
-/*******************************************************************
-a wrapper around memcpy for diagnostic purposes
-********************************************************************/
-void *memcpy_wrapped(void *d,void *s,int l,char *fname,int line)
-{
- if (l>64 && (((int)d)%4) != (((int)s)%4))
- DEBUG(4,("Misaligned memcpy(0x%X,0x%X,%d) at %s(%d)\n",d,s,l,fname,line));
-#ifdef xx_old_memcpy
- return(xx_old_memcpy(d,s,l));
-#else
- return(memcpy(d,s,l));
-#endif
-}
-#define memcpy(d,s,l) memcpy_wrapped(d,s,l,__FILE__,__LINE__)
-#endif
-
diff --git a/source/lib/system.c b/source/lib/system.c
deleted file mode 100644
index fe8e8004d04..00000000000
--- a/source/lib/system.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Samba system utilities
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-/*
- The idea is that this file will eventually have wrappers around all
- important system calls in samba. The aims are:
-
- - to enable easier porting by putting OS dependent stuff in here
-
- - to allow for hooks into other "pseudo-filesystems"
-
- - to allow easier integration of things like the japanese extensions
-
- - to support the philosophy of Samba to expose the features of
- the OS within the SMB model. In general whatever file/printer/variable
- expansions/etc make sense to the OS should be acceptable to Samba.
-*/
-
-
-/*******************************************************************
-this replaces the normal select() system call
-return if some data has arrived on one of the file descriptors
-return -1 means error
-********************************************************************/
-#ifdef NO_SELECT
-static int pollfd(int fd)
-{
- int r=0;
-
-#ifdef HAS_RDCHK
- r = rdchk(fd);
-#elif defined(TCRDCHK)
- (void)ioctl(fd, TCRDCHK, &r);
-#else
- (void)ioctl(fd, FIONREAD, &r);
-#endif
-
- return(r);
-}
-
-int sys_select(fd_set *fds,struct timeval *tval)
-{
- fd_set fds2;
- int counter=0;
- int found=0;
-
- FD_ZERO(&fds2);
-
- while (1)
- {
- int i;
- for (i=0;i<255;i++) {
- if (FD_ISSET(i,fds) && pollfd(i)>0) {
- found++;
- FD_SET(i,&fds2);
- }
- }
-
- if (found) {
- memcpy((void *)fds,(void *)&fds2,sizeof(fds2));
- return(found);
- }
-
- if (tval && tval->tv_sec < counter) return(0);
- sleep(1);
- counter++;
- }
-}
-
-#else
-int sys_select(fd_set *fds,struct timeval *tval)
-{
- struct timeval t2;
- int selrtn;
-
- do {
- if (tval) memcpy((void *)&t2,(void *)tval,sizeof(t2));
- errno = 0;
- selrtn = select(255,SELECT_CAST fds,NULL,NULL,tval?&t2:NULL);
- } while (selrtn<0 && errno == EINTR);
-
- return(selrtn);
-}
-#endif
-
-
-/*******************************************************************
-just a unlink wrapper
-********************************************************************/
-int sys_unlink(char *fname)
-{
- return(unlink(dos_to_unix(fname,False)));
-}
-
-
-/*******************************************************************
-a simple open() wrapper
-********************************************************************/
-int sys_open(char *fname,int flags,int mode)
-{
- return(open(dos_to_unix(fname,False),flags,mode));
-}
-
-
-/*******************************************************************
-a simple opendir() wrapper
-********************************************************************/
-DIR *sys_opendir(char *dname)
-{
- return(opendir(dos_to_unix(dname,False)));
-}
-
-
-/*******************************************************************
-and a stat() wrapper
-********************************************************************/
-int sys_stat(char *fname,struct stat *sbuf)
-{
- return(stat(dos_to_unix(fname,False),sbuf));
-}
-
-/*******************************************************************
-The wait() calls vary between systems
-********************************************************************/
-int sys_waitpid(pid_t pid,int *status,int options)
-{
-#ifdef USE_WAITPID
- return waitpid(pid,status,options);
-#else /* USE_WAITPID */
- return wait4(pid, status, options, NULL);
-#endif /* USE_WAITPID */
-}
-
-/*******************************************************************
-don't forget lstat()
-********************************************************************/
-int sys_lstat(char *fname,struct stat *sbuf)
-{
- return(lstat(dos_to_unix(fname,False),sbuf));
-}
-
-
-/*******************************************************************
-mkdir() gets a wrapper
-********************************************************************/
-int sys_mkdir(char *dname,int mode)
-{
- return(mkdir(dos_to_unix(dname,False),mode));
-}
-
-
-/*******************************************************************
-do does rmdir()
-********************************************************************/
-int sys_rmdir(char *dname)
-{
- return(rmdir(dos_to_unix(dname,False)));
-}
-
-
-/*******************************************************************
-I almost forgot chdir()
-********************************************************************/
-int sys_chdir(char *dname)
-{
- return(chdir(dos_to_unix(dname,False)));
-}
-
-
-/*******************************************************************
-now for utime()
-********************************************************************/
-int sys_utime(char *fname,struct utimbuf *times)
-{
- return(utime(dos_to_unix(fname,False),times));
-}
-
-/*********************************************************
-for rename across filesystems Patch from Warren Birnbaum
-<warrenb@hpcvscdp.cv.hp.com>
-**********************************************************/
-
-static int copy_reg(char *source, const char *dest)
-{
- struct stat source_stats;
- int ifd;
- int full_write();
- int safe_read();
- int ofd;
- char *buf;
- int len; /* Number of bytes read into `buf'. */
-
- lstat (source, &source_stats);
- if (!S_ISREG (source_stats.st_mode))
- {
- return 1;
- }
-
- if (unlink (dest) && errno != ENOENT)
- {
- return 1;
- }
-
- if((ifd = open (source, O_RDONLY, 0)) < 0)
- {
- return 1;
- }
- if((ofd = open (dest, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0 )
- {
- close (ifd);
- return 1;
- }
-
- if((buf = malloc( COPYBUF_SIZE )) == NULL)
- {
- close (ifd);
- close (ofd);
- unlink (dest);
- return 1;
- }
-
- while ((len = read(ifd, buf, COPYBUF_SIZE)) > 0)
- {
- if (write_data(ofd, buf, len) < 0)
- {
- close (ifd);
- close (ofd);
- unlink (dest);
- free(buf);
- return 1;
- }
- }
- free(buf);
- if (len < 0)
- {
- close (ifd);
- close (ofd);
- unlink (dest);
- return 1;
- }
-
- if (close (ifd) < 0)
- {
- close (ofd);
- return 1;
- }
- if (close (ofd) < 0)
- {
- return 1;
- }
-
- /* chown turns off set[ug]id bits for non-root,
- so do the chmod last. */
-
- /* Try to copy the old file's modtime and access time. */
- {
- struct utimbuf tv;
-
- tv.actime = source_stats.st_atime;
- tv.modtime = source_stats.st_mtime;
- if (utime (dest, &tv))
- {
- return 1;
- }
- }
-
- /* Try to preserve ownership. For non-root it might fail, but that's ok.
- But root probably wants to know, e.g. if NFS disallows it. */
- if (chown (dest, source_stats.st_uid, source_stats.st_gid)
- && (errno != EPERM))
- {
- return 1;
- }
-
- if (chmod (dest, source_stats.st_mode & 07777))
- {
- return 1;
- }
- unlink (source);
- return 0;
-}
-
-/*******************************************************************
-for rename()
-********************************************************************/
-int sys_rename(char *from, char *to)
-{
- int rcode;
- pstring zfrom, zto;
-
- pstrcpy (zfrom, dos_to_unix (from, False));
- pstrcpy (zto, dos_to_unix (to, False));
- rcode = rename (zfrom, zto);
-
- if (errno == EXDEV)
- {
- /* Rename across filesystems needed. */
- rcode = copy_reg (zfrom, zto);
- }
- return rcode;
-}
-
-/*******************************************************************
-for chmod
-********************************************************************/
-int sys_chmod(char *fname,int mode)
-{
- return(chmod(dos_to_unix(fname,False),mode));
-}
-
-/*******************************************************************
-for getwd
-********************************************************************/
-char *sys_getwd(char *s)
-{
- char *wd;
-#ifdef USE_GETCWD
- wd = (char *) getcwd (s, sizeof (pstring));
-#else
- wd = (char *) getwd (s);
-#endif
- if (wd)
- unix_to_dos (wd, True);
- return wd;
-}
-
-/*******************************************************************
-chown isn't used much but OS/2 doesn't have it
-********************************************************************/
-int sys_chown(char *fname,int uid,int gid)
-{
-#ifdef NO_CHOWN
- DEBUG(1,("Warning - chown(%s,%d,%d) not done\n",fname,uid,gid));
-#else
- return(chown(fname,uid,gid));
-#endif
-}
-
-/*******************************************************************
-os/2 also doesn't have chroot
-********************************************************************/
-int sys_chroot(char *dname)
-{
-#ifdef NO_CHROOT
- DEBUG(1,("Warning - chroot(%s) not done\n",dname));
-#else
- return(chroot(dname));
-#endif
-}
-
-/**************************************************************************
-A wrapper for gethostbyname() that tries avoids looking up hostnames
-in the root domain, which can cause dial-on-demand links to come up for no
-apparent reason.
-****************************************************************************/
-struct hostent *sys_gethostbyname(char *name)
-{
-#ifdef REDUCE_ROOT_DNS_LOOKUPS
- char query[256], hostname[256];
- char *domain;
-
- /* Does this name have any dots in it? If so, make no change */
-
- if (strchr(name, '.'))
- return(gethostbyname(name));
-
- /* Get my hostname, which should have domain name
- attached. If not, just do the gethostname on the
- original string.
- */
-
- gethostname(hostname, sizeof(hostname) - 1);
- hostname[sizeof(hostname) - 1] = 0;
- if ((domain = strchr(hostname, '.')) == NULL)
- return(gethostbyname(name));
-
- /* Attach domain name to query and do modified query.
- If names too large, just do gethostname on the
- original string.
- */
-
- if((strlen(name) + strlen(domain)) >= sizeof(query))
- return(gethostbyname(name));
-
- sprintf(query, "%s%s", name, domain);
- return(gethostbyname(query));
-#else /* REDUCE_ROOT_DNS_LOOKUPS */
- return(gethostbyname(name));
-#endif /* REDUCE_ROOT_DNS_LOOKUPS */
-}
-
diff --git a/source/lib/time.c b/source/lib/time.c
deleted file mode 100644
index 4f688d2214a..00000000000
--- a/source/lib/time.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- time handling functions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-/*
- This stuff was largely rewritten by Paul Eggert <eggert@twinsun.com>
- in May 1996
- */
-
-
-int serverzone=0;
-int extra_time_offset = 0;
-
-extern int DEBUGLEVEL;
-
-#ifndef CHAR_BIT
-#define CHAR_BIT 8
-#endif
-
-#ifndef TIME_T_MIN
-#define TIME_T_MIN ((time_t)0 < (time_t) -1 ? (time_t) 0 \
- : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
-#endif
-#ifndef TIME_T_MAX
-#define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
-#endif
-
-
-
-/*******************************************************************
-a gettimeofday wrapper
-********************************************************************/
-void GetTimeOfDay(struct timeval *tval)
-{
-#ifdef GETTIMEOFDAY1
- gettimeofday(tval);
-#else
- gettimeofday(tval,NULL);
-#endif
-}
-
-#define TM_YEAR_BASE 1900
-
-/*******************************************************************
-yield the difference between *A and *B, in seconds, ignoring leap seconds
-********************************************************************/
-static int tm_diff(struct tm *a, struct tm *b)
-{
- int ay = a->tm_year + (TM_YEAR_BASE - 1);
- int by = b->tm_year + (TM_YEAR_BASE - 1);
- int intervening_leap_days =
- (ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
- int years = ay - by;
- int days = 365*years + intervening_leap_days + (a->tm_yday - b->tm_yday);
- int hours = 24*days + (a->tm_hour - b->tm_hour);
- int minutes = 60*hours + (a->tm_min - b->tm_min);
- int seconds = 60*minutes + (a->tm_sec - b->tm_sec);
- return seconds;
-}
-
-/*******************************************************************
- return the UTC offset in seconds west of UTC
- ******************************************************************/
-static int TimeZone(time_t t)
-{
- struct tm tm_utc = *(gmtime(&t));
- return tm_diff(&tm_utc,localtime(&t));
-}
-
-
-/*******************************************************************
-init the time differences
-********************************************************************/
-void TimeInit(void)
-{
- serverzone = TimeZone(time(NULL));
- DEBUG(4,("Serverzone is %d\n",serverzone));
-}
-
-
-/*******************************************************************
-return the same value as TimeZone, but it should be more efficient.
-
-We keep a table of DST offsets to prevent calling localtime() on each
-call of this function. This saves a LOT of time on many unixes.
-
-Updated by Paul Eggert <eggert@twinsun.com>
-********************************************************************/
-static int TimeZoneFaster(time_t t)
-{
- static struct dst_table {time_t start,end; int zone;} *dst_table = NULL;
- static int table_size = 0;
- int i;
- int zone = 0;
-
- if (t == 0) t = time(NULL);
-
- /* Tunis has a 8 day DST region, we need to be careful ... */
-#define MAX_DST_WIDTH (365*24*60*60)
-#define MAX_DST_SKIP (7*24*60*60)
-
- for (i=0;i<table_size;i++)
- if (t >= dst_table[i].start && t <= dst_table[i].end) break;
-
- if (i<table_size) {
- zone = dst_table[i].zone;
- } else {
- time_t low,high;
-
- zone = TimeZone(t);
- dst_table = (struct dst_table *)Realloc(dst_table,
- sizeof(dst_table[0])*(i+1));
- if (!dst_table) {
- table_size = 0;
- } else {
- table_size++;
-
- dst_table[i].zone = zone;
- dst_table[i].start = dst_table[i].end = t;
-
- /* no entry will cover more than 6 months */
- low = t - MAX_DST_WIDTH/2;
- if (t < low)
- low = TIME_T_MIN;
-
- high = t + MAX_DST_WIDTH/2;
- if (high < t)
- high = TIME_T_MAX;
-
- /* widen the new entry using two bisection searches */
- while (low+60*60 < dst_table[i].start) {
- if (dst_table[i].start - low > MAX_DST_SKIP*2)
- t = dst_table[i].start - MAX_DST_SKIP;
- else
- t = low + (dst_table[i].start-low)/2;
- if (TimeZone(t) == zone)
- dst_table[i].start = t;
- else
- low = t;
- }
-
- while (high-60*60 > dst_table[i].end) {
- if (high - dst_table[i].end > MAX_DST_SKIP*2)
- t = dst_table[i].end + MAX_DST_SKIP;
- else
- t = high - (high-dst_table[i].end)/2;
- if (TimeZone(t) == zone)
- dst_table[i].end = t;
- else
- high = t;
- }
-#if 0
- DEBUG(1,("Added DST entry from %s ",
- asctime(localtime(&dst_table[i].start))));
- DEBUG(1,("to %s (%d)\n",asctime(localtime(&dst_table[i].end)),
- dst_table[i].zone));
-#endif
- }
- }
- return zone;
-}
-
-/****************************************************************************
- return the UTC offset in seconds west of UTC, adjusted for extra time offset
- **************************************************************************/
-int TimeDiff(time_t t)
-{
- return TimeZoneFaster(t) + 60*extra_time_offset;
-}
-
-
-/****************************************************************************
- return the UTC offset in seconds west of UTC, adjusted for extra time
- offset, for a local time value. If ut = lt + LocTimeDiff(lt), then
- lt = ut - TimeDiff(ut), but the converse does not necessarily hold near
- daylight savings transitions because some local times are ambiguous.
- LocTimeDiff(t) equals TimeDiff(t) except near daylight savings transitions.
- +**************************************************************************/
-static int LocTimeDiff(time_t lte)
-{
- time_t lt = lte - 60*extra_time_offset;
- int d = TimeZoneFaster(lt);
- time_t t = lt + d;
-
- /* if overflow occurred, ignore all the adjustments so far */
- if (((lte < lt) ^ (extra_time_offset < 0)) | ((t < lt) ^ (d < 0)))
- t = lte;
-
- /* now t should be close enough to the true UTC to yield the right answer */
- return TimeDiff(t);
-}
-
-
-/****************************************************************************
-try to optimise the localtime call, it can be quite expenive on some machines
-****************************************************************************/
-struct tm *LocalTime(time_t *t)
-{
- time_t t2 = *t;
-
- t2 -= TimeDiff(t2);
-
- return(gmtime(&t2));
-}
-
-
-#define TIME_FIXUP_CONSTANT (369.0*365.25*24*60*60-(3.0*24*60*60+6.0*60*60))
-
-/****************************************************************************
-interpret an 8 byte "filetime" structure to a time_t
-It's originally in "100ns units since jan 1st 1601"
-
-It appears to be kludge-GMT (at least for file listings). This means
-its the GMT you get by taking a localtime and adding the
-serverzone. This is NOT the same as GMT in some cases. This routine
-converts this to real GMT.
-****************************************************************************/
-time_t interpret_long_date(char *p)
-{
- double d;
- time_t ret;
- uint32 tlow,thigh;
- tlow = IVAL(p,0);
- thigh = IVAL(p,4);
-
- if (thigh == 0) return(0);
-
- d = ((double)thigh)*4.0*(double)(1<<30);
- d += (tlow&0xFFF00000);
- d *= 1.0e-7;
-
- /* now adjust by 369 years to make the secs since 1970 */
- d -= TIME_FIXUP_CONSTANT;
-
- if (!(TIME_T_MIN <= d && d <= TIME_T_MAX))
- return(0);
-
- ret = (time_t)(d+0.5);
-
- /* this takes us from kludge-GMT to real GMT */
- ret -= serverzone;
- ret += LocTimeDiff(ret);
-
- return(ret);
-}
-
-
-/****************************************************************************
-put a 8 byte filetime from a time_t
-This takes real GMT as input and converts to kludge-GMT
-****************************************************************************/
-void put_long_date(char *p,time_t t)
-{
- uint32 tlow,thigh;
- double d;
-
- if (t==0) {
- SIVAL(p,0,0); SIVAL(p,4,0);
- return;
- }
-
- /* this converts GMT to kludge-GMT */
- t -= TimeDiff(t) - serverzone;
-
- d = (double) (t);
-
- d += TIME_FIXUP_CONSTANT;
-
- d *= 1.0e7;
-
- thigh = (uint32)(d * (1.0/(4.0*(double)(1<<30))));
- tlow = (uint32)(d - ((double)thigh)*4.0*(double)(1<<30));
-
- SIVAL(p,0,tlow);
- SIVAL(p,4,thigh);
-}
-
-
-/****************************************************************************
-check if it's a null mtime
-****************************************************************************/
-static BOOL null_mtime(time_t mtime)
-{
- if (mtime == 0 || mtime == 0xFFFFFFFF || mtime == (time_t)-1)
- return(True);
- return(False);
-}
-
-/*******************************************************************
- create a 16 bit dos packed date
-********************************************************************/
-static uint16 make_dos_date1(time_t unixdate,struct tm *t)
-{
- uint16 ret=0;
- ret = (((unsigned)(t->tm_mon+1)) >> 3) | ((t->tm_year-80) << 1);
- ret = ((ret&0xFF)<<8) | (t->tm_mday | (((t->tm_mon+1) & 0x7) << 5));
- return(ret);
-}
-
-/*******************************************************************
- create a 16 bit dos packed time
-********************************************************************/
-static uint16 make_dos_time1(time_t unixdate,struct tm *t)
-{
- uint16 ret=0;
- ret = ((((unsigned)t->tm_min >> 3)&0x7) | (((unsigned)t->tm_hour) << 3));
- ret = ((ret&0xFF)<<8) | ((t->tm_sec/2) | ((t->tm_min & 0x7) << 5));
- return(ret);
-}
-
-/*******************************************************************
- create a 32 bit dos packed date/time from some parameters
- This takes a GMT time and returns a packed localtime structure
-********************************************************************/
-static uint32 make_dos_date(time_t unixdate)
-{
- struct tm *t;
- uint32 ret=0;
-
- t = LocalTime(&unixdate);
-
- ret = make_dos_date1(unixdate,t);
- ret = ((ret&0xFFFF)<<16) | make_dos_time1(unixdate,t);
-
- return(ret);
-}
-
-/*******************************************************************
-put a dos date into a buffer (time/date format)
-This takes GMT time and puts local time in the buffer
-********************************************************************/
-void put_dos_date(char *buf,int offset,time_t unixdate)
-{
- uint32 x = make_dos_date(unixdate);
- SIVAL(buf,offset,x);
-}
-
-/*******************************************************************
-put a dos date into a buffer (date/time format)
-This takes GMT time and puts local time in the buffer
-********************************************************************/
-void put_dos_date2(char *buf,int offset,time_t unixdate)
-{
- uint32 x = make_dos_date(unixdate);
- x = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16);
- SIVAL(buf,offset,x);
-}
-
-/*******************************************************************
-put a dos 32 bit "unix like" date into a buffer. This routine takes
-GMT and converts it to LOCAL time before putting it (most SMBs assume
-localtime for this sort of date)
-********************************************************************/
-void put_dos_date3(char *buf,int offset,time_t unixdate)
-{
- if (!null_mtime(unixdate))
- unixdate -= TimeDiff(unixdate);
- SIVAL(buf,offset,unixdate);
-}
-
-/*******************************************************************
- interpret a 32 bit dos packed date/time to some parameters
-********************************************************************/
-static void interpret_dos_date(uint32 date,int *year,int *month,int *day,int *hour,int *minute,int *second)
-{
- uint32 p0,p1,p2,p3;
-
- p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF;
- p2=((date&0xFF0000)>>16)&0xFF; p3=((date&0xFF000000)>>24)&0xFF;
-
- *second = 2*(p0 & 0x1F);
- *minute = ((p0>>5)&0xFF) + ((p1&0x7)<<3);
- *hour = (p1>>3)&0xFF;
- *day = (p2&0x1F);
- *month = ((p2>>5)&0xFF) + ((p3&0x1)<<3) - 1;
- *year = ((p3>>1)&0xFF) + 80;
-}
-
-/*******************************************************************
- create a unix date (int GMT) from a dos date (which is actually in
- localtime)
-********************************************************************/
-time_t make_unix_date(void *date_ptr)
-{
- uint32 dos_date=0;
- struct tm t;
- time_t ret;
-
- dos_date = IVAL(date_ptr,0);
-
- if (dos_date == 0) return(0);
-
- interpret_dos_date(dos_date,&t.tm_year,&t.tm_mon,
- &t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec);
- t.tm_isdst = -1;
-
- /* mktime() also does the local to GMT time conversion for us */
- ret = mktime(&t);
-
- return(ret);
-}
-
-/*******************************************************************
-like make_unix_date() but the words are reversed
-********************************************************************/
-time_t make_unix_date2(void *date_ptr)
-{
- uint32 x,x2;
-
- x = IVAL(date_ptr,0);
- x2 = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16);
- SIVAL(&x,0,x2);
-
- return(make_unix_date((void *)&x));
-}
-
-/*******************************************************************
- create a unix GMT date from a dos date in 32 bit "unix like" format
- these generally arrive as localtimes, with corresponding DST
- ******************************************************************/
-time_t make_unix_date3(void *date_ptr)
-{
- time_t t = IVAL(date_ptr,0);
- if (!null_mtime(t))
- t += LocTimeDiff(t);
- return(t);
-}
-
-/****************************************************************************
-set the time on a file
-****************************************************************************/
-BOOL set_filetime(char *fname,time_t mtime)
-{
- struct utimbuf times;
-
- if (null_mtime(mtime)) return(True);
-
- times.modtime = times.actime = mtime;
-
- if (sys_utime(fname,&times)) {
- DEBUG(4,("set_filetime(%s) failed: %s\n",fname,strerror(errno)));
- }
-
- return(True);
-}
-
-
-/****************************************************************************
- return the date and time as a string
-****************************************************************************/
-char *timestring(void )
-{
- static fstring TimeBuf;
- time_t t = time(NULL);
- struct tm *tm = LocalTime(&t);
-
-#ifdef NO_STRFTIME
- fstrcpy(TimeBuf, asctime(tm));
-#elif defined(CLIX) || defined(CONVEX)
- strftime(TimeBuf,100,"%m/%d/%y %I:%M:%S %p",tm);
-#elif defined(AMPM)
- strftime(TimeBuf,100,"%D %r",tm);
-#elif defined(TZ_TIME)
- {
- int zone = TimeDiff(t);
- int absZoneMinutes = (zone<0 ? -zone : zone) / 60;
- size_t len = strftime(TimeBuf,sizeof(TimeBuf)-6,"%D %T",tm);
- sprintf(TimeBuf+len," %c%02d%02d",
- zone<0?'+':'-',absZoneMinutes/60,absZoneMinutes%60);
- }
-#else
- strftime(TimeBuf,100,"%D %T",tm);
-#endif
- return(TimeBuf);
-}
-
diff --git a/source/lib/ufc.c b/source/lib/ufc.c
deleted file mode 100644
index 0fa5cfd3a0f..00000000000
--- a/source/lib/ufc.c
+++ /dev/null
@@ -1,782 +0,0 @@
-/*
- This bit of code was derived from the UFC-crypt package which
- carries the following copyright
-
- Modified for use by Samba by Andrew Tridgell, October 1994
-
- Note that this routine is only faster on some machines. Under Linux 1.1.51
- libc 4.5.26 I actually found this routine to be slightly slower.
-
- Under SunOS I found a huge speedup by using these routines
- (a factor of 20 or so)
-
- Warning: I've had a report from Steve Kennedy <steve@gbnet.org>
- that this crypt routine may sometimes get the wrong answer. Only
- use UFC_CRYT if you really need it.
-
-*/
-
-#ifdef UFC_CRYPT
-
-/*
- * UFC-crypt: ultra fast crypt(3) implementation
- *
- * Copyright (C) 1991-1997, Free Software Foundation, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * @(#)crypt_util.c 2.31 02/08/92
- *
- * Support routines
- *
- */
-#include "includes.h"
-
-
-#ifndef long32
-#define long32 int32
-#endif
-
-#ifndef long64
-#define long64 int64
-#endif
-
-#ifndef ufc_long
-#define ufc_long unsigned
-#endif
-
-#ifndef _UFC_64_
-#define _UFC_32_
-#endif
-
-/*
- * Permutation done once on the 56 bit
- * key derived from the original 8 byte ASCII key.
- */
-static int pc1[56] = {
- 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
- 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
- 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
- 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
-};
-
-/*
- * How much to rotate each 28 bit half of the pc1 permutated
- * 56 bit key before using pc2 to give the i' key
- */
-static int rots[16] = {
- 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
-};
-
-/*
- * Permutation giving the key
- * of the i' DES round
- */
-static int pc2[48] = {
- 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
- 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
- 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
- 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
-};
-
-/*
- * The E expansion table which selects
- * bits from the 32 bit intermediate result.
- */
-static int esel[48] = {
- 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
- 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
- 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
-};
-static int e_inverse[64];
-
-/*
- * Permutation done on the
- * result of sbox lookups
- */
-static int perm32[32] = {
- 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
- 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
-};
-
-/*
- * The sboxes
- */
-static int sbox[8][4][16]= {
- { { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
- { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
- { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
- { 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }
- },
-
- { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
- { 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
- { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
- { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }
- },
-
- { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
- { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
- { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
- { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }
- },
-
- { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
- { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
- { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
- { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }
- },
-
- { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
- { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
- { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
- { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }
- },
-
- { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
- { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
- { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
- { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }
- },
-
- { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
- { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
- { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
- { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }
- },
-
- { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
- { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
- { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
- { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }
- }
-};
-
-/*
- * This is the final
- * permutation matrix
- */
-static int final_perm[64] = {
- 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
-};
-
-/*
- * The 16 DES keys in BITMASK format
- */
-#ifdef _UFC_32_
-long32 _ufc_keytab[16][2];
-#endif
-
-#ifdef _UFC_64_
-long64 _ufc_keytab[16];
-#endif
-
-
-#define ascii_to_bin(c) ((c)>='a'?(c-59):(c)>='A'?((c)-53):(c)-'.')
-#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
-
-/* Macro to set a bit (0..23) */
-#define BITMASK(i) ( (1<<(11-(i)%12+3)) << ((i)<12?16:0) )
-
-/*
- * sb arrays:
- *
- * Workhorses of the inner loop of the DES implementation.
- * They do sbox lookup, shifting of this value, 32 bit
- * permutation and E permutation for the next round.
- *
- * Kept in 'BITMASK' format.
- */
-
-#ifdef _UFC_32_
-long32 _ufc_sb0[8192], _ufc_sb1[8192], _ufc_sb2[8192], _ufc_sb3[8192];
-static long32 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3};
-#endif
-
-#ifdef _UFC_64_
-long64 _ufc_sb0[4096], _ufc_sb1[4096], _ufc_sb2[4096], _ufc_sb3[4096];
-static long64 *sb[4] = {_ufc_sb0, _ufc_sb1, _ufc_sb2, _ufc_sb3};
-#endif
-
-/*
- * eperm32tab: do 32 bit permutation and E selection
- *
- * The first index is the byte number in the 32 bit value to be permuted
- * - second - is the value of this byte
- * - third - selects the two 32 bit values
- *
- * The table is used and generated internally in init_des to speed it up
- */
-static ufc_long eperm32tab[4][256][2];
-
-/*
- * do_pc1: permform pc1 permutation in the key schedule generation.
- *
- * The first index is the byte number in the 8 byte ASCII key
- * - second - - the two 28 bits halfs of the result
- * - third - selects the 7 bits actually used of each byte
- *
- * The result is kept with 28 bit per 32 bit with the 4 most significant
- * bits zero.
- */
-static ufc_long do_pc1[8][2][128];
-
-/*
- * do_pc2: permform pc2 permutation in the key schedule generation.
- *
- * The first index is the septet number in the two 28 bit intermediate values
- * - second - - - septet values
- *
- * Knowledge of the structure of the pc2 permutation is used.
- *
- * The result is kept with 28 bit per 32 bit with the 4 most significant
- * bits zero.
- */
-static ufc_long do_pc2[8][128];
-
-/*
- * efp: undo an extra e selection and do final
- * permutation giving the DES result.
- *
- * Invoked 6 bit a time on two 48 bit values
- * giving two 32 bit longs.
- */
-static ufc_long efp[16][64][2];
-
-static unsigned char bytemask[8] = {
- 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-static ufc_long longmask[32] = {
- 0x80000000, 0x40000000, 0x20000000, 0x10000000,
- 0x08000000, 0x04000000, 0x02000000, 0x01000000,
- 0x00800000, 0x00400000, 0x00200000, 0x00100000,
- 0x00080000, 0x00040000, 0x00020000, 0x00010000,
- 0x00008000, 0x00004000, 0x00002000, 0x00001000,
- 0x00000800, 0x00000400, 0x00000200, 0x00000100,
- 0x00000080, 0x00000040, 0x00000020, 0x00000010,
- 0x00000008, 0x00000004, 0x00000002, 0x00000001
-};
-
-
-/*
- * Silly rewrite of 'bzero'. I do so
- * because some machines don't have
- * bzero and some don't have memset.
- */
-
-static void clearmem(start, cnt)
- char *start;
- int cnt;
- { while(cnt--)
- *start++ = '\0';
- }
-
-static int initialized = 0;
-
-/* lookup a 6 bit value in sbox */
-
-#define s_lookup(i,s) sbox[(i)][(((s)>>4) & 0x2)|((s) & 0x1)][((s)>>1) & 0xf];
-
-/*
- * Initialize unit - may be invoked directly
- * by fcrypt users.
- */
-
-static void ufc_init_des()
- { int comes_from_bit;
- int bit, sg;
- ufc_long j;
- ufc_long mask1, mask2;
-
- /*
- * Create the do_pc1 table used
- * to affect pc1 permutation
- * when generating keys
- */
- for(bit = 0; bit < 56; bit++) {
- comes_from_bit = pc1[bit] - 1;
- mask1 = bytemask[comes_from_bit % 8 + 1];
- mask2 = longmask[bit % 28 + 4];
- for(j = 0; j < 128; j++) {
- if(j & mask1)
- do_pc1[comes_from_bit / 8][bit / 28][j] |= mask2;
- }
- }
-
- /*
- * Create the do_pc2 table used
- * to affect pc2 permutation when
- * generating keys
- */
- for(bit = 0; bit < 48; bit++) {
- comes_from_bit = pc2[bit] - 1;
- mask1 = bytemask[comes_from_bit % 7 + 1];
- mask2 = BITMASK(bit % 24);
- for(j = 0; j < 128; j++) {
- if(j & mask1)
- do_pc2[comes_from_bit / 7][j] |= mask2;
- }
- }
-
- /*
- * Now generate the table used to do combined
- * 32 bit permutation and e expansion
- *
- * We use it because we have to permute 16384 32 bit
- * longs into 48 bit in order to initialize sb.
- *
- * Looping 48 rounds per permutation becomes
- * just too slow...
- *
- */
-
- clearmem((char*)eperm32tab, sizeof(eperm32tab));
-
- for(bit = 0; bit < 48; bit++) {
- ufc_long mask1,comes_from;
-
- comes_from = perm32[esel[bit]-1]-1;
- mask1 = bytemask[comes_from % 8];
-
- for(j = 256; j--;) {
- if(j & mask1)
- eperm32tab[comes_from / 8][j][bit / 24] |= BITMASK(bit % 24);
- }
- }
-
- /*
- * Create the sb tables:
- *
- * For each 12 bit segment of an 48 bit intermediate
- * result, the sb table precomputes the two 4 bit
- * values of the sbox lookups done with the two 6
- * bit halves, shifts them to their proper place,
- * sends them through perm32 and finally E expands
- * them so that they are ready for the next
- * DES round.
- *
- */
- for(sg = 0; sg < 4; sg++) {
- int j1, j2;
- int s1, s2;
-
- for(j1 = 0; j1 < 64; j1++) {
- s1 = s_lookup(2 * sg, j1);
- for(j2 = 0; j2 < 64; j2++) {
- ufc_long to_permute, inx;
-
- s2 = s_lookup(2 * sg + 1, j2);
- to_permute = ((s1 << 4) | s2) << (24 - 8 * sg);
-
-#ifdef _UFC_32_
- inx = ((j1 << 6) | j2) << 1;
- sb[sg][inx ] = eperm32tab[0][(to_permute >> 24) & 0xff][0];
- sb[sg][inx+1] = eperm32tab[0][(to_permute >> 24) & 0xff][1];
- sb[sg][inx ] |= eperm32tab[1][(to_permute >> 16) & 0xff][0];
- sb[sg][inx+1] |= eperm32tab[1][(to_permute >> 16) & 0xff][1];
- sb[sg][inx ] |= eperm32tab[2][(to_permute >> 8) & 0xff][0];
- sb[sg][inx+1] |= eperm32tab[2][(to_permute >> 8) & 0xff][1];
- sb[sg][inx ] |= eperm32tab[3][(to_permute) & 0xff][0];
- sb[sg][inx+1] |= eperm32tab[3][(to_permute) & 0xff][1];
-#endif
-#ifdef _UFC_64_
- inx = ((j1 << 6) | j2);
- sb[sg][inx] =
- ((long64)eperm32tab[0][(to_permute >> 24) & 0xff][0] << 32) |
- (long64)eperm32tab[0][(to_permute >> 24) & 0xff][1];
- sb[sg][inx] |=
- ((long64)eperm32tab[1][(to_permute >> 16) & 0xff][0] << 32) |
- (long64)eperm32tab[1][(to_permute >> 16) & 0xff][1];
- sb[sg][inx] |=
- ((long64)eperm32tab[2][(to_permute >> 8) & 0xff][0] << 32) |
- (long64)eperm32tab[2][(to_permute >> 8) & 0xff][1];
- sb[sg][inx] |=
- ((long64)eperm32tab[3][(to_permute) & 0xff][0] << 32) |
- (long64)eperm32tab[3][(to_permute) & 0xff][1];
-#endif
- }
- }
- }
-
- /*
- * Create an inverse matrix for esel telling
- * where to plug out bits if undoing it
- */
- for(bit=48; bit--;) {
- e_inverse[esel[bit] - 1 ] = bit;
- e_inverse[esel[bit] - 1 + 32] = bit + 48;
- }
-
- /*
- * create efp: the matrix used to
- * undo the E expansion and effect final permutation
- */
- clearmem((char*)efp, sizeof efp);
- for(bit = 0; bit < 64; bit++) {
- int o_bit, o_long;
- ufc_long word_value, mask1, mask2;
- int comes_from_f_bit, comes_from_e_bit;
- int comes_from_word, bit_within_word;
-
- /* See where bit i belongs in the two 32 bit long's */
- o_long = bit / 32; /* 0..1 */
- o_bit = bit % 32; /* 0..31 */
-
- /*
- * And find a bit in the e permutated value setting this bit.
- *
- * Note: the e selection may have selected the same bit several
- * times. By the initialization of e_inverse, we only look
- * for one specific instance.
- */
- comes_from_f_bit = final_perm[bit] - 1; /* 0..63 */
- comes_from_e_bit = e_inverse[comes_from_f_bit]; /* 0..95 */
- comes_from_word = comes_from_e_bit / 6; /* 0..15 */
- bit_within_word = comes_from_e_bit % 6; /* 0..5 */
-
- mask1 = longmask[bit_within_word + 26];
- mask2 = longmask[o_bit];
-
- for(word_value = 64; word_value--;) {
- if(word_value & mask1)
- efp[comes_from_word][word_value][o_long] |= mask2;
- }
- }
- initialized++;
- }
-
-/*
- * Process the elements of the sb table permuting the
- * bits swapped in the expansion by the current salt.
- */
-
-#ifdef _UFC_32_
-static void shuffle_sb(k, saltbits)
- long32 *k;
- ufc_long saltbits;
- { ufc_long j;
- long32 x;
- for(j=4096; j--;) {
- x = (k[0] ^ k[1]) & (long32)saltbits;
- *k++ ^= x;
- *k++ ^= x;
- }
- }
-#endif
-
-#ifdef _UFC_64_
-static void shuffle_sb(k, saltbits)
- long64 *k;
- ufc_long saltbits;
- { ufc_long j;
- long64 x;
- for(j=4096; j--;) {
- x = ((*k >> 32) ^ *k) & (long64)saltbits;
- *k++ ^= (x << 32) | x;
- }
- }
-#endif
-
-/*
- * Setup the unit for a new salt
- * Hopefully we'll not see a new salt in each crypt call.
- */
-
-static unsigned char current_salt[3] = "&&"; /* invalid value */
-static ufc_long current_saltbits = 0;
-static int direction = 0;
-
-static void setup_salt(char *s1)
- { ufc_long i, j, saltbits;
- unsigned char *s2 = (unsigned char *)s1;
-
- if(!initialized)
- ufc_init_des();
-
- if(s2[0] == current_salt[0] && s2[1] == current_salt[1])
- return;
- current_salt[0] = s2[0]; current_salt[1] = s2[1];
-
- /*
- * This is the only crypt change to DES:
- * entries are swapped in the expansion table
- * according to the bits set in the salt.
- */
- saltbits = 0;
- for(i = 0; i < 2; i++) {
- long c=ascii_to_bin(s2[i]);
- if(c < 0 || c > 63)
- c = 0;
- for(j = 0; j < 6; j++) {
- if((c >> j) & 0x1)
- saltbits |= BITMASK(6 * i + j);
- }
- }
-
- /*
- * Permute the sb table values
- * to reflect the changed e
- * selection table
- */
- shuffle_sb(_ufc_sb0, current_saltbits ^ saltbits);
- shuffle_sb(_ufc_sb1, current_saltbits ^ saltbits);
- shuffle_sb(_ufc_sb2, current_saltbits ^ saltbits);
- shuffle_sb(_ufc_sb3, current_saltbits ^ saltbits);
-
- current_saltbits = saltbits;
- }
-
-static void ufc_mk_keytab(key)
- char *key;
- { ufc_long v1, v2, *k1;
- int i;
-#ifdef _UFC_32_
- long32 v, *k2 = &_ufc_keytab[0][0];
-#endif
-#ifdef _UFC_64_
- long64 v, *k2 = &_ufc_keytab[0];
-#endif
-
- v1 = v2 = 0; k1 = &do_pc1[0][0][0];
- for(i = 8; i--;) {
- v1 |= k1[*key & 0x7f]; k1 += 128;
- v2 |= k1[*key++ & 0x7f]; k1 += 128;
- }
-
- for(i = 0; i < 16; i++) {
- k1 = &do_pc2[0][0];
-
- v1 = (v1 << rots[i]) | (v1 >> (28 - rots[i]));
- v = k1[(v1 >> 21) & 0x7f]; k1 += 128;
- v |= k1[(v1 >> 14) & 0x7f]; k1 += 128;
- v |= k1[(v1 >> 7) & 0x7f]; k1 += 128;
- v |= k1[(v1 ) & 0x7f]; k1 += 128;
-
-#ifdef _UFC_32_
- *k2++ = v;
- v = 0;
-#endif
-#ifdef _UFC_64_
- v <<= 32;
-#endif
-
- v2 = (v2 << rots[i]) | (v2 >> (28 - rots[i]));
- v |= k1[(v2 >> 21) & 0x7f]; k1 += 128;
- v |= k1[(v2 >> 14) & 0x7f]; k1 += 128;
- v |= k1[(v2 >> 7) & 0x7f]; k1 += 128;
- v |= k1[(v2 ) & 0x7f];
-
- *k2++ = v;
- }
-
- direction = 0;
- }
-
-/*
- * Undo an extra E selection and do final permutations
- */
-
-ufc_long *_ufc_dofinalperm(l1, l2, r1, r2)
- ufc_long l1,l2,r1,r2;
- { ufc_long v1, v2, x;
- static ufc_long ary[2];
-
- x = (l1 ^ l2) & current_saltbits; l1 ^= x; l2 ^= x;
- x = (r1 ^ r2) & current_saltbits; r1 ^= x; r2 ^= x;
-
- v1=v2=0; l1 >>= 3; l2 >>= 3; r1 >>= 3; r2 >>= 3;
-
- v1 |= efp[15][ r2 & 0x3f][0]; v2 |= efp[15][ r2 & 0x3f][1];
- v1 |= efp[14][(r2 >>= 6) & 0x3f][0]; v2 |= efp[14][ r2 & 0x3f][1];
- v1 |= efp[13][(r2 >>= 10) & 0x3f][0]; v2 |= efp[13][ r2 & 0x3f][1];
- v1 |= efp[12][(r2 >>= 6) & 0x3f][0]; v2 |= efp[12][ r2 & 0x3f][1];
-
- v1 |= efp[11][ r1 & 0x3f][0]; v2 |= efp[11][ r1 & 0x3f][1];
- v1 |= efp[10][(r1 >>= 6) & 0x3f][0]; v2 |= efp[10][ r1 & 0x3f][1];
- v1 |= efp[ 9][(r1 >>= 10) & 0x3f][0]; v2 |= efp[ 9][ r1 & 0x3f][1];
- v1 |= efp[ 8][(r1 >>= 6) & 0x3f][0]; v2 |= efp[ 8][ r1 & 0x3f][1];
-
- v1 |= efp[ 7][ l2 & 0x3f][0]; v2 |= efp[ 7][ l2 & 0x3f][1];
- v1 |= efp[ 6][(l2 >>= 6) & 0x3f][0]; v2 |= efp[ 6][ l2 & 0x3f][1];
- v1 |= efp[ 5][(l2 >>= 10) & 0x3f][0]; v2 |= efp[ 5][ l2 & 0x3f][1];
- v1 |= efp[ 4][(l2 >>= 6) & 0x3f][0]; v2 |= efp[ 4][ l2 & 0x3f][1];
-
- v1 |= efp[ 3][ l1 & 0x3f][0]; v2 |= efp[ 3][ l1 & 0x3f][1];
- v1 |= efp[ 2][(l1 >>= 6) & 0x3f][0]; v2 |= efp[ 2][ l1 & 0x3f][1];
- v1 |= efp[ 1][(l1 >>= 10) & 0x3f][0]; v2 |= efp[ 1][ l1 & 0x3f][1];
- v1 |= efp[ 0][(l1 >>= 6) & 0x3f][0]; v2 |= efp[ 0][ l1 & 0x3f][1];
-
- ary[0] = v1; ary[1] = v2;
- return ary;
- }
-
-/*
- * crypt only: convert from 64 bit to 11 bit ASCII
- * prefixing with the salt
- */
-
-static char *output_conversion(v1, v2, salt)
- ufc_long v1, v2;
- char *salt;
- { static char outbuf[14];
- int i, s;
-
- outbuf[0] = salt[0];
- outbuf[1] = salt[1] ? salt[1] : salt[0];
-
- for(i = 0; i < 5; i++)
- outbuf[i + 2] = bin_to_ascii((v1 >> (26 - 6 * i)) & 0x3f);
-
- s = (v2 & 0xf) << 2;
- v2 = (v2 >> 2) | ((v1 & 0x3) << 30);
-
- for(i = 5; i < 10; i++)
- outbuf[i + 2] = bin_to_ascii((v2 >> (56 - 6 * i)) & 0x3f);
-
- outbuf[12] = bin_to_ascii(s);
- outbuf[13] = 0;
-
- return outbuf;
- }
-
-/*
- * UNIX crypt function
- */
-
-ufc_long *_ufc_doit(ufc_long , ufc_long, ufc_long, ufc_long, ufc_long);
-
-char *ufc_crypt(char *key,char *salt)
- { ufc_long *s;
- char ktab[9];
-
- /*
- * Hack DES tables according to salt
- */
- setup_salt(salt);
-
- /*
- * Setup key schedule
- */
- clearmem(ktab, sizeof ktab);
- StrnCpy(ktab, key, 8);
- ufc_mk_keytab(ktab);
-
- /*
- * Go for the 25 DES encryptions
- */
- s = _ufc_doit((ufc_long)0, (ufc_long)0,
- (ufc_long)0, (ufc_long)0, (ufc_long)25);
-
- /*
- * And convert back to 6 bit ASCII
- */
- return output_conversion(s[0], s[1], salt);
- }
-
-
-#ifdef _UFC_32_
-
-/*
- * 32 bit version
- */
-
-extern long32 _ufc_keytab[16][2];
-extern long32 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
-
-#define SBA(sb, v) (*(long32*)((char*)(sb)+(v)))
-
-static ufc_long *_ufc_doit(l1, l2, r1, r2, itr)
- ufc_long l1, l2, r1, r2, itr;
- { int i;
- long32 s, *k;
-
- while(itr--) {
- k = &_ufc_keytab[0][0];
- for(i=8; i--; ) {
- s = *k++ ^ r1;
- l1 ^= SBA(_ufc_sb1, s & 0xffff); l2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);
- l1 ^= SBA(_ufc_sb0, s >>= 16); l2 ^= SBA(_ufc_sb0, (s) +4);
- s = *k++ ^ r2;
- l1 ^= SBA(_ufc_sb3, s & 0xffff); l2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);
- l1 ^= SBA(_ufc_sb2, s >>= 16); l2 ^= SBA(_ufc_sb2, (s) +4);
-
- s = *k++ ^ l1;
- r1 ^= SBA(_ufc_sb1, s & 0xffff); r2 ^= SBA(_ufc_sb1, (s & 0xffff)+4);
- r1 ^= SBA(_ufc_sb0, s >>= 16); r2 ^= SBA(_ufc_sb0, (s) +4);
- s = *k++ ^ l2;
- r1 ^= SBA(_ufc_sb3, s & 0xffff); r2 ^= SBA(_ufc_sb3, (s & 0xffff)+4);
- r1 ^= SBA(_ufc_sb2, s >>= 16); r2 ^= SBA(_ufc_sb2, (s) +4);
- }
- s=l1; l1=r1; r1=s; s=l2; l2=r2; r2=s;
- }
- return _ufc_dofinalperm(l1, l2, r1, r2);
- }
-
-#endif
-
-#ifdef _UFC_64_
-
-/*
- * 64 bit version
- */
-
-extern long64 _ufc_keytab[16];
-extern long64 _ufc_sb0[], _ufc_sb1[], _ufc_sb2[], _ufc_sb3[];
-
-#define SBA(sb, v) (*(long64*)((char*)(sb)+(v)))
-
-static ufc_long *_ufc_doit(l1, l2, r1, r2, itr)
- ufc_long l1, l2, r1, r2, itr;
- { int i;
- long64 l, r, s, *k;
-
- l = (((long64)l1) << 32) | ((long64)l2);
- r = (((long64)r1) << 32) | ((long64)r2);
-
- while(itr--) {
- k = &_ufc_keytab[0];
- for(i=8; i--; ) {
- s = *k++ ^ r;
- l ^= SBA(_ufc_sb3, (s >> 0) & 0xffff);
- l ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
- l ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
- l ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
-
- s = *k++ ^ l;
- r ^= SBA(_ufc_sb3, (s >> 0) & 0xffff);
- r ^= SBA(_ufc_sb2, (s >> 16) & 0xffff);
- r ^= SBA(_ufc_sb1, (s >> 32) & 0xffff);
- r ^= SBA(_ufc_sb0, (s >> 48) & 0xffff);
- }
- s=l; l=r; r=s;
- }
-
- l1 = l >> 32; l2 = l & 0xffffffff;
- r1 = r >> 32; r2 = r & 0xffffffff;
- return _ufc_dofinalperm(l1, l2, r1, r2);
- }
-
-#endif
-
-
-#else
- int ufc_dummy_procedure(void)
-{return 0;}
-#endif
diff --git a/source/lib/username.c b/source/lib/username.c
deleted file mode 100644
index a9f64259916..00000000000
--- a/source/lib/username.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Username handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-extern int DEBUGLEVEL;
-
-/* internal functions - modified versions of the ones in password.c */
-static struct passwd *uname_string_combinations(char *s, struct passwd * (*fn) (), int N);
-static struct passwd *uname_string_combinations2(char *s, int offset, struct passwd * (*fn) (), int N);
-
-/****************************************************************************
-get a users home directory. tries as-is then lower case
-****************************************************************************/
-char *get_home_dir(char *user)
-{
- static struct passwd *pass;
-
- pass = Get_Pwnam(user,False);
-
- if (!pass) return(NULL);
- return(pass->pw_dir);
-}
-
-
-/*******************************************************************
-map a username from a dos name to a unix name by looking in the username
-map
-********************************************************************/
-void map_username(char *user)
-{
- static int depth=0;
- static BOOL initialised=False;
- static fstring last_from,last_to;
- FILE *f;
- char *s;
- char *mapfile = lp_username_map();
- if (!*mapfile || depth) return;
-
- if (!*user) return;
-
- if (!initialised) {
- *last_from = *last_to = 0;
- initialised = True;
- }
-
- if (strequal(user,last_to)) return;
-
- if (strequal(user,last_from)) {
- DEBUG(3,("Mapped user %s to %s\n",user,last_to));
- fstrcpy(user,last_to);
- return;
- }
-
- f = fopen(mapfile,"r");
- if (!f) {
- DEBUG(0,("can't open username map %s\n",mapfile));
- return;
- }
-
- DEBUG(4,("Scanning username map %s\n",mapfile));
-
- depth++;
-
- for (; (s=fgets_slash(NULL,80,f)); free(s)) {
- char *unixname = s;
- char *dosname = strchr(unixname,'=');
-
- if (!dosname) continue;
- *dosname++ = 0;
-
- while (isspace(*unixname)) unixname++;
- if (!*unixname || strchr("#;",*unixname)) continue;
-
- {
- int l = strlen(unixname);
- while (l && isspace(unixname[l-1])) {
- unixname[l-1] = 0;
- l--;
- }
- }
-
- if (strchr(dosname,'*') || user_in_list(user,dosname)) {
- DEBUG(3,("Mapped user %s to %s\n",user,unixname));
- StrnCpy(last_from,user,sizeof(last_from)-1);
- sscanf(unixname,"%s",user);
- StrnCpy(last_to,user,sizeof(last_to)-1);
- }
- }
-
- fclose(f);
-
- depth--;
-}
-
-/****************************************************************************
-internals of Get_Pwnam wrapper
-****************************************************************************/
-static struct passwd *_Get_Pwnam(char *s)
-{
- struct passwd *ret;
-
- ret = getpwnam(s);
- if (ret)
- {
-#ifdef GETPWANAM
- struct passwd_adjunct *pwret;
- pwret = getpwanam(s);
- if (pwret)
- {
- free(ret->pw_passwd);
- ret->pw_passwd = pwret->pwa_passwd;
- }
-#endif
-
- }
-
- return(ret);
-}
-
-
-/****************************************************************************
-a wrapper for getpwnam() that tries with all lower and all upper case
-if the initial name fails. Also tried with first letter capitalised
-Note that this changes user!
-****************************************************************************/
-struct passwd *Get_Pwnam(char *user,BOOL allow_change)
-{
- fstring user2;
- int last_char;
- int usernamelevel = lp_usernamelevel();
-
- struct passwd *ret;
-
- if (!user || !(*user))
- return(NULL);
-
- StrnCpy(user2,user,sizeof(user2)-1);
-
- if (!allow_change) {
- user = &user2[0];
- }
-
- map_username(user);
-
- ret = _Get_Pwnam(user);
- if (ret) return(ret);
-
- strlower(user);
- ret = _Get_Pwnam(user);
- if (ret) return(ret);
-
- strupper(user);
- ret = _Get_Pwnam(user);
- if (ret) return(ret);
-
- /* try with first letter capitalised */
- if (strlen(user) > 1)
- strlower(user+1);
- ret = _Get_Pwnam(user);
- if (ret) return(ret);
-
- /* try with last letter capitalised */
- strlower(user);
- last_char = strlen(user)-1;
- user[last_char] = toupper(user[last_char]);
- DEBUG(3, ("Trying username %s\n", user));
- ret = _Get_Pwnam(user);
- if (ret) return(ret);
-
- /* try all combinations up to usernamelevel */
- strlower(user);
- ret = uname_string_combinations(user, _Get_Pwnam, usernamelevel);
- if (ret) return(ret);
-
- if (allow_change)
- fstrcpy(user,user2);
-
- return(NULL);
-}
-
-
-/****************************************************************************
-check if a user is in a user list
-****************************************************************************/
-BOOL user_in_list(char *user,char *list)
-{
- pstring tok;
- char *p=list;
-
- while (next_token(&p,tok,LIST_SEP))
- {
- if (strequal(user,tok))
- return(True);
-
-#ifdef NETGROUP
- if (*tok == '@')
- {
- static char *mydomain = NULL;
- if (mydomain == 0)
- yp_get_default_domain(&mydomain);
-
- if(mydomain == 0)
- {
- DEBUG(5,("Unable to get default yp domain\n"));
- }
- else
- {
-
- DEBUG(5,("looking for user %s of domain %s in netgroup %s\n",
- user, mydomain, &tok[1]));
- DEBUG(5,("innetgr is %s\n",
- innetgr(&tok[1], (char *) 0, user, mydomain)
- ? "TRUE" : "FALSE"));
-
- if (innetgr(&tok[1], (char *)0, user, mydomain))
- return (True);
- }
- }
-#endif
-
-
-#if HAVE_GETGRNAM
- if (*tok == '@')
- {
- struct group *gptr;
- char **member;
- struct passwd *pass = Get_Pwnam(user,False);
-
- if (pass) {
- gptr = getgrgid(pass->pw_gid);
- if (gptr && strequal(gptr->gr_name,&tok[1]))
- return(True);
- }
-
- gptr = (struct group *)getgrnam(&tok[1]);
-
- if (gptr)
- {
- member = gptr->gr_mem;
- while (member && *member)
- {
- if (strequal(*member,user))
- return(True);
- member++;
- }
- }
- }
-#endif
- }
- return(False);
-}
-
-/* The functions below have been taken from password.c and slightly modified */
-/****************************************************************************
-apply a function to upper/lower case combinations
-of a string and return true if one of them returns true.
-try all combinations with N uppercase letters.
-offset is the first char to try and change (start with 0)
-it assumes the string starts lowercased
-****************************************************************************/
-static struct passwd *uname_string_combinations2(char *s,int offset,struct passwd *(*fn)(),int N)
-{
- int len = strlen(s);
- int i;
- struct passwd *ret;
-
-#ifdef PASSWORD_LENGTH
- len = MIN(len,PASSWORD_LENGTH);
-#endif
-
- if (N <= 0 || offset >= len)
- return(fn(s));
-
-
- for (i=offset;i<(len-(N-1));i++)
-
- {
- char c = s[i];
- if (!islower(c)) continue;
- s[i] = toupper(c);
- ret = uname_string_combinations2(s,i+1,fn,N-1);
- if(ret) return(ret);
- s[i] = c;
- }
- return(NULL);
-}
-
-/****************************************************************************
-apply a function to upper/lower case combinations
-of a string and return true if one of them returns true.
-try all combinations with up to N uppercase letters.
-offset is the first char to try and change (start with 0)
-it assumes the string starts lowercased
-****************************************************************************/
-static struct passwd * uname_string_combinations(char *s,struct passwd * (*fn)(),int N)
-{
- int n;
- struct passwd *ret;
-
- for (n=1;n<=N;n++)
- {
- ret = uname_string_combinations2(s,0,fn,n);
- if(ret) return(ret);
- }
- return(NULL);
-}
diff --git a/source/lib/util.c b/source/lib/util.c
deleted file mode 100644
index 4e6bfb7054a..00000000000
--- a/source/lib/util.c
+++ /dev/null
@@ -1,4392 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Samba utility functions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-pstring scope = "";
-
-int DEBUGLEVEL = 1;
-
-BOOL passive = False;
-
-int Protocol = PROTOCOL_COREPLUS;
-
-/* a default finfo structure to ensure all fields are sensible */
-file_info def_finfo = {-1,0,0,0,0,0,0,""};
-
-/* these are some file handles where debug info will be stored */
-FILE *dbf = NULL;
-
-/* the client file descriptor */
-int Client = -1;
-
-/* the last IP received from */
-struct in_addr lastip;
-
-/* the last port received from */
-int lastport=0;
-
-/* this is used by the chaining code */
-int chain_size = 0;
-
-int trans_num = 0;
-
-/*
- case handling on filenames
-*/
-int case_default = CASE_LOWER;
-
-pstring debugf = "";
-int syslog_level;
-
-/* the following control case operations - they are put here so the
- client can link easily */
-BOOL case_sensitive;
-BOOL case_preserve;
-BOOL use_mangled_map = False;
-BOOL short_case_preserve;
-BOOL case_mangle;
-
-fstring remote_machine="";
-fstring local_machine="";
-fstring remote_arch="UNKNOWN";
-static enum remote_arch_types ra_type = RA_UNKNOWN;
-fstring remote_proto="UNKNOWN";
-pstring myhostname="";
-pstring user_socket_options="";
-pstring sesssetup_user="";
-pstring myname = "";
-fstring myworkgroup = "";
-char **my_netbios_names;
-
-int smb_read_error = 0;
-
-static BOOL stdout_logging = False;
-
-static char *filename_dos(char *path,char *buf);
-
-/*******************************************************************
- get ready for syslog stuff
- ******************************************************************/
-void setup_logging(char *pname,BOOL interactive)
-{
-#ifdef SYSLOG
- if (!interactive) {
- char *p = strrchr(pname,'/');
- if (p) pname = p+1;
-#ifdef LOG_DAEMON
- openlog(pname, LOG_PID, LOG_DAEMON);
-#else /* LOG_DAEMON - for old systems that have no facility codes. */
- openlog(pname, LOG_PID);
-#endif /* LOG_DAEMON */
- }
-#endif
- if (interactive) {
- stdout_logging = True;
- dbf = stdout;
- }
-}
-
-
-BOOL append_log=False;
-
-
-/****************************************************************************
-reopen the log files
-****************************************************************************/
-void reopen_logs(void)
-{
- extern FILE *dbf;
- pstring fname;
-
- if (DEBUGLEVEL > 0)
- {
- strcpy(fname,debugf);
- if (lp_loaded() && (*lp_logfile()))
- strcpy(fname,lp_logfile());
-
- if (!strcsequal(fname,debugf) || !dbf || !file_exist(debugf,NULL))
- {
- int oldumask = umask(022);
- strcpy(debugf,fname);
- if (dbf) fclose(dbf);
- if (append_log)
- dbf = fopen(debugf,"a");
- else
- dbf = fopen(debugf,"w");
- if (dbf) setbuf(dbf,NULL);
- umask(oldumask);
- }
- }
- else
- {
- if (dbf)
- {
- fclose(dbf);
- dbf = NULL;
- }
- }
-}
-
-
-/*******************************************************************
-check if the log has grown too big
-********************************************************************/
-static void check_log_size(void)
-{
- static int debug_count=0;
- int maxlog;
- struct stat st;
-
- if (debug_count++ < 100 || getuid() != 0) return;
-
- maxlog = lp_max_log_size() * 1024;
- if (!dbf || maxlog <= 0) return;
-
- if (fstat(fileno(dbf),&st) == 0 && st.st_size > maxlog) {
- fclose(dbf); dbf = NULL;
- reopen_logs();
- if (dbf && file_size(debugf) > maxlog) {
- pstring name;
- fclose(dbf); dbf = NULL;
- sprintf(name,"%s.old",debugf);
- sys_rename(debugf,name);
- reopen_logs();
- }
- }
- debug_count=0;
-}
-
-
-/*******************************************************************
-write an debug message on the debugfile. This is called by the DEBUG
-macro
-********************************************************************/
-#ifdef __STDC__
- int Debug1(char *format_str, ...)
-{
-#else
- int Debug1(va_alist)
-va_dcl
-{
- char *format_str;
-#endif
- va_list ap;
- int old_errno = errno;
-
- if (stdout_logging) {
-#ifdef __STDC__
- va_start(ap, format_str);
-#else
- va_start(ap);
- format_str = va_arg(ap,char *);
-#endif
- vfprintf(dbf,format_str,ap);
- va_end(ap);
- errno = old_errno;
- return(0);
- }
-
-#ifdef SYSLOG
- if (!lp_syslog_only())
-#endif
- {
- if (!dbf) {
- int oldumask = umask(022);
- dbf = fopen(debugf,"w");
- umask(oldumask);
- if (dbf) {
- setbuf(dbf,NULL);
- } else {
- errno = old_errno;
- return(0);
- }
- }
- }
-
-#ifdef SYSLOG
- if (syslog_level < lp_syslog())
- {
- /*
- * map debug levels to syslog() priorities
- * note that not all DEBUG(0, ...) calls are
- * necessarily errors
- */
- static int priority_map[] = {
- LOG_ERR, /* 0 */
- LOG_WARNING, /* 1 */
- LOG_NOTICE, /* 2 */
- LOG_INFO, /* 3 */
- };
- int priority;
- pstring msgbuf;
-
- if (syslog_level >= sizeof(priority_map) / sizeof(priority_map[0]) ||
- syslog_level < 0)
- priority = LOG_DEBUG;
- else
- priority = priority_map[syslog_level];
-
-#ifdef __STDC__
- va_start(ap, format_str);
-#else
- va_start(ap);
- format_str = va_arg(ap,char *);
-#endif
- vsprintf(msgbuf, format_str, ap);
- va_end(ap);
-
- msgbuf[255] = '\0';
- syslog(priority, "%s", msgbuf);
- }
-#endif
-
-#ifdef SYSLOG
- if (!lp_syslog_only())
-#endif
- {
-#ifdef __STDC__
- va_start(ap, format_str);
-#else
- va_start(ap);
- format_str = va_arg(ap,char *);
-#endif
- vfprintf(dbf,format_str,ap);
- va_end(ap);
- fflush(dbf);
- }
-
- check_log_size();
-
- errno = old_errno;
-
- return(0);
-}
-
-/****************************************************************************
- find a suitable temporary directory. The result should be copied immediately
- as it may be overwritten by a subsequent call
- ****************************************************************************/
-char *tmpdir(void)
-{
- char *p;
- if ((p = getenv("TMPDIR"))) {
- return p;
- }
- return "/tmp";
-}
-
-
-
-/****************************************************************************
-determine if a file descriptor is in fact a socket
-****************************************************************************/
-BOOL is_a_socket(int fd)
-{
- int v,l;
- l = sizeof(int);
- return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
-}
-
-
-static char *last_ptr=NULL;
-
-/****************************************************************************
- Get the next token from a string, return False if none found
- handles double-quotes.
-Based on a routine by GJC@VILLAGE.COM.
-Extensively modified by Andrew.Tridgell@anu.edu.au
-****************************************************************************/
-BOOL next_token(char **ptr,char *buff,char *sep)
-{
- char *s;
- BOOL quoted;
-
- if (!ptr) ptr = &last_ptr;
- if (!ptr) return(False);
-
- s = *ptr;
-
- /* default to simple separators */
- if (!sep) sep = " \t\n\r";
-
- /* find the first non sep char */
- while(*s && strchr(sep,*s)) s++;
-
- /* nothing left? */
- if (! *s) return(False);
-
- /* copy over the token */
- for (quoted = False; *s && (quoted || !strchr(sep,*s)); s++)
- {
- if (*s == '\"')
- quoted = !quoted;
- else
- *buff++ = *s;
- }
-
- *ptr = (*s) ? s+1 : s;
- *buff = 0;
- last_ptr = *ptr;
-
- return(True);
-}
-
-/****************************************************************************
-Convert list of tokens to array; dependent on above routine.
-Uses last_ptr from above - bit of a hack.
-****************************************************************************/
-char **toktocliplist(int *ctok, char *sep)
-{
- char *s=last_ptr;
- int ictok=0;
- char **ret, **iret;
-
- if (!sep) sep = " \t\n\r";
-
- while(*s && strchr(sep,*s)) s++;
-
- /* nothing left? */
- if (!*s) return(NULL);
-
- do {
- ictok++;
- while(*s && (!strchr(sep,*s))) s++;
- while(*s && strchr(sep,*s)) *s++=0;
- } while(*s);
-
- *ctok=ictok;
- s=last_ptr;
-
- if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL;
-
- while(ictok--) {
- *iret++=s;
- while(*s++);
- while(!*s) s++;
- }
-
- return ret;
-}
-
-#ifndef HAVE_MEMMOVE
-/*******************************************************************
-safely copies memory, ensuring no overlap problems.
-this is only used if the machine does not have it's own memmove().
-this is not the fastest algorithm in town, but it will do for our
-needs.
-********************************************************************/
-void *MemMove(void *dest,void *src,int size)
-{
- unsigned long d,s;
- int i;
- if (dest==src || !size) return(dest);
-
- d = (unsigned long)dest;
- s = (unsigned long)src;
-
- if ((d >= (s+size)) || (s >= (d+size))) {
- /* no overlap */
- memcpy(dest,src,size);
- return(dest);
- }
-
- if (d < s)
- {
- /* we can forward copy */
- if (s-d >= sizeof(int) &&
- !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
- /* do it all as words */
- int *idest = (int *)dest;
- int *isrc = (int *)src;
- size /= sizeof(int);
- for (i=0;i<size;i++) idest[i] = isrc[i];
- } else {
- /* simplest */
- char *cdest = (char *)dest;
- char *csrc = (char *)src;
- for (i=0;i<size;i++) cdest[i] = csrc[i];
- }
- }
- else
- {
- /* must backward copy */
- if (d-s >= sizeof(int) &&
- !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
- /* do it all as words */
- int *idest = (int *)dest;
- int *isrc = (int *)src;
- size /= sizeof(int);
- for (i=size-1;i>=0;i--) idest[i] = isrc[i];
- } else {
- /* simplest */
- char *cdest = (char *)dest;
- char *csrc = (char *)src;
- for (i=size-1;i>=0;i--) cdest[i] = csrc[i];
- }
- }
- return(dest);
-}
-#endif
-
-
-/****************************************************************************
-prompte a dptr (to make it recently used)
-****************************************************************************/
-void array_promote(char *array,int elsize,int element)
-{
- char *p;
- if (element == 0)
- return;
-
- p = (char *)malloc(elsize);
-
- if (!p)
- {
- DEBUG(5,("Ahh! Can't malloc\n"));
- return;
- }
- memcpy(p,array + element * elsize, elsize);
- memmove(array + elsize,array,elsize*element);
- memcpy(array,p,elsize);
- free(p);
-}
-
-enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
-
-struct
-{
- char *name;
- int level;
- int option;
- int value;
- int opttype;
-} socket_options[] = {
- {"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, 0, OPT_BOOL},
- {"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, 0, OPT_BOOL},
- {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, 0, OPT_BOOL},
-#ifdef TCP_NODELAY
- {"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, 0, OPT_BOOL},
-#endif
-#ifdef IPTOS_LOWDELAY
- {"IPTOS_LOWDELAY", IPPROTO_IP, IP_TOS, IPTOS_LOWDELAY, OPT_ON},
-#endif
-#ifdef IPTOS_THROUGHPUT
- {"IPTOS_THROUGHPUT", IPPROTO_IP, IP_TOS, IPTOS_THROUGHPUT, OPT_ON},
-#endif
-#ifdef SO_SNDBUF
- {"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, 0, OPT_INT},
-#endif
-#ifdef SO_RCVBUF
- {"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, 0, OPT_INT},
-#endif
-#ifdef SO_SNDLOWAT
- {"SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, 0, OPT_INT},
-#endif
-#ifdef SO_RCVLOWAT
- {"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
-#endif
-#ifdef SO_SNDTIMEO
- {"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
-#endif
-#ifdef SO_RCVTIMEO
- {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
-#endif
- {NULL,0,0,0,0}};
-
-
-
-/****************************************************************************
-set user socket options
-****************************************************************************/
-void set_socket_options(int fd, char *options)
-{
- string tok;
-
- while (next_token(&options,tok," \t,"))
- {
- int ret=0,i;
- int value = 1;
- char *p;
- BOOL got_value = False;
-
- if ((p = strchr(tok,'=')))
- {
- *p = 0;
- value = atoi(p+1);
- got_value = True;
- }
-
- for (i=0;socket_options[i].name;i++)
- if (strequal(socket_options[i].name,tok))
- break;
-
- if (!socket_options[i].name)
- {
- DEBUG(0,("Unknown socket option %s\n",tok));
- continue;
- }
-
- switch (socket_options[i].opttype)
- {
- case OPT_BOOL:
- case OPT_INT:
- ret = setsockopt(fd,socket_options[i].level,
- socket_options[i].option,(char *)&value,sizeof(int));
- break;
-
- case OPT_ON:
- if (got_value)
- DEBUG(0,("syntax error - %s does not take a value\n",tok));
-
- {
- int on = socket_options[i].value;
- ret = setsockopt(fd,socket_options[i].level,
- socket_options[i].option,(char *)&on,sizeof(int));
- }
- break;
- }
-
- if (ret != 0)
- DEBUG(0,("Failed to set socket option %s\n",tok));
- }
-}
-
-
-
-/****************************************************************************
- close the socket communication
-****************************************************************************/
-void close_sockets(void )
-{
- close(Client);
- Client = 0;
-}
-
-/****************************************************************************
-determine whether we are in the specified group
-****************************************************************************/
-BOOL in_group(gid_t group, int current_gid, int ngroups, int *groups)
-{
- int i;
-
- if (group == current_gid) return(True);
-
- for (i=0;i<ngroups;i++)
- if (group == groups[i])
- return(True);
-
- return(False);
-}
-
-/****************************************************************************
-this is a safer strcpy(), meant to prevent core dumps when nasty things happen
-****************************************************************************/
-char *StrCpy(char *dest,char *src)
-{
- char *d = dest;
-
-#if AJT
- /* I don't want to get lazy with these ... */
- if (!dest || !src) {
- DEBUG(0,("ERROR: NULL StrCpy() called!\n"));
- ajt_panic();
- }
-#endif
-
- if (!dest) return(NULL);
- if (!src) {
- *dest = 0;
- return(dest);
- }
- while ((*d++ = *src++)) ;
- return(dest);
-}
-
-/****************************************************************************
-line strncpy but always null terminates. Make sure there is room!
-****************************************************************************/
-char *StrnCpy(char *dest,char *src,int n)
-{
- char *d = dest;
- if (!dest) return(NULL);
- if (!src) {
- *dest = 0;
- return(dest);
- }
- while (n-- && (*d++ = *src++)) ;
- *d = 0;
- return(dest);
-}
-
-
-/*******************************************************************
-copy an IP address from one buffer to another
-********************************************************************/
-void putip(void *dest,void *src)
-{
- memcpy(dest,src,4);
-}
-
-
-/****************************************************************************
-interpret the weird netbios "name". Return the name type
-****************************************************************************/
-static int name_interpret(char *in,char *out)
-{
- int ret;
- int len = (*in++) / 2;
-
- *out=0;
-
- if (len > 30 || len<1) return(0);
-
- while (len--)
- {
- if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
- *out = 0;
- return(0);
- }
- *out = ((in[0]-'A')<<4) + (in[1]-'A');
- in += 2;
- out++;
- }
- *out = 0;
- ret = out[-1];
-
-#ifdef NETBIOS_SCOPE
- /* Handle any scope names */
- while(*in)
- {
- *out++ = '.'; /* Scope names are separated by periods */
- len = *(unsigned char *)in++;
- StrnCpy(out, in, len);
- out += len;
- *out=0;
- in += len;
- }
-#endif
- return(ret);
-}
-
-/****************************************************************************
-mangle a name into netbios format
-
- Note: <Out> must be (33 + strlen(scope) + 2) bytes long, at minimum.
-****************************************************************************/
-int name_mangle( char *In, char *Out, char name_type )
- {
- int i;
- int c;
- int len;
- char buf[20];
- char *p = Out;
-
- /* Safely copy the input string, In, into buf[]. */
- (void)memset( buf, 0, 20 );
- if( '*' == In[0] )
- buf[0] = '*';
- else
- (void)sprintf( buf, "%-15.15s%c", In, name_type );
-
- /* Place the length of the first field into the output buffer. */
- p[0] = 32;
- p++;
-
- /* Now convert the name to the rfc1001/1002 format. */
- for( i = 0; i < 16; i++ )
- {
- c = toupper( buf[i] );
- p[i*2] = ( (c >> 4) & 0x000F ) + 'A';
- p[(i*2)+1] = (c & 0x000F) + 'A';
- }
- p += 32;
- p[0] = '\0';
-
- /* Add the scope string. */
- for( i = 0, len = 0; NULL != scope; i++, len++ )
- {
- switch( scope[i] )
- {
- case '\0':
- p[0] = len;
- if( len > 0 )
- p[len+1] = 0;
- return( name_len(Out) );
- case '.':
- p[0] = len;
- p += (len + 1);
- len = 0;
- break;
- default:
- p[len+1] = scope[i];
- break;
- }
- }
-
- return( name_len(Out) );
- } /* name_mangle */
-
-/*******************************************************************
- check if a file exists
-********************************************************************/
-BOOL file_exist(char *fname,struct stat *sbuf)
-{
- struct stat st;
- if (!sbuf) sbuf = &st;
-
- if (sys_stat(fname,sbuf) != 0)
- return(False);
-
- return(S_ISREG(sbuf->st_mode));
-}
-
-/*******************************************************************
-check a files mod time
-********************************************************************/
-time_t file_modtime(char *fname)
-{
- struct stat st;
-
- if (sys_stat(fname,&st) != 0)
- return(0);
-
- return(st.st_mtime);
-}
-
-/*******************************************************************
- check if a directory exists
-********************************************************************/
-BOOL directory_exist(char *dname,struct stat *st)
-{
- struct stat st2;
- BOOL ret;
-
- if (!st) st = &st2;
-
- if (sys_stat(dname,st) != 0)
- return(False);
-
- ret = S_ISDIR(st->st_mode);
- if(!ret)
- errno = ENOTDIR;
- return ret;
-}
-
-/*******************************************************************
-returns the size in bytes of the named file
-********************************************************************/
-uint32 file_size(char *file_name)
-{
- struct stat buf;
- buf.st_size = 0;
- sys_stat(file_name,&buf);
- return(buf.st_size);
-}
-
-/*******************************************************************
-return a string representing an attribute for a file
-********************************************************************/
-char *attrib_string(int mode)
-{
- static char attrstr[10];
-
- attrstr[0] = 0;
-
- if (mode & aVOLID) strcat(attrstr,"V");
- if (mode & aDIR) strcat(attrstr,"D");
- if (mode & aARCH) strcat(attrstr,"A");
- if (mode & aHIDDEN) strcat(attrstr,"H");
- if (mode & aSYSTEM) strcat(attrstr,"S");
- if (mode & aRONLY) strcat(attrstr,"R");
-
- return(attrstr);
-}
-
-
-/*******************************************************************
- case insensitive string compararison
-********************************************************************/
-int StrCaseCmp(char *s, char *t)
-{
- /* compare until we run out of string, either t or s, or find a difference */
- /* We *must* use toupper rather than tolower here due to the
- asynchronous upper to lower mapping.
- */
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- int diff;
- for (;;)
- {
- if (!*s || !*t)
- return toupper (*s) - toupper (*t);
- else if (is_sj_alph (*s) && is_sj_alph (*t))
- {
- diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
- if (diff)
- return diff;
- s += 2;
- t += 2;
- }
- else if (is_shift_jis (*s) && is_shift_jis (*t))
- {
- diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
- if (diff)
- return diff;
- diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
- if (diff)
- return diff;
- s += 2;
- t += 2;
- }
- else if (is_shift_jis (*s))
- return 1;
- else if (is_shift_jis (*t))
- return -1;
- else
- {
- diff = toupper (*s) - toupper (*t);
- if (diff)
- return diff;
- s++;
- t++;
- }
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- while (*s && *t && toupper(*s) == toupper(*t))
- {
- s++;
- t++;
- }
-
- return(toupper(*s) - toupper(*t));
- }
-}
-
-/*******************************************************************
- case insensitive string compararison, length limited
-********************************************************************/
-int StrnCaseCmp(char *s, char *t, int n)
-{
- /* compare until we run out of string, either t or s, or chars */
- /* We *must* use toupper rather than tolower here due to the
- asynchronous upper to lower mapping.
- */
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- int diff;
- for (;n > 0;)
- {
- if (!*s || !*t)
- return toupper (*s) - toupper (*t);
- else if (is_sj_alph (*s) && is_sj_alph (*t))
- {
- diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
- if (diff)
- return diff;
- s += 2;
- t += 2;
- n -= 2;
- }
- else if (is_shift_jis (*s) && is_shift_jis (*t))
- {
- diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
- if (diff)
- return diff;
- diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
- if (diff)
- return diff;
- s += 2;
- t += 2;
- n -= 2;
- }
- else if (is_shift_jis (*s))
- return 1;
- else if (is_shift_jis (*t))
- return -1;
- else
- {
- diff = toupper (*s) - toupper (*t);
- if (diff)
- return diff;
- s++;
- t++;
- n--;
- }
- }
- return 0;
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- while (n-- && *s && *t && toupper(*s) == toupper(*t))
- {
- s++;
- t++;
- }
-
- /* not run out of chars - strings are different lengths */
- if (n)
- return(toupper(*s) - toupper(*t));
-
- /* identical up to where we run out of chars,
- and strings are same length */
- return(0);
- }
-}
-
-/*******************************************************************
- compare 2 strings
-********************************************************************/
-BOOL strequal(char *s1, char *s2)
-{
- if (s1 == s2) return(True);
- if (!s1 || !s2) return(False);
-
- return(StrCaseCmp(s1,s2)==0);
-}
-
-/*******************************************************************
- compare 2 strings up to and including the nth char.
- ******************************************************************/
-BOOL strnequal(char *s1,char *s2,int n)
-{
- if (s1 == s2) return(True);
- if (!s1 || !s2 || !n) return(False);
-
- return(StrnCaseCmp(s1,s2,n)==0);
-}
-
-/*******************************************************************
- compare 2 strings (case sensitive)
-********************************************************************/
-BOOL strcsequal(char *s1,char *s2)
-{
- if (s1 == s2) return(True);
- if (!s1 || !s2) return(False);
-
- return(strcmp(s1,s2)==0);
-}
-
-
-/*******************************************************************
- convert a string to lower case
-********************************************************************/
-void strlower(char *s)
-{
- while (*s)
- {
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- if (is_shift_jis (*s))
- {
- if (is_sj_upper (s[0], s[1]))
- s[1] = sj_tolower2 (s[1]);
- s += 2;
- }
- else if (is_kana (*s))
- {
- s++;
- }
- else
- {
- if (isupper(*s))
- *s = tolower(*s);
- s++;
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- if (isupper(*s))
- *s = tolower(*s);
- s++;
- }
- }
-}
-
-/*******************************************************************
- convert a string to upper case
-********************************************************************/
-void strupper(char *s)
-{
- while (*s)
- {
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- if (is_shift_jis (*s))
- {
- if (is_sj_lower (s[0], s[1]))
- s[1] = sj_toupper2 (s[1]);
- s += 2;
- }
- else if (is_kana (*s))
- {
- s++;
- }
- else
- {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- if (islower(*s))
- *s = toupper(*s);
- s++;
- }
- }
-}
-
-/*******************************************************************
- convert a string to "normal" form
-********************************************************************/
-void strnorm(char *s)
-{
- if (case_default == CASE_UPPER)
- strupper(s);
- else
- strlower(s);
-}
-
-/*******************************************************************
-check if a string is in "normal" case
-********************************************************************/
-BOOL strisnormal(char *s)
-{
- if (case_default == CASE_UPPER)
- return(!strhaslower(s));
-
- return(!strhasupper(s));
-}
-
-
-/****************************************************************************
- string replace
-****************************************************************************/
-void string_replace(char *s,char oldc,char newc)
-{
- while (*s)
- {
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- if (is_shift_jis (*s))
- s += 2;
- else if (is_kana (*s))
- s++;
- else
- {
- if (oldc == *s)
- *s = newc;
- s++;
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- if (oldc == *s)
- *s = newc;
- s++;
- }
- }
-}
-
-/****************************************************************************
- make a file into unix format
-****************************************************************************/
-void unix_format(char *fname)
-{
- pstring namecopy;
- string_replace(fname,'\\','/');
-
- if (*fname == '/')
- {
- pstrcpy(namecopy,fname);
- strcpy(fname,".");
- strcat(fname,namecopy);
- }
-}
-
-/****************************************************************************
- make a file into dos format
-****************************************************************************/
-void dos_format(char *fname)
-{
- string_replace(fname,'/','\\');
-}
-
-
-/*******************************************************************
- show a smb message structure
-********************************************************************/
-void show_msg(char *buf)
-{
- int i;
- int j;
- int bcc=0;
- if (DEBUGLEVEL < 5)
- return;
-
- DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
- smb_len(buf),
- (int)CVAL(buf,smb_com),
- (int)CVAL(buf,smb_rcls),
- (int)CVAL(buf,smb_reh),
- (int)SVAL(buf,smb_err),
- (int)CVAL(buf,smb_flg),
- (int)SVAL(buf,smb_flg2)));
- DEBUG(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\nsmt_wct=%d\n",
- (int)SVAL(buf,smb_tid),
- (int)SVAL(buf,smb_pid),
- (int)SVAL(buf,smb_uid),
- (int)SVAL(buf,smb_mid),
- (int)CVAL(buf,smb_wct)));
- for (i=0;i<(int)CVAL(buf,smb_wct);i++)
- DEBUG(5,("smb_vwv[%d]=%d (0x%X)\n",i,
- SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
- bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
- DEBUG(5,("smb_bcc=%d\n",bcc));
- if (DEBUGLEVEL < 10)
- return;
- for (i = 0; i < MIN(bcc, 256); i += 16)
- {
- for (j = 0; j < 16 && i+j < MIN(bcc,256); j++)
- {
-
- DEBUG(10,("%2X ",CVAL(smb_buf(buf),i+j)));
- if (j == 7) DEBUG(10, (" "));
-
- }
- DEBUG(10,(" "));
-
- for (j = 0; j < 16 && i+j < MIN(bcc,256); j++)
- {
- unsigned char c = CVAL(smb_buf(buf),i+j);
- if (c < 32 || c > 128) c = '.';
- DEBUG(10,("%c",c));
-
- if (j == 7) DEBUG(10, (" "));
- }
-
- DEBUG(10,("\n"));
-}
-}
-
-/*******************************************************************
- return the length of an smb packet
-********************************************************************/
-int smb_len(char *buf)
-{
- return( PVAL(buf,3) | (PVAL(buf,2)<<8) | ((PVAL(buf,1)&1)<<16) );
-}
-
-/*******************************************************************
- set the length of an smb packet
-********************************************************************/
-void _smb_setlen(char *buf,int len)
-{
- buf[0] = 0;
- buf[1] = (len&0x10000)>>16;
- buf[2] = (len&0xFF00)>>8;
- buf[3] = len&0xFF;
-}
-
-/*******************************************************************
- set the length and marker of an smb packet
-********************************************************************/
-void smb_setlen(char *buf,int len)
-{
- _smb_setlen(buf,len);
-
- CVAL(buf,4) = 0xFF;
- CVAL(buf,5) = 'S';
- CVAL(buf,6) = 'M';
- CVAL(buf,7) = 'B';
-}
-
-/*******************************************************************
- setup the word count and byte count for a smb message
-********************************************************************/
-int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
-{
- if (zero)
- bzero(buf + smb_size,num_words*2 + num_bytes);
- CVAL(buf,smb_wct) = num_words;
- SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
- smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
- return (smb_size + num_words*2 + num_bytes);
-}
-
-/*******************************************************************
-return the number of smb words
-********************************************************************/
-int smb_numwords(char *buf)
-{
- return (CVAL(buf,smb_wct));
-}
-
-/*******************************************************************
-return the size of the smb_buf region of a message
-********************************************************************/
-int smb_buflen(char *buf)
-{
- return(SVAL(buf,smb_vwv0 + smb_numwords(buf)*2));
-}
-
-/*******************************************************************
- return a pointer to the smb_buf data area
-********************************************************************/
-int smb_buf_ofs(char *buf)
-{
- return (smb_size + CVAL(buf,smb_wct)*2);
-}
-
-/*******************************************************************
- return a pointer to the smb_buf data area
-********************************************************************/
-char *smb_buf(char *buf)
-{
- return (buf + smb_buf_ofs(buf));
-}
-
-/*******************************************************************
-return the SMB offset into an SMB buffer
-********************************************************************/
-int smb_offset(char *p,char *buf)
-{
- return(PTR_DIFF(p,buf+4) + chain_size);
-}
-
-
-/*******************************************************************
-skip past some strings in a buffer
-********************************************************************/
-char *skip_string(char *buf,int n)
-{
- while (n--)
- buf += strlen(buf) + 1;
- return(buf);
-}
-
-/*******************************************************************
-trim the specified elements off the front and back of a string
-********************************************************************/
-BOOL trim_string(char *s,char *front,char *back)
-{
- BOOL ret = False;
- while (front && *front && strncmp(s,front,strlen(front)) == 0)
- {
- char *p = s;
- ret = True;
- while (1)
- {
- if (!(*p = p[strlen(front)]))
- break;
- p++;
- }
- }
- while (back && *back && strlen(s) >= strlen(back) &&
- (strncmp(s+strlen(s)-strlen(back),back,strlen(back))==0))
- {
- ret = True;
- s[strlen(s)-strlen(back)] = 0;
- }
- return(ret);
-}
-
-
-/*******************************************************************
-reduce a file name, removing .. elements.
-********************************************************************/
-void dos_clean_name(char *s)
-{
- char *p=NULL;
-
- DEBUG(3,("dos_clean_name [%s]\n",s));
-
- /* remove any double slashes */
- string_sub(s, "\\\\", "\\");
-
- while ((p = strstr(s,"\\..\\")) != NULL)
- {
- pstring s1;
-
- *p = 0;
- pstrcpy(s1,p+3);
-
- if ((p=strrchr(s,'\\')) != NULL)
- *p = 0;
- else
- *s = 0;
- strcat(s,s1);
- }
-
- trim_string(s,NULL,"\\..");
-
- string_sub(s, "\\.\\", "\\");
-}
-
-/*******************************************************************
-reduce a file name, removing .. elements.
-********************************************************************/
-void unix_clean_name(char *s)
-{
- char *p=NULL;
-
- DEBUG(3,("unix_clean_name [%s]\n",s));
-
- /* remove any double slashes */
- string_sub(s, "//","/");
-
- /* Remove leading ./ characters */
- if(strncmp(s, "./", 2) == 0) {
- trim_string(s, "./", NULL);
- if(*s == 0)
- strcpy(s,"./");
- }
-
- while ((p = strstr(s,"/../")) != NULL)
- {
- pstring s1;
-
- *p = 0;
- pstrcpy(s1,p+3);
-
- if ((p=strrchr(s,'/')) != NULL)
- *p = 0;
- else
- *s = 0;
- strcat(s,s1);
- }
-
- trim_string(s,NULL,"/..");
-}
-
-
-/*******************************************************************
-a wrapper for the normal chdir() function
-********************************************************************/
-int ChDir(char *path)
-{
- int res;
- static pstring LastDir="";
-
- if (strcsequal(path,".")) return(0);
-
- if (*path == '/' && strcsequal(LastDir,path)) return(0);
- DEBUG(3,("chdir to %s\n",path));
- res = sys_chdir(path);
- if (!res)
- pstrcpy(LastDir,path);
- return(res);
-}
-
-/* number of list structures for a caching GetWd function. */
-#define MAX_GETWDCACHE (50)
-
-struct
-{
- ino_t inode;
- dev_t dev;
- char *text;
- BOOL valid;
-} ino_list[MAX_GETWDCACHE];
-
-BOOL use_getwd_cache=True;
-
-/*******************************************************************
- return the absolute current directory path
-********************************************************************/
-char *GetWd(char *str)
-{
- pstring s;
- static BOOL getwd_cache_init = False;
- struct stat st, st2;
- int i;
-
- *s = 0;
-
- if (!use_getwd_cache)
- return(sys_getwd(str));
-
- /* init the cache */
- if (!getwd_cache_init)
- {
- getwd_cache_init = True;
- for (i=0;i<MAX_GETWDCACHE;i++)
- {
- string_init(&ino_list[i].text,"");
- ino_list[i].valid = False;
- }
- }
-
- /* Get the inode of the current directory, if this doesn't work we're
- in trouble :-) */
-
- if (stat(".",&st) == -1)
- {
- DEBUG(0,("Very strange, couldn't stat \".\"\n"));
- return(sys_getwd(str));
- }
-
-
- for (i=0; i<MAX_GETWDCACHE; i++)
- if (ino_list[i].valid)
- {
-
- /* If we have found an entry with a matching inode and dev number
- then find the inode number for the directory in the cached string.
- If this agrees with that returned by the stat for the current
- directory then all is o.k. (but make sure it is a directory all
- the same...) */
-
- if (st.st_ino == ino_list[i].inode &&
- st.st_dev == ino_list[i].dev)
- {
- if (stat(ino_list[i].text,&st2) == 0)
- {
- if (st.st_ino == st2.st_ino &&
- st.st_dev == st2.st_dev &&
- (st2.st_mode & S_IFMT) == S_IFDIR)
- {
- strcpy (str, ino_list[i].text);
-
- /* promote it for future use */
- array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
- return (str);
- }
- else
- {
- /* If the inode is different then something's changed,
- scrub the entry and start from scratch. */
- ino_list[i].valid = False;
- }
- }
- }
- }
-
-
- /* We don't have the information to hand so rely on traditional methods.
- The very slow getcwd, which spawns a process on some systems, or the
- not quite so bad getwd. */
-
- if (!sys_getwd(s))
- {
- DEBUG(0,("Getwd failed, errno %s\n",strerror(errno)));
- return (NULL);
- }
-
- strcpy(str,s);
-
- DEBUG(5,("GetWd %s, inode %d, dev %x\n",s,(int)st.st_ino,(int)st.st_dev));
-
- /* add it to the cache */
- i = MAX_GETWDCACHE - 1;
- string_set(&ino_list[i].text,s);
- ino_list[i].dev = st.st_dev;
- ino_list[i].inode = st.st_ino;
- ino_list[i].valid = True;
-
- /* put it at the top of the list */
- array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
-
- return (str);
-}
-
-
-
-/*******************************************************************
-reduce a file name, removing .. elements and checking that
-it is below dir in the heirachy. This uses GetWd() and so must be run
-on the system that has the referenced file system.
-
-widelinks are allowed if widelinks is true
-********************************************************************/
-BOOL reduce_name(char *s,char *dir,BOOL widelinks)
-{
-#ifndef REDUCE_PATHS
- return True;
-#else
- pstring dir2;
- pstring wd;
- pstring basename;
- pstring newname;
- char *p=NULL;
- BOOL relative = (*s != '/');
-
- *dir2 = *wd = *basename = *newname = 0;
-
- if (widelinks)
- {
- unix_clean_name(s);
- /* can't have a leading .. */
- if (strncmp(s,"..",2) == 0 && (s[2]==0 || s[2]=='/'))
- {
- DEBUG(3,("Illegal file name? (%s)\n",s));
- return(False);
- }
-
- if (strlen(s) == 0)
- strcpy(s,"./");
-
- return(True);
- }
-
- DEBUG(3,("reduce_name [%s] [%s]\n",s,dir));
-
- /* remove any double slashes */
- string_sub(s,"//","/");
-
- pstrcpy(basename,s);
- p = strrchr(basename,'/');
-
- if (!p)
- return(True);
-
- if (!GetWd(wd))
- {
- DEBUG(0,("couldn't getwd for %s %s\n",s,dir));
- return(False);
- }
-
- if (ChDir(dir) != 0)
- {
- DEBUG(0,("couldn't chdir to %s\n",dir));
- return(False);
- }
-
- if (!GetWd(dir2))
- {
- DEBUG(0,("couldn't getwd for %s\n",dir));
- ChDir(wd);
- return(False);
- }
-
-
- if (p && (p != basename))
- {
- *p = 0;
- if (strcmp(p+1,".")==0)
- p[1]=0;
- if (strcmp(p+1,"..")==0)
- *p = '/';
- }
-
- if (ChDir(basename) != 0)
- {
- ChDir(wd);
- DEBUG(3,("couldn't chdir for %s %s basename=%s\n",s,dir,basename));
- return(False);
- }
-
- if (!GetWd(newname))
- {
- ChDir(wd);
- DEBUG(2,("couldn't get wd for %s %s\n",s,dir2));
- return(False);
- }
-
- if (p && (p != basename))
- {
- strcat(newname,"/");
- strcat(newname,p+1);
- }
-
- {
- int l = strlen(dir2);
- if (dir2[l-1] == '/')
- l--;
-
- if (strncmp(newname,dir2,l) != 0)
- {
- ChDir(wd);
- DEBUG(2,("Bad access attempt? s=%s dir=%s newname=%s l=%d\n",s,dir2,newname,l));
- return(False);
- }
-
- if (relative)
- {
- if (newname[l] == '/')
- pstrcpy(s,newname + l + 1);
- else
- pstrcpy(s,newname+l);
- }
- else
- pstrcpy(s,newname);
- }
-
- ChDir(wd);
-
- if (strlen(s) == 0)
- strcpy(s,"./");
-
- DEBUG(3,("reduced to %s\n",s));
- return(True);
-#endif
-}
-
-/****************************************************************************
-expand some *s
-****************************************************************************/
-static void expand_one(char *Mask,int len)
-{
- char *p1;
- while ((p1 = strchr(Mask,'*')) != NULL)
- {
- int lfill = (len+1) - strlen(Mask);
- int l1= (p1 - Mask);
- pstring tmp;
- pstrcpy(tmp,Mask);
- memset(tmp+l1,'?',lfill);
- pstrcpy(tmp + l1 + lfill,Mask + l1 + 1);
- pstrcpy(Mask,tmp);
- }
-}
-
-/****************************************************************************
-expand a wildcard expression, replacing *s with ?s
-****************************************************************************/
-void expand_mask(char *Mask,BOOL doext)
-{
- pstring mbeg,mext;
- pstring dirpart;
- pstring filepart;
- BOOL hasdot = False;
- char *p1;
- BOOL absolute = (*Mask == '\\');
-
- *mbeg = *mext = *dirpart = *filepart = 0;
-
- /* parse the directory and filename */
- if (strchr(Mask,'\\'))
- dirname_dos(Mask,dirpart);
-
- filename_dos(Mask,filepart);
-
- pstrcpy(mbeg,filepart);
- if ((p1 = strchr(mbeg,'.')) != NULL)
- {
- hasdot = True;
- *p1 = 0;
- p1++;
- pstrcpy(mext,p1);
- }
- else
- {
- strcpy(mext,"");
- if (strlen(mbeg) > 8)
- {
- pstrcpy(mext,mbeg + 8);
- mbeg[8] = 0;
- }
- }
-
- if (*mbeg == 0)
- strcpy(mbeg,"????????");
- if ((*mext == 0) && doext && !hasdot)
- strcpy(mext,"???");
-
- if (strequal(mbeg,"*") && *mext==0)
- strcpy(mext,"*");
-
- /* expand *'s */
- expand_one(mbeg,8);
- if (*mext)
- expand_one(mext,3);
-
- pstrcpy(Mask,dirpart);
- if (*dirpart || absolute) strcat(Mask,"\\");
- strcat(Mask,mbeg);
- strcat(Mask,".");
- strcat(Mask,mext);
-
- DEBUG(6,("Mask expanded to [%s]\n",Mask));
-}
-
-
-/****************************************************************************
-does a string have any uppercase chars in it?
-****************************************************************************/
-BOOL strhasupper(char *s)
-{
- while (*s)
- {
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- if (is_shift_jis (*s))
- s += 2;
- else if (is_kana (*s))
- s++;
- else
- {
- if (isupper(*s))
- return(True);
- s++;
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- if (isupper(*s))
- return(True);
- s++;
- }
- }
- return(False);
-}
-
-/****************************************************************************
-does a string have any lowercase chars in it?
-****************************************************************************/
-BOOL strhaslower(char *s)
-{
- while (*s)
- {
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- if (is_shift_jis (*s))
- {
- if (is_sj_upper (s[0], s[1]))
- return(True);
- if (is_sj_lower (s[0], s[1]))
- return (True);
- s += 2;
- }
- else if (is_kana (*s))
- {
- s++;
- }
- else
- {
- if (islower(*s))
- return(True);
- s++;
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- if (islower(*s))
- return(True);
- s++;
- }
- }
- return(False);
-}
-
-/****************************************************************************
-find the number of chars in a string
-****************************************************************************/
-int count_chars(char *s,char c)
-{
- int count=0;
-
-#if !defined(KANJI_WIN95_COMPATIBILITY)
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- /* Win95 treats full width ascii characters as case sensitive. */
- while (*s)
- {
- if (is_shift_jis (*s))
- s += 2;
- else
- {
- if (*s == c)
- count++;
- s++;
- }
- }
- }
- else
-#endif /* KANJI_WIN95_COMPATIBILITY */
- {
- while (*s)
- {
- if (*s == c)
- count++;
- s++;
- }
- }
- return(count);
-}
-
-
-/****************************************************************************
- make a dir struct
-****************************************************************************/
-void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date)
-{
- char *p;
- pstring mask2;
-
- pstrcpy(mask2,mask);
-
- if ((mode & aDIR) != 0)
- size = 0;
-
- memset(buf+1,' ',11);
- if ((p = strchr(mask2,'.')) != NULL)
- {
- *p = 0;
- memcpy(buf+1,mask2,MIN(strlen(mask2),8));
- memcpy(buf+9,p+1,MIN(strlen(p+1),3));
- *p = '.';
- }
- else
- memcpy(buf+1,mask2,MIN(strlen(mask2),11));
-
- bzero(buf+21,DIR_STRUCT_SIZE-21);
- CVAL(buf,21) = mode;
- put_dos_date(buf,22,date);
- SSVAL(buf,26,size & 0xFFFF);
- SSVAL(buf,28,size >> 16);
- StrnCpy(buf+30,fname,12);
- if (!case_sensitive)
- strupper(buf+30);
- DEBUG(8,("put name [%s] into dir struct\n",buf+30));
-}
-
-
-/*******************************************************************
-close the low 3 fd's and open dev/null in their place
-********************************************************************/
-void close_low_fds(void)
-{
- int fd;
- int i;
- close(0); close(1); close(2);
- /* try and use up these file descriptors, so silly
- library routines writing to stdout etc won't cause havoc */
- for (i=0;i<3;i++) {
- fd = open("/dev/null",O_RDWR,0);
- if (fd < 0) fd = open("/dev/null",O_WRONLY,0);
- if (fd < 0) {
- DEBUG(0,("Can't open /dev/null\n"));
- return;
- }
- if (fd != i) {
- DEBUG(0,("Didn't get file descriptor %d\n",i));
- return;
- }
- }
-}
-
-/****************************************************************************
-Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
-else
-if SYSV use O_NDELAY
-if BSD use FNDELAY
-****************************************************************************/
-int set_blocking(int fd, BOOL set)
-{
- int val;
-#ifdef O_NONBLOCK
-#define FLAG_TO_SET O_NONBLOCK
-#else
-#ifdef SYSV
-#define FLAG_TO_SET O_NDELAY
-#else /* BSD */
-#define FLAG_TO_SET FNDELAY
-#endif
-#endif
-
- if((val = fcntl(fd, F_GETFL, 0)) == -1)
- return -1;
- if(set) /* Turn blocking on - ie. clear nonblock flag */
- val &= ~FLAG_TO_SET;
- else
- val |= FLAG_TO_SET;
- return fcntl( fd, F_SETFL, val);
-#undef FLAG_TO_SET
-}
-
-
-/****************************************************************************
-write to a socket
-****************************************************************************/
-int write_socket(int fd,char *buf,int len)
-{
- int ret=0;
-
- if (passive)
- return(len);
- DEBUG(6,("write_socket(%d,%d)\n",fd,len));
- ret = write_data(fd,buf,len);
-
- DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,len,ret));
- return(ret);
-}
-
-/****************************************************************************
-read from a socket
-****************************************************************************/
-int read_udp_socket(int fd,char *buf,int len)
-{
- int ret;
- struct sockaddr sock;
- int socklen;
-
- socklen = sizeof(sock);
- bzero((char *)&sock,socklen);
- bzero((char *)&lastip,sizeof(lastip));
- ret = recvfrom(fd,buf,len,0,&sock,&socklen);
- if (ret <= 0) {
- DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
- return(0);
- }
-
- lastip = *(struct in_addr *) &sock.sa_data[2];
- lastport = ntohs(((struct sockaddr_in *)&sock)->sin_port);
-
- return(ret);
-}
-
-/****************************************************************************
-read data from a device with a timout in msec.
-mincount = if timeout, minimum to read before returning
-maxcount = number to be read.
-****************************************************************************/
-int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out)
-{
- fd_set fds;
- int selrtn;
- int readret;
- int nread = 0;
- struct timeval timeout;
-
- /* just checking .... */
- if (maxcnt <= 0) return(0);
-
- smb_read_error = 0;
-
- /* Blocking read */
- if (time_out <= 0) {
- if (mincnt == 0) mincnt = maxcnt;
-
- while (nread < mincnt) {
- readret = read(fd, buf + nread, maxcnt - nread);
- if (readret == 0) {
- smb_read_error = READ_EOF;
- return -1;
- }
-
- if (readret == -1) {
- smb_read_error = READ_ERROR;
- return -1;
- }
- nread += readret;
- }
- return(nread);
- }
-
- /* Most difficult - timeout read */
- /* If this is ever called on a disk file and
- mincnt is greater then the filesize then
- system performance will suffer severely as
- select always return true on disk files */
-
- /* Set initial timeout */
- timeout.tv_sec = time_out / 1000;
- timeout.tv_usec = 1000 * (time_out % 1000);
-
- for (nread=0; nread<mincnt; )
- {
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
-
- selrtn = sys_select(&fds,&timeout);
-
- /* Check if error */
- if(selrtn == -1) {
- /* something is wrong. Maybe the socket is dead? */
- smb_read_error = READ_ERROR;
- return -1;
- }
-
- /* Did we timeout ? */
- if (selrtn == 0) {
- smb_read_error = READ_TIMEOUT;
- return -1;
- }
-
- readret = read(fd, buf+nread, maxcnt-nread);
- if (readret == 0) {
- /* we got EOF on the file descriptor */
- smb_read_error = READ_EOF;
- return -1;
- }
-
- if (readret == -1) {
- /* the descriptor is probably dead */
- smb_read_error = READ_ERROR;
- return -1;
- }
-
- nread += readret;
- }
-
- /* Return the number we got */
- return(nread);
-}
-
-/****************************************************************************
-read data from the client. Maxtime is in milliseconds
-****************************************************************************/
-int read_max_udp(int fd,char *buffer,int bufsize,int maxtime)
-{
- fd_set fds;
- int selrtn;
- int nread;
- struct timeval timeout;
-
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
-
- timeout.tv_sec = maxtime / 1000;
- timeout.tv_usec = (maxtime % 1000) * 1000;
-
- selrtn = sys_select(&fds,maxtime>0?&timeout:NULL);
-
- if (!FD_ISSET(fd,&fds))
- return 0;
-
- nread = read_udp_socket(fd, buffer, bufsize);
-
- /* return the number got */
- return(nread);
-}
-
-/*******************************************************************
-find the difference in milliseconds between two struct timeval
-values
-********************************************************************/
-int TvalDiff(struct timeval *tvalold,struct timeval *tvalnew)
-{
- return((tvalnew->tv_sec - tvalold->tv_sec)*1000 +
- ((int)tvalnew->tv_usec - (int)tvalold->tv_usec)/1000);
-}
-
-/****************************************************************************
-send a keepalive packet (rfc1002)
-****************************************************************************/
-BOOL send_keepalive(int client)
-{
- unsigned char buf[4];
-
- buf[0] = 0x85;
- buf[1] = buf[2] = buf[3] = 0;
-
- return(write_data(client,(char *)buf,4) == 4);
-}
-
-
-
-/****************************************************************************
- read data from the client, reading exactly N bytes.
-****************************************************************************/
-int read_data(int fd,char *buffer,int N)
-{
- int ret;
- int total=0;
-
- smb_read_error = 0;
-
- while (total < N)
- {
- ret = read(fd,buffer + total,N - total);
- if (ret == 0) {
- smb_read_error = READ_EOF;
- return 0;
- }
- if (ret == -1) {
- smb_read_error = READ_ERROR;
- return -1;
- }
- total += ret;
- }
- return total;
-}
-
-
-/****************************************************************************
- write data to a fd
-****************************************************************************/
-int write_data(int fd,char *buffer,int N)
-{
- int total=0;
- int ret;
-
- while (total < N)
- {
- ret = write(fd,buffer + total,N - total);
-
- if (ret == -1) return -1;
- if (ret == 0) return total;
-
- total += ret;
- }
- return total;
-}
-
-
-/****************************************************************************
-transfer some data between two fd's
-****************************************************************************/
-int transfer_file(int infd,int outfd,int n,char *header,int headlen,int align)
-{
- static char *buf=NULL;
- static int size=0;
- char *buf1,*abuf;
- int total = 0;
-
- DEBUG(4,("transfer_file %d (head=%d) called\n",n,headlen));
-
- if (size == 0) {
- size = lp_readsize();
- size = MAX(size,1024);
- }
-
- while (!buf && size>0) {
- buf = (char *)Realloc(buf,size+8);
- if (!buf) size /= 2;
- }
-
- if (!buf) {
- DEBUG(0,("Can't allocate transfer buffer!\n"));
- exit(1);
- }
-
- abuf = buf + (align%8);
-
- if (header)
- n += headlen;
-
- while (n > 0)
- {
- int s = MIN(n,size);
- int ret,ret2=0;
-
- ret = 0;
-
- if (header && (headlen >= MIN(s,1024))) {
- buf1 = header;
- s = headlen;
- ret = headlen;
- headlen = 0;
- header = NULL;
- } else {
- buf1 = abuf;
- }
-
- if (header && headlen > 0)
- {
- ret = MIN(headlen,size);
- memcpy(buf1,header,ret);
- headlen -= ret;
- header += ret;
- if (headlen <= 0) header = NULL;
- }
-
- if (s > ret)
- ret += read(infd,buf1+ret,s-ret);
-
- if (ret > 0)
- {
- ret2 = (outfd>=0?write_data(outfd,buf1,ret):ret);
- if (ret2 > 0) total += ret2;
- /* if we can't write then dump excess data */
- if (ret2 != ret)
- transfer_file(infd,-1,n-(ret+headlen),NULL,0,0);
- }
- if (ret <= 0 || ret2 != ret)
- return(total);
- n -= ret;
- }
- return(total);
-}
-
-
-/****************************************************************************
-read 4 bytes of a smb packet and return the smb length of the packet
-possibly store the result in the buffer
-****************************************************************************/
-int read_smb_length(int fd,char *inbuf,int timeout)
-{
- char *buffer;
- char buf[4];
- int len=0, msg_type;
- BOOL ok=False;
-
- if (inbuf)
- buffer = inbuf;
- else
- buffer = buf;
-
- while (!ok)
- {
- if (timeout > 0)
- ok = (read_with_timeout(fd,buffer,4,4,timeout) == 4);
- else
- ok = (read_data(fd,buffer,4) == 4);
-
- if (!ok)
- return(-1);
-
- len = smb_len(buffer);
- msg_type = CVAL(buffer,0);
-
- if (msg_type == 0x85)
- {
- DEBUG(5,("Got keepalive packet\n"));
- ok = False;
- }
- }
-
- DEBUG(10,("got smb length of %d\n",len));
-
- return(len);
-}
-
-
-
-/****************************************************************************
- read an smb from a fd. Note that the buffer *MUST* be of size
- BUFFER_SIZE+SAFETY_MARGIN.
-The timeout is in milli seconds
-****************************************************************************/
-BOOL receive_smb(int fd,char *buffer, int timeout)
-{
- int len,ret;
-
- smb_read_error = 0;
-
- bzero(buffer,smb_size + 100);
-
- len = read_smb_length(fd,buffer,timeout);
- if (len == -1)
- return(False);
-
- if (len > BUFFER_SIZE) {
- DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
- if (len > BUFFER_SIZE + (SAFETY_MARGIN/2))
- exit(1);
- }
-
- ret = read_data(fd,buffer+4,len);
- if (ret != len) {
- smb_read_error = READ_ERROR;
- return False;
- }
-
- return(True);
-}
-
-/****************************************************************************
- read a message from a udp fd.
-The timeout is in milli seconds
-****************************************************************************/
-BOOL receive_local_message(int fd, char *buffer, int buffer_len, int timeout)
-{
- struct sockaddr_in from;
- int fromlen = sizeof(from);
- int32 msg_len = 0;
-
- if(timeout != 0)
- {
- struct timeval to;
- fd_set fds;
- int selrtn;
-
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
-
- to.tv_sec = timeout / 1000;
- to.tv_usec = (timeout % 1000) * 1000;
-
- selrtn = sys_select(&fds,&to);
-
- /* Check if error */
- if(selrtn == -1)
- {
- /* something is wrong. Maybe the socket is dead? */
- smb_read_error = READ_ERROR;
- return False;
- }
-
- /* Did we timeout ? */
- if (selrtn == 0)
- {
- smb_read_error = READ_TIMEOUT;
- return False;
- }
- }
-
- /*
- * Read a loopback udp message.
- */
- msg_len = recvfrom(fd, &buffer[UDP_CMD_HEADER_LEN],
- buffer_len - UDP_CMD_HEADER_LEN, 0,
- (struct sockaddr *)&from, &fromlen);
-
- if(msg_len < 0)
- {
- DEBUG(0,("receive_local_message. Error in recvfrom. (%s).\n",strerror(errno)));
- return False;
- }
-
- /* Validate message length. */
- if(msg_len > (buffer_len - UDP_CMD_HEADER_LEN))
- {
- DEBUG(0,("receive_local_message: invalid msg_len (%d) max can be %d\n",
- msg_len,
- buffer_len - UDP_CMD_HEADER_LEN));
- return False;
- }
-
- /* Validate message from address (must be localhost). */
- if(from.sin_addr.s_addr != htonl(INADDR_LOOPBACK))
- {
- DEBUG(0,("receive_local_message: invalid 'from' address \
-(was %x should be 127.0.0.1\n", from.sin_addr.s_addr));
- return False;
- }
-
- /* Setup the message header */
- SIVAL(buffer,UDP_CMD_LEN_OFFSET,msg_len);
- SSVAL(buffer,UDP_CMD_PORT_OFFSET,ntohs(from.sin_port));
-
- return True;
-}
-
-/****************************************************************************
- structure to hold a linked list of local udp messages.
- for processing.
-****************************************************************************/
-
-typedef struct _udp_message_list {
- struct _udp_message_list *msg_next;
- char *msg_buf;
- int msg_len;
-} udp_message_list;
-
-static udp_message_list *udp_msg_head = NULL;
-
-/****************************************************************************
- Function to push a linked list of local udp messages ready
- for processing.
-****************************************************************************/
-BOOL push_local_message(char *buf, int msg_len)
-{
- udp_message_list *msg = (udp_message_list *)malloc(sizeof(udp_message_list));
-
- if(msg == NULL)
- {
- DEBUG(0,("push_local_message: malloc fail (1)\n"));
- return False;
- }
-
- msg->msg_buf = (char *)malloc(msg_len);
- if(msg->msg_buf == NULL)
- {
- DEBUG(0,("push_local_message: malloc fail (2)\n"));
- free((char *)msg);
- return False;
- }
-
- memcpy(msg->msg_buf, buf, msg_len);
- msg->msg_len = msg_len;
-
- msg->msg_next = udp_msg_head;
- udp_msg_head = msg;
-
- return True;
-}
-
-/****************************************************************************
- Do a select on an two fd's - with timeout.
-
- If a local udp message has been pushed onto the
- queue (this can only happen during oplock break
- processing) return this first.
-
- If the first smbfd is ready then read an smb from it.
- if the second (loopback UDP) fd is ready then read a message
- from it and setup the buffer header to identify the length
- and from address.
- Returns False on timeout or error.
- Else returns True.
-
-The timeout is in milli seconds
-****************************************************************************/
-BOOL receive_message_or_smb(int smbfd, int oplock_fd,
- char *buffer, int buffer_len,
- int timeout, BOOL *got_smb)
-{
- fd_set fds;
- int selrtn;
- struct timeval to;
-
- *got_smb = False;
-
- /*
- * Check to see if we already have a message on the udp queue.
- * If so - copy and return it.
- */
-
- if(udp_msg_head)
- {
- udp_message_list *msg = udp_msg_head;
- memcpy(buffer, msg->msg_buf, MIN(buffer_len, msg->msg_len));
- udp_msg_head = msg->msg_next;
-
- /* Free the message we just copied. */
- free((char *)msg->msg_buf);
- free((char *)msg);
- return True;
- }
-
- FD_ZERO(&fds);
- FD_SET(smbfd,&fds);
- FD_SET(oplock_fd,&fds);
-
- to.tv_sec = timeout / 1000;
- to.tv_usec = (timeout % 1000) * 1000;
-
- selrtn = sys_select(&fds,timeout>0?&to:NULL);
-
- /* Check if error */
- if(selrtn == -1) {
- /* something is wrong. Maybe the socket is dead? */
- smb_read_error = READ_ERROR;
- return False;
- }
-
- /* Did we timeout ? */
- if (selrtn == 0) {
- smb_read_error = READ_TIMEOUT;
- return False;
- }
-
- if (FD_ISSET(smbfd,&fds))
- {
- *got_smb = True;
- return receive_smb(smbfd, buffer, 0);
- }
- else
- {
- return receive_local_message(oplock_fd, buffer, buffer_len, 0);
- }
-}
-
-/****************************************************************************
- send an smb to a fd
-****************************************************************************/
-BOOL send_smb(int fd,char *buffer)
-{
- int len;
- int ret,nwritten=0;
- len = smb_len(buffer) + 4;
-
- while (nwritten < len)
- {
- ret = write_socket(fd,buffer+nwritten,len - nwritten);
- if (ret <= 0)
- {
- DEBUG(0,("Error writing %d bytes to client. %d. Exiting\n",len,ret));
- close_sockets();
- exit(1);
- }
- nwritten += ret;
- }
-
-
- return True;
-}
-
-
-/****************************************************************************
-find a pointer to a netbios name
-****************************************************************************/
-char *name_ptr(char *buf,int ofs)
-{
- unsigned char c = *(unsigned char *)(buf+ofs);
-
- if ((c & 0xC0) == 0xC0)
- {
- uint16 l;
- char p[2];
- memcpy(p,buf+ofs,2);
- p[0] &= ~0xC0;
- l = RSVAL(p,0);
- DEBUG(5,("name ptr to pos %d from %d is %s\n",l,ofs,buf+l));
- return(buf + l);
- }
- else
- return(buf+ofs);
-}
-
-/****************************************************************************
-extract a netbios name from a buf
-****************************************************************************/
-int name_extract(char *buf,int ofs,char *name)
-{
- char *p = name_ptr(buf,ofs);
- int d = PTR_DIFF(p,buf+ofs);
- strcpy(name,"");
- if (d < -50 || d > 50) return(0);
- return(name_interpret(p,name));
-}
-
-/****************************************************************************
-return the total storage length of a mangled name
-****************************************************************************/
-int name_len( char *s )
- {
- int len;
-
- /* If the two high bits of the byte are set, return 2. */
- if( 0xC0 == (*(unsigned char *)s & 0xC0) )
- return(2);
-
- /* Add up the length bytes. */
- for( len = 1; (*s); s += (*s) + 1 )
- {
- len += *s + 1;
- }
-
- return( len );
- } /* name_len */
-
-/****************************************************************************
-send a single packet to a port on another machine
-****************************************************************************/
-BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
-{
- BOOL ret;
- int out_fd;
- struct sockaddr_in sock_out;
-
- if (passive)
- return(True);
-
- /* create a socket to write to */
- out_fd = socket(AF_INET, type, 0);
- if (out_fd == -1)
- {
- DEBUG(0,("socket failed"));
- return False;
- }
-
- /* set the address and port */
- bzero((char *)&sock_out,sizeof(sock_out));
- putip((char *)&sock_out.sin_addr,(char *)&ip);
- sock_out.sin_port = htons( port );
- sock_out.sin_family = AF_INET;
-
- if (DEBUGLEVEL > 0)
- DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
- len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
-
- /* send it */
- ret = (sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
-
- if (!ret)
- DEBUG(0,("Packet send to %s(%d) failed ERRNO=%s\n",
- inet_ntoa(ip),port,strerror(errno)));
-
- close(out_fd);
- return(ret);
-}
-
-/*******************************************************************
-sleep for a specified number of milliseconds
-********************************************************************/
-void msleep(int t)
-{
- int tdiff=0;
- struct timeval tval,t1,t2;
- fd_set fds;
-
- GetTimeOfDay(&t1);
- GetTimeOfDay(&t2);
-
- while (tdiff < t) {
- tval.tv_sec = (t-tdiff)/1000;
- tval.tv_usec = 1000*((t-tdiff)%1000);
-
- FD_ZERO(&fds);
- errno = 0;
- sys_select(&fds,&tval);
-
- GetTimeOfDay(&t2);
- tdiff = TvalDiff(&t1,&t2);
- }
-}
-
-/****************************************************************************
-check if a string is part of a list
-****************************************************************************/
-BOOL in_list(char *s,char *list,BOOL casesensitive)
-{
- pstring tok;
- char *p=list;
-
- if (!list) return(False);
-
- while (next_token(&p,tok,LIST_SEP))
- {
- if (casesensitive) {
- if (strcmp(tok,s) == 0)
- return(True);
- } else {
- if (StrCaseCmp(tok,s) == 0)
- return(True);
- }
- }
- return(False);
-}
-
-/* this is used to prevent lots of mallocs of size 1 */
-static char *null_string = NULL;
-
-/****************************************************************************
-set a string value, allocing the space for the string
-****************************************************************************/
-BOOL string_init(char **dest,char *src)
-{
- int l;
- if (!src)
- src = "";
-
- l = strlen(src);
-
- if (l == 0)
- {
- if (!null_string)
- null_string = (char *)malloc(1);
-
- *null_string = 0;
- *dest = null_string;
- }
- else
- {
- (*dest) = (char *)malloc(l+1);
- if ((*dest) == NULL) {
- DEBUG(0,("Out of memory in string_init\n"));
- return False;
- }
-
- strcpy(*dest,src);
- }
- return(True);
-}
-
-/****************************************************************************
-free a string value
-****************************************************************************/
-void string_free(char **s)
-{
- if (!s || !(*s)) return;
- if (*s == null_string)
- *s = NULL;
- if (*s) free(*s);
- *s = NULL;
-}
-
-/****************************************************************************
-set a string value, allocing the space for the string, and deallocating any
-existing space
-****************************************************************************/
-BOOL string_set(char **dest,char *src)
-{
- string_free(dest);
-
- return(string_init(dest,src));
-}
-
-/****************************************************************************
-substitute a string for a pattern in another string. Make sure there is
-enough room!
-
-This routine looks for pattern in s and replaces it with
-insert. It may do multiple replacements.
-
-return True if a substitution was done.
-****************************************************************************/
-BOOL string_sub(char *s,char *pattern,char *insert)
-{
- BOOL ret = False;
- char *p;
- int ls,lp,li;
-
- if (!insert || !pattern || !s) return(False);
-
- ls = strlen(s);
- lp = strlen(pattern);
- li = strlen(insert);
-
- if (!*pattern) return(False);
-
- while (lp <= ls && (p = strstr(s,pattern)))
- {
- ret = True;
- memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
- memcpy(p,insert,li);
- s = p + li;
- ls = strlen(s);
- }
- return(ret);
-}
-
-
-
-/*********************************************************
-* Recursive routine that is called by mask_match.
-* Does the actual matching.
-*********************************************************/
-BOOL do_match(char *str, char *regexp, int case_sig)
-{
- char *p;
-
- for( p = regexp; *p && *str; ) {
- switch(*p) {
- case '?':
- str++; p++;
- break;
-
- case '*':
- /* Look for a character matching
- the one after the '*' */
- p++;
- if(!*p)
- return True; /* Automatic match */
- while(*str) {
- while(*str && (case_sig ? (*p != *str) : (toupper(*p)!=toupper(*str))))
- str++;
- if(do_match(str,p,case_sig))
- return True;
- if(!*str)
- return False;
- else
- str++;
- }
- return False;
-
- default:
- if(case_sig) {
- if(*str != *p)
- return False;
- } else {
- if(toupper(*str) != toupper(*p))
- return False;
- }
- str++, p++;
- break;
- }
- }
- if(!*p && !*str)
- return True;
-
- if (!*p && str[0] == '.' && str[1] == 0)
- return(True);
-
- if (!*str && *p == '?')
- {
- while (*p == '?') p++;
- return(!*p);
- }
-
- if(!*str && (*p == '*' && p[1] == '\0'))
- return True;
- return False;
-}
-
-
-/*********************************************************
-* Routine to match a given string with a regexp - uses
-* simplified regexp that takes * and ? only. Case can be
-* significant or not.
-*********************************************************/
-BOOL mask_match(char *str, char *regexp, int case_sig,BOOL trans2)
-{
- char *p;
- pstring p1, p2;
- fstring ebase,eext,sbase,sext;
-
- BOOL matched;
-
- /* Make local copies of str and regexp */
- StrnCpy(p1,regexp,sizeof(pstring)-1);
- StrnCpy(p2,str,sizeof(pstring)-1);
-
- if (!strchr(p2,'.')) {
- strcat(p2,".");
- }
-
-/*
- if (!strchr(p1,'.')) {
- strcat(p1,".");
- }
-*/
-
-#if 0
- if (strchr(p1,'.'))
- {
- string_sub(p1,"*.*","*");
- string_sub(p1,".*","*");
- }
-#endif
-
- /* Remove any *? and ** as they are meaningless */
- for(p = p1; *p; p++)
- while( *p == '*' && (p[1] == '?' ||p[1] == '*'))
- (void)strcpy( &p[1], &p[2]);
-
- if (strequal(p1,"*")) return(True);
-
- DEBUG(8,("mask_match str=<%s> regexp=<%s>, case_sig = %d\n", p2, p1, case_sig));
-
- if (trans2) {
- fstrcpy(ebase,p1);
- fstrcpy(sbase,p2);
- } else {
- if ((p=strrchr(p1,'.'))) {
- *p = 0;
- fstrcpy(ebase,p1);
- fstrcpy(eext,p+1);
- } else {
- fstrcpy(ebase,p1);
- eext[0] = 0;
- }
-
- if (!strequal(p2,".") && !strequal(p2,"..") && (p=strrchr(p2,'.'))) {
- *p = 0;
- fstrcpy(sbase,p2);
- fstrcpy(sext,p+1);
- } else {
- fstrcpy(sbase,p2);
- fstrcpy(sext,"");
- }
- }
-
- matched = do_match(sbase,ebase,case_sig) &&
- (trans2 || do_match(sext,eext,case_sig));
-
- DEBUG(8,("mask_match returning %d\n", matched));
-
- return matched;
-}
-
-
-
-/****************************************************************************
-become a daemon, discarding the controlling terminal
-****************************************************************************/
-void become_daemon(void)
-{
-#ifndef NO_FORK_DEBUG
- if (fork())
- exit(0);
-
- /* detach from the terminal */
-#ifdef USE_SETSID
- setsid();
-#else /* USE_SETSID */
-#ifdef TIOCNOTTY
- {
- int i = open("/dev/tty", O_RDWR);
- if (i >= 0)
- {
- ioctl(i, (int) TIOCNOTTY, (char *)0);
- close(i);
- }
- }
-#endif /* TIOCNOTTY */
-#endif /* USE_SETSID */
- /* Close fd's 0,1,2. Needed if started by rsh */
- close_low_fds();
-#endif /* NO_FORK_DEBUG */
-}
-
-
-/****************************************************************************
-put up a yes/no prompt
-****************************************************************************/
-BOOL yesno(char *p)
-{
- pstring ans;
- printf("%s",p);
-
- if (!fgets(ans,sizeof(ans)-1,stdin))
- return(False);
-
- if (*ans == 'y' || *ans == 'Y')
- return(True);
-
- return(False);
-}
-
-/****************************************************************************
-read a line from a file with possible \ continuation chars.
-Blanks at the start or end of a line are stripped.
-The string will be allocated if s2 is NULL
-****************************************************************************/
-char *fgets_slash(char *s2,int maxlen,FILE *f)
-{
- char *s=s2;
- int len = 0;
- int c;
- BOOL start_of_line = True;
-
- if (feof(f))
- return(NULL);
-
- if (!s2)
- {
- maxlen = MIN(maxlen,8);
- s = (char *)Realloc(s,maxlen);
- }
-
- if (!s || maxlen < 2) return(NULL);
-
- *s = 0;
-
- while (len < maxlen-1)
- {
- c = getc(f);
- switch (c)
- {
- case '\r':
- break;
- case '\n':
- while (len > 0 && s[len-1] == ' ')
- {
- s[--len] = 0;
- }
- if (len > 0 && s[len-1] == '\\')
- {
- s[--len] = 0;
- start_of_line = True;
- break;
- }
- return(s);
- case EOF:
- if (len <= 0 && !s2)
- free(s);
- return(len>0?s:NULL);
- case ' ':
- if (start_of_line)
- break;
- default:
- start_of_line = False;
- s[len++] = c;
- s[len] = 0;
- }
- if (!s2 && len > maxlen-3)
- {
- maxlen *= 2;
- s = (char *)Realloc(s,maxlen);
- if (!s) return(NULL);
- }
- }
- return(s);
-}
-
-
-
-/****************************************************************************
-set the length of a file from a filedescriptor.
-Returns 0 on success, -1 on failure.
-****************************************************************************/
-int set_filelen(int fd, long len)
-{
-/* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
- extend a file with ftruncate. Provide alternate implementation
- for this */
-
-#if FTRUNCATE_CAN_EXTEND
- return ftruncate(fd, len);
-#else
- struct stat st;
- char c = 0;
- long currpos = lseek(fd, 0L, SEEK_CUR);
-
- if(currpos < 0)
- return -1;
- /* Do an fstat to see if the file is longer than
- the requested size (call ftruncate),
- or shorter, in which case seek to len - 1 and write 1
- byte of zero */
- if(fstat(fd, &st)<0)
- return -1;
-
-#ifdef S_ISFIFO
- if (S_ISFIFO(st.st_mode)) return 0;
-#endif
-
- if(st.st_size == len)
- return 0;
- if(st.st_size > len)
- return ftruncate(fd, len);
-
- if(lseek(fd, len-1, SEEK_SET) != len -1)
- return -1;
- if(write(fd, &c, 1)!=1)
- return -1;
- /* Seek to where we were */
- lseek(fd, currpos, SEEK_SET);
- return 0;
-#endif
-}
-
-
-/****************************************************************************
-return the byte checksum of some data
-****************************************************************************/
-int byte_checksum(char *buf,int len)
-{
- unsigned char *p = (unsigned char *)buf;
- int ret = 0;
- while (len--)
- ret += *p++;
- return(ret);
-}
-
-
-
-#ifdef HPUX
-/****************************************************************************
-this is a version of setbuffer() for those machines that only have setvbuf
-****************************************************************************/
- void setbuffer(FILE *f,char *buf,int bufsize)
-{
- setvbuf(f,buf,_IOFBF,bufsize);
-}
-#endif
-
-
-/****************************************************************************
-parse out a directory name from a path name. Assumes dos style filenames.
-****************************************************************************/
-char *dirname_dos(char *path,char *buf)
-{
- char *p = strrchr(path,'\\');
-
- if (!p)
- strcpy(buf,path);
- else
- {
- *p = 0;
- strcpy(buf,path);
- *p = '\\';
- }
-
- return(buf);
-}
-
-
-/****************************************************************************
-parse out a filename from a path name. Assumes dos style filenames.
-****************************************************************************/
-static char *filename_dos(char *path,char *buf)
-{
- char *p = strrchr(path,'\\');
-
- if (!p)
- strcpy(buf,path);
- else
- strcpy(buf,p+1);
-
- return(buf);
-}
-
-
-
-/****************************************************************************
-expand a pointer to be a particular size
-****************************************************************************/
-void *Realloc(void *p,int size)
-{
- void *ret=NULL;
-
- if (size == 0) {
- if (p) free(p);
- DEBUG(5,("Realloc asked for 0 bytes\n"));
- return NULL;
- }
-
- if (!p)
- ret = (void *)malloc(size);
- else
- ret = (void *)realloc(p,size);
-
- if (!ret)
- DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",size));
-
- return(ret);
-}
-
-#ifdef NOSTRDUP
-/****************************************************************************
-duplicate a string
-****************************************************************************/
- char *strdup(char *s)
-{
- char *ret = NULL;
- if (!s) return(NULL);
- ret = (char *)malloc(strlen(s)+1);
- if (!ret) return(NULL);
- strcpy(ret,s);
- return(ret);
-}
-#endif
-
-
-/****************************************************************************
- Signal handler for SIGPIPE (write on a disconnected socket)
-****************************************************************************/
-void Abort(void )
-{
- DEBUG(0,("Probably got SIGPIPE\nExiting\n"));
- exit(2);
-}
-
-/****************************************************************************
-get my own name and IP
-****************************************************************************/
-BOOL get_myname(char *my_name,struct in_addr *ip)
-{
- struct hostent *hp;
- pstring hostname;
-
- *hostname = 0;
-
- /* get my host name */
- if (gethostname(hostname, MAXHOSTNAMELEN) == -1)
- {
- DEBUG(0,("gethostname failed\n"));
- return False;
- }
-
- /* get host info */
- if ((hp = Get_Hostbyname(hostname)) == 0)
- {
- DEBUG(0,( "Get_Hostbyname: Unknown host %s.\n",hostname));
- return False;
- }
-
- if (my_name)
- {
- /* split off any parts after an initial . */
- char *p = strchr(hostname,'.');
- if (p) *p = 0;
-
- fstrcpy(my_name,hostname);
- }
-
- if (ip)
- putip((char *)ip,(char *)hp->h_addr);
-
- return(True);
-}
-
-
-/****************************************************************************
-true if two IP addresses are equal
-****************************************************************************/
-BOOL ip_equal(struct in_addr ip1,struct in_addr ip2)
-{
- uint32 a1,a2;
- a1 = ntohl(ip1.s_addr);
- a2 = ntohl(ip2.s_addr);
- return(a1 == a2);
-}
-
-
-/****************************************************************************
-open a socket of the specified type, port and address for incoming data
-****************************************************************************/
-int open_socket_in(int type, int port, int dlevel,uint32 socket_addr)
-{
- struct hostent *hp;
- struct sockaddr_in sock;
- pstring host_name;
- int res;
-
- /* get my host name */
- if (gethostname(host_name, MAXHOSTNAMELEN) == -1)
- { DEBUG(0,("gethostname failed\n")); return -1; }
-
- /* get host info */
- if ((hp = Get_Hostbyname(host_name)) == 0)
- {
- DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",host_name));
- return -1;
- }
-
- bzero((char *)&sock,sizeof(sock));
- memcpy((char *)&sock.sin_addr,(char *)hp->h_addr, hp->h_length);
-#if defined(__FreeBSD__) || defined(NETBSD) /* XXX not the right ifdef */
- sock.sin_len = sizeof(sock);
-#endif
- sock.sin_port = htons( port );
- sock.sin_family = hp->h_addrtype;
- sock.sin_addr.s_addr = socket_addr;
- res = socket(hp->h_addrtype, type, 0);
- if (res == -1)
- { DEBUG(0,("socket failed\n")); return -1; }
-
- {
- int one=1;
- setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one));
- }
-
- /* now we've got a socket - we need to bind it */
- if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) < 0)
- {
- if (port) {
- if (port == SMB_PORT || port == NMB_PORT)
- DEBUG(dlevel,("bind failed on port %d socket_addr=%x (%s)\n",
- port,socket_addr,strerror(errno)));
- close(res);
-
- if (dlevel > 0 && port < 1000)
- port = 7999;
-
- if (port >= 1000 && port < 9000)
- return(open_socket_in(type,port+1,dlevel,socket_addr));
- }
-
- return(-1);
- }
- DEBUG(3,("bind succeeded on port %d\n",port));
-
- return res;
-}
-
-
-/****************************************************************************
- create an outgoing socket
- **************************************************************************/
-int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
-{
- struct sockaddr_in sock_out;
- int res,ret;
- int connect_loop = 250; /* 250 milliseconds */
- int loops = (timeout * 1000) / connect_loop;
-
- /* create a socket to write to */
- res = socket(PF_INET, type, 0);
- if (res == -1)
- { DEBUG(0,("socket error\n")); return -1; }
-
- if (type != SOCK_STREAM) return(res);
-
- bzero((char *)&sock_out,sizeof(sock_out));
- putip((char *)&sock_out.sin_addr,(char *)addr);
-
- sock_out.sin_port = htons( port );
- sock_out.sin_family = PF_INET;
-
- /* set it non-blocking */
- set_blocking(res,False);
-
- DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
-
- /* and connect it to the destination */
-connect_again:
- ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
-
- /* Some systems return EAGAIN when they mean EINPROGRESS */
- if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
- errno == EAGAIN) && loops--) {
- msleep(connect_loop);
- goto connect_again;
- }
-
- if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
- errno == EAGAIN)) {
- DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
- close(res);
- return -1;
- }
-
-#ifdef EISCONN
- if (ret < 0 && errno == EISCONN) {
- errno = 0;
- ret = 0;
- }
-#endif
-
- if (ret < 0) {
- DEBUG(1,("error connecting to %s:%d (%s)\n",
- inet_ntoa(*addr),port,strerror(errno)));
- return -1;
- }
-
- /* set it blocking again */
- set_blocking(res,True);
-
- return res;
-}
-
-
-/****************************************************************************
-interpret a protocol description string, with a default
-****************************************************************************/
-int interpret_protocol(char *str,int def)
-{
- if (strequal(str,"NT1"))
- return(PROTOCOL_NT1);
- if (strequal(str,"LANMAN2"))
- return(PROTOCOL_LANMAN2);
- if (strequal(str,"LANMAN1"))
- return(PROTOCOL_LANMAN1);
- if (strequal(str,"CORE"))
- return(PROTOCOL_CORE);
- if (strequal(str,"COREPLUS"))
- return(PROTOCOL_COREPLUS);
- if (strequal(str,"CORE+"))
- return(PROTOCOL_COREPLUS);
-
- DEBUG(0,("Unrecognised protocol level %s\n",str));
-
- return(def);
-}
-
-/****************************************************************************
-interpret a security level
-****************************************************************************/
-int interpret_security(char *str,int def)
-{
- if (strequal(str,"SERVER"))
- return(SEC_SERVER);
- if (strequal(str,"USER"))
- return(SEC_USER);
- if (strequal(str,"SHARE"))
- return(SEC_SHARE);
-
- DEBUG(0,("Unrecognised security level %s\n",str));
-
- return(def);
-}
-
-
-/****************************************************************************
-interpret an internet address or name into an IP address in 4 byte form
-****************************************************************************/
-uint32 interpret_addr(char *str)
-{
- struct hostent *hp;
- uint32 res;
- int i;
- BOOL pure_address = True;
-
- if (strcmp(str,"0.0.0.0") == 0) return(0);
- if (strcmp(str,"255.255.255.255") == 0) return(0xFFFFFFFF);
-
- for (i=0; pure_address && str[i]; i++)
- if (!(isdigit(str[i]) || str[i] == '.'))
- pure_address = False;
-
- /* if it's in the form of an IP address then get the lib to interpret it */
- if (pure_address) {
- res = inet_addr(str);
- } else {
- /* otherwise assume it's a network name of some sort and use
- Get_Hostbyname */
- if ((hp = Get_Hostbyname(str)) == 0) {
- DEBUG(3,("Get_Hostbyname: Unknown host. %s\n",str));
- return 0;
- }
- if(hp->h_addr == NULL) {
- DEBUG(3,("Get_Hostbyname: host address is invalid for host %s.\n",str));
- return 0;
- }
- putip((char *)&res,(char *)hp->h_addr);
- }
-
- if (res == (uint32)-1) return(0);
-
- return(res);
-}
-
-/*******************************************************************
- a convenient addition to interpret_addr()
- ******************************************************************/
-struct in_addr *interpret_addr2(char *str)
-{
- static struct in_addr ret;
- uint32 a = interpret_addr(str);
- ret.s_addr = a;
- return(&ret);
-}
-
-/*******************************************************************
- check if an IP is the 0.0.0.0
- ******************************************************************/
-BOOL zero_ip(struct in_addr ip)
-{
- uint32 a;
- putip((char *)&a,(char *)&ip);
- return(a == 0);
-}
-
-
-/*******************************************************************
- matchname - determine if host name matches IP address
- ******************************************************************/
-static BOOL matchname(char *remotehost,struct in_addr addr)
-{
- struct hostent *hp;
- int i;
-
- if ((hp = Get_Hostbyname(remotehost)) == 0) {
- DEBUG(0,("Get_Hostbyname(%s): lookup failure", remotehost));
- return False;
- }
-
- /*
- * Make sure that gethostbyname() returns the "correct" host name.
- * Unfortunately, gethostbyname("localhost") sometimes yields
- * "localhost.domain". Since the latter host name comes from the
- * local DNS, we just have to trust it (all bets are off if the local
- * DNS is perverted). We always check the address list, though.
- */
-
- if (strcasecmp(remotehost, hp->h_name)
- && strcasecmp(remotehost, "localhost")) {
- DEBUG(0,("host name/name mismatch: %s != %s",
- remotehost, hp->h_name));
- return False;
- }
-
- /* Look up the host address in the address list we just got. */
- for (i = 0; hp->h_addr_list[i]; i++) {
- if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
- return True;
- }
-
- /*
- * The host name does not map to the original host address. Perhaps
- * someone has compromised a name server. More likely someone botched
- * it, but that could be dangerous, too.
- */
-
- DEBUG(0,("host name/address mismatch: %s != %s",
- inet_ntoa(addr), hp->h_name));
- return False;
-}
-
-/*******************************************************************
- Reset the 'done' variables so after a client process is created
- from a fork call these calls will be re-done. This should be
- expanded if more variables need reseting.
- ******************************************************************/
-
-static BOOL global_client_name_done = False;
-static BOOL global_client_addr_done = False;
-
-void reset_globals_after_fork()
-{
- global_client_name_done = False;
- global_client_addr_done = False;
-}
-
-/*******************************************************************
- return the DNS name of the client
- ******************************************************************/
-char *client_name(void)
-{
- extern int Client;
- struct sockaddr sa;
- struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
- int length = sizeof(sa);
- static pstring name_buf;
- struct hostent *hp;
-
- if (global_client_name_done)
- return name_buf;
-
- strcpy(name_buf,"UNKNOWN");
-
- if (getpeername(Client, &sa, &length) < 0) {
- DEBUG(0,("getpeername failed\n"));
- return name_buf;
- }
-
- /* Look up the remote host name. */
- if ((hp = gethostbyaddr((char *) &sockin->sin_addr,
- sizeof(sockin->sin_addr),
- AF_INET)) == 0) {
- DEBUG(1,("Gethostbyaddr failed for %s\n",client_addr()));
- StrnCpy(name_buf,client_addr(),sizeof(name_buf) - 1);
- } else {
- StrnCpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
- if (!matchname(name_buf, sockin->sin_addr)) {
- DEBUG(0,("Matchname failed on %s %s\n",name_buf,client_addr()));
- strcpy(name_buf,"UNKNOWN");
- }
- }
- global_client_name_done = True;
- return name_buf;
-}
-
-/*******************************************************************
- return the IP addr of the client as a string
- ******************************************************************/
-char *client_addr(void)
-{
- extern int Client;
- struct sockaddr sa;
- struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
- int length = sizeof(sa);
- static fstring addr_buf;
-
- if (global_client_addr_done)
- return addr_buf;
-
- strcpy(addr_buf,"0.0.0.0");
-
- if (getpeername(Client, &sa, &length) < 0) {
- DEBUG(0,("getpeername failed\n"));
- return addr_buf;
- }
-
- fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
-
- global_client_addr_done = True;
- return addr_buf;
-}
-
-/*******************************************************************
-sub strings with useful parameters
-Rewritten by Stefaan A Eeckels <Stefaan.Eeckels@ecc.lu> and
-Paul Rippin <pr3245@nopc.eurostat.cec.be>
-********************************************************************/
-void standard_sub_basic(char *str)
- {
- char *s, *p;
- char pidstr[10];
- struct passwd *pass;
-
- for (s = str ; (p = strchr(s,'%')) != NULL ; s = p )
- {
- switch (*(p+1))
- {
- case 'G' : if ((pass = Get_Pwnam(sesssetup_user,False))!=NULL)
- string_sub(p,"%G",gidtoname(pass->pw_gid));
- else
- p += 2;
- break;
- case 'I' : string_sub(p,"%I",client_addr()); break;
- case 'L' : string_sub(p,"%L",local_machine); break;
- case 'M' : string_sub(p,"%M",client_name()); break;
- case 'R' : string_sub(p,"%R",remote_proto); break;
- case 'T' : string_sub(p,"%T",timestring()); break;
- case 'U' : string_sub(p,"%U",sesssetup_user); break;
- case 'a' : string_sub(p,"%a",remote_arch); break;
- case 'd' : sprintf(pidstr,"%d",(int)getpid());
- string_sub(p,"%d",pidstr);
- break;
- case 'h' : string_sub(p,"%h",myhostname); break;
- case 'm' : string_sub(p,"%m",remote_machine); break;
- case 'v' : string_sub(p,"%v",VERSION); break;
- case '\0' : p++; break; /* don't run off end if last character is % */
- default : p+=2; break;
- }
- }
- return;
-}
-
-/*******************************************************************
-are two IPs on the same subnet?
-********************************************************************/
-BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask)
-{
- uint32 net1,net2,nmask;
-
- nmask = ntohl(mask.s_addr);
- net1 = ntohl(ip1.s_addr);
- net2 = ntohl(ip2.s_addr);
-
- return((net1 & nmask) == (net2 & nmask));
-}
-
-
-/*******************************************************************
-write a string in unicoode format
-********************************************************************/
-int PutUniCode(char *dst,char *src)
-{
- int ret = 0;
- while (*src) {
- dst[ret++] = src[0];
- dst[ret++] = 0;
- src++;
- }
- dst[ret++]=0;
- dst[ret++]=0;
- return(ret);
-}
-
-/****************************************************************************
-a wrapper for gethostbyname() that tries with all lower and all upper case
-if the initial name fails
-****************************************************************************/
-struct hostent *Get_Hostbyname(char *name)
-{
- char *name2 = strdup(name);
- struct hostent *ret;
-
- if (!name2)
- {
- DEBUG(0,("Memory allocation error in Get_Hostbyname! panic\n"));
- exit(0);
- }
-
- if (!isalnum(*name2))
- {
- free(name2);
- return(NULL);
- }
-
- ret = sys_gethostbyname(name2);
- if (ret != NULL)
- {
- free(name2);
- return(ret);
- }
-
- /* try with all lowercase */
- strlower(name2);
- ret = sys_gethostbyname(name2);
- if (ret != NULL)
- {
- free(name2);
- return(ret);
- }
-
- /* try with all uppercase */
- strupper(name2);
- ret = sys_gethostbyname(name2);
- if (ret != NULL)
- {
- free(name2);
- return(ret);
- }
-
- /* nothing works :-( */
- free(name2);
- return(NULL);
-}
-
-
-/****************************************************************************
-check if a process exists. Does this work on all unixes?
-****************************************************************************/
-BOOL process_exists(int pid)
-{
-#ifdef LINUX
- fstring s;
- sprintf(s,"/proc/%d",pid);
- return(directory_exist(s,NULL));
-#else
- {
- static BOOL tested=False;
- static BOOL ok=False;
- fstring s;
- if (!tested) {
- tested = True;
- sprintf(s,"/proc/%05d",(int)getpid());
- ok = file_exist(s,NULL);
- }
- if (ok) {
- sprintf(s,"/proc/%05d",pid);
- return(file_exist(s,NULL));
- }
- }
-
- /* CGH 8/16/96 - added ESRCH test */
- return(pid == getpid() || kill(pid,0) == 0 || errno != ESRCH);
-#endif
-}
-
-
-/*******************************************************************
-turn a uid into a user name
-********************************************************************/
-char *uidtoname(int uid)
-{
- static char name[40];
- struct passwd *pass = getpwuid(uid);
- if (pass) return(pass->pw_name);
- sprintf(name,"%d",uid);
- return(name);
-}
-
-/*******************************************************************
-turn a gid into a group name
-********************************************************************/
-char *gidtoname(int gid)
-{
- static char name[40];
- struct group *grp = getgrgid(gid);
- if (grp) return(grp->gr_name);
- sprintf(name,"%d",gid);
- return(name);
-}
-
-/*******************************************************************
-block sigs
-********************************************************************/
-void BlockSignals(BOOL block,int signum)
-{
-#ifdef USE_SIGBLOCK
- int block_mask = sigmask(signum);
- static int oldmask = 0;
- if (block)
- oldmask = sigblock(block_mask);
- else
- sigsetmask(oldmask);
-#elif defined(USE_SIGPROCMASK)
- sigset_t set;
- sigemptyset(&set);
- sigaddset(&set,signum);
- sigprocmask(block?SIG_BLOCK:SIG_UNBLOCK,&set,NULL);
-#endif
-}
-
-#if AJT
-/*******************************************************************
-my own panic function - not suitable for general use
-********************************************************************/
-void ajt_panic(void)
-{
- system("/usr/bin/X11/xedit -display ljus:0 /tmp/ERROR_FAULT");
-}
-#endif
-
-#ifdef USE_DIRECT
-#define DIRECT direct
-#else
-#define DIRECT dirent
-#endif
-
-/*******************************************************************
-a readdir wrapper which just returns the file name
-also return the inode number if requested
-********************************************************************/
-char *readdirname(void *p)
-{
- struct DIRECT *ptr;
- char *dname;
-
- if (!p) return(NULL);
-
- ptr = (struct DIRECT *)readdir(p);
- if (!ptr) return(NULL);
-
- dname = ptr->d_name;
-
-#ifdef NEXT2
- if (telldir(p) < 0) return(NULL);
-#endif
-
-#ifdef SUNOS5
- /* this handles a broken compiler setup, causing a mixture
- of BSD and SYSV headers and libraries */
- {
- static BOOL broken_readdir = False;
- if (!broken_readdir && !(*(dname)) && strequal("..",dname-2))
- {
- DEBUG(0,("Your readdir() is broken. You have somehow mixed SYSV and BSD headers and libraries\n"));
- broken_readdir = True;
- }
- if (broken_readdir)
- dname = dname - 2;
- }
-#endif
-
- {
- static pstring buf;
- pstrcpy(buf, dname);
- unix_to_dos(buf, True);
- dname = buf;
- }
-
- return(dname);
-}
-
-/*******************************************************************
- Utility function used to decide if the last component
- of a path matches a (possibly wildcarded) entry in a namelist.
-********************************************************************/
-
-BOOL is_in_path(char *name, name_compare_entry *namelist)
-{
- pstring last_component;
- char *p;
-
- DEBUG(8, ("is_in_path: %s\n", name));
-
- /* if we have no list it's obviously not in the path */
- if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL)))
- {
- DEBUG(8,("is_in_path: no name list.\n"));
- return False;
- }
-
- /* Get the last component of the unix name. */
- p = strrchr(name, '/');
- strncpy(last_component, p ? p : name, sizeof(last_component)-1);
- last_component[sizeof(last_component)-1] = '\0';
-
- for(; namelist->name != NULL; namelist++)
- {
- if(namelist->is_wild)
- {
- /* look for a wildcard match. */
- if (mask_match(last_component, namelist->name, case_sensitive, False))
- {
- DEBUG(8,("is_in_path: mask match succeeded\n"));
- return True;
- }
- }
- else
- {
- if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
- (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0)))
- {
- DEBUG(8,("is_in_path: match succeeded\n"));
- return True;
- }
- }
- }
- DEBUG(8,("is_in_path: match not found\n"));
-
- return False;
-}
-
-/*******************************************************************
- Strip a '/' separated list into an array of
- name_compare_enties structures suitable for
- passing to is_in_path(). We do this for
- speed so we can pre-parse all the names in the list
- and don't do it for each call to is_in_path().
- namelist is modified here and is assumed to be
- a copy owned by the caller.
- We also check if the entry contains a wildcard to
- remove a potentially expensive call to mask_match
- if possible.
-********************************************************************/
-
-void set_namearray(name_compare_entry **ppname_array, char *namelist)
-{
- char *name_end;
- char *nameptr = namelist;
- int num_entries = 0;
- int i;
-
- (*ppname_array) = NULL;
-
- if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
- return;
-
- /* We need to make two passes over the string. The
- first to count the number of elements, the second
- to split it.
- */
- while(*nameptr)
- {
- if ( *nameptr == '/' )
- {
- /* cope with multiple (useless) /s) */
- nameptr++;
- continue;
- }
- /* find the next / */
- name_end = strchr(nameptr, '/');
-
- /* oops - the last check for a / didn't find one. */
- if (name_end == NULL)
- break;
-
- /* next segment please */
- nameptr = name_end + 1;
- num_entries++;
- }
-
- if(num_entries == 0)
- return;
-
- if(( (*ppname_array) = (name_compare_entry *)malloc(
- (num_entries + 1) * sizeof(name_compare_entry))) == NULL)
- {
- DEBUG(0,("set_namearray: malloc fail\n"));
- return;
- }
-
- /* Now copy out the names */
- nameptr = namelist;
- i = 0;
- while(*nameptr)
- {
- if ( *nameptr == '/' )
- {
- /* cope with multiple (useless) /s) */
- nameptr++;
- continue;
- }
- /* find the next / */
- if ((name_end = strchr(nameptr, '/')) != NULL)
- {
- *name_end = 0;
- }
-
- /* oops - the last check for a / didn't find one. */
- if(name_end == NULL)
- break;
-
- (*ppname_array)[i].is_wild = ((strchr( nameptr, '?')!=NULL) ||
- (strchr( nameptr, '*')!=NULL));
- if(((*ppname_array)[i].name = strdup(nameptr)) == NULL)
- {
- DEBUG(0,("set_namearray: malloc fail (1)\n"));
- return;
- }
-
- /* next segment please */
- nameptr = name_end + 1;
- i++;
- }
-
- (*ppname_array)[i].name = NULL;
-
- return;
-}
-
-/****************************************************************************
-routine to free a namearray.
-****************************************************************************/
-
-void free_namearray(name_compare_entry *name_array)
-{
- if(name_array == 0)
- return;
-
- if(name_array->name != NULL)
- free(name_array->name);
-
- free((char *)name_array);
-}
-
-/****************************************************************************
-routine to do file locking
-****************************************************************************/
-BOOL fcntl_lock(int fd,int op,uint32 offset,uint32 count,int type)
-{
-#if HAVE_FCNTL_LOCK
- struct flock lock;
- int ret;
-
-#if 1
- uint32 mask = 0xC0000000;
-
- /* make sure the count is reasonable, we might kill the lockd otherwise */
- count &= ~mask;
-
- /* the offset is often strange - remove 2 of its bits if either of
- the top two bits are set. Shift the top ones by two bits. This
- still allows OLE2 apps to operate, but should stop lockd from
- dieing */
- if ((offset & mask) != 0)
- offset = (offset & ~mask) | ((offset & mask) >> 2);
-#else
- uint32 mask = ((unsigned)1<<31);
-
- /* interpret negative counts as large numbers */
- if (count < 0)
- count &= ~mask;
-
- /* no negative offsets */
- offset &= ~mask;
-
- /* count + offset must be in range */
- while ((offset < 0 || (offset + count < 0)) && mask)
- {
- offset &= ~mask;
- mask = mask >> 1;
- }
-#endif
-
-
- DEBUG(8,("fcntl_lock %d %d %d %d %d\n",fd,op,(int)offset,(int)count,type));
-
- lock.l_type = type;
- lock.l_whence = SEEK_SET;
- lock.l_start = (int)offset;
- lock.l_len = (int)count;
- lock.l_pid = 0;
-
- errno = 0;
-
- ret = fcntl(fd,op,&lock);
-
- if (errno != 0)
- DEBUG(3,("fcntl lock gave errno %d (%s)\n",errno,strerror(errno)));
-
- /* a lock query */
- if (op == F_GETLK)
- {
- if ((ret != -1) &&
- (lock.l_type != F_UNLCK) &&
- (lock.l_pid != 0) &&
- (lock.l_pid != getpid()))
- {
- DEBUG(3,("fd %d is locked by pid %d\n",fd,lock.l_pid));
- return(True);
- }
-
- /* it must be not locked or locked by me */
- return(False);
- }
-
- /* a lock set or unset */
- if (ret == -1)
- {
- DEBUG(3,("lock failed at offset %d count %d op %d type %d (%s)\n",
- offset,count,op,type,strerror(errno)));
-
- /* perhaps it doesn't support this sort of locking?? */
- if (errno == EINVAL)
- {
- DEBUG(3,("locking not supported? returning True\n"));
- return(True);
- }
-
- return(False);
- }
-
- /* everything went OK */
- DEBUG(8,("Lock call successful\n"));
-
- return(True);
-#else
- return(False);
-#endif
-}
-
-/*******************************************************************
-lock a file - returning a open file descriptor or -1 on failure
-The timeout is in seconds. 0 means no timeout
-********************************************************************/
-int file_lock(char *name,int timeout)
-{
- int fd = open(name,O_RDWR|O_CREAT,0666);
- time_t t=0;
- if (fd < 0) return(-1);
-
-#if HAVE_FCNTL_LOCK
- if (timeout) t = time(NULL);
- while (!timeout || (time(NULL)-t < timeout)) {
- if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)) return(fd);
- msleep(LOCK_RETRY_TIMEOUT);
- }
- return(-1);
-#else
- return(fd);
-#endif
-}
-
-/*******************************************************************
-unlock a file locked by file_lock
-********************************************************************/
-void file_unlock(int fd)
-{
- if (fd<0) return;
-#if HAVE_FCNTL_LOCK
- fcntl_lock(fd,F_SETLK,0,1,F_UNLCK);
-#endif
- close(fd);
-}
-
-/*******************************************************************
-is the name specified one of my netbios names
-returns true is it is equal, false otherwise
-********************************************************************/
-BOOL is_myname(char *s)
-{
- int n;
- BOOL ret = False;
-
- for (n=0; my_netbios_names[n]; n++) {
- if (strequal(my_netbios_names[n], s))
- ret=True;
- }
- DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
- return(ret);
-}
-
-/*******************************************************************
-set the horrid remote_arch string based on an enum.
-********************************************************************/
-void set_remote_arch(enum remote_arch_types type)
-{
- ra_type = type;
- switch( type )
- {
- case RA_WFWG:
- strcpy(remote_arch, "WfWg");
- return;
- case RA_OS2:
- strcpy(remote_arch, "OS2");
- return;
- case RA_WIN95:
- strcpy(remote_arch, "Win95");
- return;
- case RA_WINNT:
- strcpy(remote_arch, "WinNT");
- return;
- case RA_SAMBA:
- strcpy(remote_arch,"Samba");
- return;
- default:
- ra_type = RA_UNKNOWN;
- strcpy(remote_arch, "UNKNOWN");
- break;
- }
-}
-
-/*******************************************************************
- Get the remote_arch type.
-********************************************************************/
-enum remote_arch_types get_remote_arch()
-{
- return ra_type;
-}
-
-
-/*******************************************************************
-skip past some unicode strings in a buffer
-********************************************************************/
-char *skip_unicode_string(char *buf,int n)
-{
- while (n--)
- {
- while (*buf)
- buf += 2;
- buf += 2;
- }
- return(buf);
-}
-
-/*******************************************************************
-Return a ascii version of a unicode string
-Hack alert: uses fixed buffer(s) and only handles ascii strings
-********************************************************************/
-#define MAXUNI 1024
-char *unistr2(uint16 *buf)
-{
- static char lbufs[8][MAXUNI];
- static int nexti;
- char *lbuf = lbufs[nexti];
- char *p;
- nexti = (nexti+1)%8;
- for (p = lbuf; *buf && p-lbuf < MAXUNI-2; p++, buf++)
- {
- *p = *buf;
- }
- *p = 0;
- return lbuf;
-}
-
-/*******************************************************************
-Return a ascii version of a unicode string
-Hack alert: uses fixed buffer(s) and only handles ascii strings
-********************************************************************/
-#define MAXUNI 1024
-char *unistr(char *buf)
-{
- static char lbufs[8][MAXUNI];
- static int nexti;
- char *lbuf = lbufs[nexti];
- char *p;
-
- nexti = (nexti+1)%8;
-
- for (p = lbuf; *buf && p-lbuf < MAXUNI-2; p++, buf += 2)
- {
- *p = *buf;
- }
- *p = 0;
- return lbuf;
-}
-
-/*******************************************************************
-strncpy for unicode strings
-********************************************************************/
-int unistrncpy(char *dst, char *src, int len)
-{
- int num_wchars = 0;
-
- while (*src && len > 0)
- {
- *dst++ = *src++;
- *dst++ = *src++;
- len--;
- num_wchars++;
- }
- *dst++ = 0;
- *dst++ = 0;
-
- return num_wchars;
-}
-
-
-/*******************************************************************
-strcpy for unicode strings. returns length (in num of wide chars)
-********************************************************************/
-int unistrcpy(char *dst, char *src)
-{
- int num_wchars = 0;
-
- while (*src)
- {
- *dst++ = *src++;
- *dst++ = *src++;
- num_wchars++;
- }
- *dst++ = 0;
- *dst++ = 0;
-
- return num_wchars;
-}
-
-
-/*******************************************************************
-safe string copy into a fstring
-********************************************************************/
-void fstrcpy(char *dest, char *src)
-{
- int maxlength = sizeof(fstring) - 1;
- if (!dest) {
- DEBUG(0,("ERROR: NULL dest in fstrcpy\n"));
- return;
- }
-
- if (!src) {
- *dest = 0;
- return;
- }
-
- while (maxlength-- && *src)
- *dest++ = *src++;
- *dest = 0;
- if (*src) {
- DEBUG(0,("ERROR: string overflow by %d in fstrcpy\n",
- strlen(src)));
- }
-}
-
-/*******************************************************************
-safe string copy into a pstring
-********************************************************************/
-void pstrcpy(char *dest, char *src)
-{
- int maxlength = sizeof(pstring) - 1;
- if (!dest) {
- DEBUG(0,("ERROR: NULL dest in pstrcpy\n"));
- return;
- }
-
- if (!src) {
- *dest = 0;
- return;
- }
-
- while (maxlength-- && *src)
- *dest++ = *src++;
- *dest = 0;
- if (*src) {
- DEBUG(0,("ERROR: string overflow by %d in pstrcpy\n",
- strlen(src)));
- }
-}
-
-
-/*******************************************************************
-align a pointer to a multiple of 4 bytes
-********************************************************************/
-char *align4(char *q, char *base)
-{
- if ((q - base) & 3)
- {
- q += 4 - ((q - base) & 3);
- }
- return q;
-}
-
-/*******************************************************************
-align a pointer to a multiple of 2 bytes
-********************************************************************/
-char *align2(char *q, char *base)
-{
- if ((q - base) & 1)
- {
- q++;
- }
- return q;
-}
-
-/*******************************************************************
-align a pointer to a multiple of align_offset bytes. looks like it
-will work for offsets of 0, 2 and 4...
-********************************************************************/
-char *align_offset(char *q, char *base, int align_offset_len)
-{
- if (align_offset_len != 0 && ((q - base) & (align_offset_len-1)))
- {
- q += align_offset_len - ((q - base) & (align_offset_len));
- }
- return q;
-}
-
diff --git a/source/libsmb/credentials.c b/source/libsmb/credentials.c
deleted file mode 100644
index 4c81177fb20..00000000000
--- a/source/libsmb/credentials.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- code to manipulate domain credentials
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-
-/****************************************************************************
- setup the session key.
-Input: 8 byte challenge block
- 8 byte server challenge block
- 16 byte md4 encrypted password
-Output:
- 8 byte session key
-****************************************************************************/
-void cred_session_key(char *challenge, char *srv_challenge, char *pass,
- char *session_key)
-{
- uint32 sum[2];
- char sum2[8];
- char buf[8];
-
- sum[0] = IVAL(challenge, 0) + IVAL(srv_challenge, 0);
- sum[1] = IVAL(challenge, 4) + IVAL(srv_challenge, 4);
-
- SIVAL(sum2,0,sum[0]);
- SIVAL(sum2,4,sum[1]);
-
- E1(pass,sum2,buf);
- E1(pass+9,buf,session_key);
-}
-
-
-/****************************************************************************
-create a credential
-
-Input:
- 8 byte sesssion key
- 8 byte stored credential
- 4 byte timestamp
-
-Output:
- 8 byte credential
-****************************************************************************/
-void cred_create(char *session_key, char *stored_cred, UTIME timestamp,
- char *cred)
-{
- char key2[7];
- char buf[8];
- char timecred[8];
-
- memcpy(timecred, stored_cred, 8);
- SIVAL(timecred, 0, IVAL(stored_cred, 0) + timestamp.time);
-
- E1(session_key, timecred, buf);
- memset(key2, 0, 7);
- key2[0] = session_key[7];
- E1(key2, buf, cred);
-}
-
-
-/****************************************************************************
- check a supplied credential
-
-Input:
- 8 byte received credential
- 8 byte sesssion key
- 8 byte stored credential
- 4 byte timestamp
-
-Output:
- returns 1 if computed credential matches received credential
- returns 0 otherwise
-****************************************************************************/
-int cred_assert(char *cred, char *session_key, char *stored_cred,
- NTTIME timestamp)
-{
- char cred2[8];
-
- cred_create(session_key, stored_cred, timestamp, cred2);
-
- return memcmp(cred, cred2, 8) == 0;
-}
-
diff --git a/source/libsmb/namequery.c b/source/libsmb/namequery.c
deleted file mode 100644
index 55f70be1222..00000000000
--- a/source/libsmb/namequery.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- name query routines
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "includes.h"
-
-extern pstring scope;
-extern int DEBUGLEVEL;
-
-
-/****************************************************************************
-interpret a node status response
-****************************************************************************/
-static void _interpret_node_status(char *p, char *master,char *rname)
-{
- int numnames = CVAL(p,0);
- DEBUG(1,("received %d names\n",numnames));
-
- if (rname) *rname = 0;
- if (master) *master = 0;
-
- p += 1;
- while (numnames--)
- {
- char qname[17];
- int type;
- fstring flags;
- int i;
- *flags = 0;
- StrnCpy(qname,p,15);
- type = CVAL(p,15);
- p += 16;
-
- strcat(flags, (p[0] & 0x80) ? "<GROUP> " : " ");
- if ((p[0] & 0x60) == 0x00) strcat(flags,"B ");
- if ((p[0] & 0x60) == 0x20) strcat(flags,"P ");
- if ((p[0] & 0x60) == 0x40) strcat(flags,"M ");
- if ((p[0] & 0x60) == 0x60) strcat(flags,"H ");
- if (p[0] & 0x10) strcat(flags,"<DEREGISTERING> ");
- if (p[0] & 0x08) strcat(flags,"<CONFLICT> ");
- if (p[0] & 0x04) strcat(flags,"<ACTIVE> ");
- if (p[0] & 0x02) strcat(flags,"<PERMANENT> ");
-
- if (master && !*master && type == 0x1d) {
- StrnCpy(master,qname,15);
- trim_string(master,NULL," ");
- }
-
- if (rname && !*rname && type == 0x20 && !(p[0]&0x80)) {
- StrnCpy(rname,qname,15);
- trim_string(rname,NULL," ");
- }
-
- for (i = strlen( qname) ; --i >= 0 ; ) {
- if (!isprint(qname[i])) qname[i] = '.';
- }
- DEBUG(1,("\t%-15s <%02x> - %s\n",qname,type,flags));
- p+=2;
- }
- DEBUG(1,("num_good_sends=%d num_good_receives=%d\n",
- IVAL(p,20),IVAL(p,24)));
-}
-
-
-/****************************************************************************
- do a netbios name status query on a host
-
- the "master" parameter is a hack used for finding workgroups.
- **************************************************************************/
-BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
- struct in_addr to_ip,char *master,char *rname,
- void (*fn)())
-{
- BOOL found=False;
- int retries = 2;
- int retry_time = 5000;
- struct timeval tval;
- struct packet_struct p;
- struct packet_struct *p2;
- struct nmb_packet *nmb = &p.packet.nmb;
- static int name_trn_id = 0;
-
- bzero((char *)&p,sizeof(p));
-
- if (!name_trn_id) name_trn_id = (time(NULL)%(unsigned)0x7FFF) +
- (getpid()%(unsigned)100);
- name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
-
- nmb->header.name_trn_id = name_trn_id;
- nmb->header.opcode = 0;
- nmb->header.response = False;
- nmb->header.nm_flags.bcast = False;
- nmb->header.nm_flags.recursion_available = False;
- nmb->header.nm_flags.recursion_desired = False;
- nmb->header.nm_flags.trunc = False;
- nmb->header.nm_flags.authoritative = False;
- nmb->header.rcode = 0;
- nmb->header.qdcount = 1;
- nmb->header.ancount = 0;
- nmb->header.nscount = 0;
- nmb->header.arcount = 0;
-
- make_nmb_name(&nmb->question.question_name,name,name_type,scope);
-
- nmb->question.question_type = 0x21;
- nmb->question.question_class = 0x1;
-
- p.ip = to_ip;
- p.port = NMB_PORT;
- p.fd = fd;
- p.timestamp = time(NULL);
- p.packet_type = NMB_PACKET;
-
- GetTimeOfDay(&tval);
-
- if (!send_packet(&p))
- return(False);
-
- retries--;
-
- while (1)
- {
- struct timeval tval2;
- GetTimeOfDay(&tval2);
- if (TvalDiff(&tval,&tval2) > retry_time) {
- if (!retries) break;
- if (!found && !send_packet(&p))
- return False;
- GetTimeOfDay(&tval);
- retries--;
- }
-
- if ((p2=receive_packet(fd,NMB_PACKET,90)))
- {
- struct nmb_packet *nmb2 = &p2->packet.nmb;
- debug_nmb_packet(p2);
-
- if (nmb->header.name_trn_id != nmb2->header.name_trn_id ||
- !nmb2->header.response) {
- /* its not for us - maybe deal with it later */
- if (fn)
- fn(p2);
- else
- free_packet(p2);
- continue;
- }
-
- if (nmb2->header.opcode != 0 ||
- nmb2->header.nm_flags.bcast ||
- nmb2->header.rcode ||
- !nmb2->header.ancount ||
- nmb2->answers->rr_type != 0x21) {
- /* XXXX what do we do with this? could be a redirect, but
- we'll discard it for the moment */
- free_packet(p2);
- continue;
- }
-
- _interpret_node_status(&nmb2->answers->rdata[0], master,rname);
- free_packet(p2);
- return(True);
- }
- }
-
-
- DEBUG(0,("No status response (this is not unusual)\n"));
-
- return(False);
-}
-
-
-/****************************************************************************
- do a netbios name query to find someones IP
- ****************************************************************************/
-BOOL name_query(int fd,char *name,int name_type,
- BOOL bcast,BOOL recurse,
- struct in_addr to_ip, struct in_addr *ip,void (*fn)())
-{
- BOOL found=False;
- int retries = 3;
- int retry_time = bcast?250:2000;
- struct timeval tval;
- struct packet_struct p;
- struct packet_struct *p2;
- struct nmb_packet *nmb = &p.packet.nmb;
- static int name_trn_id = 0;
-
- bzero((char *)&p,sizeof(p));
-
- if (!name_trn_id) name_trn_id = (time(NULL)%(unsigned)0x7FFF) +
- (getpid()%(unsigned)100);
- name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
-
- nmb->header.name_trn_id = name_trn_id;
- nmb->header.opcode = 0;
- nmb->header.response = False;
- nmb->header.nm_flags.bcast = bcast;
- nmb->header.nm_flags.recursion_available = False;
- nmb->header.nm_flags.recursion_desired = True;
- nmb->header.nm_flags.trunc = False;
- nmb->header.nm_flags.authoritative = False;
- nmb->header.rcode = 0;
- nmb->header.qdcount = 1;
- nmb->header.ancount = 0;
- nmb->header.nscount = 0;
- nmb->header.arcount = 0;
-
- make_nmb_name(&nmb->question.question_name,name,name_type,scope);
-
- nmb->question.question_type = 0x20;
- nmb->question.question_class = 0x1;
-
- p.ip = to_ip;
- p.port = NMB_PORT;
- p.fd = fd;
- p.timestamp = time(NULL);
- p.packet_type = NMB_PACKET;
-
- GetTimeOfDay(&tval);
-
- if (!send_packet(&p))
- return(False);
-
- retries--;
-
- while (1)
- {
- struct timeval tval2;
- GetTimeOfDay(&tval2);
- if (TvalDiff(&tval,&tval2) > retry_time) {
- if (!retries) break;
- if (!found && !send_packet(&p))
- return False;
- GetTimeOfDay(&tval);
- retries--;
- }
-
- if ((p2=receive_packet(fd,NMB_PACKET,90)))
- {
- struct nmb_packet *nmb2 = &p2->packet.nmb;
- debug_nmb_packet(p2);
-
- if (nmb->header.name_trn_id != nmb2->header.name_trn_id ||
- !nmb2->header.response) {
- /* its not for us - maybe deal with it later
- (put it on the queue?) */
- if (fn)
- fn(p2);
- else
- free_packet(p2);
- continue;
- }
-
- if (nmb2->header.opcode != 0 ||
- nmb2->header.nm_flags.bcast ||
- nmb2->header.rcode ||
- !nmb2->header.ancount) {
- /* XXXX what do we do with this? could be a redirect, but
- we'll discard it for the moment */
- free_packet(p2);
- continue;
- }
-
- if (ip) {
- putip((char *)ip,&nmb2->answers->rdata[2]);
- DEBUG(fn?3:2,("Got a positive name query response from %s",
- inet_ntoa(p2->ip)));
- DEBUG(fn?3:2,(" (%s)\n",inet_ntoa(*ip)));
- }
- found=True; retries=0;
- free_packet(p2);
- if (fn) break;
- }
- }
-
- return(found);
-}
diff --git a/source/libsmb/nmblib.c b/source/libsmb/nmblib.c
deleted file mode 100644
index 48f988de2a2..00000000000
--- a/source/libsmb/nmblib.c
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios library routines
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-int num_good_sends = 0;
-int num_good_receives = 0;
-extern pstring scope;
-extern pstring myname;
-extern struct in_addr ipzero;
-
-static struct opcode_names {
- char *nmb_opcode_name;
- int opcode;
-} nmb_header_opcode_names[] = {
- { "Query", 0 },
- {"Registration", 5 },
- {"Release", 6 },
- {"WACK", 7 },
- {"refresh", 8 },
- {0, -1 }
-};
-
-/****************************************************************************
- * Lookup a nmb opcode name.
- ****************************************************************************/
-
-char *lookup_opcode_name( int opcode )
-{
- struct opcode_names *op_namep;
- int i;
-
- for(i = 0; nmb_header_opcode_names[i].nmb_opcode_name != 0; i++) {
- op_namep = &nmb_header_opcode_names[i];
- if(opcode == op_namep->opcode)
- return op_namep->nmb_opcode_name;
- }
- return "<unknown opcode>";
-}
-
-/****************************************************************************
- print out a res_rec structure
- ****************************************************************************/
-static void debug_nmb_res_rec(struct res_rec *res, char *hdr)
-{
- int i, j;
-
- DEBUG(4,(" %s: nmb_name=%s rr_type=%d rr_class=%d ttl=%d\n",
- hdr,
- namestr(&res->rr_name),
- res->rr_type,
- res->rr_class,
- res->ttl));
-
- if (res->rdlength == 0 || res->rdata == NULL) return;
-
- for (i = 0; i < res->rdlength; i+= 16)
- {
- DEBUG(4, (" %s %3x char ", hdr, i));
-
- for (j = 0; j < 16; j++)
- {
- unsigned char x = res->rdata[i+j];
- if (x < 32 || x > 127) x = '.';
-
- if (i+j >= res->rdlength) break;
- DEBUG(4, ("%c", x));
- }
-
- DEBUG(4, (" hex ", i));
-
- for (j = 0; j < 16; j++)
- {
- if (i+j >= res->rdlength) break;
- DEBUG(4, ("%02X", (unsigned char)res->rdata[i+j]));
- }
-
- DEBUG(4, ("\n"));
- }
-}
-
-/****************************************************************************
- process a nmb packet
- ****************************************************************************/
-void debug_nmb_packet(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
-
- DEBUG(4,("nmb packet from %s header: id=%d opcode=%s(%d) response=%s\n",
- inet_ntoa(p->ip),
- nmb->header.name_trn_id,
- lookup_opcode_name(nmb->header.opcode),
- nmb->header.opcode,BOOLSTR(nmb->header.response)));
- DEBUG(4,(" header: flags: bcast=%s rec_avail=%s rec_des=%s trunc=%s auth=%s\n",
- BOOLSTR(nmb->header.nm_flags.bcast),
- BOOLSTR(nmb->header.nm_flags.recursion_available),
- BOOLSTR(nmb->header.nm_flags.recursion_desired),
- BOOLSTR(nmb->header.nm_flags.trunc),
- BOOLSTR(nmb->header.nm_flags.authoritative)));
- DEBUG(4,(" header: rcode=%d qdcount=%d ancount=%d nscount=%d arcount=%d\n",
- nmb->header.rcode,
- nmb->header.qdcount,
- nmb->header.ancount,
- nmb->header.nscount,
- nmb->header.arcount));
-
- if (nmb->header.qdcount)
- {
- DEBUG(4,(" question: q_name=%s q_type=%d q_class=%d\n",
- namestr(&nmb->question.question_name),
- nmb->question.question_type,
- nmb->question.question_class));
- }
-
- if (nmb->answers && nmb->header.ancount)
- {
- debug_nmb_res_rec(nmb->answers,"answers");
- }
- if (nmb->nsrecs && nmb->header.nscount)
- {
- debug_nmb_res_rec(nmb->nsrecs,"nsrecs");
- }
- if (nmb->additional && nmb->header.arcount)
- {
- debug_nmb_res_rec(nmb->additional,"additional");
- }
-}
-
-/*******************************************************************
- handle "compressed" name pointers
- ******************************************************************/
-static BOOL handle_name_ptrs(unsigned char *ubuf,int *offset,int length,
- BOOL *got_pointer,int *ret)
-{
- int loop_count=0;
-
- while ((ubuf[*offset] & 0xC0) == 0xC0) {
- if (!*got_pointer) (*ret) += 2;
- (*got_pointer)=True;
- (*offset) = ((ubuf[*offset] & ~0xC0)<<8) | ubuf[(*offset)+1];
- if (loop_count++ == 10 || (*offset) < 0 || (*offset)>(length-2)) {
- return(False);
- }
- }
- return(True);
-}
-
-/*******************************************************************
- parse a nmb name from "compressed" format to something readable
- return the space taken by the name, or 0 if the name is invalid
- ******************************************************************/
-static int parse_nmb_name(char *inbuf,int offset,int length, struct nmb_name *name)
-{
- int m,n=0;
- unsigned char *ubuf = (unsigned char *)inbuf;
- int ret = 0;
- BOOL got_pointer=False;
-
- if (length - offset < 2) return(0);
-
- /* handle initial name pointers */
- if (!handle_name_ptrs(ubuf,&offset,length,&got_pointer,&ret)) return(0);
-
- m = ubuf[offset];
-
- if (!m) return(0);
- if ((m & 0xC0) || offset+m+2 > length) return(0);
-
- bzero((char *)name,sizeof(*name));
-
- /* the "compressed" part */
- if (!got_pointer) ret += m + 2;
- offset++;
- while (m) {
- unsigned char c1,c2;
- c1 = ubuf[offset++]-'A';
- c2 = ubuf[offset++]-'A';
- if ((c1 & 0xF0) || (c2 & 0xF0)) return(0);
- name->name[n++] = (c1<<4) | c2;
- m -= 2;
- }
- name->name[n] = 0;
-
- if (n==16) {
- /* parse out the name type,
- its always in the 16th byte of the name */
- name->name_type = name->name[15];
-
- /* remove trailing spaces */
- name->name[15] = 0;
- n = 14;
- while (n && name->name[n]==' ') name->name[n--] = 0;
- }
-
- /* now the domain parts (if any) */
- n = 0;
- while ((m=ubuf[offset])) {
- /* we can have pointers within the domain part as well */
- if (!handle_name_ptrs(ubuf,&offset,length,&got_pointer,&ret)) return(0);
-
- if (!got_pointer) ret += m+1;
- if (n) name->scope[n++] = '.';
- if (m+2+offset>length || n+m+1>sizeof(name->scope)) return(0);
- offset++;
- while (m--) name->scope[n++] = (char)ubuf[offset++];
- }
- name->scope[n++] = 0;
-
- return(ret);
-}
-
-
-/*******************************************************************
- put a compressed nmb name into a buffer. return the length of the
- compressed name
-
- compressed names are really weird. The "compression" doubles the
- size. The idea is that it also means that compressed names conform
- to the doman name system. See RFC1002.
- ******************************************************************/
-static int put_nmb_name(char *buf,int offset,struct nmb_name *name)
-{
- int ret,m;
- fstring buf1;
- char *p;
-
- if (name->name[0] == '*') {
- /* special case for wildcard name */
- bzero(buf1,20);
- buf1[0] = '*';
- } else {
- sprintf(buf1,"%-15.15s%c",name->name,name->name_type);
- }
-
- buf[offset] = 0x20;
-
- ret = 34;
-
- for (m=0;m<16;m++) {
- buf[offset+1+2*m] = 'A' + ((buf1[m]>>4)&0xF);
- buf[offset+2+2*m] = 'A' + (buf1[m]&0xF);
- }
- offset += 33;
-
- buf[offset] = 0;
-
- if (name->scope[0]) {
- /* XXXX this scope handling needs testing */
- ret += strlen(name->scope) + 1;
- strcpy(&buf[offset+1],name->scope);
-
- p = &buf[offset+1];
- while ((p = strchr(p,'.'))) {
- buf[offset] = PTR_DIFF(p,&buf[offset]);
- offset += buf[offset];
- p = &buf[offset+1];
- }
- buf[offset] = strlen(&buf[offset+1]);
- }
-
- return(ret);
-}
-
-/*******************************************************************
- useful for debugging messages
- ******************************************************************/
-char *namestr(struct nmb_name *n)
-{
- static int i=0;
- static fstring ret[4];
- char *p = ret[i];
-
- if (!n->scope[0])
- sprintf(p,"%s(%x)",n->name,n->name_type);
- else
- sprintf(p,"%s(%x).%s",n->name,n->name_type,n->scope);
-
- i = (i+1)%4;
- return(p);
-}
-
-/*******************************************************************
- allocate and parse some resource records
- ******************************************************************/
-static BOOL parse_alloc_res_rec(char *inbuf,int *offset,int length,
- struct res_rec **recs, int count)
-{
- int i;
- *recs = (struct res_rec *)malloc(sizeof(**recs)*count);
- if (!*recs) return(False);
-
- bzero(*recs,sizeof(**recs)*count);
-
- for (i=0;i<count;i++) {
- int l = parse_nmb_name(inbuf,*offset,length,&(*recs)[i].rr_name);
- (*offset) += l;
- if (!l || (*offset)+10 > length) {
- free(*recs);
- return(False);
- }
- (*recs)[i].rr_type = RSVAL(inbuf,(*offset));
- (*recs)[i].rr_class = RSVAL(inbuf,(*offset)+2);
- (*recs)[i].ttl = RIVAL(inbuf,(*offset)+4);
- (*recs)[i].rdlength = RSVAL(inbuf,(*offset)+8);
- (*offset) += 10;
- if ((*recs)[i].rdlength>sizeof((*recs)[i].rdata) ||
- (*offset)+(*recs)[i].rdlength > length) {
- free(*recs);
- return(False);
- }
- memcpy((*recs)[i].rdata,inbuf+(*offset),(*recs)[i].rdlength);
- (*offset) += (*recs)[i].rdlength;
- }
- return(True);
-}
-
-/*******************************************************************
- put a resource record into a packet
- ******************************************************************/
-static int put_res_rec(char *buf,int offset,struct res_rec *recs,int count)
-{
- int ret=0;
- int i;
-
- for (i=0;i<count;i++) {
- int l = put_nmb_name(buf,offset,&recs[i].rr_name);
- offset += l;
- ret += l;
- RSSVAL(buf,offset,recs[i].rr_type);
- RSSVAL(buf,offset+2,recs[i].rr_class);
- RSIVAL(buf,offset+4,recs[i].ttl);
- RSSVAL(buf,offset+8,recs[i].rdlength);
- memcpy(buf+offset+10,recs[i].rdata,recs[i].rdlength);
- offset += 10+recs[i].rdlength;
- ret += 10+recs[i].rdlength;
- }
-
- return(ret);
-}
-
-/*******************************************************************
- parse a dgram packet. Return False if the packet can't be parsed
- or is invalid for some reason, True otherwise
-
- this is documented in section 4.4.1 of RFC1002
- ******************************************************************/
-static BOOL parse_dgram(char *inbuf,int length,struct dgram_packet *dgram)
-{
- int offset;
- int flags;
-
- bzero((char *)dgram,sizeof(*dgram));
-
- if (length < 14) return(False);
-
- dgram->header.msg_type = CVAL(inbuf,0);
- flags = CVAL(inbuf,1);
- dgram->header.flags.node_type = (enum node_type)((flags>>2)&3);
- if (flags & 1) dgram->header.flags.more = True;
- if (flags & 2) dgram->header.flags.first = True;
- dgram->header.dgm_id = RSVAL(inbuf,2);
- putip((char *)&dgram->header.source_ip,inbuf+4);
- dgram->header.source_port = RSVAL(inbuf,8);
- dgram->header.dgm_length = RSVAL(inbuf,10);
- dgram->header.packet_offset = RSVAL(inbuf,12);
-
- offset = 14;
-
- if (dgram->header.msg_type == 0x10 ||
- dgram->header.msg_type == 0x11 ||
- dgram->header.msg_type == 0x12) {
- offset += parse_nmb_name(inbuf,offset,length,&dgram->source_name);
- offset += parse_nmb_name(inbuf,offset,length,&dgram->dest_name);
- }
-
- if (offset >= length || (length-offset > sizeof(dgram->data)))
- return(False);
-
- dgram->datasize = length-offset;
- memcpy(dgram->data,inbuf+offset,dgram->datasize);
-
- return(True);
-}
-
-
-/*******************************************************************
- parse a nmb packet. Return False if the packet can't be parsed
- or is invalid for some reason, True otherwise
- ******************************************************************/
-static BOOL parse_nmb(char *inbuf,int length,struct nmb_packet *nmb)
-{
- int nm_flags,offset;
-
- bzero((char *)nmb,sizeof(*nmb));
-
- if (length < 12) return(False);
-
- /* parse the header */
- nmb->header.name_trn_id = RSVAL(inbuf,0);
-
- DEBUG(10,("parse_nmb: packet id = %d\n", nmb->header.name_trn_id));
-
- nmb->header.opcode = (CVAL(inbuf,2) >> 3) & 0xF;
- nmb->header.response = ((CVAL(inbuf,2)>>7)&1)?True:False;
- nm_flags = ((CVAL(inbuf,2) & 0x7) << 4) + (CVAL(inbuf,3)>>4);
- nmb->header.nm_flags.bcast = (nm_flags&1)?True:False;
- nmb->header.nm_flags.recursion_available = (nm_flags&8)?True:False;
- nmb->header.nm_flags.recursion_desired = (nm_flags&0x10)?True:False;
- nmb->header.nm_flags.trunc = (nm_flags&0x20)?True:False;
- nmb->header.nm_flags.authoritative = (nm_flags&0x40)?True:False;
- nmb->header.rcode = CVAL(inbuf,3) & 0xF;
- nmb->header.qdcount = RSVAL(inbuf,4);
- nmb->header.ancount = RSVAL(inbuf,6);
- nmb->header.nscount = RSVAL(inbuf,8);
- nmb->header.arcount = RSVAL(inbuf,10);
-
- if (nmb->header.qdcount) {
- offset = parse_nmb_name(inbuf,12,length,&nmb->question.question_name);
- if (!offset) return(False);
-
- if (length - (12+offset) < 4) return(False);
- nmb->question.question_type = RSVAL(inbuf,12+offset);
- nmb->question.question_class = RSVAL(inbuf,12+offset+2);
-
- offset += 12+4;
- } else {
- offset = 12;
- }
-
- /* and any resource records */
- if (nmb->header.ancount &&
- !parse_alloc_res_rec(inbuf,&offset,length,&nmb->answers,
- nmb->header.ancount))
- return(False);
-
- if (nmb->header.nscount &&
- !parse_alloc_res_rec(inbuf,&offset,length,&nmb->nsrecs,
- nmb->header.nscount))
- return(False);
-
- if (nmb->header.arcount &&
- !parse_alloc_res_rec(inbuf,&offset,length,&nmb->additional,
- nmb->header.arcount))
- return(False);
-
- return(True);
-}
-
-/*******************************************************************
- free up any resources associated with an nmb packet
- ******************************************************************/
-void free_nmb_packet(struct nmb_packet *nmb)
-{
- if (nmb->answers) free(nmb->answers);
- if (nmb->nsrecs) free(nmb->nsrecs);
- if (nmb->additional) free(nmb->additional);
-}
-
-/*******************************************************************
- free up any resources associated with a packet
- ******************************************************************/
-void free_packet(struct packet_struct *packet)
-{
- if (packet->packet_type == NMB_PACKET)
- free_nmb_packet(&packet->packet.nmb);
- free(packet);
-}
-
-/*******************************************************************
- read a packet from a socket and parse it, returning a packet ready
- to be used or put on the queue. This assumes a UDP socket
- ******************************************************************/
-struct packet_struct *read_packet(int fd,enum packet_type packet_type)
-{
- extern struct in_addr lastip;
- extern int lastport;
- struct packet_struct *packet;
- char buf[MAX_DGRAM_SIZE];
- int length;
- BOOL ok=False;
-
- length = read_udp_socket(fd,buf,sizeof(buf));
- if (length < MIN_DGRAM_SIZE) return(NULL);
-
- packet = (struct packet_struct *)malloc(sizeof(*packet));
- if (!packet) return(NULL);
-
- packet->next = NULL;
- packet->prev = NULL;
- packet->ip = lastip;
- packet->port = lastport;
- packet->fd = fd;
- packet->timestamp = time(NULL);
- packet->packet_type = packet_type;
- switch (packet_type)
- {
- case NMB_PACKET:
- ok = parse_nmb(buf,length,&packet->packet.nmb);
- break;
-
- case DGRAM_PACKET:
- ok = parse_dgram(buf,length,&packet->packet.dgram);
- break;
- }
- if (!ok) {
- DEBUG(10,("parse_nmb: discarding packet id = %d\n",
- packet->packet.nmb.header.name_trn_id));
- free(packet);
- return(NULL);
- }
-
- num_good_receives++;
-
- DEBUG(5,("%s received a packet of len %d from (%s) port %d\n",
- timestring(),length,inet_ntoa(packet->ip),packet->port));
-
- return(packet);
-}
-
-
-/*******************************************************************
- send a udp packet on a already open socket
- ******************************************************************/
-static BOOL send_udp(int fd,char *buf,int len,struct in_addr ip,int port)
-{
- BOOL ret;
- struct sockaddr_in sock_out;
-
- /* set the address and port */
- bzero((char *)&sock_out,sizeof(sock_out));
- putip((char *)&sock_out.sin_addr,(char *)&ip);
- sock_out.sin_port = htons( port );
- sock_out.sin_family = AF_INET;
-
- DEBUG(5,("%s sending a packet of len %d to (%s) on port %d\n",
- timestring(),len,inet_ntoa(ip),port));
-
- ret = (sendto(fd,buf,len,0,(struct sockaddr *)&sock_out,
- sizeof(sock_out)) >= 0);
-
- if (!ret)
- DEBUG(0,("Packet send failed to %s(%d) ERRNO=%s\n",
- inet_ntoa(ip),port,strerror(errno)));
-
- if (ret)
- num_good_sends++;
-
- return(ret);
-}
-
-/*******************************************************************
- build a dgram packet ready for sending
-
- XXXX This currently doesn't handle packets too big for one
- datagram. It should split them and use the packet_offset, more and
- first flags to handle the fragmentation. Yuck.
- ******************************************************************/
-static int build_dgram(char *buf,struct packet_struct *p)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- unsigned char *ubuf = (unsigned char *)buf;
- int offset=0;
-
- /* put in the header */
- ubuf[0] = dgram->header.msg_type;
- ubuf[1] = (((int)dgram->header.flags.node_type)<<2);
- if (dgram->header.flags.more) ubuf[1] |= 1;
- if (dgram->header.flags.first) ubuf[1] |= 2;
- RSSVAL(ubuf,2,dgram->header.dgm_id);
- putip(ubuf+4,(char *)&dgram->header.source_ip);
- RSSVAL(ubuf,8,dgram->header.source_port);
- RSSVAL(ubuf,12,dgram->header.packet_offset);
-
- offset = 14;
-
- if (dgram->header.msg_type == 0x10 ||
- dgram->header.msg_type == 0x11 ||
- dgram->header.msg_type == 0x12) {
- offset += put_nmb_name((char *)ubuf,offset,&dgram->source_name);
- offset += put_nmb_name((char *)ubuf,offset,&dgram->dest_name);
- }
-
- memcpy(ubuf+offset,dgram->data,dgram->datasize);
- offset += dgram->datasize;
-
- /* automatically set the dgm_length */
- dgram->header.dgm_length = offset;
- RSSVAL(ubuf,10,dgram->header.dgm_length);
-
- return(offset);
-}
-
-/*******************************************************************
- build a nmb name
- ******************************************************************/
-void make_nmb_name(struct nmb_name *n,char *name,int type,char *this_scope)
-{
- fstrcpy(n->name,name);
- strupper(n->name);
- n->name_type = type;
- fstrcpy(n->scope,this_scope);
-}
-
-
-/*******************************************************************
- build a nmb packet ready for sending
-
- XXXX this currently relies on not being passed something that expands
- to a packet too big for the buffer. Eventually this should be
- changed to set the trunc bit so the receiver can request the rest
- via tcp (when that becomes supported)
- ******************************************************************/
-static int build_nmb(char *buf,struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- unsigned char *ubuf = (unsigned char *)buf;
- int offset=0;
-
- /* put in the header */
- RSSVAL(ubuf,offset,nmb->header.name_trn_id);
- ubuf[offset+2] = (nmb->header.opcode & 0xF) << 3;
- if (nmb->header.response) ubuf[offset+2] |= (1<<7);
- if (nmb->header.nm_flags.authoritative &&
- nmb->header.response) ubuf[offset+2] |= 0x4;
- if (nmb->header.nm_flags.trunc) ubuf[offset+2] |= 0x2;
- if (nmb->header.nm_flags.recursion_desired) ubuf[offset+2] |= 0x1;
- if (nmb->header.nm_flags.recursion_available &&
- nmb->header.response) ubuf[offset+3] |= 0x80;
- if (nmb->header.nm_flags.bcast) ubuf[offset+3] |= 0x10;
- ubuf[offset+3] |= (nmb->header.rcode & 0xF);
-
- RSSVAL(ubuf,offset+4,nmb->header.qdcount);
- RSSVAL(ubuf,offset+6,nmb->header.ancount);
- RSSVAL(ubuf,offset+8,nmb->header.nscount);
- RSSVAL(ubuf,offset+10,nmb->header.arcount);
-
- offset += 12;
- if (nmb->header.qdcount) {
- /* XXXX this doesn't handle a qdcount of > 1 */
- offset += put_nmb_name((char *)ubuf,offset,&nmb->question.question_name);
- RSSVAL(ubuf,offset,nmb->question.question_type);
- RSSVAL(ubuf,offset+2,nmb->question.question_class);
- offset += 4;
- }
-
- if (nmb->header.ancount)
- offset += put_res_rec((char *)ubuf,offset,nmb->answers,
- nmb->header.ancount);
-
- if (nmb->header.nscount)
- offset += put_res_rec((char *)ubuf,offset,nmb->nsrecs,
- nmb->header.nscount);
-
- if (nmb->header.arcount)
- offset += put_res_rec((char *)ubuf,offset,nmb->additional,
- nmb->header.arcount);
-
- return(offset);
-}
-
-
-/*******************************************************************
- send a packet_struct
- ******************************************************************/
-BOOL send_packet(struct packet_struct *p)
-{
- char buf[1024];
- int len=0;
-
- bzero(buf,sizeof(buf));
-
- switch (p->packet_type)
- {
- case NMB_PACKET:
- len = build_nmb(buf,p);
- break;
-
- case DGRAM_PACKET:
- len = build_dgram(buf,p);
- break;
- }
-
- if (!len) return(False);
-
- return(send_udp(p->fd,buf,len,p->ip,p->port));
-}
-
-/****************************************************************************
- receive a packet with timeout on a open UDP filedescriptor
- The timeout is in milliseconds
- ***************************************************************************/
-struct packet_struct *receive_packet(int fd,enum packet_type type,int t)
-{
- fd_set fds;
- struct timeval timeout;
-
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
- timeout.tv_sec = t/1000;
- timeout.tv_usec = 1000*(t%1000);
-
- sys_select(&fds,&timeout);
-
- if (FD_ISSET(fd,&fds))
- return(read_packet(fd,type));
-
- return(NULL);
-}
-
-
diff --git a/source/libsmb/smbdes.c b/source/libsmb/smbdes.c
deleted file mode 100644
index 1c38612b739..00000000000
--- a/source/libsmb/smbdes.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
-
- a partial implementation of DES designed for use in the
- SMB authentication protocol
-
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-/* NOTES:
-
- This code makes no attempt to be fast! In fact, it is a very
- slow implementation
-
- This code is NOT a complete DES implementation. It implements only
- the minimum necessary for SMB authentication, as used by all SMB
- products (including every copy of Microsoft Windows95 ever sold)
-
- In particular, it can only do a unchained forward DES pass. This
- means it is not possible to use this code for encryption/decryption
- of data, instead it is only useful as a "hash" algorithm.
-
- There is no entry point into this code that allows normal DES operation.
-
- I believe this means that this code does not come under ITAR
- regulations but this is NOT a legal opinion. If you are concerned
- about the applicability of ITAR regulations to this code then you
- should confirm it for yourself (and maybe let me know if you come
- up with a different answer to the one above)
-*/
-
-
-
-static int perm1[56] = {57, 49, 41, 33, 25, 17, 9,
- 1, 58, 50, 42, 34, 26, 18,
- 10, 2, 59, 51, 43, 35, 27,
- 19, 11, 3, 60, 52, 44, 36,
- 63, 55, 47, 39, 31, 23, 15,
- 7, 62, 54, 46, 38, 30, 22,
- 14, 6, 61, 53, 45, 37, 29,
- 21, 13, 5, 28, 20, 12, 4};
-
-static int perm2[48] = {14, 17, 11, 24, 1, 5,
- 3, 28, 15, 6, 21, 10,
- 23, 19, 12, 4, 26, 8,
- 16, 7, 27, 20, 13, 2,
- 41, 52, 31, 37, 47, 55,
- 30, 40, 51, 45, 33, 48,
- 44, 49, 39, 56, 34, 53,
- 46, 42, 50, 36, 29, 32};
-
-static int perm3[64] = {58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7};
-
-static int perm4[48] = { 32, 1, 2, 3, 4, 5,
- 4, 5, 6, 7, 8, 9,
- 8, 9, 10, 11, 12, 13,
- 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21,
- 20, 21, 22, 23, 24, 25,
- 24, 25, 26, 27, 28, 29,
- 28, 29, 30, 31, 32, 1};
-
-static int perm5[32] = { 16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25};
-
-
-static int perm6[64] ={ 40, 8, 48, 16, 56, 24, 64, 32,
- 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30,
- 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28,
- 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26,
- 33, 1, 41, 9, 49, 17, 57, 25};
-
-
-static int sc[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
-
-static int sbox[8][4][16] = {
- {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
- {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
- {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
- {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}},
-
- {{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
- {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
- {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
- {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}},
-
- {{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
- {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
- {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
- {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}},
-
- {{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
- {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
- {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
- {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}},
-
- {{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
- {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
- {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
- {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}},
-
- {{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
- {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
- {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
- {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}},
-
- {{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
- {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
- {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
- {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}},
-
- {{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
- {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
- {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
- {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}};
-
-static void permute(char *out, char *in, int *p, int n)
-{
- int i;
- for (i=0;i<n;i++)
- out[i] = in[p[i]-1];
-}
-
-static void lshift(char *d, int count, int n)
-{
- char out[64];
- int i;
- for (i=0;i<n;i++)
- out[i] = d[(i+count)%n];
- for (i=0;i<n;i++)
- d[i] = out[i];
-}
-
-static void concat(char *out, char *in1, char *in2, int l1, int l2)
-{
- while (l1--)
- *out++ = *in1++;
- while (l2--)
- *out++ = *in2++;
-}
-
-static void xor(char *out, char *in1, char *in2, int n)
-{
- int i;
- for (i=0;i<n;i++)
- out[i] = in1[i] ^ in2[i];
-}
-
-static void dohash(char *out, char *in, char *key)
-{
- int i, j, k;
- char pk1[56];
- char c[28];
- char d[28];
- char cd[56];
- char ki[16][48];
- char pd1[64];
- char l[32], r[32];
- char rl[64];
-
- permute(pk1, key, perm1, 56);
-
- for (i=0;i<28;i++)
- c[i] = pk1[i];
- for (i=0;i<28;i++)
- d[i] = pk1[i+28];
-
- for (i=0;i<16;i++) {
- lshift(c, sc[i], 28);
- lshift(d, sc[i], 28);
-
- concat(cd, c, d, 28, 28);
- permute(ki[i], cd, perm2, 48);
- }
-
- permute(pd1, in, perm3, 64);
-
- for (j=0;j<32;j++) {
- l[j] = pd1[j];
- r[j] = pd1[j+32];
- }
-
- for (i=0;i<16;i++) {
- char er[48];
- char erk[48];
- char b[8][6];
- char cb[32];
- char pcb[32];
- char r2[32];
-
- permute(er, r, perm4, 48);
-
- xor(erk, er, ki[i], 48);
-
- for (j=0;j<8;j++)
- for (k=0;k<6;k++)
- b[j][k] = erk[j*6 + k];
-
- for (j=0;j<8;j++) {
- int m, n;
- m = (b[j][0]<<1) | b[j][5];
-
- n = (b[j][1]<<3) | (b[j][2]<<2) | (b[j][3]<<1) | b[j][4];
-
- for (k=0;k<4;k++)
- b[j][k] = (sbox[j][m][n] & (1<<(3-k)))?1:0;
- }
-
- for (j=0;j<8;j++)
- for (k=0;k<4;k++)
- cb[j*4+k] = b[j][k];
- permute(pcb, cb, perm5, 32);
-
- xor(r2, l, pcb, 32);
-
- for (j=0;j<32;j++)
- l[j] = r[j];
-
- for (j=0;j<32;j++)
- r[j] = r2[j];
- }
-
- concat(rl, r, l, 32, 32);
-
- permute(out, rl, perm6, 64);
-}
-
-static void str_to_key(unsigned char *str,unsigned char *key)
-{
- int i;
-
- key[0] = str[0]>>1;
- key[1] = ((str[0]&0x01)<<6) | (str[1]>>2);
- key[2] = ((str[1]&0x03)<<5) | (str[2]>>3);
- key[3] = ((str[2]&0x07)<<4) | (str[3]>>4);
- key[4] = ((str[3]&0x0F)<<3) | (str[4]>>5);
- key[5] = ((str[4]&0x1F)<<2) | (str[5]>>6);
- key[6] = ((str[5]&0x3F)<<1) | (str[6]>>7);
- key[7] = str[6]&0x7F;
- for (i=0;i<8;i++) {
- key[i] = (key[i]<<1);
- }
-}
-
-
-static void smbhash(unsigned char *out, unsigned char *in, unsigned char *key)
-{
- int i;
- char outb[64];
- char inb[64];
- char keyb[64];
- unsigned char key2[8];
-
- str_to_key(key, key2);
-
- for (i=0;i<64;i++) {
- inb[i] = (in[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
- keyb[i] = (key2[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
- outb[i] = 0;
- }
-
- dohash(outb, inb, keyb);
-
- for (i=0;i<8;i++) {
- out[i] = 0;
- }
-
- for (i=0;i<64;i++) {
- if (outb[i])
- out[i/8] |= (1<<(7-(i%8)));
- }
-}
-
-void E_P16(unsigned char *p14,unsigned char *p16)
-{
- unsigned char sp8[8] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
- smbhash(p16, sp8, p14);
- smbhash(p16+8, sp8, p14+7);
-}
-
-void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24)
-{
- smbhash(p24, c8, p21);
- smbhash(p24+8, c8, p21+7);
- smbhash(p24+16, c8, p21+14);
-}
-
-
diff --git a/source/libsmb/smbencrypt.c b/source/libsmb/smbencrypt.c
deleted file mode 100644
index 27172fd4136..00000000000
--- a/source/libsmb/smbencrypt.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB parameters and setup
- Copyright (C) Andrew Tridgell 1992-1997
- Modified by Jeremy Allison 1995.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-#include "byteorder.h"
-
-/*
- This implements the X/Open SMB password encryption
- It takes a password, a 8 byte "crypt key" and puts 24 bytes of
- encrypted password into p24 */
-void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24)
-{
- uchar p14[15], p21[21];
-
- memset(p21,'\0',21);
- memset(p14,'\0',14);
- StrnCpy((char *)p14,(char *)passwd,14);
-
- strupper((char *)p14);
- E_P16(p14, p21);
- E_P24(p21, c8, p24);
-}
-
-/* Routines for Windows NT MD4 Hash functions. */
-static int _my_wcslen(int16 *str)
-{
- int len = 0;
- while(*str++ != 0)
- len++;
- return len;
-}
-
-/*
- * Convert a string into an NT UNICODE string.
- * Note that regardless of processor type
- * this must be in intel (little-endian)
- * format.
- */
-
-static int _my_mbstowcs(int16 *dst, uchar *src, int len)
-{
- int i;
- int16 val;
-
- for(i = 0; i < len; i++) {
- val = *src;
- SSVAL(dst,0,val);
- dst++;
- src++;
- if(val == 0)
- break;
- }
- return i;
-}
-
-/*
- * Creates the MD4 Hash of the users password in NT UNICODE.
- */
-
-void E_md4hash(uchar *passwd, uchar *p16)
-{
- int len;
- int16 wpwd[129];
-
- /* Password cannot be longer than 128 characters */
- len = strlen((char *)passwd);
- if(len > 128)
- len = 128;
- /* Password must be converted to NT unicode */
- _my_mbstowcs(wpwd, passwd, len);
- wpwd[len] = 0; /* Ensure string is null terminated */
- /* Calculate length in bytes */
- len = _my_wcslen(wpwd) * sizeof(int16);
-
- mdfour(p16, (unsigned char *)wpwd, len);
-}
-
-/* Does the NT MD4 hash then des encryption. */
-
-void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24)
-{
- uchar p21[21];
-
- memset(p21,'\0',21);
-
- E_md4hash(passwd, p21);
- E_P24(p21, c8, p24);
-}
-
diff --git a/source/locking/locking.c b/source/locking/locking.c
deleted file mode 100644
index 639bc7be0ba..00000000000
--- a/source/locking/locking.c
+++ /dev/null
@@ -1,1535 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Locking functions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 12 aug 96: Erik.Devriendt@te6.siemens.be
- added support for shared memory implementation of share mode locking
-
- May 1997. Jeremy Allison (jallison@whistle.com). Modified share mode
- locking to deal with multiple share modes per open file.
-
- September 1997. Jeremy Allison (jallison@whistle.com). Added oplock
- support.
-
-*/
-
-#include "includes.h"
-extern int DEBUGLEVEL;
-extern connection_struct Connections[];
-extern files_struct Files[];
-
-/****************************************************************************
- utility function called to see if a file region is locked
-****************************************************************************/
-BOOL is_locked(int fnum,int cnum,uint32 count,uint32 offset)
-{
- int snum = SNUM(cnum);
-
- if (count == 0)
- return(False);
-
- if (!lp_locking(snum) || !lp_strict_locking(snum))
- return(False);
-
- return(fcntl_lock(Files[fnum].fd_ptr->fd,F_GETLK,offset,count,
- (Files[fnum].can_write?F_WRLCK:F_RDLCK)));
-}
-
-
-/****************************************************************************
- utility function called by locking requests
-****************************************************************************/
-BOOL do_lock(int fnum,int cnum,uint32 count,uint32 offset,int *eclass,uint32 *ecode)
-{
- BOOL ok = False;
-
- if (!lp_locking(SNUM(cnum)))
- return(True);
-
- if (count == 0) {
- *eclass = ERRDOS;
- *ecode = ERRnoaccess;
- return False;
- }
-
- if (Files[fnum].can_lock && OPEN_FNUM(fnum) && (Files[fnum].cnum == cnum))
- ok = fcntl_lock(Files[fnum].fd_ptr->fd,F_SETLK,offset,count,
- (Files[fnum].can_write?F_WRLCK:F_RDLCK));
-
- if (!ok) {
- *eclass = ERRDOS;
- *ecode = ERRlock;
- return False;
- }
- return True; /* Got lock */
-}
-
-
-/****************************************************************************
- utility function called by unlocking requests
-****************************************************************************/
-BOOL do_unlock(int fnum,int cnum,uint32 count,uint32 offset,int *eclass,uint32 *ecode)
-{
- BOOL ok = False;
-
- if (!lp_locking(SNUM(cnum)))
- return(True);
-
- if (Files[fnum].can_lock && OPEN_FNUM(fnum) && (Files[fnum].cnum == cnum))
- ok = fcntl_lock(Files[fnum].fd_ptr->fd,F_SETLK,offset,count,F_UNLCK);
-
- if (!ok) {
- *eclass = ERRDOS;
- *ecode = ERRlock;
- return False;
- }
- return True; /* Did unlock */
-}
-
-#ifdef FAST_SHARE_MODES
-/*******************************************************************
- initialize the shared memory for share_mode management
- ******************************************************************/
-BOOL start_share_mode_mgmt(void)
-{
- pstring shmem_file_name;
-
- pstrcpy(shmem_file_name,lp_lockdir());
- if (!directory_exist(shmem_file_name,NULL))
- mkdir(shmem_file_name,0755);
- trim_string(shmem_file_name,"","/");
- if (!*shmem_file_name) return(False);
- strcat(shmem_file_name, "/SHARE_MEM_FILE");
- return smb_shm_open(shmem_file_name, lp_shmem_size());
-}
-
-
-/*******************************************************************
- deinitialize the shared memory for share_mode management
- ******************************************************************/
-BOOL stop_share_mode_mgmt(void)
-{
- return smb_shm_close();
-}
-
-/*******************************************************************
- lock a hash bucket entry in shared memory for share_mode management
- ******************************************************************/
-BOOL lock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token *ptok)
-{
- return smb_shm_lock_hash_entry(HASH_ENTRY(dev, inode));
-}
-
-/*******************************************************************
- unlock a hash bucket entry in shared memory for share_mode management
- ******************************************************************/
-BOOL unlock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token token)
-{
- return smb_shm_unlock_hash_entry(HASH_ENTRY(dev, inode));
-}
-
-/*******************************************************************
-get all share mode entries in shared memory for a dev/inode pair.
-********************************************************************/
-int get_share_modes(int cnum, share_lock_token token, uint32 dev, uint32 inode,
- min_share_mode_entry **old_shares)
-{
- smb_shm_offset_t *mode_array;
- unsigned int hash_entry = HASH_ENTRY(dev, inode);
- share_mode_record *file_scanner_p;
- share_mode_record *file_prev_p;
- share_mode_entry *entry_scanner_p;
- share_mode_entry *entry_prev_p;
- int num_entries;
- int num_entries_copied;
- BOOL found = False;
- min_share_mode_entry *share_array = (min_share_mode_entry *)0;
-
- *old_shares = 0;
-
- if(hash_entry > lp_shmem_hash_size() )
- {
- DEBUG(0,
- ("PANIC ERROR : get_share_modes (FAST_SHARE_MODES): hash_entry %d too large \
-(max = %d)\n",
- hash_entry, lp_shmem_hash_size() ));
- return 0;
- }
-
- mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
-
- if(mode_array[hash_entry] == NULL_OFFSET)
- {
- DEBUG(5,("get_share_modes (FAST_SHARE_MODES): hash bucket %d empty\n", hash_entry));
- return 0;
- }
-
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[hash_entry]);
- file_prev_p = file_scanner_p;
- while(file_scanner_p)
- {
- if( (file_scanner_p->st_dev == dev) && (file_scanner_p->st_ino == inode) )
- {
- found = True;
- break;
- }
- else
- {
- file_prev_p = file_scanner_p ;
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(
- file_scanner_p->next_offset);
- }
- }
-
- if(!found)
- {
- DEBUG(5,("get_share_modes (FAST_SHARE_MODES): no entry for \
-file dev = %d, ino = %d in hash_bucket %d\n", dev, inode, hash_entry));
- return (0);
- }
-
- if(file_scanner_p->locking_version != LOCKING_VERSION)
- {
- DEBUG(0,("ERROR:get_share_modes (FAST_SHARE_MODES): Deleting old share mode \
-record due to old locking version %d for file dev = %d, inode = %d in hash \
-bucket %d\n", file_scanner_p->locking_version, dev, inode, hash_entry));
- if(file_prev_p == file_scanner_p)
- mode_array[hash_entry] = file_scanner_p->next_offset;
- else
- file_prev_p->next_offset = file_scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(file_scanner_p));
- return (0);
- }
-
- /* Allocate the old_shares array */
- num_entries = file_scanner_p->num_share_mode_entries;
- if(num_entries)
- {
- *old_shares = share_array = (min_share_mode_entry *)
- malloc(num_entries * sizeof(min_share_mode_entry));
- if(*old_shares == 0)
- {
- DEBUG(0,("get_share_modes (FAST_SHARE_MODES): malloc fail !\n"));
- return 0;
- }
- }
-
- num_entries_copied = 0;
-
- entry_scanner_p = (share_mode_entry*)smb_shm_offset2addr(
- file_scanner_p->share_mode_entries);
- entry_prev_p = entry_scanner_p;
- while(entry_scanner_p)
- {
- int pid = entry_scanner_p->pid;
-
- if (pid && !process_exists(pid))
- {
- /* Delete this share mode entry */
- share_mode_entry *delete_entry_p = entry_scanner_p;
- int share_mode = entry_scanner_p->share_mode;
-
- if(entry_prev_p == entry_scanner_p)
- {
- /* We are at start of list */
- file_scanner_p->share_mode_entries = entry_scanner_p->next_share_mode_entry;
- entry_scanner_p = (share_mode_entry*)smb_shm_offset2addr(
- file_scanner_p->share_mode_entries);
- entry_prev_p = entry_scanner_p;
- }
- else
- {
- entry_prev_p->next_share_mode_entry = entry_scanner_p->next_share_mode_entry;
- entry_scanner_p = (share_mode_entry*)
- smb_shm_offset2addr(entry_scanner_p->next_share_mode_entry);
- }
- /* Decrement the number of share mode entries on this share mode record */
- file_scanner_p->num_share_mode_entries -= 1;
-
- /* PARANOIA TEST */
- if(file_scanner_p->num_share_mode_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:get_share_mode (FAST_SHARE_MODES): num_share_mode_entries < 0 (%d) \
-for dev = %d, ino = %d, hashbucket %d\n", file_scanner_p->num_share_mode_entries,
- dev, inode, hash_entry));
- return 0;
- }
-
- DEBUG(0,("get_share_modes (FAST_SHARE_MODES): process %d no longer exists and \
-it left a share mode entry with mode 0x%X for file dev = %d, ino = %d in hash \
-bucket %d (number of entries now = %d)\n",
- pid, share_mode, dev, inode, hash_entry,
- file_scanner_p->num_share_mode_entries));
-
- smb_shm_free(smb_shm_addr2offset(delete_entry_p));
- }
- else
- {
- /* This is a valid share mode entry and the process that
- created it still exists. Copy it into the output array.
- */
- share_array[num_entries_copied].pid = entry_scanner_p->pid;
- share_array[num_entries_copied].share_mode = entry_scanner_p->share_mode;
- share_array[num_entries_copied].op_port = entry_scanner_p->op_port;
- share_array[num_entries_copied].op_type = entry_scanner_p->op_type;
- memcpy(&share_array[num_entries_copied].time, &entry_scanner_p->time,
- sizeof(struct timeval));
- num_entries_copied++;
- DEBUG(5,("get_share_modes (FAST_SHARE_MODES): Read share mode \
-record mode 0x%X pid=%d\n", entry_scanner_p->share_mode, entry_scanner_p->pid));
- entry_prev_p = entry_scanner_p;
- entry_scanner_p = (share_mode_entry *)
- smb_shm_offset2addr(entry_scanner_p->next_share_mode_entry);
- }
- }
-
- /* If no valid share mode entries were found then this record shouldn't exist ! */
- if(num_entries_copied == 0)
- {
- DEBUG(0,("get_share_modes (FAST_SHARE_MODES): file with dev %d, inode %d in \
-hash bucket %d has a share mode record but no entries - deleting\n",
- dev, inode, hash_entry));
- if(*old_shares)
- free((char *)*old_shares);
- *old_shares = 0;
-
- if(file_prev_p == file_scanner_p)
- mode_array[hash_entry] = file_scanner_p->next_offset;
- else
- file_prev_p->next_offset = file_scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(file_scanner_p));
- }
-
- DEBUG(5,("get_share_modes (FAST_SHARE_MODES): file with dev %d, inode %d in \
-hash bucket %d returning %d entries\n", dev, inode, hash_entry, num_entries_copied));
-
- return(num_entries_copied);
-}
-
-/*******************************************************************
-del the share mode of a file.
-********************************************************************/
-void del_share_mode(share_lock_token token, int fnum)
-{
- uint32 dev, inode;
- smb_shm_offset_t *mode_array;
- unsigned int hash_entry;
- share_mode_record *file_scanner_p;
- share_mode_record *file_prev_p;
- share_mode_entry *entry_scanner_p;
- share_mode_entry *entry_prev_p;
- BOOL found = False;
- int pid = getpid();
-
- dev = Files[fnum].fd_ptr->dev;
- inode = Files[fnum].fd_ptr->inode;
-
- hash_entry = HASH_ENTRY(dev, inode);
-
- if(hash_entry > lp_shmem_hash_size() )
- {
- DEBUG(0,
- ("PANIC ERROR:del_share_mode (FAST_SHARE_MODES): hash_entry %d too large \
-(max = %d)\n",
- hash_entry, lp_shmem_hash_size() ));
- return;
- }
-
- mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
-
- if(mode_array[hash_entry] == NULL_OFFSET)
- {
- DEBUG(0,("PANIC ERROR:del_share_mode (FAST_SHARE_MODES): hash bucket %d empty\n",
- hash_entry));
- return;
- }
-
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[hash_entry]);
- file_prev_p = file_scanner_p;
-
- while(file_scanner_p)
- {
- if( (file_scanner_p->st_dev == dev) && (file_scanner_p->st_ino == inode) )
- {
- found = True;
- break;
- }
- else
- {
- file_prev_p = file_scanner_p ;
- file_scanner_p = (share_mode_record *)
- smb_shm_offset2addr(file_scanner_p->next_offset);
- }
- }
-
- if(!found)
- {
- DEBUG(0,("ERROR:del_share_mode (FAST_SHARE_MODES): no entry found for dev %d, \
-inode %d in hash bucket %d\n", dev, inode, hash_entry));
- return;
- }
-
- if(file_scanner_p->locking_version != LOCKING_VERSION)
- {
- DEBUG(0,("ERROR: del_share_modes (FAST_SHARE_MODES): Deleting old share mode \
-record due to old locking version %d for file dev %d, inode %d hash bucket %d\n",
- file_scanner_p->locking_version, dev, inode, hash_entry ));
- if(file_prev_p == file_scanner_p)
- mode_array[hash_entry] = file_scanner_p->next_offset;
- else
- file_prev_p->next_offset = file_scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(file_scanner_p));
- return;
- }
-
- found = False;
- entry_scanner_p = (share_mode_entry*)smb_shm_offset2addr(
- file_scanner_p->share_mode_entries);
- entry_prev_p = entry_scanner_p;
- while(entry_scanner_p)
- {
- if( (pid == entry_scanner_p->pid) &&
- (memcmp(&entry_scanner_p->time,
- &Files[fnum].open_time,sizeof(struct timeval)) == 0) )
- {
- found = True;
- break;
- }
- else
- {
- entry_prev_p = entry_scanner_p;
- entry_scanner_p = (share_mode_entry *)
- smb_shm_offset2addr(entry_scanner_p->next_share_mode_entry);
- }
- }
-
- if (found)
- {
- /* Decrement the number of entries in the record. */
- file_scanner_p->num_share_mode_entries -= 1;
-
- DEBUG(2,("del_share_modes (FAST_SHARE_MODES): \
-Deleting share mode entry dev = %d, inode = %d in hash bucket %d (num entries now = %d)\n",
- dev, inode, hash_entry, file_scanner_p->num_share_mode_entries));
- if(entry_prev_p == entry_scanner_p)
- /* We are at start of list */
- file_scanner_p->share_mode_entries = entry_scanner_p->next_share_mode_entry;
- else
- entry_prev_p->next_share_mode_entry = entry_scanner_p->next_share_mode_entry;
- smb_shm_free(smb_shm_addr2offset(entry_scanner_p));
-
- /* PARANOIA TEST */
- if(file_scanner_p->num_share_mode_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:del_share_mode (FAST_SHARE_MODES): num_share_mode_entries < 0 (%d) \
-for dev = %d, ino = %d, hashbucket %d\n", file_scanner_p->num_share_mode_entries,
- dev, inode, hash_entry));
- return;
- }
-
- /* If we deleted the last share mode entry then remove the share mode record. */
- if(file_scanner_p->num_share_mode_entries == 0)
- {
- DEBUG(2,("del_share_modes (FAST_SHARE_MODES): num entries = 0, deleting share_mode \
-record dev = %d, inode = %d in hash bucket %d\n", dev, inode, hash_entry));
- if(file_prev_p == file_scanner_p)
- mode_array[hash_entry] = file_scanner_p->next_offset;
- else
- file_prev_p->next_offset = file_scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(file_scanner_p));
- }
- }
- else
- {
- DEBUG(0,("ERROR: del_share_modes (FAST_SHARE_MODES): No share mode record found \
-dev = %d, inode = %d in hash bucket %d\n", dev, inode, hash_entry));
- }
-}
-
-/*******************************************************************
-set the share mode of a file. Return False on fail, True on success.
-********************************************************************/
-BOOL set_share_mode(share_lock_token token, int fnum, uint16 port, uint16 op_type)
-{
- files_struct *fs_p = &Files[fnum];
- int32 dev, inode;
- smb_shm_offset_t *mode_array;
- unsigned int hash_entry;
- share_mode_record *file_scanner_p;
- share_mode_record *file_prev_p;
- share_mode_entry *new_entry_p;
- smb_shm_offset_t new_entry_offset;
- BOOL found = False;
-
- dev = fs_p->fd_ptr->dev;
- inode = fs_p->fd_ptr->inode;
-
- hash_entry = HASH_ENTRY(dev, inode);
- if(hash_entry > lp_shmem_hash_size() )
- {
- DEBUG(0,
- ("PANIC ERROR:set_share_mode (FAST_SHARE_MODES): hash_entry %d too large \
-(max = %d)\n",
- hash_entry, lp_shmem_hash_size() ));
- return False;
- }
-
- mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
-
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[hash_entry]);
- file_prev_p = file_scanner_p;
-
- while(file_scanner_p)
- {
- if( (file_scanner_p->st_dev == dev) && (file_scanner_p->st_ino == inode) )
- {
- found = True;
- break;
- }
- else
- {
- file_prev_p = file_scanner_p ;
- file_scanner_p = (share_mode_record *)
- smb_shm_offset2addr(file_scanner_p->next_offset);
- }
- }
-
- if(!found)
- {
- /* We must create a share_mode_record */
- share_mode_record *new_mode_p = NULL;
- smb_shm_offset_t new_offset = smb_shm_alloc( sizeof(share_mode_record) +
- strlen(fs_p->name) + 1);
- if(new_offset == NULL_OFFSET)
- {
- DEBUG(0,("ERROR:set_share_mode (FAST_SHARE_MODES): smb_shm_alloc fail !\n"));
- return False;
- }
- new_mode_p = smb_shm_offset2addr(new_offset);
- new_mode_p->locking_version = LOCKING_VERSION;
- new_mode_p->st_dev = dev;
- new_mode_p->st_ino = inode;
- new_mode_p->num_share_mode_entries = 0;
- new_mode_p->share_mode_entries = NULL_OFFSET;
- strcpy(new_mode_p->file_name, fs_p->name);
-
- /* Chain onto the start of the hash chain (in the hope we will be used first). */
- new_mode_p->next_offset = mode_array[hash_entry];
- mode_array[hash_entry] = new_offset;
-
- file_scanner_p = new_mode_p;
-
- DEBUG(3,("set_share_mode (FAST_SHARE_MODES): Created share record for %s (dev %d \
-inode %d in hash bucket %d\n", fs_p->name, dev, inode, hash_entry));
- }
-
- /* Now create the share mode entry */
- new_entry_offset = smb_shm_alloc( sizeof(share_mode_entry));
- if(new_entry_offset == NULL_OFFSET)
- {
- smb_shm_offset_t delete_offset = mode_array[hash_entry];
- DEBUG(0,("ERROR:set_share_mode (FAST_SHARE_MODES): smb_shm_alloc fail 1!\n"));
- /* Unlink the damaged record */
- mode_array[hash_entry] = file_scanner_p->next_offset;
- /* And delete it */
- smb_shm_free( delete_offset );
- return False;
- }
-
- new_entry_p = smb_shm_offset2addr(new_entry_offset);
-
- new_entry_p->pid = getpid();
- new_entry_p->share_mode = fs_p->share_mode;
- new_entry_p->op_port = port;
- new_entry_p->op_type = op_type;
- memcpy( (char *)&new_entry_p->time, (char *)&fs_p->open_time, sizeof(struct timeval));
-
- /* Chain onto the share_mode_record */
- new_entry_p->next_share_mode_entry = file_scanner_p->share_mode_entries;
- file_scanner_p->share_mode_entries = new_entry_offset;
-
- /* PARANOIA TEST */
- if(file_scanner_p->num_share_mode_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:set_share_mode (FAST_SHARE_MODES): num_share_mode_entries < 0 (%d) \
-for dev = %d, ino = %d, hashbucket %d\n", file_scanner_p->num_share_mode_entries,
- dev, inode, hash_entry));
- return False;
- }
-
- /* Increment the share_mode_entries counter */
- file_scanner_p->num_share_mode_entries += 1;
-
- DEBUG(3,("set_share_mode (FAST_SHARE_MODES): Created share entry for %s with mode \
-0x%X pid=%d (num_entries now = %d)\n",fs_p->name, fs_p->share_mode, new_entry_p->pid,
- file_scanner_p->num_share_mode_entries));
-
- return(True);
-}
-
-/*******************************************************************
-Remove an oplock port and mode entry from a share mode.
-********************************************************************/
-BOOL remove_share_oplock(int fnum, share_lock_token token)
-{
- uint32 dev, inode;
- smb_shm_offset_t *mode_array;
- unsigned int hash_entry;
- share_mode_record *file_scanner_p;
- share_mode_record *file_prev_p;
- share_mode_entry *entry_scanner_p;
- share_mode_entry *entry_prev_p;
- BOOL found = False;
- int pid = getpid();
-
- dev = Files[fnum].fd_ptr->dev;
- inode = Files[fnum].fd_ptr->inode;
-
- hash_entry = HASH_ENTRY(dev, inode);
-
- if(hash_entry > lp_shmem_hash_size() )
- {
- DEBUG(0,
- ("PANIC ERROR:remove_share_oplock (FAST_SHARE_MODES): hash_entry %d too large \
-(max = %d)\n",
- hash_entry, lp_shmem_hash_size() ));
- return False;
- }
-
- mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
-
- if(mode_array[hash_entry] == NULL_OFFSET)
- {
- DEBUG(0,("PANIC ERROR:remove_share_oplock (FAST_SHARE_MODES): hash bucket %d empty\n",
- hash_entry));
- return False;
- }
-
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[hash_entry]);
- file_prev_p = file_scanner_p;
-
- while(file_scanner_p)
- {
- if( (file_scanner_p->st_dev == dev) && (file_scanner_p->st_ino == inode) )
- {
- found = True;
- break;
- }
- else
- {
- file_prev_p = file_scanner_p ;
- file_scanner_p = (share_mode_record *)
- smb_shm_offset2addr(file_scanner_p->next_offset);
- }
- }
-
- if(!found)
- {
- DEBUG(0,("ERROR:remove_share_oplock (FAST_SHARE_MODES): no entry found for dev %d, \
-inode %d in hash bucket %d\n", dev, inode, hash_entry));
- return False;
- }
-
- if(file_scanner_p->locking_version != LOCKING_VERSION)
- {
- DEBUG(0,("ERROR: remove_share_oplock (FAST_SHARE_MODES): Deleting old share mode \
-record due to old locking version %d for file dev %d, inode %d hash bucket %d\n",
- file_scanner_p->locking_version, dev, inode, hash_entry ));
- if(file_prev_p == file_scanner_p)
- mode_array[hash_entry] = file_scanner_p->next_offset;
- else
- file_prev_p->next_offset = file_scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(file_scanner_p));
- return False;
- }
-
- found = False;
- entry_scanner_p = (share_mode_entry*)smb_shm_offset2addr(
- file_scanner_p->share_mode_entries);
- entry_prev_p = entry_scanner_p;
- while(entry_scanner_p)
- {
- if( (pid == entry_scanner_p->pid) &&
- (entry_scanner_p->share_mode == Files[fnum].share_mode) &&
- (memcmp(&entry_scanner_p->time,
- &Files[fnum].open_time,sizeof(struct timeval)) == 0) )
- {
- /* Delete the oplock info. */
- entry_scanner_p->op_port = 0;
- entry_scanner_p->op_type = 0;
- found = True;
- break;
- }
- else
- {
- entry_prev_p = entry_scanner_p;
- entry_scanner_p = (share_mode_entry *)
- smb_shm_offset2addr(entry_scanner_p->next_share_mode_entry);
- }
- }
-
- if(!found)
- {
- DEBUG(0,("ERROR: remove_share_oplock (FAST_SHARE_MODES): No oplock granted share \
-mode record found dev = %d, inode = %d in hash bucket %d\n", dev, inode, hash_entry));
- return False;
- }
-
- return True;
-}
-
-#else /* FAST_SHARE_MODES */
-
-/* SHARE MODE LOCKS USING SLOW DESCRIPTION FILES */
-
-/*******************************************************************
- name a share file
- ******************************************************************/
-static BOOL share_name(int cnum, uint32 dev, uint32 inode, char *name)
-{
- strcpy(name,lp_lockdir());
- standard_sub(cnum,name);
- trim_string(name,"","/");
- if (!*name) return(False);
- name += strlen(name);
-
- sprintf(name,"/share.%u.%u",dev,inode);
- return(True);
-}
-
-/*******************************************************************
- lock a share mode file.
- ******************************************************************/
-BOOL lock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token *ptok)
-{
- pstring fname;
- int fd;
-
- *ptok = (share_lock_token)-1;
-
- if(!share_name(cnum, dev, inode, fname))
- return False;
-
- {
- int old_umask;
- BOOL gotlock = False;
- unbecome_user();
- old_umask = umask(0);
-
- /*
- * There was a race condition in the original slow share mode code.
- * A smbd could open a share mode file, and before getting
- * the lock, another smbd could delete the last entry for
- * the share mode file and delete the file entry from the
- * directory. Thus this smbd would be left with a locked
- * share mode fd attached to a file that no longer had a
- * directory entry. Thus another smbd would think that
- * there were no outstanding opens on the file. To fix
- * this we now check we can do a stat() call on the filename
- * before allowing the lock to proceed, and back out completely
- * and try the open again if we cannot.
- * Jeremy Allison (jallison@whistle.com).
- */
-
- do
- {
- struct stat dummy_stat;
-
-#ifdef SECURE_SHARE_MODES
- fd = (share_lock_token)open(fname,O_RDWR|O_CREAT,0600);
-#else /* SECURE_SHARE_MODES */
- fd = (share_lock_token)open(fname,O_RDWR|O_CREAT,0666);
-#endif /* SECURE_SHARE_MODES */
-
- /* At this point we have an open fd to the share mode file.
- Lock the first byte exclusively to signify a lock. */
- if(fcntl_lock(fd, F_SETLKW, 0, 1, F_WRLCK) == False)
- {
- DEBUG(0,("ERROR lock_share_entry: fcntl_lock on file %s failed with %s\n",
- fname, strerror(errno)));
- close(fd);
- return False;
- }
-
- /*
- * If we cannot stat the filename, the file was deleted between
- * the open and the lock call. Back out and try again.
- */
-
- if(stat(fname, &dummy_stat)!=0)
- {
- DEBUG(2,("lock_share_entry: Re-issuing open on %s to fix race. Error was %s\n",
- fname, strerror(errno)));
- close(fd);
- }
- else
- gotlock = True;
- } while(!gotlock);
-
- umask(old_umask);
- if(!become_user(cnum,Connections[cnum].vuid))
- {
- DEBUG(0,("lock_share_entry: Can't become connected user!\n"));
- close(fd);
- return False;
- }
- /* We need to change directory back to the connection root. */
- if (ChDir(Connections[cnum].connectpath) != 0)
- {
- DEBUG(0,("lock_share_entry: Can't change directory to %s (%s)\n",
- Connections[cnum].connectpath, strerror(errno)));
- close(fd);
- return False;
- }
- }
-
- *ptok = (share_lock_token)fd;
- return True;
-}
-
-/*******************************************************************
- unlock a share mode file.
- ******************************************************************/
-BOOL unlock_share_entry(int cnum, uint32 dev, uint32 inode, share_lock_token token)
-{
- int fd = (int)token;
- int ret = True;
-
- /* token is the fd of the open share mode file. */
- /* Unlock the first byte. */
- if(fcntl_lock(fd, F_SETLKW, 0, 1, F_UNLCK) == False)
- {
- DEBUG(0,("ERROR unlock_share_entry: fcntl_lock failed with %s\n",
- strerror(errno)));
- ret = False;
- }
-
- close(fd);
- return ret;
-}
-
-/*******************************************************************
-Force a share file to be deleted.
-********************************************************************/
-
-static int delete_share_file( int cnum, char *fname )
-{
- unbecome_user();
- if(unlink(fname) != 0)
- {
- DEBUG(0,("delete_share_file: Can't delete share file %s (%s)\n",
- fname, strerror(errno)));
- }
-
- DEBUG(5,("delete_share_file: Deleted share file %s\n", fname));
-
- if(!become_user(cnum,Connections[cnum].vuid))
- {
- DEBUG(0,("delete_share_file: Can't become connected user!\n"));
- return -1;
- }
- /* We need to change directory back to the connection root. */
- if (ChDir(Connections[cnum].connectpath) != 0)
- {
- DEBUG(0,("delete_share_file: Can't change directory to %s (%s)\n",
- Connections[cnum].connectpath, strerror(errno)));
- return -1;
- }
- return 0;
-}
-
-/*******************************************************************
-Read a share file into a buffer.
-********************************************************************/
-
-static int read_share_file(int cnum, int fd, char *fname, char **out, BOOL *p_new_file)
-{
- struct stat sb;
- char *buf;
- int size;
-
- *out = 0;
- *p_new_file = False;
-
- if(fstat(fd, &sb) != 0)
- {
- DEBUG(0,("ERROR: read_share_file: Failed to do stat on share file %s (%s)\n",
- fname, strerror(errno)));
- return -1;
- }
-
- if(sb.st_size == 0)
- {
- *p_new_file = True;
- return 0;
- }
-
- /* Allocate space for the file */
- if((buf = (char *)malloc(sb.st_size)) == NULL)
- {
- DEBUG(0,("read_share_file: malloc for file size %d fail !\n", sb.st_size));
- return -1;
- }
-
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: read_share_file: Failed to reset position to 0 \
-for share file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return -1;
- }
-
- if (read(fd,buf,sb.st_size) != sb.st_size)
- {
- DEBUG(0,("ERROR: read_share_file: Failed to read share file %s (%s)\n",
- fname, strerror(errno)));
- if(buf)
- free(buf);
- return -1;
- }
-
- if (IVAL(buf,SMF_VERSION_OFFSET) != LOCKING_VERSION) {
- DEBUG(0,("ERROR: read_share_file: share file %s has incorrect \
-locking version (was %d, should be %d).\n",fname,
- IVAL(buf,SMF_VERSION_OFFSET), LOCKING_VERSION));
- if(buf)
- free(buf);
- delete_share_file(cnum, fname);
- return -1;
- }
-
- /* Sanity check for file contents */
- size = sb.st_size;
- size -= SMF_HEADER_LENGTH; /* Remove the header */
-
- /* Remove the filename component. */
- size -= SVAL(buf, SMF_FILENAME_LEN_OFFSET);
-
- /* The remaining size must be a multiple of SMF_ENTRY_LENGTH - error if not. */
- if((size % SMF_ENTRY_LENGTH) != 0)
- {
- DEBUG(0,("ERROR: read_share_file: share file %s is an incorrect length - \
-deleting it.\n", fname));
- if(buf)
- free(buf);
- delete_share_file(cnum, fname);
- return -1;
- }
-
- *out = buf;
- return 0;
-}
-
-/*******************************************************************
-get all share mode entries in a share file for a dev/inode pair.
-********************************************************************/
-int get_share_modes(int cnum, share_lock_token token, uint32 dev, uint32 inode,
- min_share_mode_entry **old_shares)
-{
- int fd = (int)token;
- pstring fname;
- int i;
- int num_entries;
- int num_entries_copied;
- int newsize;
- min_share_mode_entry *share_array;
- char *buf = 0;
- char *base = 0;
- BOOL new_file;
-
- *old_shares = 0;
-
- /* Read the share file header - this is of the form:
- 0 - locking version.
- 4 - number of share mode entries.
- 8 - 2 byte name length
- [n bytes] file name (zero terminated).
-
- Followed by <n> share mode entries of the form :
-
- 0 - tv_sec
- 4 - tv_usec
- 8 - share_mode
- 12 - pid
- 16 - oplock port (if oplocks in use) - 2 bytes.
- */
-
- share_name(cnum, dev, inode, fname);
-
- if(read_share_file( cnum, fd, fname, &buf, &new_file) != 0)
- {
- DEBUG(0,("ERROR: get_share_modes: Failed to read share file %s\n",
- fname));
- return 0;
- }
-
- if(new_file == True)
- return 0;
-
- num_entries = IVAL(buf,SMF_NUM_ENTRIES_OFFSET);
-
- DEBUG(5,("get_share_modes: share file %s has %d share mode entries.\n",
- fname, num_entries));
-
- /* PARANOIA TEST */
- if(num_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:get_share_mode: num_share_mode_entries < 0 (%d) \
-for share file %d\n", num_entries, fname));
- return 0;
- }
-
- if(num_entries)
- {
- *old_shares = share_array = (min_share_mode_entry *)
- malloc(num_entries * sizeof(min_share_mode_entry));
- if(*old_shares == 0)
- {
- DEBUG(0,("get_share_modes: malloc fail !\n"));
- return 0;
- }
- }
- else
- {
- /* No entries - just delete the file. */
- DEBUG(0,("get_share_modes: share file %s has no share mode entries - deleting.\n",
- fname));
- if(buf)
- free(buf);
- delete_share_file(cnum, fname);
- return 0;
- }
-
- num_entries_copied = 0;
- base = buf + SMF_HEADER_LENGTH + SVAL(buf,SMF_FILENAME_LEN_OFFSET);
-
- for( i = 0; i < num_entries; i++)
- {
- int pid;
- char *p = base + (i*SMF_ENTRY_LENGTH);
-
- pid = IVAL(p,SME_PID_OFFSET);
-
- if(!process_exists(pid))
- {
- DEBUG(0,("get_share_modes: process %d no longer exists and \
-it left a share mode entry with mode 0x%X in share file %s\n",
- pid, IVAL(p,SME_SHAREMODE_OFFSET), fname));
- continue;
- }
- share_array[num_entries_copied].time.tv_sec = IVAL(p,SME_SEC_OFFSET);
- share_array[num_entries_copied].time.tv_usec = IVAL(p,SME_USEC_OFFSET);
- share_array[num_entries_copied].share_mode = IVAL(p,SME_SHAREMODE_OFFSET);
- share_array[num_entries_copied].pid = pid;
- share_array[num_entries_copied].op_port = SVAL(p,SME_PORT_OFFSET);
- share_array[num_entries_copied].op_type = SVAL(p,SME_OPLOCK_TYPE_OFFSET);
-
- num_entries_copied++;
- }
-
- if(num_entries_copied == 0)
- {
- /* Delete the whole file. */
- DEBUG(0,("get_share_modes: share file %s had no valid entries - deleting it !\n",
- fname));
- if(*old_shares)
- free((char *)*old_shares);
- *old_shares = 0;
- if(buf)
- free(buf);
- delete_share_file(cnum, fname);
- return 0;
- }
-
- /* If we deleted some entries we need to re-write the whole number of
- share mode entries back into the file. */
-
- if(num_entries_copied != num_entries)
- {
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: get_share_modes: lseek failed to reset to \
-position 0 for share mode file %s (%s)\n", fname, strerror(errno)));
- if(*old_shares)
- free((char *)*old_shares);
- *old_shares = 0;
- if(buf)
- free(buf);
- return 0;
- }
-
- SIVAL(buf, SMF_NUM_ENTRIES_OFFSET, num_entries_copied);
- for( i = 0; i < num_entries_copied; i++)
- {
- char *p = base + (i*SMF_ENTRY_LENGTH);
-
- SIVAL(p,SME_PID_OFFSET,share_array[i].pid);
- SIVAL(p,SME_SHAREMODE_OFFSET,share_array[i].share_mode);
- SIVAL(p,SME_SEC_OFFSET,share_array[i].time.tv_sec);
- SIVAL(p,SME_USEC_OFFSET,share_array[i].time.tv_usec);
- SSVAL(p,SME_PORT_OFFSET,share_array[i].op_port);
- SSVAL(p,SME_OPLOCK_TYPE_OFFSET,share_array[i].op_type);
- }
-
- newsize = (base - buf) + (SMF_ENTRY_LENGTH*num_entries_copied);
- if(write(fd, buf, newsize) != newsize)
- {
- DEBUG(0,("ERROR: get_share_modes: failed to re-write share \
-mode file %s (%s)\n", fname, strerror(errno)));
- if(*old_shares)
- free((char *)*old_shares);
- *old_shares = 0;
- if(buf)
- free(buf);
- return 0;
- }
- /* Now truncate the file at this point. */
- if(ftruncate(fd, newsize)!= 0)
- {
- DEBUG(0,("ERROR: get_share_modes: failed to ftruncate share \
-mode file %s to size %d (%s)\n", fname, newsize, strerror(errno)));
- if(*old_shares)
- free((char *)*old_shares);
- *old_shares = 0;
- if(buf)
- free(buf);
- return 0;
- }
- }
-
- if(buf)
- free(buf);
-
- DEBUG(5,("get_share_modes: Read share file %s returning %d entries\n",fname,
- num_entries_copied));
-
- return num_entries_copied;
-}
-
-/*******************************************************************
-del a share mode from a share mode file.
-********************************************************************/
-void del_share_mode(share_lock_token token, int fnum)
-{
- pstring fname;
- int fd = (int)token;
- char *buf = 0;
- char *base = 0;
- int num_entries;
- int newsize;
- int i;
- files_struct *fs_p = &Files[fnum];
- int pid;
- BOOL deleted = False;
- BOOL new_file;
-
- share_name(fs_p->cnum, fs_p->fd_ptr->dev,
- fs_p->fd_ptr->inode, fname);
-
- if(read_share_file( fs_p->cnum, fd, fname, &buf, &new_file) != 0)
- {
- DEBUG(0,("ERROR: del_share_mode: Failed to read share file %s\n",
- fname));
- return;
- }
-
- if(new_file == True)
- {
- DEBUG(0,("ERROR:del_share_mode: share file %s is new (size zero), deleting it.\n",
- fname));
- delete_share_file(fs_p->cnum, fname);
- return;
- }
-
- num_entries = IVAL(buf,SMF_NUM_ENTRIES_OFFSET);
-
- DEBUG(5,("del_share_mode: share file %s has %d share mode entries.\n",
- fname, num_entries));
-
- /* PARANOIA TEST */
- if(num_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:del_share_mode: num_share_mode_entries < 0 (%d) \
-for share file %d\n", num_entries, fname));
- return;
- }
-
- if(num_entries == 0)
- {
- /* No entries - just delete the file. */
- DEBUG(0,("del_share_mode: share file %s has no share mode entries - deleting.\n",
- fname));
- if(buf)
- free(buf);
- delete_share_file(fs_p->cnum, fname);
- return;
- }
-
- pid = getpid();
-
- /* Go through the entries looking for the particular one
- we have set - delete it.
- */
-
- base = buf + SMF_HEADER_LENGTH + SVAL(buf,SMF_FILENAME_LEN_OFFSET);
-
- for(i = 0; i < num_entries; i++)
- {
- char *p = base + (i*SMF_ENTRY_LENGTH);
-
- if((IVAL(p,SME_SEC_OFFSET) != fs_p->open_time.tv_sec) ||
- (IVAL(p,SME_USEC_OFFSET) != fs_p->open_time.tv_usec) ||
- (IVAL(p,SME_SHAREMODE_OFFSET) != fs_p->share_mode) ||
- (IVAL(p,SME_PID_OFFSET) != pid))
- continue;
-
- DEBUG(5,("del_share_mode: deleting entry number %d (of %d) from the share file %s\n",
- i, num_entries, fname));
-
- /* Remove this entry. */
- if(i != num_entries - 1)
- memcpy(p, p + SMF_ENTRY_LENGTH, (num_entries - i - 1)*SMF_ENTRY_LENGTH);
-
- deleted = True;
- break;
- }
-
- if(!deleted)
- {
- DEBUG(0,("del_share_mode: entry not found in share file %s\n", fname));
- if(buf)
- free(buf);
- return;
- }
-
- num_entries--;
- SIVAL(buf,SMF_NUM_ENTRIES_OFFSET, num_entries);
-
- if(num_entries == 0)
- {
- /* Deleted the last entry - remove the file. */
- DEBUG(5,("del_share_mode: removed last entry in share file - deleting share file %s\n",
- fname));
- if(buf)
- free(buf);
- delete_share_file(fs_p->cnum,fname);
- return;
- }
-
- /* Re-write the file - and truncate it at the correct point. */
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: del_share_mode: lseek failed to reset to \
-position 0 for share mode file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return;
- }
-
- newsize = (base - buf) + (SMF_ENTRY_LENGTH*num_entries);
- if(write(fd, buf, newsize) != newsize)
- {
- DEBUG(0,("ERROR: del_share_mode: failed to re-write share \
-mode file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return;
- }
- /* Now truncate the file at this point. */
- if(ftruncate(fd, newsize) != 0)
- {
- DEBUG(0,("ERROR: del_share_mode: failed to ftruncate share \
-mode file %s to size %d (%s)\n", fname, newsize, strerror(errno)));
- if(buf)
- free(buf);
- return;
- }
-}
-
-/*******************************************************************
-set the share mode of a file
-********************************************************************/
-BOOL set_share_mode(share_lock_token token,int fnum, uint16 port, uint16 op_type)
-{
- files_struct *fs_p = &Files[fnum];
- pstring fname;
- int fd = (int)token;
- int pid = (int)getpid();
- struct stat sb;
- char *buf;
- int num_entries;
- int header_size;
- char *p;
-
- share_name(fs_p->cnum, fs_p->fd_ptr->dev,
- fs_p->fd_ptr->inode, fname);
-
- if(fstat(fd, &sb) != 0)
- {
- DEBUG(0,("ERROR: set_share_mode: Failed to do stat on share file %s\n",
- fname));
- return False;
- }
-
- /* Sanity check for file contents (if it's not a new share file). */
- if(sb.st_size != 0)
- {
- int size = sb.st_size;
-
- /* Allocate space for the file plus one extra entry */
- if((buf = (char *)malloc(sb.st_size + SMF_ENTRY_LENGTH)) == NULL)
- {
- DEBUG(0,("set_share_mode: malloc for file size %d fail !\n",
- sb.st_size + SMF_ENTRY_LENGTH));
- return False;
- }
-
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: set_share_mode: Failed to reset position \
-to 0 for share file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- if (read(fd,buf,sb.st_size) != sb.st_size)
- {
- DEBUG(0,("ERROR: set_share_mode: Failed to read share file %s (%s)\n",
- fname, strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- if (IVAL(buf,SMF_VERSION_OFFSET) != LOCKING_VERSION)
- {
- DEBUG(0,("ERROR: set_share_mode: share file %s has incorrect \
-locking version (was %d, should be %d).\n",fname, IVAL(buf,SMF_VERSION_OFFSET),
- LOCKING_VERSION));
- if(buf)
- free(buf);
- delete_share_file(fs_p->cnum, fname);
- return False;
- }
-
- size -= (SMF_HEADER_LENGTH + SVAL(buf, SMF_FILENAME_LEN_OFFSET)); /* Remove the header */
-
- /* The remaining size must be a multiple of SMF_ENTRY_LENGTH - error if not. */
- if((size % SMF_ENTRY_LENGTH) != 0)
- {
- DEBUG(0,("ERROR: set_share_mode: share file %s is an incorrect length - \
-deleting it.\n", fname));
- if(buf)
- free(buf);
- delete_share_file(fs_p->cnum, fname);
- return False;
- }
-
- }
- else
- {
- /* New file - just use a single_entry. */
- if((buf = (char *)malloc(SMF_HEADER_LENGTH +
- strlen(fs_p->name) + 1 + SMF_ENTRY_LENGTH)) == NULL)
- {
- DEBUG(0,("ERROR: set_share_mode: malloc failed for single entry.\n"));
- return False;
- }
- SIVAL(buf,SMF_VERSION_OFFSET,LOCKING_VERSION);
- SIVAL(buf,SMF_NUM_ENTRIES_OFFSET,0);
- SSVAL(buf,SMF_FILENAME_LEN_OFFSET,strlen(fs_p->name) + 1);
- strcpy(buf + SMF_HEADER_LENGTH, fs_p->name);
- }
-
- num_entries = IVAL(buf,SMF_NUM_ENTRIES_OFFSET);
- header_size = SMF_HEADER_LENGTH + SVAL(buf,SMF_FILENAME_LEN_OFFSET);
- p = buf + header_size + (num_entries * SMF_ENTRY_LENGTH);
- SIVAL(p,SME_SEC_OFFSET,fs_p->open_time.tv_sec);
- SIVAL(p,SME_USEC_OFFSET,fs_p->open_time.tv_usec);
- SIVAL(p,SME_SHAREMODE_OFFSET,fs_p->share_mode);
- SIVAL(p,SME_PID_OFFSET,pid);
- SSVAL(p,SME_PORT_OFFSET,port);
- SSVAL(p,SME_OPLOCK_TYPE_OFFSET,op_type);
-
- num_entries++;
-
- SIVAL(buf,SMF_NUM_ENTRIES_OFFSET,num_entries);
-
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: set_share_mode: (1) Failed to reset position to \
-0 for share file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- if (write(fd,buf,header_size + (num_entries*SMF_ENTRY_LENGTH)) !=
- (header_size + (num_entries*SMF_ENTRY_LENGTH)))
- {
- DEBUG(2,("ERROR: set_share_mode: Failed to write share file %s - \
-deleting it (%s).\n",fname, strerror(errno)));
- delete_share_file(fs_p->cnum, fname);
- if(buf)
- free(buf);
- return False;
- }
-
- /* Now truncate the file at this point - just for safety. */
- if(ftruncate(fd, header_size + (SMF_ENTRY_LENGTH*num_entries))!= 0)
- {
- DEBUG(0,("ERROR: set_share_mode: failed to ftruncate share \
-mode file %s to size %d (%s)\n", fname, header_size + (SMF_ENTRY_LENGTH*num_entries),
- strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- if(buf)
- free(buf);
-
- DEBUG(3,("set_share_mode: Created share file %s with \
-mode 0x%X pid=%d\n",fname,fs_p->share_mode,pid));
-
- return True;
-}
-
-/*******************************************************************
-Remove an oplock port and mode entry from a share mode.
-********************************************************************/
-BOOL remove_share_oplock(int fnum, share_lock_token token)
-{
- pstring fname;
- int fd = (int)token;
- char *buf = 0;
- char *base = 0;
- int num_entries;
- int fsize;
- int i;
- files_struct *fs_p = &Files[fnum];
- int pid;
- BOOL found = False;
- BOOL new_file;
-
- share_name(fs_p->cnum, fs_p->fd_ptr->dev,
- fs_p->fd_ptr->inode, fname);
-
- if(read_share_file( fs_p->cnum, fd, fname, &buf, &new_file) != 0)
- {
- DEBUG(0,("ERROR: remove_share_oplock: Failed to read share file %s\n",
- fname));
- return False;
- }
-
- if(new_file == True)
- {
- DEBUG(0,("ERROR: remove_share_oplock: share file %s is new (size zero), \
-deleting it.\n", fname));
- delete_share_file(fs_p->cnum, fname);
- return False;
- }
-
- num_entries = IVAL(buf,SMF_NUM_ENTRIES_OFFSET);
-
- DEBUG(5,("remove_share_oplock: share file %s has %d share mode entries.\n",
- fname, num_entries));
-
- /* PARANOIA TEST */
- if(num_entries < 0)
- {
- DEBUG(0,("PANIC ERROR:remove_share_oplock: num_share_mode_entries < 0 (%d) \
-for share file %d\n", num_entries, fname));
- return False;
- }
-
- if(num_entries == 0)
- {
- /* No entries - just delete the file. */
- DEBUG(0,("remove_share_oplock: share file %s has no share mode entries - deleting.\n",
- fname));
- if(buf)
- free(buf);
- delete_share_file(fs_p->cnum, fname);
- return False;
- }
-
- pid = getpid();
-
- /* Go through the entries looking for the particular one
- we have set - remove the oplock settings on it.
- */
-
- base = buf + SMF_HEADER_LENGTH + SVAL(buf,SMF_FILENAME_LEN_OFFSET);
-
- for(i = 0; i < num_entries; i++)
- {
- char *p = base + (i*SMF_ENTRY_LENGTH);
-
- if((IVAL(p,SME_SEC_OFFSET) != fs_p->open_time.tv_sec) ||
- (IVAL(p,SME_USEC_OFFSET) != fs_p->open_time.tv_usec) ||
- (IVAL(p,SME_SHAREMODE_OFFSET) != fs_p->share_mode) ||
- (IVAL(p,SME_PID_OFFSET) != pid))
- continue;
-
- DEBUG(5,("remove_share_oplock: clearing oplock on entry number %d (of %d) \
-from the share file %s\n", i, num_entries, fname));
-
- SSVAL(p,SME_PORT_OFFSET,0);
- SSVAL(p,SME_OPLOCK_TYPE_OFFSET,0);
- found = True;
- break;
- }
-
- if(!found)
- {
- DEBUG(0,("remove_share_oplock: entry not found in share file %s\n", fname));
- if(buf)
- free(buf);
- return False;
- }
-
- /* Re-write the file - and truncate it at the correct point. */
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- DEBUG(0,("ERROR: remove_share_oplock: lseek failed to reset to \
-position 0 for share mode file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- fsize = (base - buf) + (SMF_ENTRY_LENGTH*num_entries);
- if(write(fd, buf, fsize) != fsize)
- {
- DEBUG(0,("ERROR: remove_share_oplock: failed to re-write share \
-mode file %s (%s)\n", fname, strerror(errno)));
- if(buf)
- free(buf);
- return False;
- }
-
- return True;
-
-}
-#endif /* FAST_SHARE_MODES */
diff --git a/source/locking/shmem.c b/source/locking/shmem.c
deleted file mode 100644
index bbb11f215a0..00000000000
--- a/source/locking/shmem.c
+++ /dev/null
@@ -1,844 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Shared memory functions
- Copyright (C) Erik Devriendt 1996-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "includes.h"
-
-
-#ifdef FAST_SHARE_MODES
-
-
-extern int DEBUGLEVEL;
-
-
-#define SMB_SHM_MAGIC 0x53484100
-/* = "SHM" in hex */
-
-#define SMB_SHM_VERSION 2
-
-/* WARNING : offsets are used because mmap() does not guarantee that all processes have the
- shared memory mapped to the same address */
-
-struct SmbShmHeader
-{
- int smb_shm_magic;
- int smb_shm_version;
- int total_size; /* in bytes */
- BOOL consistent;
- smb_shm_offset_t first_free_off;
- smb_shm_offset_t userdef_off; /* a userdefined offset. can be used to store root of tree or list */
- struct { /* a cell is a range of bytes of sizeof(struct SmbShmBlockDesc) size */
- int cells_free;
- int cells_used;
- int cells_system; /* number of cells used as allocated block descriptors */
- } statistics;
-};
-
-#define SMB_SHM_NOT_FREE_OFF (-1)
-struct SmbShmBlockDesc
-{
- smb_shm_offset_t next; /* offset of next block in the free list or SMB_SHM_NOT_FREE_OFF when block in use */
- int size; /* user size in BlockDescSize units */
-};
-
-#define EOList_Addr (struct SmbShmBlockDesc *)( 0 )
-#define EOList_Off (NULL_OFFSET)
-
-#define CellSize sizeof(struct SmbShmBlockDesc)
-
-/* HeaderSize aligned on 8 byte boundary */
-#define AlignedHeaderSize ((sizeof(struct SmbShmHeader)+7) & ~7)
-
-static int smb_shm_fd = -1;
-static pstring smb_shm_processreg_name = "";
-
-static struct SmbShmHeader *smb_shm_header_p = (struct SmbShmHeader *)0;
-static int smb_shm_times_locked = 0;
-
-static BOOL smb_shm_initialize_called = False;
-
-static BOOL smb_shm_global_lock(void)
-{
- if (smb_shm_fd < 0)
- {
- DEBUG(0,("ERROR smb_shm_global_lock : bad smb_shm_fd (%d)\n",smb_shm_fd));
- return False;
- }
-
- smb_shm_times_locked++;
-
- if(smb_shm_times_locked > 1)
- {
- DEBUG(5,("smb_shm_global_lock : locked %d times\n",smb_shm_times_locked));
- return True;
- }
-
- /* Do an exclusive wait lock on the first byte of the file */
- if (fcntl_lock(smb_shm_fd, F_SETLKW, 0, 1, F_WRLCK) == False)
- {
- DEBUG(0,("ERROR smb_shm_global_lock : fcntl_lock failed with code %s\n",strerror(errno)));
- smb_shm_times_locked--;
- return False;
- }
-
- return True;
-
-}
-
-static BOOL smb_shm_global_unlock(void)
-{
- if (smb_shm_fd < 0)
- {
- DEBUG(0,("ERROR smb_shm_global_unlock : bad smb_shm_fd (%d)\n",smb_shm_fd));
- return False;
- }
-
- if(smb_shm_times_locked == 0)
- {
- DEBUG(0,("ERROR smb_shm_global_unlock : shmem not locked\n",smb_shm_fd));
- return False;
- }
-
- smb_shm_times_locked--;
-
- if(smb_shm_times_locked > 0)
- {
- DEBUG(5,("smb_shm_global_unlock : still locked %d times\n",smb_shm_times_locked));
- return True;
- }
-
- /* Do a wait unlock on the first byte of the file */
- if (fcntl_lock(smb_shm_fd, F_SETLKW, 0, 1, F_UNLCK) == False)
- {
- DEBUG(0,("ERROR smb_shm_global_unlock : fcntl_lock failed with code %s\n",strerror(errno)));
- smb_shm_times_locked++;
- return False;
- }
-
- return True;
-
-}
-
-/*
- * Function to create the hash table for the share mode entries. Called
- * when smb shared memory is global locked.
- */
-
-BOOL smb_shm_create_hash_table( unsigned int size )
-{
- size *= sizeof(smb_shm_offset_t);
-
- smb_shm_global_lock();
- smb_shm_header_p->userdef_off = smb_shm_alloc( size );
-
- if(smb_shm_header_p->userdef_off == NULL_OFFSET)
- {
- DEBUG(0,("smb_shm_create_hash_table: Failed to create hash table of size %d\n",size));
- smb_shm_global_unlock();
- return False;
- }
-
- /* Clear hash buckets. */
- memset( smb_shm_offset2addr(smb_shm_header_p->userdef_off), '\0', size);
- smb_shm_global_unlock();
- return True;
-}
-
-static BOOL smb_shm_register_process(char *processreg_file, pid_t pid, BOOL *other_processes)
-{
- int smb_shm_processes_fd = -1;
- int nb_read;
- pid_t other_pid;
- int seek_back = -((int)sizeof(other_pid));
- int free_slot = -1;
- int erased_slot;
-
-#ifndef SECURE_SHARE_MODES
- smb_shm_processes_fd = open(processreg_file, O_RDWR | O_CREAT, 0666);
-#else /* SECURE_SHARE_MODES */
- smb_shm_processes_fd = open(processreg_file, O_RDWR | O_CREAT, 0600);
-#endif /* SECURE_SHARE_MODES */
- if ( smb_shm_processes_fd < 0 )
- {
- DEBUG(0,("ERROR smb_shm_register_process : processreg_file open failed with code %s\n",strerror(errno)));
- return False;
- }
-
- *other_processes = False;
-
- while ((nb_read = read(smb_shm_processes_fd, &other_pid, sizeof(other_pid))) > 0)
- {
- if(other_pid)
- {
- if(process_exists(other_pid))
- *other_processes = True;
- else
- {
- /* erase old pid */
- DEBUG(5,("smb_shm_register_process : erasing stale record for pid %d (seek_back = %d)\n",
- other_pid, seek_back));
- other_pid = (pid_t)0;
- erased_slot = lseek(smb_shm_processes_fd, seek_back, SEEK_CUR);
- write(smb_shm_processes_fd, &other_pid, sizeof(other_pid));
- if(free_slot < 0)
- free_slot = erased_slot;
- }
- }
- else
- if(free_slot < 0)
- free_slot = lseek(smb_shm_processes_fd, seek_back, SEEK_CUR);
- }
- if (nb_read < 0)
- {
- DEBUG(0,("ERROR smb_shm_register_process : processreg_file read failed with code %s\n",strerror(errno)));
- close(smb_shm_processes_fd);
- return False;
- }
-
- if(free_slot < 0)
- free_slot = lseek(smb_shm_processes_fd, 0, SEEK_END);
-
- DEBUG(5,("smb_shm_register_process : writing record for pid %d at offset %d\n",pid,free_slot));
- lseek(smb_shm_processes_fd, free_slot, SEEK_SET);
- if(write(smb_shm_processes_fd, &pid, sizeof(pid)) < 0)
- {
- DEBUG(0,("ERROR smb_shm_register_process : processreg_file write failed with code %s\n",strerror(errno)));
- close(smb_shm_processes_fd);
- return False;
- }
-
- close(smb_shm_processes_fd);
-
- return True;
-}
-
-static BOOL smb_shm_unregister_process(char *processreg_file, pid_t pid)
-{
- int old_umask;
- int smb_shm_processes_fd = -1;
- int nb_read;
- pid_t other_pid;
- int seek_back = -((int)sizeof(other_pid));
- int erased_slot;
- BOOL found = False;
-
-
- old_umask = umask(0);
- smb_shm_processes_fd = open(processreg_file, O_RDWR);
- umask(old_umask);
- if ( smb_shm_processes_fd < 0 )
- {
- DEBUG(0,("ERROR smb_shm_unregister_process : processreg_file open failed with code %s\n",strerror(errno)));
- return False;
- }
-
- while ((nb_read = read(smb_shm_processes_fd, &other_pid, sizeof(other_pid))) > 0)
- {
- DEBUG(5,("smb_shm_unregister_process : read record for pid %d\n",other_pid));
- if(other_pid == pid)
- {
- /* erase pid */
- DEBUG(5,("smb_shm_unregister_process : erasing record for pid %d (seek_val = %d)\n",
- other_pid, seek_back));
- other_pid = (pid_t)0;
- erased_slot = lseek(smb_shm_processes_fd, seek_back, SEEK_CUR);
- if(write(smb_shm_processes_fd, &other_pid, sizeof(other_pid)) < 0)
- {
- DEBUG(0,("ERROR smb_shm_unregister_process : processreg_file write failed with code %s\n",strerror(errno)));
- close(smb_shm_processes_fd);
- return False;
- }
-
- found = True;
- break;
- }
- }
- if (nb_read < 0)
- {
- DEBUG(0,("ERROR smb_shm_unregister_process : processreg_file read failed with code %s\n",strerror(errno)));
- close(smb_shm_processes_fd);
- return False;
- }
-
- if(!found)
- {
- DEBUG(0,("ERROR smb_shm_unregister_process : couldn't find pid %d in file %s\n",pid,processreg_file));
- close(smb_shm_processes_fd);
- return False;
- }
-
-
- close(smb_shm_processes_fd);
-
- return True;
-}
-
-
-static BOOL smb_shm_validate_header(int size)
-{
- if( !smb_shm_header_p )
- {
- /* not mapped yet */
- DEBUG(0,("ERROR smb_shm_validate_header : shmem not mapped\n"));
- return False;
- }
-
- if(smb_shm_header_p->smb_shm_magic != SMB_SHM_MAGIC)
- {
- DEBUG(0,("ERROR smb_shm_validate_header : bad magic\n"));
- return False;
- }
- if(smb_shm_header_p->smb_shm_version != SMB_SHM_VERSION)
- {
- DEBUG(0,("ERROR smb_shm_validate_header : bad version %X\n",smb_shm_header_p->smb_shm_version));
- return False;
- }
-
- if(smb_shm_header_p->total_size != size)
- {
- DEBUG(0,("ERROR smb_shm_validate_header : shmem size mismatch (old = %d, new = %d)\n",smb_shm_header_p->total_size,size));
- return False;
- }
-
- if(!smb_shm_header_p->consistent)
- {
- DEBUG(0,("ERROR smb_shm_validate_header : shmem not consistent\n"));
- return False;
- }
- return True;
-}
-
-static BOOL smb_shm_initialize(int size)
-{
- struct SmbShmBlockDesc * first_free_block_p;
-
- DEBUG(5,("smb_shm_initialize : initializing shmem file of size %d\n",size));
-
- if( !smb_shm_header_p )
- {
- /* not mapped yet */
- DEBUG(0,("ERROR smb_shm_initialize : shmem not mapped\n"));
- return False;
- }
-
- smb_shm_header_p->smb_shm_magic = SMB_SHM_MAGIC;
- smb_shm_header_p->smb_shm_version = SMB_SHM_VERSION;
- smb_shm_header_p->total_size = size;
- smb_shm_header_p->first_free_off = AlignedHeaderSize;
- smb_shm_header_p->userdef_off = NULL_OFFSET;
-
- first_free_block_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(smb_shm_header_p->first_free_off);
- first_free_block_p->next = EOList_Off;
- first_free_block_p->size = ( size - AlignedHeaderSize - CellSize ) / CellSize ;
-
- smb_shm_header_p->statistics.cells_free = first_free_block_p->size;
- smb_shm_header_p->statistics.cells_used = 0;
- smb_shm_header_p->statistics.cells_system = 1;
-
- smb_shm_header_p->consistent = True;
-
- smb_shm_initialize_called = True;
-
- return True;
-}
-
-static void smb_shm_solve_neighbors(struct SmbShmBlockDesc *head_p )
-{
- struct SmbShmBlockDesc *next_p;
-
- /* Check if head_p and head_p->next are neighbors and if so join them */
- if ( head_p == EOList_Addr ) return ;
- if ( head_p->next == EOList_Off ) return ;
-
- next_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(head_p->next);
- if ( ( head_p + head_p->size + 1 ) == next_p)
- {
- head_p->size += next_p->size +1 ; /* adapt size */
- head_p->next = next_p->next ; /* link out */
-
- smb_shm_header_p->statistics.cells_free += 1;
- smb_shm_header_p->statistics.cells_system -= 1;
- }
-}
-
-
-
-BOOL smb_shm_open( char *file_name, int size)
-{
- int filesize;
- BOOL created_new = False;
- BOOL other_processes = True;
- int old_umask;
-
- DEBUG(5,("smb_shm_open : using shmem file %s to be of size %d\n",file_name,size));
-
- old_umask = umask(0);
-#ifndef SECURE_SHARE_MODES
- smb_shm_fd = open(file_name, O_RDWR | O_CREAT, 0666);
-#else /* SECURE_SHARE_MODES */
- smb_shm_fd = open(file_name, O_RDWR | O_CREAT, 0600);
-#endif /* SECURE_SHARE_MODE */
- umask(old_umask);
- if ( smb_shm_fd < 0 )
- {
- DEBUG(0,("ERROR smb_shm_open : open failed with code %s\n",strerror(errno)));
- return False;
- }
-
- if (!smb_shm_global_lock())
- {
- DEBUG(0,("ERROR smb_shm_open : can't do smb_shm_global_lock\n"));
- return False;
- }
-
- if( (filesize = lseek(smb_shm_fd, 0, SEEK_END)) < 0)
- {
- DEBUG(0,("ERROR smb_shm_open : lseek failed with code %s\n",strerror(errno)));
- smb_shm_global_unlock();
- close(smb_shm_fd);
- return False;
- }
-
- /* return the file offset to 0 to save on later seeks */
- lseek(smb_shm_fd,0,SEEK_SET);
-
- if (filesize == 0)
- {
- /* we just created a new one */
- created_new = True;
- }
-
- /* to find out if some other process is already mapping the file,
- we use a registration file containing the processids of the file mapping processes
- */
-
- /* construct processreg file name */
- strcpy(smb_shm_processreg_name, file_name);
- strcat(smb_shm_processreg_name, ".processes");
-
- if (! smb_shm_register_process(smb_shm_processreg_name, getpid(), &other_processes))
- {
- smb_shm_global_unlock();
- close(smb_shm_fd);
- return False;
- }
-
- if (created_new || !other_processes)
- {
- /* we just created a new one, or are the first opener, lets set it size */
- if( ftruncate(smb_shm_fd, size) <0)
- {
- DEBUG(0,("ERROR smb_shm_open : ftruncate failed with code %s\n",strerror(errno)));
- smb_shm_unregister_process(smb_shm_processreg_name, getpid());
- smb_shm_global_unlock();
- close(smb_shm_fd);
- return False;
- }
-
- /* paranoia */
- lseek(smb_shm_fd,0,SEEK_SET);
-
- filesize = size;
- }
-
- if (size != filesize )
- {
- /* the existing file has a different size and we are not the first opener.
- Since another process is still using it, we will use the file size */
- DEBUG(0,("WARNING smb_shm_open : filesize (%d) != expected size (%d), using filesize\n",filesize,size));
- size = filesize;
- }
-
- smb_shm_header_p = (struct SmbShmHeader *)mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, smb_shm_fd, 0);
- /* WARNING, smb_shm_header_p can be different for different processes mapping the same file ! */
- if (smb_shm_header_p == (struct SmbShmHeader *)(-1))
- {
- DEBUG(0,("ERROR smb_shm_open : mmap failed with code %s\n",strerror(errno)));
- smb_shm_unregister_process(smb_shm_processreg_name, getpid());
- smb_shm_global_unlock();
- close(smb_shm_fd);
- return False;
- }
-
-
- if (created_new || !other_processes)
- {
- smb_shm_initialize(size);
- /* Create the hash buckets for the share file entries. */
- smb_shm_create_hash_table( lp_shmem_hash_size() );
- }
- else if (!smb_shm_validate_header(size) )
- {
- /* existing file is corrupt, samba admin should remove it by hand */
- DEBUG(0,("ERROR smb_shm_open : corrupt shared mem file, remove it manually\n"));
- munmap((caddr_t)smb_shm_header_p, size);
- smb_shm_unregister_process(smb_shm_processreg_name, getpid());
- smb_shm_global_unlock();
- close(smb_shm_fd);
- return False;
- }
-
- smb_shm_global_unlock();
- return True;
-
-}
-
-
-BOOL smb_shm_close( void )
-{
-
- if(smb_shm_initialize_called == False)
- return True;
-
- DEBUG(5,("smb_shm_close\n"));
- if(smb_shm_times_locked > 0)
- DEBUG(0,("WARNING smb_shm_close : shmem was still locked %d times\n",smb_shm_times_locked));;
- if ((smb_shm_header_p != NULL) &&
- (munmap((caddr_t)smb_shm_header_p, smb_shm_header_p->total_size) < 0))
- {
- DEBUG(0,("ERROR smb_shm_close : munmap failed with code %s\n",strerror(errno)));
- }
-
- smb_shm_global_lock();
- DEBUG(5,("calling smb_shm_unregister_process(%s, %d)\n", smb_shm_processreg_name, getpid()));
- smb_shm_unregister_process(smb_shm_processreg_name, getpid());
- smb_shm_global_unlock();
-
- close(smb_shm_fd);
-
- smb_shm_fd = -1;
- smb_shm_processreg_name[0] = '\0';
-
- smb_shm_header_p = (struct SmbShmHeader *)0;
- smb_shm_times_locked = 0;
-
- return True;
-}
-
-smb_shm_offset_t smb_shm_alloc(int size)
-{
- unsigned num_cells ;
- struct SmbShmBlockDesc *scanner_p;
- struct SmbShmBlockDesc *prev_p;
- struct SmbShmBlockDesc *new_p;
- smb_shm_offset_t result_offset;
-
-
- if( !smb_shm_header_p )
- {
- /* not mapped yet */
- DEBUG(0,("ERROR smb_shm_alloc : shmem not mapped\n"));
- return NULL_OFFSET;
- }
-
- smb_shm_global_lock();
-
- if( !smb_shm_header_p->consistent)
- {
- DEBUG(0,("ERROR smb_shm_alloc : shmem not consistent\n"));
- smb_shm_global_unlock();
- return NULL_OFFSET;
- }
-
-
- /* calculate the number of cells */
- num_cells = (size + CellSize -1) / CellSize;
-
- /* set start of scan */
- prev_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(smb_shm_header_p->first_free_off);
- scanner_p = prev_p ;
-
- /* scan the free list to find a matching free space */
- while ( ( scanner_p != EOList_Addr ) && ( scanner_p->size < num_cells ) )
- {
- prev_p = scanner_p;
- scanner_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(scanner_p->next);
- }
-
- /* at this point scanner point to a block header or to the end of the list */
- if ( scanner_p == EOList_Addr )
- {
- DEBUG(0,("ERROR smb_shm_alloc : alloc of %d bytes failed, no free space found\n",size));
- smb_shm_global_unlock();
- return (NULL_OFFSET);
- }
-
- /* going to modify shared mem */
- smb_shm_header_p->consistent = False;
-
- /* if we found a good one : scanner == the good one */
- if ( scanner_p->size <= num_cells + 2 )
- {
- /* there is no use in making a new one, it will be too small anyway
- * we will link out scanner
- */
- if ( prev_p == scanner_p )
- {
- smb_shm_header_p->first_free_off = scanner_p->next ;
- }
- else
- {
- prev_p->next = scanner_p->next ;
- }
- smb_shm_header_p->statistics.cells_free -= scanner_p->size;
- smb_shm_header_p->statistics.cells_used += scanner_p->size;
- }
- else
- {
- /* Make a new one */
- new_p = scanner_p + 1 + num_cells;
- new_p->size = scanner_p->size - num_cells - 1;
- new_p->next = scanner_p->next;
- scanner_p->size = num_cells;
- scanner_p->next = smb_shm_addr2offset(new_p);
-
- if ( prev_p != scanner_p )
- {
- prev_p->next = smb_shm_addr2offset(new_p) ;
- }
- else
- {
- smb_shm_header_p->first_free_off = smb_shm_addr2offset(new_p) ;
- }
- smb_shm_header_p->statistics.cells_free -= num_cells+1;
- smb_shm_header_p->statistics.cells_used += num_cells;
- smb_shm_header_p->statistics.cells_system += 1;
- }
-
- result_offset = smb_shm_addr2offset( &(scanner_p[1]) );
- scanner_p->next = SMB_SHM_NOT_FREE_OFF ;
-
- /* end modification of shared mem */
- smb_shm_header_p->consistent = True;
-
- DEBUG(6,("smb_shm_alloc : request for %d bytes, allocated %d bytes at offset %d\n",size,scanner_p->size*CellSize,result_offset ));
-
- smb_shm_global_unlock();
- return ( result_offset );
-}
-
-
-
-BOOL smb_shm_free(smb_shm_offset_t offset)
-{
- struct SmbShmBlockDesc *header_p ; /* pointer to header of block to free */
- struct SmbShmBlockDesc *scanner_p ; /* used to scan the list */
- struct SmbShmBlockDesc *prev_p ; /* holds previous in the list */
-
- if( !smb_shm_header_p )
- {
- /* not mapped yet */
- DEBUG(0,("ERROR smb_shm_free : shmem not mapped\n"));
- return False;
- }
-
- smb_shm_global_lock();
-
- if( !smb_shm_header_p->consistent)
- {
- DEBUG(0,("ERROR smb_shm_free : shmem not consistent\n"));
- smb_shm_global_unlock();
- return False;
- }
-
- header_p = ( (struct SmbShmBlockDesc *)smb_shm_offset2addr(offset) - 1); /* make pointer to header of block */
-
- if (header_p->next != SMB_SHM_NOT_FREE_OFF)
- {
- DEBUG(0,("ERROR smb_shm_free : bad offset (%d)\n",offset));
- smb_shm_global_unlock();
- return False;
- }
-
- /* find a place in the free_list to put the header in */
-
- /* set scanner and previous pointer to start of list */
- prev_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(smb_shm_header_p->first_free_off);
- scanner_p = prev_p ;
-
- while ( ( scanner_p != EOList_Addr) && (scanner_p < header_p) ) /* while we didn't scan past its position */
- {
- prev_p = scanner_p ;
- scanner_p = (struct SmbShmBlockDesc *)smb_shm_offset2addr(scanner_p->next);
- }
-
- smb_shm_header_p->consistent = False;
-
- DEBUG(6,("smb_shm_free : freeing %d bytes at offset %d\n",header_p->size*CellSize,offset));
-
- if ( scanner_p == prev_p )
- {
- smb_shm_header_p->statistics.cells_free += header_p->size;
- smb_shm_header_p->statistics.cells_used -= header_p->size;
-
- /* we must free it at the beginning of the list */
- smb_shm_header_p->first_free_off = smb_shm_addr2offset(header_p); /* set the free_list_pointer to this block_header */
-
- /* scanner is the one that was first in the list */
- header_p->next = smb_shm_addr2offset(scanner_p);
- smb_shm_solve_neighbors( header_p ); /* if neighbors then link them */
-
- smb_shm_header_p->consistent = True;
- smb_shm_global_unlock();
- return True;
- }
- else
- {
- smb_shm_header_p->statistics.cells_free += header_p->size;
- smb_shm_header_p->statistics.cells_used -= header_p->size;
-
- prev_p->next = smb_shm_addr2offset(header_p);
- header_p->next = smb_shm_addr2offset(scanner_p);
- smb_shm_solve_neighbors(header_p) ;
- smb_shm_solve_neighbors(prev_p) ;
-
- smb_shm_header_p->consistent = True;
- smb_shm_global_unlock();
- return True;
- }
-}
-
-smb_shm_offset_t smb_shm_get_userdef_off(void)
-{
- if (!smb_shm_header_p)
- return NULL_OFFSET;
- else
- return smb_shm_header_p->userdef_off;
-}
-
-BOOL smb_shm_set_userdef_off(smb_shm_offset_t userdef_off)
-{
- if (!smb_shm_header_p)
- return False;
- else
- smb_shm_header_p->userdef_off = userdef_off;
- return True;
-}
-
-void *smb_shm_offset2addr(smb_shm_offset_t offset)
-{
- if (offset == NULL_OFFSET )
- return (void *)(0);
-
- if (!smb_shm_header_p)
- return (void *)(0);
-
- return (void *)((char *)smb_shm_header_p + offset );
-}
-
-smb_shm_offset_t smb_shm_addr2offset(void *addr)
-{
- if (!addr)
- return NULL_OFFSET;
-
- if (!smb_shm_header_p)
- return NULL_OFFSET;
-
- return (smb_shm_offset_t)((char *)addr - (char *)smb_shm_header_p);
-}
-
-/*******************************************************************
- Lock a particular hash bucket entry.
- ******************************************************************/
-
-BOOL smb_shm_lock_hash_entry( unsigned int entry)
-{
- int start = (smb_shm_header_p->userdef_off + (entry * sizeof(smb_shm_offset_t)));
-
- if (smb_shm_fd < 0)
- {
- DEBUG(0,("ERROR smb_shm_lock_hash_entry : bad smb_shm_fd (%d)\n",smb_shm_fd));
- return False;
- }
-
- if(entry >= lp_shmem_hash_size())
- {
- DEBUG(0,("ERROR smb_shm_lock_hash_entry : hash entry size too big (%d)\n", entry));
- return False;
- }
-
- /* Do an exclusive wait lock on the 4 byte region mapping into this entry */
- if (fcntl_lock(smb_shm_fd, F_SETLKW, start, sizeof(smb_shm_offset_t), F_WRLCK) == False)
- {
- DEBUG(0,("ERROR smb_shm_lock_hash_entry : fcntl_lock failed with code %s\n",strerror(errno)));
- return False;
- }
-
- DEBUG(9,("smb_shm_lock_hash_entry: locked hash bucket %d\n", entry));
- return True;
-}
-
-/*******************************************************************
- Unlock a particular hash bucket entry.
- ******************************************************************/
-
-BOOL smb_shm_unlock_hash_entry( unsigned int entry )
-{
- int start = (smb_shm_header_p->userdef_off + (entry * sizeof(smb_shm_offset_t)));
-
- if (smb_shm_fd < 0)
- {
- DEBUG(0,("ERROR smb_shm_unlock_hash_entry : bad smb_shm_fd (%d)\n",smb_shm_fd));
- return False;
- }
-
- if(entry >= lp_shmem_hash_size())
- {
- DEBUG(0,("ERROR smb_shm_unlock_hash_entry : hash entry size too big (%d)\n", entry));
- return False;
- }
-
- /* Do a wait lock on the 4 byte region mapping into this entry */
- if (fcntl_lock(smb_shm_fd, F_SETLKW, start, sizeof(smb_shm_offset_t), F_UNLCK) == False)
- {
- DEBUG(0,("ERROR smb_shm_unlock_hash_entry : fcntl_lock failed with code %s\n",strerror(errno)));
- return False;
- }
-
- DEBUG(9,("smb_shm_unlock_hash_entry: unlocked hash bucket %d\n", entry));
- return True;
-}
-
-/*******************************************************************
- Gather statistics on shared memory usage.
- ******************************************************************/
-
-BOOL smb_shm_get_usage(int *bytes_free,
- int *bytes_used,
- int *bytes_overhead)
-{
- if( !smb_shm_header_p )
- {
- /* not mapped yet */
- DEBUG(0,("ERROR smb_shm_free : shmem not mapped\n"));
- return False;
- }
- *bytes_free = smb_shm_header_p->statistics.cells_free * CellSize;
- *bytes_used = smb_shm_header_p->statistics.cells_used * CellSize;
- *bytes_overhead = smb_shm_header_p->statistics.cells_system * CellSize + AlignedHeaderSize;
-
- return True;
-}
-
-#else /* FAST_SHARE_MODES */
- int shmem_dummy_procedure(void)
-{return 0;}
-#endif /* FAST_SHARE_MODES */
diff --git a/source/lsaparse.c b/source/lsaparse.c
deleted file mode 100644
index 9ea6f566b23..00000000000
--- a/source/lsaparse.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Samba utility functions
- Copyright (C) Luke Leighton 1996 - 1997 Paul Ashton 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-
-/*******************************************************************
-reads or writes an LSA_R_OPEN_POL structure.
-********************************************************************/
-char* lsa_io_r_open_pol(BOOL io, LSA_R_OPEN_POL *r_p, char *q, char *base, int align)
-{
- if (r_p == NULL) return NULL;
-
- q = smb_io_pol_hnd(io, &(r_p->pol), q, base, align);
-
- RW_IVAL(io, q, r_p->status, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an LSA_Q_QUERY_INFO structure.
-********************************************************************/
-char* lsa_io_q_query(BOOL io, LSA_Q_QUERY_INFO *q_q, char *q, char *base, int align)
-{
- if (q_q == NULL) return NULL;
-
- q = smb_io_pol_hnd(io, &(q_q->pol), q, base, align);
-
- RW_SVAL(io, q, q_q->info_class, 0); q += 2;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an LSA_Q_QUERY_INFO structure.
-********************************************************************/
-char* lsa_io_r_query(BOOL io, LSA_R_QUERY_INFO *r_q, char *q, char *base, int align)
-{
- if (r_q == NULL) return NULL;
-
- RW_IVAL(io, q, r_q->undoc_buffer, 0); q += 4;
-
- if (r_q->undoc_buffer != 0)
- {
- RW_SVAL(io, q, r_q->info_class, 0); q += 2;
-
- switch (r_q->info_class)
- {
- case 3:
- {
- q = smb_io_dom_query_3(io, &(r_q->dom.id3), q, base, align);
- break;
- }
- case 5:
- {
- q = smb_io_dom_query_5(io, &(r_q->dom.id3), q, base, align);
- break;
- }
- default:
- {
- /* PANIC! */
- break;
- }
- }
- }
-
- RW_IVAL(io, q, r_q->status, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_lookup_sids(BOOL io, LSA_Q_LOOKUP_SIDS *q_s, char *q, char *base, int align)
-{
- int i;
-
- if (q_s == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_pol_hnd(io, &(q_s->pol_hnd), q, base, align); /* policy handle */
-
- RW_IVAL(io, q, q_s->num_entries, 0); q += 4;
- RW_IVAL(io, q, q_s->buffer_dom_sid, 0); q += 4; /* undocumented domain SID buffer pointer */
- RW_IVAL(io, q, q_s->buffer_dom_name, 0); q += 4; /* undocumented domain name buffer pointer */
-
- for (i = 0; i < q_s->num_entries; i++)
- {
- RW_IVAL(io, q, q_s->buffer_lookup_sids[i], 0); q += 4; /* undocumented domain SID pointers to be looked up. */
- }
-
- for (i = 0; i < q_s->num_entries; i++)
- {
- q = smb_io_dom_sid(io, &(q_s->dom_sids[i]), q, base, align); /* domain SIDs to be looked up. */
- }
-
- RW_PCVAL(io, q, q_s->undoc, 16); q += 16; /* completely undocumented 16 bytes */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_lookup_sids(BOOL io, LSA_R_LOOKUP_SIDS *r_s, char *q, char *base, int align)
-{
- int i;
-
- if (r_s == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_dom_r_ref(io, &(r_s->dom_ref), q, base, align); /* domain reference info */
-
- RW_IVAL(io, q, r_s->num_entries, 0); q += 4;
- RW_IVAL(io, q, r_s->undoc_buffer, 0); q += 4;
- RW_IVAL(io, q, r_s->num_entries2, 0); q += 4;
-
- for (i = 0; i < r_s->num_entries2; i++)
- {
- q = smb_io_dom_sid2(io, &(r_s->dom_sid[i]), q, base, align); /* domain SIDs being looked up */
- }
-
- RW_IVAL(io, q, r_s->num_entries3, 0); q += 4;
-
- RW_IVAL(io, q, r_s->status, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_lookup_rids(BOOL io, LSA_Q_LOOKUP_RIDS *q_r, char *q, char *base, int align)
-{
- int i;
-
- if (q_r == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_pol_hnd(io, &(q_r->pol_hnd), q, base, align); /* policy handle */
-
- RW_IVAL(io, q, q_r->num_entries, 0); q += 4;
- RW_IVAL(io, q, q_r->num_entries2, 0); q += 4;
- RW_IVAL(io, q, q_r->buffer_dom_sid, 0); q += 4; /* undocumented domain SID buffer pointer */
- RW_IVAL(io, q, q_r->buffer_dom_name, 0); q += 4; /* undocumented domain name buffer pointer */
-
- for (i = 0; i < q_r->num_entries; i++)
- {
- q = smb_io_dom_name(io, &(q_r->lookup_name[i]), q, base, 0); /* names to be looked up */
- }
-
- RW_PCVAL(io, q, q_r->undoc, UNKNOWN_LEN); q += UNKNOWN_LEN; /* completely undocumented bytes of unknown length */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_lookup_rids(BOOL io, LSA_R_LOOKUP_RIDS *r_r, char *q, char *base, int align)
-{
- int i;
-
- if (r_r == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_dom_r_ref(io, &(r_r->dom_ref), q, base, align); /* domain reference info */
-
- RW_IVAL(io, q, r_r->num_entries, 0); q += 4;
- RW_IVAL(io, q, r_r->undoc_buffer, 0); q += 4;
- RW_IVAL(io, q, r_r->num_entries2, 0); q += 4;
-
- for (i = 0; i < r_r->num_entries2; i++)
- {
- q = smb_io_dom_rid2(io, &(r_r->dom_rid[i]), q, base, align); /* domain RIDs being looked up */
- }
-
- RW_IVAL(io, q, r_r->num_entries3, 0); q += 4;
-
- RW_IVAL(io, q, r_r->status, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_req_chal(BOOL io, LSA_Q_REQ_CHAL *q_c, char *q, char *base, int align)
-{
- if (q_c == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_unistr2(io, &(q_c->uni_logon_srv), q, base, align); /* logon server unicode string */
- q = smb_io_unistr2(io, &(q_c->uni_logon_clnt), q, base, align); /* logon client unicode string */
- q = smb_io_chal(io, &(q_c->clnt_chal), q, base, align); /* client challenge */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_req_chal(BOOL io, LSA_R_REQ_CHAL *r_c, char *q, char *base, int align)
-{
- if (r_c == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_chal(io, &(r_c->srv_chal), q, base, align); /* server challenge */
-
- RW_IVAL(io, q, r_c->status, 0); q += 4;
-
- return q;
-}
-
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_auth2(BOOL io, LSA_Q_AUTH_2 *q_a, char *q, char *base, int align)
-{
- if (q_a == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_log_info (io, &(q_a->clnt_id), q, base, align); /* client identification info */
- q = smb_io_chal (io, &(q_a->clnt_chal), q, base, align); /* client-calculated credentials */
- q = smb_io_neg_flags(io, &(q_a->clnt_flgs), q, base, align);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_auth_2(BOOL io, LSA_R_AUTH_2 *r_a, char *q, char *base, int align)
-{
- if (r_a == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_chal (io, &(r_a->srv_chal), q, base, align); /* server challenge */
- q = smb_io_neg_flags(io, &(r_a->srv_flgs), q, base, align);
-
- RW_IVAL(io, q, r_a->status, 0); q += 4;
-
- return q;
-}
-
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_srv_pwset(BOOL io, LSA_Q_SRV_PWSET *q_s, char *q, char *base, int align)
-{
- if (q_s == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_clnt_info(io, &(q_s->clnt_id), q, base, align); /* client identification/authentication info */
- RW_PCVAL(io, q, q_s->pwd, 16); q += 16; /* new password - undocumented */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_srv_pwset(BOOL io, LSA_R_SRV_PWSET *r_s, char *q, char *base, int align)
-{
- if (r_s == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_cred(io, &(r_s->srv_cred), q, base, align); /* server challenge */
-
- RW_IVAL(io, q, r_s->status, 0); q += 4;
-
- return q;
-}
-
-/* LSA_USER_INFO */
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_user_info(BOOL io, LSA_USER_INFO *usr, char *q, char *base, int align)
-{
- int i;
-
- if (usr == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, usr->undoc_buffer, 0); q += 4;
-
- q = smb_io_time(io, &(usr->logon_time) , q, base, align); /* logon time */
- q = smb_io_time(io, &(usr->logoff_time) , q, base, align); /* logoff time */
- q = smb_io_time(io, &(usr->kickoff_time) , q, base, align); /* kickoff time */
- q = smb_io_time(io, &(usr->pass_last_set_time) , q, base, align); /* password last set time */
- q = smb_io_time(io, &(usr->pass_can_change_time) , q, base, align); /* password can change time */
- q = smb_io_time(io, &(usr->pass_must_change_time), q, base, align); /* password must change time */
-
- q = smb_io_unihdr(io, &(usr->hdr_user_name) , q, base, align); /* username unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_full_name) , q, base, align); /* user's full name unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_logon_script), q, base, align); /* logon script unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_profile_path), q, base, align); /* profile path unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_home_dir) , q, base, align); /* home directory unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_dir_drive) , q, base, align); /* home directory drive unicode string header */
-
- RW_SVAL(io, q, usr->logon_count , 0); q += 2; /* logon count */
- RW_SVAL(io, q, usr->bad_pw_count, 0); q += 2; /* bad password count */
-
- RW_IVAL(io, q, usr->user_id , 0); q += 4; /* User ID */
- RW_IVAL(io, q, usr->group_id , 0); q += 4; /* Group ID */
- RW_IVAL(io, q, usr->num_groups , 0); q += 4; /* num groups */
- RW_IVAL(io, q, usr->buffer_groups, 0); q += 4; /* undocumented buffer pointer to groups. */
- RW_IVAL(io, q, usr->user_flgs , 0); q += 4; /* user flags */
-
- RW_PCVAL(io, q, usr->sess_key, 16); q += 16; /* unused user session key */
-
- q = smb_io_unihdr(io, &(usr->hdr_logon_srv), q, base, align); /* logon server unicode string header */
- q = smb_io_unihdr(io, &(usr->hdr_logon_dom), q, base, align); /* logon domain unicode string header */
-
- RW_IVAL(io, q, usr->buffer_dom_id, 0); q += 4; /* undocumented logon domain id pointer */
- RW_PCVAL(io, q, usr->padding, 40); q += 40; /* unused padding bytes? */
-
- RW_IVAL(io, q, usr->num_other_sids, 0); q += 4; /* 0 - num_sids */
- RW_IVAL(io, q, usr->buffer_other_sids, 0); q += 4; /* NULL - undocumented pointer to SIDs. */
-
- q = smb_io_unistr2(io, &(usr->uni_user_name) , q, base, align); /* username unicode string */
- q = smb_io_unistr2(io, &(usr->uni_full_name) , q, base, align); /* user's full name unicode string */
- q = smb_io_unistr2(io, &(usr->uni_logon_script), q, base, align); /* logon script unicode string */
- q = smb_io_unistr2(io, &(usr->uni_profile_path), q, base, align); /* profile path unicode string */
- q = smb_io_unistr2(io, &(usr->uni_home_dir) , q, base, align); /* home directory unicode string */
- q = smb_io_unistr2(io, &(usr->uni_dir_drive) , q, base, align); /* home directory drive unicode string */
-
- RW_IVAL(io, q, usr->num_groups2, 0); q += 4; /* num groups */
- for (i = 0; i < usr->num_groups2; i++)
- {
- q = smb_io_gid(io, &(usr->gids[i]), q, base, align); /* group info */
- }
-
- q = smb_io_unistr2(io, &( usr->uni_logon_srv), q, base, align); /* logon server unicode string */
- q = smb_io_unistr2(io, &( usr->uni_logon_dom), q, base, align); /* logon domain unicode string */
-
- q = smb_io_dom_sid(io, &(usr->dom_sid), q, base, align); /* domain SID */
-
- for (i = 0; i < usr->num_other_sids; i++)
- {
- q = smb_io_dom_sid(io, &(usr->other_sids[i]), q, base, align); /* other domain SIDs */
- }
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_sam_logon(BOOL io, LSA_Q_SAM_LOGON *q_l, char *q, char *base, int align)
-{
- if (q_l == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_sam_info(io, &(q_l->sam_id), q, base, align); /* domain SID */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_sam_logon(BOOL io, LSA_R_SAM_LOGON *r_l, char *q, char *base, int align)
-{
- if (r_l == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, r_l->buffer_creds, 0); q += 4; /* undocumented buffer pointer */
- q = smb_io_cred(io, &(r_l->srv_creds), q, base, align); /* server credentials. server time stamp appears to be ignored. */
-
- RW_IVAL(io, q, r_l->buffer_user, 0); q += 4;
- if (r_l->buffer_user != 0)
- {
- q = lsa_io_user_info(io, r_l->user, q, base, align);
- }
-
- RW_IVAL(io, q, r_l->auth_resp, 0); q += 4; /* 1 - Authoritative response; 0 - Non-Auth? */
-
- RW_IVAL(io, q, r_l->status, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_q_sam_logoff(BOOL io, LSA_Q_SAM_LOGOFF *q_l, char *q, char *base, int align)
-{
- if (q_l == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_sam_info(io, &(q_l->sam_id), q, base, align); /* domain SID */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* lsa_io_r_sam_logoff(BOOL io, LSA_R_SAM_LOGOFF *r_l, char *q, char *base, int align)
-{
- if (r_l == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, r_l->buffer_creds, 0); q += 4; /* undocumented buffer pointer */
- q = smb_io_cred(io, &(r_l->srv_creds), q, base, align); /* server credentials. server time stamp appears to be ignored. */
-
- RW_IVAL(io, q, r_l->status, 0); q += 4;
-
- return q;
-}
-
-#if 0
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
- char* lsa_io_(BOOL io, *, char *q, char *base, int align)
-{
- if (== NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, , 0); q += 4;
-
- return q;
-}
-#endif
diff --git a/source/nameannounce.c b/source/nameannounce.c
deleted file mode 100644
index d3344ebd478..00000000000
--- a/source/nameannounce.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- SMB Version handling
- Copyright (C) John H Terpstra 1995-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-
-#define TEST_CODE
-
-extern int DEBUGLEVEL;
-extern BOOL CanRecurse;
-
-extern struct in_addr ipzero;
-
-extern pstring myname;
-extern fstring myworkgroup;
-extern char **my_netbios_names;
-
-extern int ClientDGRAM;
-extern int ClientNMB;
-
-/* this is our domain/workgroup/server database */
-extern struct subnet_record *subnetlist;
-
-extern int updatecount;
-extern int workgroup_count;
-
-extern struct in_addr wins_ip;
-
-extern pstring scope;
-
-/****************************************************************************
- send a announce request to the local net
- **************************************************************************/
-void announce_request(struct work_record *work, struct in_addr ip)
-{
- pstring outbuf;
- char *p;
-
- if (!work) return;
-
- work->needannounce = True;
-
- DEBUG(2,("sending announce request to %s for workgroup %s\n",
- inet_ntoa(ip),work->work_group));
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf;
- CVAL(p,0) = ANN_AnnouncementRequest;
- p++;
-
- CVAL(p,0) = work->token; /* (local) unique workgroup token id */
- p++;
- StrnCpy(p,myname,16);
- strupper(p);
- p = skip_string(p,1);
-
- /* XXXX note: if we sent the announcement request to 0x1d instead
- of 0x1e, then we could get the master browser to announce to
- us instead of the members of the workgroup. wha-hey! */
-
- send_mailslot_reply(False, BROWSE_MAILSLOT,ClientDGRAM,
- outbuf,PTR_DIFF(p,outbuf),
- myname,work->work_group,0x20,0x1e,ip,*iface_ip(ip));
-}
-
-
-/****************************************************************************
- request an announcement
- **************************************************************************/
-void do_announce_request(char *info, char *to_name, int announce_type,
- int from,
- int to, struct in_addr dest_ip)
-{
- pstring outbuf;
- char *p;
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf;
- CVAL(p,0) = announce_type;
- p++;
-
- DEBUG(2,("sending announce type %d: info %s to %s - server %s(%x)\n",
- announce_type, info, inet_ntoa(dest_ip),to_name,to));
-
- StrnCpy(p,info,16);
- strupper(p);
- p = skip_string(p,1);
-
- send_mailslot_reply(False,BROWSE_MAILSLOT,ClientDGRAM,
- outbuf,PTR_DIFF(p,outbuf),
- myname,to_name,from,to,dest_ip,*iface_ip(dest_ip));
-}
-
-
-/****************************************************************************
- find a server responsible for a workgroup, and sync browse lists
- control ends up back here via response_name_query.
- **************************************************************************/
-void sync_server(enum state_type state, char *serv_name, char *work_name,
- int name_type,
- struct subnet_record *d,
- struct in_addr ip)
-{
- /* with a domain master we can get the whole list (not local only list) */
- BOOL local_only = (state != NAME_STATUS_DOM_SRV_CHK);
-
- add_browser_entry(serv_name, name_type, work_name, 0, d, ip, local_only);
-
- if (state == NAME_STATUS_DOM_SRV_CHK)
- {
- /* announce ourselves as a master browser to serv_name */
- do_announce_request(myname, serv_name, ANN_MasterAnnouncement,
- 0x20, 0, ip);
- }
-}
-
-
-/****************************************************************************
- send a host announcement packet
- **************************************************************************/
-void do_announce_host(int command,
- char *from_name, int from_type, struct in_addr from_ip,
- char *to_name , int to_type , struct in_addr to_ip,
- time_t announce_interval,
- char *server_name, int server_type, char *server_comment)
-{
- pstring outbuf;
- char *p;
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf+1;
-
- /* command type */
- CVAL(outbuf,0) = command;
-
- /* announcement parameters */
- CVAL(p,0) = updatecount;
- SIVAL(p,1,announce_interval*1000); /* ms - despite the spec */
-
- StrnCpy(p+5,server_name,16);
- strupper(p+5);
-
- CVAL(p,21) = lp_major_announce_version(); /* major version */
- CVAL(p,22) = lp_minor_announce_version(); /* minor version */
-
- SIVAL(p,23,server_type & ~SV_TYPE_LOCAL_LIST_ONLY);
- /* browse version: got from NT/AS 4.00 - Value defined in smb.h (JHT)*/
- SSVAL(p,27,BROWSER_ELECTION_VERSION);
- SSVAL(p,29,BROWSER_CONSTANT); /* browse signature */
-
- pstrcpy(p+31,server_comment);
- p += 31;
- p = skip_string(p,1);
-
- debug_browse_data(outbuf, PTR_DIFF(p,outbuf));
-
- /* send the announcement */
- send_mailslot_reply(False,BROWSE_MAILSLOT,ClientDGRAM,outbuf,
- PTR_DIFF(p,outbuf),
- from_name, to_name,
- from_type, to_type,
- to_ip, from_ip);
-}
-
-
-/****************************************************************************
-announce all samba's server entries as 'gone'.
-****************************************************************************/
-void announce_my_servers_removed(void)
-{
- struct subnet_record *d;
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work = d->workgrouplist; work; work = work->next)
- {
- struct server_record *s;
- for (s = work->serverlist; s; s = s->next)
- {
- if (!is_myname(s->serv.name)) continue;
- announce_server(d, work, s->serv.name, s->serv.comment, 0, 0);
- }
- }
- }
-}
-
-
-/****************************************************************************
- announce a server entry
- ****************************************************************************/
-void announce_server(struct subnet_record *d, struct work_record *work,
- char *name, char *comment, time_t ttl, int server_type)
-{
- /* domain type cannot have anything in it that might confuse
- a client into thinking that the domain is in fact a server.
- (SV_TYPE_SERVER_UNIX, for example)
- */
- uint32 domain_type = SV_TYPE_DOMAIN_ENUM|SV_TYPE_NT;
- BOOL wins_iface = ip_equal(d->bcast_ip, wins_ip);
-
- if(wins_iface)
- {
- DEBUG(0,("announce_server: error - announcement requested on WINS \
-interface for workgroup %s, name %s\n", work->work_group, name));
- return;
- }
-
- /* Only do domain announcements if we are a master and it's
- our name we're being asked to announce. */
- if (AM_MASTER(work) && strequal(myname,name))
- {
- DEBUG(3,("sending local master announce to %s for %s(1e)\n",
- inet_ntoa(d->bcast_ip),work->work_group));
-
- do_announce_host(ANN_LocalMasterAnnouncement,
- name , 0x00, d->myip,
- work->work_group, 0x1e, d->bcast_ip,
- ttl,
- name, server_type, comment);
-
- DEBUG(3,("sending domain announce to %s for %s\n",
- inet_ntoa(d->bcast_ip),work->work_group));
-
- /* XXXX should we do a domain-announce-kill? */
- if (server_type != 0)
- {
- do_announce_host(ANN_DomainAnnouncement,
- name , 0x00, d->myip,
- MSBROWSE, 0x01, d->bcast_ip,
- ttl,
- work->work_group, server_type ? domain_type : 0,
- name);
- }
- }
- else
- {
- DEBUG(3,("sending host announce to %s for %s(1d)\n",
- inet_ntoa(d->bcast_ip),work->work_group));
-
- do_announce_host(ANN_HostAnnouncement,
- name , 0x00, d->myip,
- work->work_group, 0x1d, d->bcast_ip,
- ttl,
- name, server_type, comment);
- }
-}
-
-/****************************************************************************
- construct a host announcement unicast
- **************************************************************************/
-void announce_host(time_t t)
-{
- struct subnet_record *d;
- pstring comment;
- char *my_name;
-
- StrnCpy(comment, lp_serverstring(), 43);
-
- my_name = *myname ? myname : "NoName";
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- uint32 stype = work->ServerType;
- struct server_record *s;
-
- /* must work on the code that does announcements at up to
- 30 seconds later if a master browser sends us a request
- announce.
- */
-
- if (work->needannounce) {
- /* drop back to a max 3 minute announce - this is to prevent a
- single lost packet from stuffing things up for too long */
- work->announce_interval = MIN(work->announce_interval,
- CHECK_TIME_MIN_HOST_ANNCE*60);
- work->lastannounce_time = t - (work->announce_interval+1);
- }
-
- /* announce every minute at first then progress to every 12 mins */
- if (work->lastannounce_time &&
- (t - work->lastannounce_time) < work->announce_interval)
- continue;
-
- if (work->announce_interval < CHECK_TIME_MAX_HOST_ANNCE * 60)
- work->announce_interval += 60;
-
- work->lastannounce_time = t;
-
- for (s = work->serverlist; s; s = s->next) {
- if (is_myname(s->serv.name)) {
- /* If we are any kind of browser or logon server, only
- announce it for our primary name, not our aliases. */
- if(!strequal(myname, s->serv.name))
- stype &= ~(SV_TYPE_MASTER_BROWSER|SV_TYPE_POTENTIAL_BROWSER|
- SV_TYPE_DOMAIN_MASTER|SV_TYPE_DOMAIN_MEMBER);
- announce_server(d,work,s->serv.name,comment,
- work->announce_interval,stype);
- }
- }
-
- if (work->needannounce)
- {
- work->needannounce = False;
- break;
- /* sorry: can't do too many announces. do some more later */
- }
- }
- }
-}
-
-/* Announce timer. Moved into global static so it can be reset
- when a machine becomes a master browser. */
-static time_t announce_timer_last=0;
-
-/****************************************************************************
- Reset the announce_timer so that a master browser announce will be done
- immediately.
- ****************************************************************************/
-
-void reset_announce_timer()
-{
- announce_timer_last = time(NULL) - (CHECK_TIME_MST_ANNOUNCE * 60);
-}
-
-/****************************************************************************
- announce myself as a master to all other domain master browsers.
-
- this actually gets done in search_and_sync_workgroups() via the
- NAME_QUERY_DOM_SRV_CHK command, if there is a response from the
- name query initiated here. see response_name_query()
- **************************************************************************/
-void announce_master(time_t t)
-{
- struct subnet_record *d;
- struct work_record *work;
- BOOL am_master = False; /* are we a master of some sort? :-) */
-
- if (!announce_timer_last) announce_timer_last = t;
- if (t-announce_timer_last < CHECK_TIME_MST_ANNOUNCE * 60)
- {
- DEBUG(10,("announce_master: t (%d) - last(%d) < %d\n",
- t, announce_timer_last, CHECK_TIME_MST_ANNOUNCE * 60 ));
- return;
- }
-
- if(wins_subnet == NULL)
- {
- DEBUG(10,("announce_master: no wins subnet, ignoring.\n"));
- return;
- }
-
- announce_timer_last = t;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (AM_MASTER(work))
- {
- am_master = True;
- DEBUG(4,( "announce_master: am_master = %d for \
-workgroup %s\n", am_master, work->work_group));
- }
- }
- }
-
- if (!am_master) return; /* only proceed if we are a master browser */
-
- /* Note that we don't do this if we are domain master browser
- and that we *only* do this on the WINS subnet. */
-
- /* Try and find our workgroup on the WINS subnet */
- work = find_workgroupstruct(wins_subnet, myworkgroup, False);
-
- if (work)
- {
- char *name;
- int type;
-
- {
- /* assume that the domain master browser we want to sync
- with is our own domain.
- */
- name = work->work_group;
- type = 0x1b;
- }
-
- /* check the existence of a dmb for this workgroup, and if
- one exists at the specified ip, sync with it and announce
- ourselves as a master browser to it
- */
-
- if (!lp_wins_support() && *lp_wins_server() )
- {
- DEBUG(4, ("Local Announce: find %s<%02x> from WINS server %s\n",
- name, type, lp_wins_server()));
-
- queue_netbios_pkt_wins(ClientNMB,
- NMB_QUERY,NAME_QUERY_DOM_SRV_CHK,
- name, type, 0,0,0,
- work->work_group,NULL,
- ipzero, ipzero);
- }
- else if(lp_wins_support())
- {
- /* We are the WINS server - query ourselves for the dmb name. */
-
- struct nmb_name netb_name;
- struct name_record *nr = 0;
-
- d = NULL;
-
- make_nmb_name(&netb_name, name, type, scope);
-
- if ((nr = find_name_search(&d, &netb_name, FIND_WINS, ipzero)) == 0)
- {
- DEBUG(0, ("announce_master: unable to find domain master browser for workgroup %s \
-in our own WINS database.\n", work->work_group));
- return;
- }
-
- /* Check that this isn't one of our addresses (ie. we are not domain master
- ourselves) */
- if(ismyip(nr->ip_flgs[0].ip) || ip_equal(nr->ip_flgs[0].ip, ipzero))
- {
- DEBUG(4, ("announce_master: domain master ip found (%s) for workgroup %s \
-is one of our interfaces.\n", work->work_group, inet_ntoa(nr->ip_flgs[0].ip) ));
- return;
- }
-
- /* Issue a NAME_STATUS_DOM_SRV_CHK immediately - short circuit the
- NAME_QUERY_DOM_SRV_CHK which is done only if we are talking to a
- remote WINS server. */
-
- DEBUG(4, ("announce_master: doing name status for %s<%02x> to domain master ip %s \
-for workgroup %s\n", name, type, inet_ntoa(nr->ip_flgs[0].ip), work->work_group ));
-
- queue_netbios_packet(wins_subnet, ClientNMB,
- NMB_QUERY,NAME_STATUS_DOM_SRV_CHK,
- name, type, 0,0,0,
- work->work_group,NULL,
- False, False, nr->ip_flgs[0].ip, nr->ip_flgs[0].ip);
- }
-
- }
-}
-
-/****************************************************************************
- do all the "remote" announcements. These are used to put ourselves
- on a remote browse list. They are done blind, no checking is done to
- see if there is actually a browse master at the other end.
- **************************************************************************/
-void announce_remote(time_t t)
-{
- char *s,*ptr;
- static time_t last_time = 0;
- pstring s2;
- struct in_addr addr;
- char *comment,*workgroup;
- int stype = lp_default_server_announce();
-
- if (last_time && t < last_time + REMOTE_ANNOUNCE_INTERVAL)
- return;
-
- last_time = t;
-
- s = lp_remote_announce();
- if (!*s) return;
-
- comment = lp_serverstring();
- workgroup = myworkgroup;
-
- for (ptr=s; next_token(&ptr,s2,NULL); )
- {
- /* the entries are of the form a.b.c.d/WORKGROUP with
- WORKGROUP being optional */
- char *wgroup;
- int n;
-
- wgroup = strchr(s2,'/');
- if (wgroup) *wgroup++ = 0;
- if (!wgroup || !*wgroup)
- wgroup = workgroup;
-
- addr = *interpret_addr2(s2);
-
- /* Announce all our names including aliases */
- for (n=0; my_netbios_names[n]; n++)
- {
- char *name = my_netbios_names[n];
- do_announce_host(ANN_HostAnnouncement,name,0x20,*iface_ip(addr),
- wgroup,0x1e,addr,
- REMOTE_ANNOUNCE_INTERVAL,
- name,stype,comment);
- }
- }
-
-}
diff --git a/source/nameannounce.doc b/source/nameannounce.doc
deleted file mode 100644
index e04a59209a1..00000000000
--- a/source/nameannounce.doc
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.2
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameannounce.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-
- 0.1 - 22jul96 : Andrew.Tridgell@anu.edu.au
- tridge's comments on first revision
-
- 0.2 - 05aug96 : lkcl@pires.co.uk
- actioned tridge comments about pdc -> domain master
- documented NAME_QUERY_ANNOUNCE_HOST
-
-*/
-
-
-this module deals with announcements: the sending of announcement requests
-and the sending of announcements either to refresh other servers' records
-or as a response to announcement requests.
-
-
-/*************************************************************************
- announce_master()
- *************************************************************************/
-
-this function is responsible for announcing samba as a master browser
-to all known domain masters.
-
-this announcement is sent out at CHECK_TIME_MST_ANNOUNCE minute
-intervals, only if samba is a master browser on one or more of
-its local interfaces.
-
-if no domain controller has been specified (lp_domain_controller())
-samba goes through its list of servers looking for domain master
-browsers. when it finds one (other than itself) it will either
-initiate a NAME_QUERY_PDC_SRV_CHK by broadcast or with a WINS
-server. this will result in a NAME_STATUS_PDC_SRV_CHK, which
-will result in a sync browse list and an announcement
-ANN_MasterAnnounce being sent (see sync_server()).
-
-if a domain controller has been specified, samba will search for
-a domain master browser for its workgroup (either by directed
-packet or by broadcast if it cannot resolve the domain controller
-name using DNS), which results in the same action as listed above.
-
-------------
-NOTE FROM TRIDGE:
-
-PDC in the above should really be DMB (domain master browser). They
-might be separate entities.
-
-I also propose a simpler scheme :-)
-
-If a DMB is not configured with lp_domain_controller() (perhaps
-renamed to lp_domain_master()?) then just don't do master
-announcements. Remember that most peoples networks are very simple and
-don't need DMB capabilities. Those that do need them will have more
-complex network topologies and they really need to choose themselves
-which box will act as the "hub" for netbios name resolution. Doing it
-via name queries will just lead to lag and propogation delays, because
-if two parts of the net choose different DMBs then the data will be
-very slow to propoogate.
-
-If a DMB is configured then just send the master announcemnt to that
-box! Thats all that needs to be done. Just send a udp 138 packet and
-forget it. If the recipient is indeed a DMB (as it should be if the
-config file is correct) then it should initiate a browse list sync
-with us at some later time, but that is take care of by smbd and nmbd
-doesn't even need to know it happened.
-
-Additionally, if a DMB is configured we need to sync our workgroup
-list and server list with them occasionally. Note that this is only
-time a non-DMB should do a browse sync, and it should only do it with
-a DMB. Essentially WAN based netbios is just a simple star. There is a
-DMB in the centre, and the individual master browsers for each subnet
-talk to it, but never talk to each other. If they start talking to
-each other then the network load will go as the square of the number
-of machines, which will result in meltdown :-)
--------------
-
-
-/*************************************************************************
- announce_host()
- *************************************************************************/
-
-this complex-looking function is responsible for announcing samba's
-existence to other servers by broadcast. the actual announcement
-is carried out by announce_server().
-
-the time period between samba's announcement will stretch from one
-minute to twelve minutes by one minute. if samba has received an
-announce request from a master browser, then it should answer at
-any random interval between zero and thirty seconds after the
-request is received. this is to ensure that the master browser
-does not get overloaded with responses!
-
-
-/*************************************************************************
- announce_server()
- *************************************************************************/
-
-this function is responsible for sending announcement packets.
-these packets are received by other servers, which will then
-update their records accordingly: what services we have, our
-name, our comment field and our time to live (to name a few).
-
-if samba is a non-master then we need to see if there is a
-domain master (on a remote subnet) that we need to announce to
-it.
-
-if samba is not the WINS server (and it is using another
-WINS server) then we need to do a name query to the WINS
-server to ask it what the domain controller is. this is done
-using a samba 'state' NAME_QUERY_ANNOUNCE_HOST, which passes
-sufficient information on to be able to carry out the
-host announcement using a unicasted do_announce_host() if and
-when a reply comes back. if there is no reply to the name query,
-this is not necessarily an error - there may genuinely be no
-domain master currently up and running for samba's workgroup.
-
-if samba is a WINS server, then samba will need to look up the
-domain controller for its workgroup in its WINS records. an
-over-cautious samba could carry out a name query on that
-domain controller to make sure that it is alive and that samba's
-WINS records are up-to-date. in any event, it will send a unicast
-do_announce_host() to inform the domain master browser, if one
-exists, of samba's server status.
-
-if we are a master browser, then using do_announce_host() we
-must send a broadcast announcement on the local interface
-notifying members of that workgroup that we are their master
-browser, and another announcement indicating to all backup
-browsers and master browsers that we are a master browser.
-
-(note: if another master browser receives this broadcasted
-announcement and thinks that it is also the master browser
-for this workgroup, it stops being a master browser and forces
-an election).
-
-if we are not a master browser, then we send a broacast
-announcement notifying the master browser that we are a member
-of its workgroup, on the local interface.
-
-
-/*************************************************************************
- remove_my_servers()
- *************************************************************************/
-
-this function is responsible for informing other servers that
-samba is about to go down. it announces, on all subnets, that
-samba's time to live is zero and that it has no services.
-
-
-/*************************************************************************
- do_announce_host()
- *************************************************************************/
-
-this function is responsible for sending out an announcement
-MAILSLOT browse packet. it contains information such as the
-time to live, name of the server, services that the server
-offers etc.
-
-the format of this MAILSLOT browse packet is described in
-draft-heizer-cifs-v1-spec-00.txt 3.9.50.4.1 page 165-6.
-
-
-/*************************************************************************
- announce_backup()
- *************************************************************************/
-
-this function is responsible for getting master browsers and domain
-controllers to send us lists of backup servers. this is done by
-sending an ANN_GetBackupListReq browse mailslot.
-
-the local master browser, or domain master browser, should respond
-with an ANN_GetBackupListResp browse mailslot containing the list
-of backup servers.
-
---------------
-NOTE FROM TRIDGE: I don't see why nmbd should ever send one of
-these. The only reason I can see for any part of Samba sending one of
-these is if we implement it in smbclient.
-
-This packet is used to request a list of backup master browsers from
-the master browser. It is used by clients (not servers!) to spread the
-browse load over more than one server. The only server that needs to
-know what the list of backups is is the master browser, and as it is
-also responsible for generating this list it will never ask anyone
-else for it.
---------------
-
-
-/*************************************************************************
- sync_server()
- *************************************************************************/
-
-this function is responsible for initiating a sync browse list
-sequence and, if necessary, carrying out an ANN_MasterAnnouncement
-to the domain master browser (that we are also sync'ing browse lists
-with).
-
-see nameservresp.c:response_name_status_check().
-
-
-/*************************************************************************
- announce_request()
- *************************************************************************/
-
-this function is responsible for sending an announcement request to
-another server. this server should respond with an announcement.
-
-if the announce request is sent to WORKGROUP(0x1e) then members of
-the workgroup will respond (with ANN_HostAnnounce packets)
-
-if the announce request is sent to WORKGROUP(0x1d) then the master
-browser of the workgroup should respond (ANN_LocalMasterAnnounce).
-this is untested.
-
-if the announce request is sent to ^1^2__MSBROWSE__^2(0x1) then
-(and this is pure speculation), all backup browsers and master
-browsers should respond with ANN_DomainAnnounce packets.
-this is untested.
-
------------
-NOTE FROM TRIDGE:
-
-I had great trouble getting machines to actually respond to this
-packet. Either we have the format wrong or MS chose not to implement
-it.
-
-Not implementing it doesn't break anything, it just means a new master
-browser won't get a complete server list as quickly.
-
-Also note that this packet should be used as little as possible as it
-could easily cause meltdown if too many servers used it. Imagine a
-dozen samba servers on a net all sending this packet! You will get 244
-responses all within 30 seconds. now imagine 50 samba servers ....
-
-So I think we should restrict ourselves to sending this packet only if
-we are already the master browser for a workgroup. We could send a
-single "announce request" when we become the master, just to prime our
-server lists. From then on the normal announce cycles should take care
-of keeping it uptodate.
------------
-
diff --git a/source/namebrowse.c b/source/namebrowse.c
deleted file mode 100644
index 1dd293d27be..00000000000
--- a/source/namebrowse.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-#include "smb.h"
-
-extern int ClientNMB;
-
-extern int DEBUGLEVEL;
-
-extern struct in_addr wins_ip;
-
-/* this is our browse master/backup cache database */
-static struct browse_cache_record *browserlist = NULL;
-
-
-/***************************************************************************
- add a browser into the list
- **************************************************************************/
-static void add_browse_cache(struct browse_cache_record *b)
-{
- struct browse_cache_record *b2;
-
- if (!browserlist)
- {
- browserlist = b;
- b->prev = NULL;
- b->next = NULL;
- return;
- }
-
- for (b2 = browserlist; b2->next; b2 = b2->next) ;
-
- b2->next = b;
- b->next = NULL;
- b->prev = b2;
-}
-
-
-/*******************************************************************
- remove old browse entries
- ******************************************************************/
-void expire_browse_cache(time_t t)
-{
- struct browse_cache_record *b;
- struct browse_cache_record *nextb;
-
- /* expire old entries in the serverlist */
- for (b = browserlist; b; b = nextb)
- {
- if (b->synced && b->sync_time < t)
- {
- DEBUG(3,("Removing dead cached browser %s\n",b->name));
- nextb = b->next;
-
- if (b->prev) b->prev->next = b->next;
- if (b->next) b->next->prev = b->prev;
-
- if (browserlist == b) browserlist = b->next;
-
- free(b);
- }
- else
- {
- nextb = b->next;
- }
- }
-}
-
-/****************************************************************************
- add a browser entry
- ****************************************************************************/
-struct browse_cache_record *add_browser_entry(char *name, int type, char *wg,
- time_t ttl, struct subnet_record *d,
- struct in_addr ip, BOOL local)
-{
- BOOL newentry=False;
-
- struct browse_cache_record *b;
-
- /* search for the entry: if it's already in the cache, update that entry */
- for (b = browserlist; b; b = b->next)
- {
- if (ip_equal(ip,b->ip) && strequal(b->group, wg)) break;
- }
-
- if (b && b->synced)
- {
- /* entries get left in the cache for a while. this stops sync'ing too
- often if the network is large */
- DEBUG(4, ("browser %s %s %s already sync'd at time %d\n",
- b->name, b->group, inet_ntoa(b->ip), b->sync_time));
- return NULL;
- }
-
- if (!b)
- {
- newentry = True;
- b = (struct browse_cache_record *)malloc(sizeof(*b));
-
- if (!b) return(NULL);
-
- bzero((char *)b,sizeof(*b));
- }
-
- /* update the entry */
- ttl = time(NULL)+ttl;
-
- StrnCpy(b->name ,name,sizeof(b->name )-1);
- StrnCpy(b->group,wg ,sizeof(b->group)-1);
- strupper(b->name);
- strupper(b->group);
-
- b->ip = ip;
- b->type = type;
- b->local = local; /* local server list sync or complete sync required */
- b->subnet = d;
-
- if (newentry || ttl < b->sync_time)
- b->sync_time = ttl;
-
- if (newentry)
- {
- b->synced = False;
- add_browse_cache(b);
-
- DEBUG(3,("Added cache entry %s %s(%2x) %s ttl %d\n",
- wg, name, type, inet_ntoa(ip),ttl));
- }
- else
- {
- DEBUG(3,("Updated cache entry %s %s(%2x) %s ttl %d\n",
- wg, name, type, inet_ntoa(ip),ttl));
- }
-
- return(b);
-}
-
-
-/****************************************************************************
-find a server responsible for a workgroup, and sync browse lists
-**************************************************************************/
-static void start_sync_browse_entry(struct browse_cache_record *b)
-{
- struct subnet_record *d = b->subnet;
- struct work_record *work;
-
- /* Check panic conditions - these should not be true. */
- if(b->subnet != wins_subnet) {
- DEBUG(0,
- ("start_sync_browse_entry: ERROR sync requested on non-WINS subnet.\n"));
- return;
- }
-
- if (!(work = find_workgroupstruct(d, b->group, False))) {
- DEBUG(0, ("start_sync_browse_entry: failed to get a \
-workgroup for a browse cache entry workgroup %s, server %s\n",
- b->group, b->name));
- return;
- }
-
- DEBUG(4, ("start_sync_browse_entry: Initiating %s sync with %s<0x20>, \
-workgroup %s\n",
- b->local ? "local" : "remote", b->name, b->group));
-
- /* first check whether the server we intend to sync with exists. if it
- doesn't, the server must have died. o dear. */
-
- /* see response_netbios_packet() or expire_netbios_response_entries() */
- /* We cheat here by using the my_comment field of the response_record
- struct as the workgroup name we are going to do the sync for.
- This is because the reply packet doesn't include the workgroup, but
- we need it when the reply comes back.
- */
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,
- b->local?NAME_QUERY_SYNC_LOCAL:NAME_QUERY_SYNC_REMOTE,
- b->name,0x20,0,0,0,NULL,b->group,
- False,False,b->ip,b->ip);
-
- b->synced = True;
-}
-
-
-/****************************************************************************
- search through browser list for an entry to sync with
- **************************************************************************/
-void do_browser_lists(time_t t)
-{
- struct browse_cache_record *b;
- static time_t last = 0;
-
- if (t-last < 20)
- {
- DEBUG(9,("do_browser_lists: returning due to t(%d) - last(%d) < 20\n",
- t, last));
- return; /* don't do too many of these at once! */
- /* XXXX equally this period should not be too long
- the server may die in the intervening gap */
- }
- last = t;
-
- /* pick any entry in the list, preferably one whose time is up */
- for (b = browserlist; b && b->next; b = b->next)
- {
- if (b->sync_time < t && b->synced == False) break;
- }
-
- if (b && !b->synced)
- {
- /* sync with the selected entry then remove some dead entries */
- DEBUG(4,("do_browser_lists: Initiating sync with %s, workgroup %s\n",
- b->name, b->group));
- start_sync_browse_entry(b);
- }
- else
- {
- DEBUG(9, ("do_browser_lists: no entries to sync.\n"));
- }
-
- expire_browse_cache(t - 60);
-}
-
diff --git a/source/namebrowse.doc b/source/namebrowse.doc
deleted file mode 100644
index 82713d85708..00000000000
--- a/source/namebrowse.doc
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.1
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namebrowse.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-
- 0.1 - 22jul96 Andrew.Tridgell@anu.edu.au
- tridge's comments on first revision
-*/
-
-this module deals with queueing servers that samba must sync browse
-lists with. it will always issue a name query immediately before
-actually carrying out the NetServerEnum call, to ensure that time
-is not wasted by a remote server's failure.
-
-this module was created to minimise the amount of NetServerEnum calls
-that samba may be asked to perform, by maintaining the name of a server
-for up to a minute after the NetServerEnum call was issued, and
-disallowing further NetServerEnum calls to this remote server until
-the entry is removed.
-
-samba can ask for a NetServerEnum call to be issued to grab a remote
-server's list of servers and workgroups either in its capacity as
-a domain master browser, as a local master browser.
-
-samba does not deal with becoming a backup master browser properly
-at present.
-
--------------
-NOTE FROM TRIDGE:
-
-Yes, samba can send these either in its capacity as a DMB or as a
-MB. There are only two situations:
-
-- If samba is a DMB then it should sync with the "local only" bit set
-with any master browser that has sent it a "master announce".
-
-- if samba is not a DMB then it can only sync with the DMB, and should
-not set the "local only" bit.
-
-Note that samba should never sync with other non-DMB servers when it
-is not a DMB.
-
-Try to do a sync under any other circumstances is dangerous without a
-multi-threaded nmbd. I have a print server at home that knows some SMB
-and NBT, but if you try to sync browse lists with it then it clogs up,
-and also clogs up nmbd while it times out the connection. If we
-follow the above two rules then we can't get into this sort of
-trouble as:
-
-- if we are a DMB and a master browser sends us a "master announce"
-then it is expecting to receive a NetServerEnum SMB connection soon,
-and must be capabable of handling it.
-
-- if we are not a DMB then we will only sync with the DMB, which must
-be capable of doing this stuff or things are really in a mess :-)
---------------
-
-
-/*************************************************************************
- do_browser_lists()
- *************************************************************************/
-
-this function is responsible for finding an appropriate entry in the
-sync browser cache, initiating a name query (which results in a
-NetServerEnum call if there is a positive response), and then
-removing all entries that have been actioned and have been around
-for over a minute.
-
-
-/*************************************************************************
- start_sync_browse_entry()
- *************************************************************************/
-
-this function is responsible for initiating a name query. if a
-positive response is received, then this will result in a
-NetServerEnum api call.
-
-samba will only initiate this process if it is a master browser
-for this workgroup.
-
------------
-NOTE FROM TRIDGE:
-
-I'd actually prefer to skip the name query completely if we can
-resolve the DMBs name via gethostbyname(). For the name query to work
-we either have to have WINS working, or we need to know the broadcast
-address of the network that the DMB is on. This makes us too dependent
-on too many thing being right.
-
-If the gethostbyname() fails then sure, go for a normal name query,
-but if it works then we have saved ourselves a lot of trouble and
-gained a lot of robustness.
-
-This is best handled by a generic "resolve netbios name" routine that
-tries DNS first then resorts to WINS or bcast if that fails. It also
-needs to cache the results.
--------------
-
-
-/*************************************************************************
- add_browser_entry()
- *************************************************************************/
-
-this function is responsible for adding a browser into the list of
-servers to sync browse lists with. if the server entry has already
-been added and syncing browse lists has already been initiated, it
-will not be added again.
-
-
-/*************************************************************************
- expire_browse_cache()
- *************************************************************************/
-
-this function is responsible for removing entries that have had the
-sync browse list initiated (whether that succeeded or not is beyond
-this function's scope) and have been in the cache for a while.
-
-
-/*************************************************************************
- add_browse_entry()
- *************************************************************************/
-
-this function is responsible for adding a new entry into the list
-of servers to sync browse lists with at some point in the near future.
-
-
-
-
diff --git a/source/nameconf.c b/source/nameconf.c
deleted file mode 100644
index 19068780611..00000000000
--- a/source/nameconf.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) David Chappell 1996-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 30 July 96: David.Chappell@mail.trincoll.edu
- Expanded multiple workgroup domain master browser support.
-
-*/
-
-/*
-** nameconf.c
-** These functions dispense information from smbbrowse.conf.
-**
-**
-*/
-
-#include "includes.h"
-extern int DEBUGLEVEL;
-
-extern fstring myworkgroup;
-
-#if 0
-struct smbbrowse_parms
- {
- char *name;
- BOOL (*reader)(char *string, void *toset);
- } smbbrowse_table[] =
-{
- {"preferred master", NULL},
- {"local master", NULL},
- {"domain master", NULL}
-} ;
-#endif
-
-/*
-** Structure for the list of workgroups from smbbrowse.conf. This
-** structure should only be manipulated thru the functions in this file.
-** That is why it is not defined in a header file.
-*/
-struct smbbrowse
-{
- char work_name[16]; /* workgroup name */
- char browsing_alias[16]; /* alias for our role in this workgroup */
- struct server_identity *my_names; /* a list of server name we should appear here as */
- BOOL should_workgroup_member; /* should we try to become a member of this workgroup? */
- BOOL should_local_master; /* should we try to become a master browser? */
- BOOL should_domain_master; /* should we try to become the domain master browser? */
-} ;
-
-/* The whole list */
-static struct smbbrowse *smbbrowse_workgroups = (struct smbbrowse*)NULL;
-
-/* The size of the list */
-static int array_size = 0;
-
-/* The next available space in the list */
-static int nexttoken = 0;
-
-int get_num_workgroups(void)
-{
- return nexttoken;
-}
-
-/*
-** This makes a new workgroup structure, possibly taking an
-** old one as a model.
-*/
-static struct smbbrowse *new_workgroup(struct smbbrowse *model,
- char *workgroup_name,
- char *default_name)
-{
- struct smbbrowse *new;
-
- if( ! (array_size > nexttoken) )
- {
- array_size += 10;
- smbbrowse_workgroups = (struct smbbrowse*)realloc(smbbrowse_workgroups,
- array_size * sizeof(struct smbbrowse));
- }
-
- new = &smbbrowse_workgroups[nexttoken];
-
- if(model != (struct smbbrowse *)NULL )
- memcpy(new, model, sizeof(struct smbbrowse));
- else
- memset(new, 0, sizeof(struct smbbrowse));
-
- StrnCpy(new->work_name, workgroup_name, 15);
- strupper(new->work_name);
-
- if (strequal(myworkgroup, workgroup_name))
- StrnCpy(new->browsing_alias, default_name, 15);
- else
- sprintf(new->browsing_alias, "%.14s%x", default_name, nexttoken);
- strupper(new->browsing_alias);
-
- DEBUG(4,("wg: %s alias: %s token: %x\n",
- new->work_name, new->browsing_alias, nexttoken));
-
- nexttoken++;
- return new;
-}
-
-/*
-** If fed a workgroup name, this function returns its token number.
-** If the workgroup does not exist a new token is assigned unless
-** new workgroups are not allowed.
-*/
-int conf_workgroup_name_to_token(char *workgroup_name,char *default_name)
-{
- int idx;
-
- /* Look for an existing instance. */
- for(idx=0; idx < nexttoken; idx++)
- {
- if(strequal(workgroup_name, smbbrowse_workgroups[idx].work_name))
- {
- return idx;
- }
- }
-
- /* See if creating new ones in admissable. */
- for(idx=0; idx < nexttoken; idx++)
- {
- if(strequal("*", smbbrowse_workgroups[idx].work_name))
- {
- struct smbbrowse *w = new_workgroup(&smbbrowse_workgroups[idx],
- workgroup_name, default_name);
- w->should_workgroup_member = False;
-
- return (nexttoken - 1);
- }
- }
-
- /* Not allowed */
- DEBUG(4, ("refusing to allow new workgroup\n"));
- return -1;
-}
-
-/*
-** This is a workgroups array bounds checker.
-*/
-static int range_check(int token)
-{
- if(token < 0 || token >= nexttoken)
- {
- DEBUG(0, ("range_check(): failed\n"));
- return True;
- }
-
- return False;
-}
-
-/*
-** Given a token, return the name.
-*/
-char *conf_workgroup_name(int token)
-{
- if(range_check(token))
- return (char*)NULL;
-
- return smbbrowse_workgroups[token].work_name;
-}
-
-/*
-** Given a token, return True if we should try
-** to become a master browser.
-*/
-int conf_should_workgroup_member(int token)
- {
-
- if(range_check(token))
- return False;
-
- return smbbrowse_workgroups[token].should_workgroup_member;
- }
-
-/*
-** Given a token, return True if we should try
-** to become a master browser.
-*/
-int conf_should_local_master(int token)
- {
- if(range_check(token))
- return False;
-
- return smbbrowse_workgroups[token].should_local_master;
- }
-
-/*
-** Given a token, return True if we should try
-** to become a domain master browser.
-*/
-int conf_should_domain_master(int token)
- {
- if(range_check(token))
- return False;
-
- return smbbrowse_workgroups[token].should_domain_master;
- }
-
-/*
-** Given a token, return the name.
-*/
-char *conf_browsing_alias(int token)
- {
- if(range_check(token))
- return (char*)NULL;
-
- return smbbrowse_workgroups[token].browsing_alias;
- }
-
-/*
-** Return the server comment which should be used with the
-** browsing alias.
-*/
-char *conf_browsing_alias_comment(int token)
-{
- if(range_check(token))
- return (char*) NULL;
-
- return "Browser";
- }
-
-/*
-** Given an alias name for this server, return the name of the workgroup
-** for which it is the browsing alias.
-*/
-char *conf_alias_to_workgroup(char *alias)
-{
- int x;
-
- DEBUG(4,("alias_to_workgroup: %s", alias));
-
- for(x=0; x < nexttoken; x++)
- {
- DEBUG(4,("%s ", smbbrowse_workgroups[x].browsing_alias));
-
- if(strequal(alias, smbbrowse_workgroups[x].browsing_alias))
- {
- DEBUG(4,("OK\n"));
- return smbbrowse_workgroups[x].work_name;
- }
- }
- DEBUG(4,("not found\n"));
- return (char*)NULL;
-}
-
-/*
-** Given an alias name for this server, return the name of the workgroup
-** for which it is the browsing alias.
-*/
-int conf_alias_to_token(char *alias)
-{
- int x;
-
- for(x=0; x < nexttoken; x++)
- {
- if(strequal(alias, smbbrowse_workgroups[x].browsing_alias))
- {
- return x;
- }
- }
- return -1;
-}
-
-/*
-** Since there is no smbbrowse.conf file, we will fill in
-** the structures with information from the smb.conf file.
-*/
-static void default_smbbrowse_conf(char *default_name)
-{
- struct smbbrowse *w;
-
- /* The workgroup specified in smb.conf */
- w = new_workgroup((struct smbbrowse *)NULL, myworkgroup, default_name);
- w->should_local_master = lp_preferred_master();
- w->should_domain_master = lp_domain_master();
- w->should_workgroup_member = True;
-
- /* default action: allow any new workgroup to be added */
- w = new_workgroup((struct smbbrowse *)NULL, "*", default_name);
- w->should_local_master = False;
- w->should_domain_master = False;
- w->should_workgroup_member = False;
-}
-
-/*
-** This function is called from main().
-*/
-void read_smbbrowse_conf(char *default_name)
-{
- FILE *f = fopen(BROWSEFILE,"r");
- if (f)
- {
- while (!feof(f))
- {
- pstring line;
- char *ptr;
- int count = 0;
-
- pstring work_name;
- struct smbbrowse *w;
-
- if (!fgets_slash(line,sizeof(pstring),f)) continue;
-
- if (*line == '#') continue;
-
- strcpy(work_name,"");
-
- ptr = line;
-
- if (next_token(&ptr, work_name, NULL)) ++count;
-
- if (count <= 0) continue;
-
- w = new_workgroup((struct smbbrowse *)NULL, work_name, default_name);
- w->should_local_master = lp_local_master();
- w->should_domain_master = lp_domain_master();
- w->should_workgroup_member = True;
- }
-
- fclose(f);
- }
- else
- {
- DEBUG(2,("Can't open browse configuration file %s\n",BROWSEFILE));
- }
- default_smbbrowse_conf(default_name);
-}
-
-
diff --git a/source/namedbname.c b/source/namedbname.c
deleted file mode 100644
index 51571d786a8..00000000000
--- a/source/namedbname.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: namedbname.c
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- created module namedbname containing name database functions
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern struct in_addr ipzero;
-extern struct in_addr wins_ip;
-extern BOOL updatedlists;
-
-extern struct subnet_record *subnetlist;
-
-#define WINS_LIST "wins.dat"
-
-uint16 nb_type = 0; /* samba's NetBIOS name type */
-
-
-/****************************************************************************
- samba's NetBIOS name type
-
- XXXX maybe functionality could be set: B, M, P or H name registration
- and resolution could be set through nb_type. just a thought.
- ****************************************************************************/
-void set_samba_nb_type(void)
-{
- if (lp_wins_support() || (*lp_wins_server()))
- {
- nb_type = NB_MFLAG; /* samba is a 'hybrid' node type */
- }
- else
- {
- nb_type = NB_BFLAG; /* samba is broadcast-only node type */
- }
-}
-
-
-/****************************************************************************
- true if two netbios names are equal
-****************************************************************************/
-BOOL name_equal(struct nmb_name *n1,struct nmb_name *n2)
-{
- return n1->name_type == n2->name_type &&
- strequal(n1->name ,n2->name ) &&
- strequal(n1->scope,n2->scope);
-}
-
-
-/****************************************************************************
- true if the netbios name is ^1^2__MSBROWSE__^2^1
-
- note: this name is registered if as a master browser or backup browser
- you are responsible for a workgroup (when you announce a domain by
- broadcasting on your local subnet, you announce it as coming from this
- name: see announce_host()).
-
- **************************************************************************/
-BOOL ms_browser_name(char *name, int type)
-{
- return strequal(name,MSBROWSE) && type == 0x01;
-}
-
-
-/****************************************************************************
- add a netbios name into the namelist
- **************************************************************************/
-static void add_name(struct subnet_record *d, struct name_record *n)
-{
- struct name_record *n2;
-
- if (!d) return;
-
- if (!d->namelist)
- {
- d->namelist = n;
- n->prev = NULL;
- n->next = NULL;
- return;
- }
-
- for (n2 = d->namelist; n2->next; n2 = n2->next) ;
-
- n2->next = n;
- n->next = NULL;
- n->prev = n2;
-
- if((d == wins_subnet) && lp_wins_support())
- updatedlists = True;
-}
-
-
-/****************************************************************************
- remove a name from the namelist. The pointer must be an element just
- retrieved
- **************************************************************************/
-void remove_name(struct subnet_record *d, struct name_record *n)
-{
- struct name_record *nlist;
- if (!d) return;
-
- nlist = d->namelist;
-
- while (nlist && nlist != n) nlist = nlist->next;
-
- if (nlist)
- {
- if (nlist->next) nlist->next->prev = nlist->prev;
- if (nlist->prev) nlist->prev->next = nlist->next;
-
- if(nlist == d->namelist)
- d->namelist = nlist->next;
-
- if(nlist->ip_flgs != NULL)
- free(nlist->ip_flgs);
- free(nlist);
- }
-
- if((d == wins_subnet) && lp_wins_support())
- updatedlists = True;
-}
-
-
-/****************************************************************************
- find a name in a namelist.
- **************************************************************************/
-struct name_record *find_name(struct name_record *n,
- struct nmb_name *name, int search)
-{
- struct name_record *ret;
-
- for (ret = n; ret; ret = ret->next)
- {
- if (name_equal(&ret->name,name))
- {
- /* self search: self names only */
- if ((search&FIND_SELF) == FIND_SELF && ret->source != SELF)
- {
- continue;
- }
- DEBUG(9,("find_name: found name %s(%02x)\n",
- name->name, name->name_type));
- return ret;
- }
- }
- DEBUG(9,("find_name: name %s(%02x) NOT FOUND\n", name->name,
- name->name_type));
- return NULL;
-}
-
-
-/****************************************************************************
- find a name in the domain database namelist
- search can be any of:
- FIND_SELF - look exclusively for names the samba server has added for itself
- FIND_LOCAL - look for names in the local subnet record.
- FIND_WINS - look for names in the WINS record
- **************************************************************************/
-struct name_record *find_name_search(struct subnet_record **d,
- struct nmb_name *name,
- int search, struct in_addr ip)
-{
- if (d == NULL) return NULL; /* bad error! */
-
- if (search & FIND_LOCAL) {
- if (*d != NULL) {
- struct name_record *n = find_name((*d)->namelist, name, search);
- DEBUG(4,("find_name on local: %s %s search %x\n",
- namestr(name),inet_ntoa(ip), search));
- if (n) return n;
- }
- }
-
- if (!(search & FIND_WINS)) return NULL;
-
- /* find WINS subnet record. */
- *d = wins_subnet;
-
- if (*d == NULL) return NULL;
-
- DEBUG(4,("find_name on WINS: %s %s search %x\n",
- namestr(name),inet_ntoa(ip), search));
- return find_name((*d)->namelist, name, search);
-}
-
-
-/****************************************************************************
- dump a copy of the name table
- **************************************************************************/
-void dump_names(void)
-{
- struct name_record *n;
- fstring fname, fnamenew;
- time_t t = time(NULL);
-
- FILE *f;
-
- if(lp_wins_support() == False || wins_subnet == 0)
- return;
-
- fstrcpy(fname,lp_lockdir());
- trim_string(fname,NULL,"/");
- strcat(fname,"/");
- strcat(fname,WINS_LIST);
- fstrcpy(fnamenew,fname);
- strcat(fnamenew,".");
-
- f = fopen(fnamenew,"w");
-
- if (!f)
- {
- DEBUG(3,("Can't open %s - %s\n",fnamenew,strerror(errno)));
- return;
- }
-
- DEBUG(4,("Dump of WINS name table:\n"));
-
- for (n = wins_subnet->namelist; n; n = n->next)
- {
- int i;
-
- DEBUG(4,("%15s ", inet_ntoa(wins_subnet->bcast_ip)));
- DEBUG(4,("%15s ", inet_ntoa(wins_subnet->mask_ip)));
- DEBUG(4,("%-19s TTL=%ld ",
- namestr(&n->name),
- n->death_time?n->death_time-t:0));
-
- for (i = 0; i < n->num_ips; i++)
- {
- DEBUG(4,("%15s NB=%2x source=%d",
- inet_ntoa(n->ip_flgs[i].ip),
- n->ip_flgs[i].nb_flags,n->source));
-
- }
- DEBUG(4,("\n"));
-
- if (f && ((n->source == REGISTER) || (n->source == SELF)))
- {
- /* XXXX i have little imagination as to how to output nb_flags as
- anything other than as a hexadecimal number :-) */
-
- fprintf(f, "%s#%02x %ld ",
- n->name.name,n->name.name_type, /* XXXX ignore scope for now */
- n->death_time);
-
- for (i = 0; i < n->num_ips; i++)
- {
- fprintf(f, "%s %2x%c ",
- inet_ntoa(n->ip_flgs[i].ip),
- n->ip_flgs[i].nb_flags, (n->source == REGISTER ? 'R' : 'S'));
- }
- fprintf(f, "\n");
- }
-
- }
-
- fclose(f);
- unlink(fname);
- chmod(fnamenew,0644);
- rename(fnamenew,fname);
-
- DEBUG(3,("Wrote wins database %s\n",fname));
-}
-
-
-/****************************************************************************
- load a netbios name database file
-
- XXXX we cannot cope with loading Internet Group names, yet
- ****************************************************************************/
-void load_netbios_names(void)
-{
- struct subnet_record *d = wins_subnet;
- fstring fname;
-
- FILE *f;
- pstring line;
-
- if (!d) return;
-
- fstrcpy(fname,lp_lockdir());
- trim_string(fname,NULL,"/");
- strcat(fname,"/");
- strcat(fname,WINS_LIST);
-
- f = fopen(fname,"r");
-
- if (!f) {
- DEBUG(2,("Can't open wins database file %s\n",fname));
- return;
- }
-
- while (!feof(f))
- {
- pstring name_str, ip_str, ttd_str, nb_flags_str;
-
- pstring name;
- int type = 0;
- unsigned int nb_flags;
- time_t ttd;
- struct in_addr ipaddr;
-
- enum name_source source;
-
- char *ptr;
- int count = 0;
-
- char *p;
-
- if (!fgets_slash(line,sizeof(pstring),f)) continue;
-
- if (*line == '#') continue;
-
- ptr = line;
-
- if (next_token(&ptr,name_str ,NULL)) ++count;
- if (next_token(&ptr,ttd_str ,NULL)) ++count;
- if (next_token(&ptr,ip_str ,NULL)) ++count;
- if (next_token(&ptr,nb_flags_str,NULL)) ++count;
-
- if (count <= 0) continue;
-
- if (count != 4) {
- DEBUG(0,("Ill formed wins line"));
- DEBUG(0,("[%s]: name#type abs_time ip nb_flags\n",line));
- continue;
- }
-
- /* Deal with SELF or REGISTER name encoding. Default is REGISTER
- for compatibility with old nmbds. */
- if(nb_flags_str[strlen(nb_flags_str)-1] == 'S')
- {
- DEBUG(5,("Ignoring SELF name %s\n", line));
- continue;
- }
-
- if(nb_flags_str[strlen(nb_flags_str)-1] == 'R')
- nb_flags_str[strlen(nb_flags_str)-1] = '\0';
-
- /* netbios name. # divides the name from the type (hex): netbios#xx */
- pstrcpy(name,name_str);
-
- p = strchr(name,'#');
-
- if (p) {
- *p = 0;
- sscanf(p+1,"%x",&type);
- }
-
- /* decode the netbios flags (hex) and the time-to-die (seconds) */
- sscanf(nb_flags_str,"%x",&nb_flags);
- sscanf(ttd_str,"%ld",&ttd);
-
- ipaddr = *interpret_addr2(ip_str);
-
- if (ip_equal(ipaddr,ipzero)) {
- source = SELF;
- }
- else
- {
- source = REGISTER;
- }
-
- DEBUG(4, ("add WINS line: %s#%02x %ld %s %2x\n",
- name,type, ttd, inet_ntoa(ipaddr), nb_flags));
-
- /* add all entries that have 60 seconds or more to live */
- if (ttd - 60 > time(NULL) || ttd == 0)
- {
- time_t t = (ttd?ttd-time(NULL):0) / 3;
-
- /* add netbios entry read from the wins.dat file. IF it's ok */
- add_netbios_entry(d,name,type,nb_flags,t,source,ipaddr,True,True);
- }
- }
-
- fclose(f);
-}
-
-
-/****************************************************************************
- remove an entry from the name list
- ****************************************************************************/
-void remove_netbios_name(struct subnet_record *d,
- char *name,int type, enum name_source source,
- struct in_addr ip)
-{
- struct nmb_name nn;
- struct name_record *n;
-
- make_nmb_name(&nn, name, type, scope);
- n = find_name_search(&d, &nn, FIND_LOCAL, ip);
-
- if (n && n->source == source) remove_name(d,n);
-}
-
-
-/****************************************************************************
- add an entry to the name list.
-
- this is a multi-purpose function.
-
- it adds samba's own names in to its records on each interface, keeping a
- record of whether it is a master browser, domain master, or WINS server.
-
- it also keeps a record of WINS entries.
-
- ****************************************************************************/
-struct name_record *add_netbios_entry(struct subnet_record *d,
- char *name, int type, int nb_flags,
- int ttl, enum name_source source, struct in_addr ip,
- BOOL new_only,BOOL wins)
-{
- struct name_record *n;
- struct name_record *n2=NULL;
- struct subnet_record *found_subnet = 0;
- int search = 0;
- BOOL self = (source == SELF);
-
- /* add the name to the WINS list if the name comes from a directed query */
- search |= wins ? FIND_WINS : FIND_LOCAL;
-
- /* If it's a local search then we need to set the subnet
- we are looking at. */
- if(search & FIND_LOCAL)
- found_subnet = d;
-
- /* search for SELF names only */
- search |= self ? FIND_SELF : 0;
-
- if (!self)
- {
- if (!wins && (type != 0x1b))
- {
- /* the only broadcast (non-WINS) names we are adding are ours
- (SELF) and Domain Master type names */
- return NULL;
- }
- if(wins && (type == 0x1d))
- {
- /* Do not allow any 0x1d names to be registered in a WINS,
- database although we return success for them.
- */
- return NULL;
- }
- }
-
- n = (struct name_record *)malloc(sizeof(*n));
- if (!n) return(NULL);
-
- bzero((char *)n,sizeof(*n));
-
- n->num_ips = 1; /* XXXX ONLY USE THIS FUNCTION FOR ONE ENTRY */
- n->ip_flgs = (struct nmb_ip*)malloc(sizeof(*n->ip_flgs) * n->num_ips);
- if (!n->ip_flgs)
- {
- free(n);
- return NULL;
- }
-
- bzero((char *)n->ip_flgs, sizeof(*n->ip_flgs) * n->num_ips);
-
- make_nmb_name(&n->name,name,type,scope);
-
- if ((n2 = find_name_search(&found_subnet, &n->name, search, new_only?ipzero:ip)))
- {
- free(n->ip_flgs);
- free(n);
- if (new_only || (n2->source==SELF && source!=SELF)) return n2;
- n = n2;
- d = found_subnet;
- }
-
- if (ttl)
- n->death_time = time(NULL)+ttl*3;
- n->refresh_time = time(NULL)+GET_TTL(ttl);
-
- /* XXXX only one entry expected with this function */
- n->ip_flgs[0].ip = ip;
- n->ip_flgs[0].nb_flags = nb_flags;
-
- n->source = source;
-
- if (!n2) add_name(d,n);
-
- DEBUG(3,("Added netbios name %s at %s ttl=%d nb_flags=%2x to interface %s\n",
- namestr(&n->name),inet_ntoa(ip),ttl,nb_flags,
- ip_equal(d->bcast_ip, wins_ip) ? "WINS" : (char *)inet_ntoa(d->bcast_ip)));
-
- return(n);
-}
-
-
-/*******************************************************************
- expires old names in the namelist
- ******************************************************************/
-void expire_names(time_t t)
-{
- struct name_record *n;
- struct name_record *next;
- struct subnet_record *d;
-
- /* expire old names */
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- for (n = d->namelist; n; n = next)
- {
- next = n->next;
- if (n->death_time && n->death_time < t)
- {
- if (n->source == SELF)
- {
- DEBUG(3,("not expiring SELF name %s\n", namestr(&n->name)));
- n->death_time += 300;
- continue;
- }
- DEBUG(3,("Removing dead name %s\n", namestr(&n->name)));
-
- if (n->prev) n->prev->next = n->next;
- if (n->next) n->next->prev = n->prev;
-
- if (d->namelist == n) d->namelist = n->next;
-
- if(n->ip_flgs != NULL)
- free(n->ip_flgs);
- free(n);
- }
- }
- }
-}
-
-
-/***************************************************************************
- assume a WINS name is a dns name, and do a gethostbyname() on it.
- ****************************************************************************/
-struct name_record *dns_name_search(struct nmb_name *question, int Time)
-{
- int name_type = question->name_type;
- char *qname = question->name;
- BOOL dns_type = (name_type == 0x20 || name_type == 0);
- struct in_addr dns_ip;
-
- if (wins_subnet == NULL)
- return NULL;
-
- DEBUG(3,("Search for %s - ", namestr(question)));
-
- /* only do DNS lookups if the query is for type 0x20 or type 0x0 */
- if (!dns_type)
- {
- DEBUG(3,("types 0x20 0x0 only: name not found\n"));
- return NULL;
- }
-
- /* look it up with DNS */
- dns_ip.s_addr = interpret_addr(qname);
-
- if (!dns_ip.s_addr)
- {
- /* no luck with DNS. We could possibly recurse here XXXX */
- DEBUG(3,("not found. no recursion.\n"));
- /* add the fail to WINS cache of names. give it 1 hour in the cache */
- add_netbios_entry(wins_subnet,qname,name_type,NB_ACTIVE,60*60,DNSFAIL,dns_ip,
- True, True);
- return NULL;
- }
-
- DEBUG(3,("found with DNS: %s\n", inet_ntoa(dns_ip)));
-
- /* add it to our WINS cache of names. give it 2 hours in the cache */
- return add_netbios_entry(wins_subnet,qname,name_type,NB_ACTIVE,2*60*60,DNS,dns_ip,
- True,True);
-}
diff --git a/source/namedbname.doc b/source/namedbname.doc
deleted file mode 100644
index 34a791dbb89..00000000000
--- a/source/namedbname.doc
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namedbname.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module deals with the NetBIOS name database for samba. it deals
-directly with adding, removing, finding, loading and saving of names.
-
-/*************************************************************************
- search_for_name()
- *************************************************************************/
-
-this function is responsible for finding a name in the appropriate part
-of samba's NetBIOS name database. if the name cannot be found, then it
-should look the name up using DNS. later modifications will be to
-forward the request on to another WINS server, should samba not be able
-to find out about the requested name (this will be implemented through
-issuing a new type of samba 'state').
-
-the name is first searched for in the NetBIOS cache. if it cannot be
-found, then it if the name looks like it's a server-type name (0x20
-0x0 or 0x1b) then DNS is used to look for the name.
-
-if DNS fails, then a record of this failure is kept. if it succeeds, then
-a new NetBIOS entry is added.
-
-the successfully found name is returned. on failure, NULL is returned.
-
-
-/*************************************************************************
- expire_names()
- *************************************************************************/
-
-this function is responsible for removing old NetBIOS names from its
-database. no further action is required.
-
-for over-zealous WINS systems, the use of query_refresh_names() is
-recommended. this function initiates polling of hosts that have
-registered with samba in its capacity as a WINS server. an alternative
-means to achieve the same end as query_refresh_names() is to
-reduce the time to live when the name is registered with samba,
-except that in this instance the responsibility for refreshing the
-name is with the owner of the name, not the server with which the name
-is registered.
-
-
-/*************************************************************************
- add_netbios_entry()
- *************************************************************************/
-
-this function is responsible for adding or updating a NetBIOS name
-in the database. into the local interface records, the only names
-that will be added are those of domain master browsers and
-samba's own names. into the WINS records, all names are added.
-
-the name to be added / updated will be looked up in the records.
-if it is found, then we will not overwrite the entry if the flag
-'newonly' is True, or if the name is being added as a non-SELF
-(non-samba) name and the records indicate that samba owns the
-name.
-
-otherwise, the name is added or updated with the new details.
-
-
-/*************************************************************************
- remove_netbios_entry()
- *************************************************************************/
-
-this function is responsible for removing a NetBIOS entry from
-the database. the name is searched for in the records using
-find_name_search(). if the ip is zero, then the ip is ignored.
-
-the name is removed if the expected source (e.g SELF, REGISTER)
-matches that in the database.
-
-
-/*************************************************************************
- load_netbios_names()
- *************************************************************************/
-
-this function is responsible for loading any NetBIOS names that samba,
-in its WINS capacity, has written out to disk. all the relevant details
-are recorded in this file, including the time-to-live. should the
-time left to live be small, the name is not added back in to samba's
-WINS database.
-
-
-/*************************************************************************
- dump_names()
- *************************************************************************/
-
-this function is responsible for outputting NetBIOS names in two formats.
-firstly, as debugging information, and secondly, all names that have been
-registered with samba in its capacity as a WINS server are written to
-disk.
-
-writing all WINS names allows two things. firstly, if samba's NetBIOS
-daemon dies or is terminated, on restarting the daemon most if not all
-of the registered WINS names will be preserved (which is a good reason
-why query_netbios_names() should be used).
-
-
-/*************************************************************************
- find_name_search()
- *************************************************************************/
-
-this function is a wrapper around find_name(). find_name_search() can
-be told whether to search for the name in a local subnet structure or
-in the WINS database. on top of this, it can be told to search only
-for samba's SELF names.
-
-if it finds the name in the WINS database, it will set the subnet_record
-and also return the name it finds.
-
-
-/*************************************************************************
- find_name()
- *************************************************************************/
-
-this function is a low-level search function that searches a single
-interface's NetBIOS records for a name. if the ip to be found is
-zero then the ip address is ignored. this is to enable a name to
-be found without knowing its ip address, and also to find the exact
-name if a large number of group names are added with different ip
-addresses.
-
-
-/*************************************************************************
- remove_name()
- *************************************************************************/
-
-this function is responsible for removing a specific NetBIOS entry
-from a subnet list's records. only if the pointer to the entry is
-in the list will the name be removed.
-
-
-/*************************************************************************
- add_name()
- *************************************************************************/
-
-this function is responsible for adding a NetBIOS entry into a
-subnet list's records.
-
-
-/*************************************************************************
- ms_browser_name()
- *************************************************************************/
-
-this function returns True if the NetBIOS name passed to it is
-^1^2__MSBROWSE__^2^1
-
-
-/*************************************************************************
- name_equal()
- *************************************************************************/
-
-this function returns True if the two NetBIOS names passed to it
-match in name, type and scope: the NetBIOS names are equal.
-
-
diff --git a/source/namedbresp.c b/source/namedbresp.c
deleted file mode 100644
index 86d7eddbd41..00000000000
--- a/source/namedbresp.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios library routines
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: namedbresp.c
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern struct subnet_record *subnetlist;
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern pstring myname;
-extern struct in_addr ipzero;
-
-int num_response_packets = 0;
-
-/***************************************************************************
- add an expected response record into the list
- **************************************************************************/
-void add_response_record(struct subnet_record *d,
- struct response_record *n)
-{
- struct response_record *n2;
-
- if (!d) return;
-
- num_response_packets++; /* count of total number of packets still around */
-
- DEBUG(4,("adding response record id:%d num_records:%d\n",
- n->response_id, num_response_packets));
-
- if (!d->responselist)
- {
- d->responselist = n;
- n->prev = NULL;
- n->next = NULL;
- return;
- }
-
- for (n2 = d->responselist; n2->next; n2 = n2->next) ;
-
- n2->next = n;
- n->next = NULL;
- n->prev = n2;
-}
-
-
-/***************************************************************************
- remove an expected response record from the list
- **************************************************************************/
-void remove_response_record(struct subnet_record *d,
- struct response_record *n)
-{
- if (!d) return;
-
- if (n->prev) n->prev->next = n->next;
- if (n->next) n->next->prev = n->prev;
-
- if (d->responselist == n) d->responselist = n->next;
-
- free(n);
-
- num_response_packets--; /* count of total number of packets still around */
-}
-
-
-/****************************************************************************
- create a name query response record
- **************************************************************************/
-struct response_record *make_response_queue_record(enum state_type state,
- int id,uint16 fd,
- int quest_type, char *name,int type, int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- BOOL bcast,BOOL recurse,
- struct in_addr send_ip, struct in_addr reply_to_ip)
-{
- struct response_record *n;
-
- if (!name || !name[0]) return NULL;
-
- if (!(n = (struct response_record *)malloc(sizeof(*n))))
- return(NULL);
-
- bzero((char *)n, sizeof(*n));
-
- n->response_id = id;
- n->state = state;
- n->fd = fd;
- n->quest_type = quest_type;
- make_nmb_name(&n->name, name, type, scope);
- n->nb_flags = nb_flags;
- n->ttl = ttl;
- n->server_type = server_type;
- n->bcast = bcast;
- n->recurse = recurse;
- n->send_ip = send_ip;
- n->reply_to_ip = reply_to_ip;
- if(my_name)
- StrnCpy(n->my_name, my_name, sizeof(n->my_name)-1);
- else
- *n->my_name = 0;
- if(my_comment)
- StrnCpy(n->my_comment, my_comment, sizeof(n->my_comment)-1);
- else
- *n->my_comment = 0;
- n->repeat_interval = 1; /* XXXX should be in ms */
- n->repeat_count = 3; /* 3 retries */
- n->repeat_time = time(NULL) + n->repeat_interval; /* initial retry time */
-
- n->num_msgs = 0;
-
- return n;
-}
-
-
-/****************************************************************************
- find a response in a subnet's name query response list.
- **************************************************************************/
-struct response_record *find_response_record(struct subnet_record **d,
- uint16 id)
-{
- struct response_record *n;
-
- if (!d) return NULL;
-
- for ((*d) = FIRST_SUBNET; (*d); (*d) = NEXT_SUBNET_INCLUDING_WINS(*d))
- {
- for (n = (*d)->responselist; n; n = n->next)
- {
- if (n->response_id == id) {
- DEBUG(4, ("found response record on %s: %d\n",
- inet_ntoa((*d)->bcast_ip), id));
- return n;
- }
- }
- }
-
- *d = NULL;
-
- return NULL;
-}
-
-
diff --git a/source/namedbresp.doc b/source/namedbresp.doc
deleted file mode 100644
index a54c0702758..00000000000
--- a/source/namedbresp.doc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.1
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namedbresp.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-
- 0.1 - 22jul96 Andrew.Tridgell@anu.edu.au
- tridge's comments on first revision
-*/
-
-module namedbresp deals with the maintenance of the list of expected
-responses - creating, finding and removal.
-
-module nameresp deals with the initial transmission, re-transmission
-and time-out of netbios response records.
-
-
-/*************************************************************************
- find_response_record()
- *************************************************************************/
-
-this function is responsible for matching the unique response transaction
-id with an expected response record. as a side-effect of this search,
-it will find the subnet (or the WINS pseudo-subnet) that samba expected
-the response to come from.
-
-
-/*************************************************************************
- make_response_queue_record()
- *************************************************************************/
-
-this function is responsible for creating a response record, which will
-be queued awaiting a response.
-
-the number of retries is set to 3, and the retry period set to 1 second.
-if no response is received, then the packet is re-transmitted, which is
-why so much information is stored in the response record.
-
-the number of expected responses queued is kept, so listen_for_packets()
-knows it must time-out after 1 second if one or more responses are
-expected.
-
-
-/*************************************************************************
- remove_response_record()
- *************************************************************************/
-
-this function is responsible for removing a response record from the
-expected response queue. the number of expected responses is decreased.
-
-
-/*************************************************************************
- add_response_record()
- *************************************************************************/
-
-this function is responsible for adding the response record created by
-make_response_queue_record() into the appropriate response record queue.
-
-
------------------
-NOTE FROM TRIDGE:
-
-namedbresp.c is interesting because it implements a novel way of
-getting most of the advantages of a multi-threaded nmbd daemon without
-the portability problems.
-
-The NBT specs (rfc1001/1002) talk about the 16 bit IDs in the packets
-as being used to ensure that packets are unique, and to stop packets
-from being confused. It suggests incrementing the ID by 1 each time.
-
-Instead Luke uses these IDs to identify individual threads of control
-in nmbd. So when nmbd sends out a NBT packet as part of some complex
-processing, it adds to a linked list the information required to
-continue the processing when the reply comes in (or it times
-out). When a reply arrives this list can be searched to find the
-matching query and the next step in the processing can be carried out.
-
-This is really good stuff, and allows for much more complex behaviour
-than was possible with the old nmbd.
-----------------
diff --git a/source/namedbserver.c b/source/namedbserver.c
deleted file mode 100644
index 9223cb6ce6a..00000000000
--- a/source/namedbserver.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- created module namedbserver containing server database functions
-
-*/
-
-#include "includes.h"
-#include "smb.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern int DEBUGLEVEL;
-
-extern pstring myname;
-extern fstring myworkgroup;
-
-/* this is our domain/workgroup/server database */
-extern struct subnet_record *subnetlist;
-
-extern BOOL updatedlists;
-
-
-/*******************************************************************
- expire old servers in the serverlist
- time of -1 indicates everybody dies except those with time of 0
- remove_all_servers indicates everybody dies.
- ******************************************************************/
-void remove_old_servers(struct work_record *work, time_t t,
- BOOL remove_all)
-{
- struct server_record *s;
- struct server_record *nexts;
-
- /* expire old entries in the serverlist */
- for (s = work->serverlist; s; s = nexts)
- {
- if (remove_all || (s->death_time && (t == -1 || s->death_time < t)))
- {
- DEBUG(3,("Removing dead server %s\n",s->serv.name));
- updatedlists = True;
- nexts = s->next;
-
- if (s->prev) s->prev->next = s->next;
- if (s->next) s->next->prev = s->prev;
-
- if (work->serverlist == s)
- work->serverlist = s->next;
-
- free(s);
- }
- else
- {
- nexts = s->next;
- }
- }
-}
-
-
-/***************************************************************************
- add a server into the list
- **************************************************************************/
-static void add_server(struct work_record *work,struct server_record *s)
-{
- struct server_record *s2;
-
- if (!work->serverlist) {
- work->serverlist = s;
- s->prev = NULL;
- s->next = NULL;
- return;
- }
-
- for (s2 = work->serverlist; s2->next; s2 = s2->next) ;
-
- s2->next = s;
- s->next = NULL;
- s->prev = s2;
-}
-
-
-/****************************************************************************
- find a server in a server list.
- **************************************************************************/
-struct server_record *find_server(struct work_record *work, char *name)
-{
- struct server_record *ret;
-
- if (!work) return NULL;
-
- for (ret = work->serverlist; ret; ret = ret->next)
- {
- if (strequal(ret->serv.name,name))
- {
- return ret;
- }
- }
- return NULL;
-}
-
-
-/****************************************************************************
- add a server entry
- ****************************************************************************/
-struct server_record *add_server_entry(struct subnet_record *d,
- struct work_record *work,
- char *name,int servertype,
- int ttl,char *comment,
- BOOL replace)
-{
- BOOL newentry=False;
- struct server_record *s;
-
- if (name[0] == '*')
- {
- return (NULL);
- }
-
- s = find_server(work, name);
-
- if (s && !replace)
- {
- DEBUG(4,("Not replacing %s\n",name));
- return(s);
- }
-
- if (!s || s->serv.type != servertype || !strequal(s->serv.comment, comment))
- updatedlists=True;
-
- if (!s)
- {
- newentry = True;
- s = (struct server_record *)malloc(sizeof(*s));
-
- if (!s) return(NULL);
-
- bzero((char *)s,sizeof(*s));
- }
-
-
- /* update the entry */
- StrnCpy(s->serv.name,name,sizeof(s->serv.name)-1);
- StrnCpy(s->serv.comment,comment,sizeof(s->serv.comment)-1);
- strupper(s->serv.name);
- s->serv.type = servertype;
- s->death_time = servertype ? (ttl?time(NULL)+ttl*3:0) : (time(NULL)-1);
-
- /* for a domain entry, the comment field refers to the server name */
-
- if (s->serv.type & SV_TYPE_DOMAIN_ENUM) strupper(s->serv.comment);
-
- if (newentry)
- {
- add_server(work, s);
-
- DEBUG(3,("Added "));
- }
- else
- {
- DEBUG(3,("Updated "));
- }
-
- DEBUG(3,("server entry %s of type %x (%s) to %s %s\n",
- name,servertype,comment,
- work->work_group,inet_ntoa(d->bcast_ip)));
-
- return(s);
-}
-
-
-/*******************************************************************
- expire old servers in the serverlist
- ******************************************************************/
-void expire_servers(time_t t)
-{
- struct subnet_record *d;
-
- for (d = FIRST_SUBNET; d ; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *work;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- remove_old_servers(work, t, False);
- }
- }
-}
-
diff --git a/source/namedbsubnet.c b/source/namedbsubnet.c
deleted file mode 100644
index c6663d71fd4..00000000000
--- a/source/namedbsubnet.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- created module namedbsubnet containing subnet database functions
-
-*/
-
-#include "includes.h"
-#include "smb.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern int DEBUGLEVEL;
-
-extern struct in_addr wins_ip;
-extern struct in_addr ipzero;
-
-extern pstring myname;
-extern fstring myworkgroup;
-extern char **my_netbios_names;
-
-BOOL updatedlists = True;
-int updatecount = 0;
-
-/* local interfaces structure */
-extern struct interface *local_interfaces;
-
-/* this is our domain/workgroup/server database */
-struct subnet_record *subnetlist = NULL;
-
-/* WINS subnet - keep this separate so enumeration code doesn't
- run onto it by mistake. */
-struct subnet_record *wins_subnet = NULL;
-
-extern uint16 nb_type; /* samba's NetBIOS name type */
-
-/****************************************************************************
- add a domain into the list
- **************************************************************************/
-static void add_subnet(struct subnet_record *d)
-{
- struct subnet_record *d2;
-
- if (!subnetlist)
- {
- subnetlist = d;
- d->prev = NULL;
- d->next = NULL;
- return;
- }
-
- for (d2 = subnetlist; d2->next; d2 = d2->next);
-
- d2->next = d;
- d->next = NULL;
- d->prev = d2;
-}
-
-
-/****************************************************************************
- find a subnet in the subnetlist - not including WINS.
- **************************************************************************/
-struct subnet_record *find_subnet(struct in_addr bcast_ip)
-{
- struct subnet_record *d;
-
- /* search through subnet list for broadcast/netmask that matches
- the source ip address. */
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- if (same_net(bcast_ip, d->bcast_ip, d->mask_ip))
- return d;
- }
-
- return (NULL);
-}
-
-
-/****************************************************************************
- finds the appropriate subnet structure. directed packets (non-bcast) are
- assumed to come from a point-to-point (P or M node), and so the subnet we
- return in this instance is the WINS 'pseudo-subnet' with ip 255.255.255.255
- ****************************************************************************/
-struct subnet_record *find_req_subnet(struct in_addr ip, BOOL bcast)
-{
- if (bcast)
- {
- /* identify the subnet the broadcast request came from */
- return find_subnet(*iface_bcast(ip));
- }
- /* Return the subnet with the pseudo-ip of 255.255.255.255 */
- return wins_subnet;
-}
-
-/****************************************************************************
- find a subnet in the subnetlist - if the subnet is not found
- then return the WINS subnet.
- **************************************************************************/
-struct subnet_record *find_subnet_all(struct in_addr bcast_ip)
-{
- struct subnet_record *d = find_subnet(bcast_ip);
- if(!d)
- return wins_subnet;
- return d;
-}
-
-/****************************************************************************
- create a domain entry
- ****************************************************************************/
-static struct subnet_record *make_subnet(struct in_addr bcast_ip, struct in_addr mask_ip, BOOL add)
-{
- struct subnet_record *d;
- d = (struct subnet_record *)malloc(sizeof(*d));
-
- if (!d) return(NULL);
-
- bzero((char *)d,sizeof(*d));
-
- DEBUG(4, ("making subnet %s ", inet_ntoa(bcast_ip)));
- DEBUG(4, ("%s\n", inet_ntoa(mask_ip)));
-
- d->bcast_ip = bcast_ip;
- d->mask_ip = mask_ip;
- d->workgrouplist = NULL;
-
- if(add)
- add_subnet(d);
-
- return d;
-}
-
-/****************************************************************************
- add a domain entry. creates a workgroup, if necessary, and adds the domain
- to the named a workgroup.
- ****************************************************************************/
-static struct subnet_record *add_subnet_entry(struct in_addr bcast_ip,
- struct in_addr mask_ip, char *name,
- BOOL create_subnets, BOOL add)
-{
- struct subnet_record *d = NULL;
-
- if (zero_ip(bcast_ip))
- bcast_ip = *iface_bcast(bcast_ip);
-
- /* Note that we should also add into the WINS subnet as add_subnet_entry
- should be called to add NetBIOS names and server entries on all
- interfaces, including the WINS interface
- */
-
- if(create_subnets == True)
- {
- /* Create new subnets. */
- if((d = make_subnet(bcast_ip, mask_ip, add)) == NULL)
- {
- DEBUG(0,("add_subnet_entry: Unable to create subnet %s\n",
- inet_ntoa(bcast_ip) ));
- return NULL;
- }
- return d;
- }
- if(ip_equal(bcast_ip, wins_ip))
- return wins_subnet;
- return find_subnet(bcast_ip);
-}
-
-/****************************************************************************
- Add a workgroup into a subnet, and if it's our primary workgroup,
- add the required names to it.
-**************************************************************************/
-
-void add_workgroup_to_subnet( struct subnet_record *d, char *group)
-{
- struct work_record *w = NULL;
-
- DEBUG(5,("add_workgroup_to_subnet: Adding workgroup %s to subnet %s\n",
- group, inet_ntoa(d->bcast_ip)));
-
- /* This next statement creates the workgroup struct if it doesn't
- already exist.
- */
- if((w = find_workgroupstruct(d, group, True)) == NULL)
- {
- DEBUG(0,("add_workgroup_to_subnet: Unable to add workgroup %s to subnet %s\n",
- group, inet_ntoa(d->bcast_ip) ));
- return;
- }
-
- /* add WORKGROUP(00) entries into name database
- or register with WINS server, if it's our workgroup.
- */
- if (strequal(myworkgroup, group))
- {
- int n;
-
- add_my_name_entry(d,group,0x0 ,nb_type|NB_ACTIVE|NB_GROUP);
-
- /* Only register the WORKGROUP<0x1e> name if we could be a local master
- browser. */
- if(lp_local_master())
- add_my_name_entry(d,group,0x1e,nb_type|NB_ACTIVE|NB_GROUP);
-
- /* Add all our server names to the workgroup list. We remove any
- browser or logon server flags from all but the primary name.
- */
- for( n = 0; my_netbios_names[n]; n++)
- {
- char *name = my_netbios_names[n];
- int stype = w->ServerType;
-
- if(!strequal(myname, name))
- stype &= ~(SV_TYPE_MASTER_BROWSER|SV_TYPE_POTENTIAL_BROWSER|
- SV_TYPE_DOMAIN_MASTER|SV_TYPE_DOMAIN_MEMBER);
-
- add_server_entry(d,w,name,stype|SV_TYPE_LOCAL_LIST_ONLY,0,
- lp_serverstring(),True);
- DEBUG(3,("add_workgroup_to_subnet: Added server name entry %s \
-to subnet %s\n", name, inet_ntoa(d->bcast_ip)));
- }
- }
-}
-
-/****************************************************************************
- create subnet / workgroup / server entries
-
- - add or create the subnet lists
- - add or create the workgroup entries in each subnet entry
- - register appropriate NetBIOS names for the workgroup entries
-
-**************************************************************************/
-void add_my_subnets(char *group)
-{
- static BOOL create_subnets = True;
- struct subnet_record *d = NULL;
- struct interface *i = NULL;
-
- if (*group == '*') return;
-
- /* Create subnets from all the local interfaces and thread them onto
- the linked list.
- */
- for (i = local_interfaces; i; i = i->next)
- {
- add_subnet_entry(i->bcast,i->nmask,group, create_subnets, True);
- }
-
- /* If we are using WINS, then we must add the workgroup to the WINS
- subnet. This is used as a place to keep collated server lists.
- */
-
- /* Create the WINS subnet if we are using WINS - but don't thread it
- onto the linked subnet list.
- */
- if (lp_wins_support() || lp_wins_server())
- {
- struct in_addr wins_nmask = ipzero;
- wins_subnet = add_subnet_entry(wins_ip, wins_nmask, group, create_subnets, False);
- }
-
- /* Ensure we only create the subnets once. */
- create_subnets = False;
-
- /* Now we have created all the subnets - we can add the names
- that make us a client member in the workgroup.
- */
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- add_workgroup_to_subnet(d, group);
-}
-
-/*******************************************************************
- write out browse.dat
- ******************************************************************/
-void write_browse_list(time_t t)
-{
- struct subnet_record *d;
- pstring fname,fnamenew;
- FILE *f;
-
- static time_t lasttime = 0;
-
- if (!lasttime) lasttime = t;
- if (!updatedlists || t - lasttime < 5) return;
-
- lasttime = t;
- updatedlists = False;
- updatecount++;
-
- dump_names();
- dump_workgroups();
-
- pstrcpy(fname,lp_lockdir());
- trim_string(fname,NULL,"/");
- strcat(fname,"/");
- strcat(fname,SERVER_LIST);
- pstrcpy(fnamenew,fname);
- strcat(fnamenew,".");
-
- f = fopen(fnamenew,"w");
-
- if (!f)
- {
- DEBUG(4,("Can't open %s - %s\n",fnamenew,strerror(errno)));
- return;
- }
-
- for (d = FIRST_SUBNET; d ; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work = d->workgrouplist; work ; work = work->next)
- {
- struct server_record *s;
- for (s = work->serverlist; s ; s = s->next)
- {
- fstring tmp;
-
- /* don't list domains I don't have a master for */
- if ((s->serv.type & SV_TYPE_DOMAIN_ENUM) && !s->serv.comment[0])
- {
- continue;
- }
-
- /* output server details, plus what workgroup/domain
- they're in. without the domain information, the
- combined list of all servers in all workgroups gets
- sent to anyone asking about any workgroup! */
-
- sprintf(tmp, "\"%s\"", s->serv.name);
- fprintf(f, "%-25s ", tmp);
- fprintf(f, "%08x ", s->serv.type);
- sprintf(tmp, "\"%s\" ", s->serv.comment);
- fprintf(f, "%-30s", tmp);
- fprintf(f, "\"%s\"\n", work->work_group);
- }
- }
- }
-
- fclose(f);
- unlink(fname);
- chmod(fnamenew,0644);
- rename(fnamenew,fname);
- DEBUG(3,("Wrote browse list %s\n",fname));
-}
-
diff --git a/source/namedbwork.c b/source/namedbwork.c
deleted file mode 100644
index a6260aab467..00000000000
--- a/source/namedbwork.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- created module namedbwork containing workgroup database functions
-
-*/
-
-#include "includes.h"
-#include "smb.h"
-
-extern int ClientNMB;
-
-extern int DEBUGLEVEL;
-
-/* this is our domain/workgroup/server database */
-extern struct subnet_record *subnetlist;
-
-extern struct in_addr wins_ip;
-
-extern fstring myworkgroup;
-
-int workgroup_count = 0; /* unique index key: one for each workgroup */
-
-
-
-/****************************************************************************
- add a workgroup into the domain list
- **************************************************************************/
-static void add_workgroup(struct work_record *work, struct subnet_record *d)
-{
- struct work_record *w2;
-
- if (!work || !d) return;
-
- if (!d->workgrouplist)
- {
- d->workgrouplist = work;
- work->prev = NULL;
- work->next = NULL;
- return;
- }
-
- for (w2 = d->workgrouplist; w2->next; w2 = w2->next);
-
- w2->next = work;
- work->next = NULL;
- work->prev = w2;
-}
-
-
-/****************************************************************************
- create a blank workgroup
- **************************************************************************/
-static struct work_record *make_workgroup(char *name)
-{
- struct work_record *work;
- struct subnet_record *d;
- int t = -1;
-
- if (!name || !name[0]) return NULL;
-
- work = (struct work_record *)malloc(sizeof(*work));
- if (!work) return(NULL);
- bzero((char *)work, sizeof(*work));
-
- StrnCpy(work->work_group,name,sizeof(work->work_group)-1);
- work->serverlist = NULL;
-
- work->ServerType = lp_default_server_announce() | (lp_local_master() ?
- SV_TYPE_POTENTIAL_BROWSER : 0 );
- work->RunningElection = False;
- work->ElectionCount = 0;
- work->announce_interval = 0;
- work->needelection = False;
- work->needannounce = True;
- work->mst_state = MST_POTENTIAL;
- work->dom_state = DOMAIN_NONE;
- work->log_state = LOGON_NONE;
-
- /* make sure all token representations of workgroups are unique */
-
- for (d = FIRST_SUBNET; d && t == -1; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *w;
- for (w = d->workgrouplist; w && t == -1; w = w->next)
- {
- if (strequal(w->work_group, work->work_group)) t = w->token;
- }
- }
-
- if (t == -1)
- {
- work->token = ++workgroup_count;
- }
- else
- {
- work->token = t;
- }
-
-
- /* WfWg uses 01040b01 */
- /* Win95 uses 01041501 */
- /* NTAS uses ???????? */
- work->ElectionCriterion = (MAINTAIN_LIST)|(ELECTION_VERSION<<8);
- work->ElectionCriterion |= (lp_os_level() << 24);
- if (lp_domain_master()) {
- work->ElectionCriterion |= 0x80;
- }
-
- return work;
-}
-
-
-/*******************************************************************
- remove workgroups
- ******************************************************************/
-struct work_record *remove_workgroup(struct subnet_record *d,
- struct work_record *work,
- BOOL remove_all_servers)
-{
- struct work_record *ret_work = NULL;
-
- if (!d || !work) return NULL;
-
- DEBUG(3,("Removing old workgroup %s\n", work->work_group));
-
- ret_work = work->next;
-
- remove_old_servers(work, -1, remove_all_servers);
-
- if (!work->serverlist)
- {
- if (work->prev) work->prev->next = work->next;
- if (work->next) work->next->prev = work->prev;
-
- if (d->workgrouplist == work) d->workgrouplist = work->next;
-
- free(work);
- }
-
- return ret_work;
-}
-
-
-/****************************************************************************
- find a workgroup in the workgrouplist
- only create it if the domain allows it, or the parameter 'add' insists
- that it get created/added anyway. this allows us to force entries in
- lmhosts file to be added.
- **************************************************************************/
-struct work_record *find_workgroupstruct(struct subnet_record *d,
- fstring name, BOOL add)
-{
- struct work_record *ret, *work;
-
- if (!d) return NULL;
-
- DEBUG(4, ("workgroup search for %s: ", name));
-
- for (ret = d->workgrouplist; ret; ret = ret->next) {
- if (!strcmp(ret->work_group,name)) {
- DEBUG(4, ("found\n"));
- return(ret);
- }
- }
-
- if (!add) {
- DEBUG(4, ("not found\n"));
- return NULL;
- }
-
- DEBUG(4,("not found: creating\n"));
-
- if ((work = make_workgroup(name)))
- {
- if (!ip_equal(d->bcast_ip, wins_ip) &&
- lp_preferred_master() && lp_local_master() &&
- strequal(myworkgroup, name))
- {
- DEBUG(3, ("preferred master startup for %s\n", work->work_group));
- work->needelection = True;
- work->ElectionCriterion |= (1<<3);
- }
- add_workgroup(work, d);
- return(work);
- }
- return NULL;
-}
-
-
-/****************************************************************************
- dump a copy of the workgroup/domain database
- **************************************************************************/
-void dump_workgroups(void)
-{
- struct subnet_record *d;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- if (d->workgrouplist)
- {
- struct work_record *work;
-
- DEBUG(4,("dump domain bcast=%15s: ", inet_ntoa(d->bcast_ip)));
- DEBUG(4,(" netmask=%15s:\n", inet_ntoa(d->mask_ip)));
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- DEBUG(4,("\t%s(%d)\n", work->work_group, work->token));
- if (work->serverlist)
- {
- struct server_record *s;
- for (s = work->serverlist; s; s = s->next)
- {
- DEBUG(4,("\t\t%s %8x (%s)\n",
- s->serv.name, s->serv.type, s->serv.comment));
- }
- }
- }
- }
- }
-}
diff --git a/source/nameelect.c b/source/nameelect.c
deleted file mode 100644
index 5fd1a4bdf2e..00000000000
--- a/source/nameelect.c
+++ /dev/null
@@ -1,855 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: nameelect.c
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- added system to become a master browser by stages.
-
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern int DEBUGLEVEL;
-extern pstring scope;
-
-extern pstring myname;
-extern fstring myworkgroup;
-extern struct in_addr ipzero;
-extern struct in_addr wins_ip;
-
-/* here are my election parameters */
-
-extern time_t StartupTime;
-
-extern struct subnet_record *subnetlist;
-
-extern uint16 nb_type; /* samba's NetBIOS name type */
-
-
-/*******************************************************************
- occasionally check to see if the master browser is around
- ******************************************************************/
-void check_master_browser(time_t t)
-{
- static time_t lastrun=0;
- struct subnet_record *d;
-
- if (!lastrun) lastrun = t;
- if (t < lastrun + CHECK_TIME_MST_BROWSE * 60) return;
-
- lastrun = t;
-
- dump_workgroups();
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (strequal(work->work_group, myworkgroup) && !AM_MASTER(work))
- {
- if (lp_local_master() && lp_preferred_master())
- {
- /* potential master browser - not a master browser. force
- becoming a master browser, hence the log message.
- */
-
- DEBUG(2,("%s potential master for %s %s - force election\n",
- timestring(), work->work_group,
- inet_ntoa(d->bcast_ip)));
-
- browser_gone(work->work_group, d->bcast_ip);
- }
- else
- {
- /* if we are not the browse master of a workgroup,
- and we can't find a browser on the subnet, do
- something about it.
- */
-
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_MST_CHK,
- work->work_group,0x1d,0,0,0,NULL,NULL,
- True,False,d->bcast_ip,d->bcast_ip);
- }
- }
- }
- }
-}
-
-
-/*******************************************************************
- what to do if a master browser DOESN't exist.
-
- option 1: force an election, and participate in it
- option 2: force an election, and let everyone else participate.
-
- ******************************************************************/
-void browser_gone(char *work_name, struct in_addr ip)
-{
- struct subnet_record *d = find_subnet(ip);
- struct work_record *work = find_workgroupstruct(d, work_name, False);
-
- /* i don't know about this workgroup, therefore i don't care */
- if (!work || !d) return;
-
- /* don't do election stuff on the WINS subnet */
- if (ip_equal(d->bcast_ip,wins_ip))
- return;
-
- if (strequal(work->work_group, myworkgroup))
- {
-
- if (lp_local_master())
- {
- /* we have discovered that there is no local master
- browser, and we are configured to initiate
- an election under exactly such circumstances.
- */
- DEBUG(2,("Forcing election on %s %s\n",
- work->work_group,inet_ntoa(d->bcast_ip)));
-
- /* we can attempt to become master browser */
- work->needelection = True;
- }
- else
- {
- /* we need to force an election, because we are configured
- not to _become_ the local master, but we still _need_ one,
- having detected that one doesn't exist.
- */
-
- /* local interfaces: force an election */
- send_election(d, work->work_group, 0, 0, myname);
-
- /* only removes workgroup completely on a local interface
- persistent lmhosts entries on a local interface _will_ be removed).
- */
- remove_workgroup(d, work,True);
- add_workgroup_to_subnet(d, work->work_group);
- }
- }
-}
-
-
-/****************************************************************************
- send an election packet
- **************************************************************************/
-void send_election(struct subnet_record *d, char *group,uint32 criterion,
- int timeup,char *name)
-{
- pstring outbuf;
- char *p;
-
- if (!d) return;
-
- DEBUG(2,("Sending election to %s for workgroup %s\n",
- inet_ntoa(d->bcast_ip),group));
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf;
- CVAL(p,0) = ANN_Election; /* election */
- p++;
-
- CVAL(p,0) = (criterion == 0 && timeup == 0) ? 0 : ELECTION_VERSION;
- SIVAL(p,1,criterion);
- SIVAL(p,5,timeup*1000); /* ms - despite the spec */
- p += 13;
- pstrcpy(p,name);
- strupper(p);
- p = skip_string(p,1);
-
- send_mailslot_reply(False,BROWSE_MAILSLOT,ClientDGRAM,
- outbuf,PTR_DIFF(p,outbuf),
- name,group,0,0x1e,d->bcast_ip,*iface_ip(d->bcast_ip));
-}
-
-
-/****************************************************************************
- un-register a SELF name that got rejected.
-
- if this name happens to be rejected when samba is in the process
- of becoming a master browser (registering __MSBROWSE__, WORKGROUP(1d)
- or WORKGROUP(1b)) then we must stop being a master browser. sad.
-
- **************************************************************************/
-void name_unregister_work(struct subnet_record *d, char *name, int name_type)
-{
- struct work_record *work;
- int remove_type_local = 0;
- int remove_type_domain = 0;
- int remove_type_logon = 0;
-
- remove_netbios_name(d,name,name_type,SELF,ipzero);
-
- if (!(work = find_workgroupstruct(d, name, False))) return;
-
- /* work out what to unbecome, from the name type being removed */
-
- if (ms_browser_name(name, name_type))
- {
- remove_type_local |= SV_TYPE_MASTER_BROWSER;
- }
- if (AM_MASTER(work) && strequal(name, myworkgroup) && name_type == 0x1d)
- {
- remove_type_local |= SV_TYPE_MASTER_BROWSER;
- }
- if (AM_DOMMST(work) && strequal(name, myworkgroup) && name_type == 0x1b)
- {
- remove_type_domain |= SV_TYPE_DOMAIN_MASTER;
- }
- if (AM_DOMMEM(work) && strequal(name, myworkgroup) && name_type == 0x1c)
- {
- remove_type_logon|= SV_TYPE_DOMAIN_MEMBER;
- }
-
- if (remove_type_local ) unbecome_local_master (d, work, remove_type_local );
- if (remove_type_domain) unbecome_domain_master(d, work, remove_type_domain);
- if (remove_type_logon ) unbecome_logon_server (d, work, remove_type_logon );
-}
-
-
-/****************************************************************************
- registers a name.
-
- if the name being added is a SELF name, we must additionally check
- whether to proceed to the next stage in samba becoming a master browser.
-
- **************************************************************************/
-void name_register_work(struct subnet_record *d, char *name, int name_type,
- int nb_flags, time_t ttl, struct in_addr ip, BOOL bcast)
-{
- enum name_source source = (ismyip(ip) || ip_equal(ip, ipzero)) ?
- SELF : REGISTER;
-
- if (source == SELF)
- {
- struct work_record *work = find_workgroupstruct(d,
- myworkgroup, False);
-
- add_netbios_entry(d,name,name_type,nb_flags,ttl,source,ip,True,!bcast);
-
- if (work)
- {
- int add_type_local = False;
- int add_type_domain = False;
- int add_type_logon = False;
-
- DEBUG(4,("checking next stage: name_register_work %s\n", name));
-
- /* work out what to become, from the name type being added */
-
- if (ms_browser_name(name, name_type))
- {
- add_type_local = True;
- }
- if (strequal(name, myworkgroup) && name_type == 0x1d)
- {
- add_type_local = True;
- }
- if (strequal(name, myworkgroup) && name_type == 0x1b)
- {
- add_type_domain = True;
- }
- if (strequal(name, myworkgroup) && name_type == 0x1c)
- {
- add_type_logon = True;
- }
-
- if (add_type_local ) become_local_master (d, work);
- if (add_type_domain) become_domain_master(d, work);
- if (add_type_logon ) become_logon_server (d, work);
- }
- }
-}
-
-
-/*******************************************************************
- become the local master browser.
-
- this is done in stages. note that this could take a while,
- particularly on a broadcast subnet, as we have to wait for
- the implicit registration of each name to be accepted.
-
- as each name is successfully registered, become_local_master() is
- called again, in order to initiate the next stage. see
- dead_netbios_entry() - deals with implicit name registration
- and response_name_reg() - deals with explicit registration
- with a WINS server.
-
- stage 1: was MST_POTENTIAL - go to MST_POTENTIAL and register ^1^2__MSBROWSE__^2^1.
- stage 2: was MST_BACK - go to MST_MSB and register WORKGROUP(0x1d)
- stage 3: was MST_MSB - go to MST_BROWSER and stay there
-
- XXXX note: this code still does not cope with the distinction
- between different types of nodes, particularly between M and P
- nodes. that comes later.
-
- ******************************************************************/
-void become_local_master(struct subnet_record *d, struct work_record *work)
-{
- /* domain type must be limited to domain enum + server type. it must
- not have SV_TYPE_SERVER or anything else with SERVER in it, else
- clients get confused and start thinking this entry is a server
- not a workgroup
- */
- uint32 domain_type = SV_TYPE_DOMAIN_ENUM|SV_TYPE_NT;
-
- if (!work || !d)
- return;
-
- if (!lp_local_master())
- {
- DEBUG(0,("Samba not configured as a local master browser.\n"));
- return;
- }
-
- DEBUG(2,("Becoming master for %s %s (currently at stage %d)\n",
- work->work_group,inet_ntoa(d->bcast_ip),work->mst_state));
-
- switch (work->mst_state)
- {
- case MST_POTENTIAL: /* while we were nothing but a server... */
- {
- DEBUG(3,("go to first stage: register ^1^2__MSBROWSE__^2^1\n"));
- work->mst_state = MST_BACK; /* an election win was successful */
-
- work->ElectionCriterion |= 0x5;
-
- /* update our server status */
- work->ServerType &= ~SV_TYPE_POTENTIAL_BROWSER;
- add_server_entry(d,work,myname,work->ServerType|SV_TYPE_LOCAL_LIST_ONLY,
- 0,lp_serverstring(),True);
-
- /* add special browser name */
- add_my_name_entry(d,MSBROWSE,0x01,nb_type|NB_ACTIVE|NB_GROUP);
-
- /* DON'T do anything else after calling add_my_name_entry() */
- break;
- }
-
- case MST_BACK: /* while nothing had happened except we won an election... */
- {
- DEBUG(3,("go to second stage: register as master browser\n"));
- work->mst_state = MST_MSB; /* registering MSBROWSE was successful */
-
- /* add server entry on successful registration of MSBROWSE */
- add_server_entry(d,work,work->work_group,domain_type|SV_TYPE_LOCAL_LIST_ONLY,
- 0,myname,True);
-
- /* add master name */
- add_my_name_entry(d,work->work_group,0x1d,nb_type|NB_ACTIVE);
-
- /* DON'T do anything else after calling add_my_name_entry() */
- break;
- }
-
- case MST_MSB: /* while we were still only registered MSBROWSE state... */
- {
- int i = 0;
- struct server_record *sl;
-
- DEBUG(3,("2nd stage complete: registered as master browser for workgroup %s \
-on subnet %s\n", work->work_group, inet_ntoa(d->bcast_ip)));
- work->mst_state = MST_BROWSER; /* registering WORKGROUP(1d) succeeded */
-
- /* update our server status */
- work->ServerType |= SV_TYPE_MASTER_BROWSER;
-
- DEBUG(3,("become_local_master: updating our server %s to type %x\n",
- myname, work->ServerType));
-
- add_server_entry(d,work,myname,work->ServerType|SV_TYPE_LOCAL_LIST_ONLY,
- 0,lp_serverstring(),True);
-
- /* Count the number of servers we have on our list. If it's
- less than 10 (just a heuristic) request the servers
- to announce themselves.
- */
- for( sl = work->serverlist; sl != NULL; sl = sl->next)
- i++;
-
- if (i < 10)
- {
- /* ask all servers on our local net to announce to us */
- announce_request(work, d->bcast_ip);
- }
-
- /* Reset the announce master timer so that we do an announce as soon as possible
- now we are a master. */
- reset_announce_timer();
-
- DEBUG(0,("Samba is now a local master browser for workgroup %s on subnet %s\n",
- work->work_group, inet_ntoa(d->bcast_ip)));
-
- break;
- }
-
- case MST_BROWSER:
- {
- /* don't have to do anything: just report success */
- DEBUG(3,("3rd stage: become master browser!\n"));
- break;
- }
- }
-}
-
-
-/*******************************************************************
- become the domain master browser.
-
- this is done in stages. note that this could take a while,
- particularly on a broadcast subnet, as we have to wait for
- the implicit registration of each name to be accepted.
-
- as each name is successfully registered, become_domain_master() is
- called again, in order to initiate the next stage. see
- dead_netbios_entry() - deals with implicit name registration
- and response_name_reg() - deals with explicit registration
- with a WINS server.
-
- stage 1: was DOMAIN_NONE - go to DOMAIN_MST
-
- XXXX note: this code still does not cope with the distinction
- between different types of nodes, particularly between M and P
- nodes. that comes later.
-
- ******************************************************************/
-void become_domain_master(struct subnet_record *d, struct work_record *work)
-{
- /* domain type must be limited to domain enum + server type. it must
- not have SV_TYPE_SERVER or anything else with SERVER in it, else
- clients get confused and start thinking this entry is a server
- not a workgroup
- */
-
- if (!work || !d) return;
-
- if (!lp_domain_master())
- {
- DEBUG(0,("Samba not configured as a domain master browser.\n"));
- return;
- }
-
- DEBUG(2,("Becoming domain master for %s %s (currently at stage %d)\n",
- work->work_group,inet_ntoa(d->bcast_ip),work->dom_state));
-
- switch (work->dom_state)
- {
- case DOMAIN_NONE: /* while we were nothing but a server... */
- {
- DEBUG(3,("become_domain_master: go to first stage: register <1b> name\n"));
- work->dom_state = DOMAIN_WAIT;
-
- /* XXXX the 0x1b is domain master browser name */
- add_my_name_entry(d, work->work_group,0x1b,nb_type|NB_ACTIVE);
-
- /* DON'T do anything else after calling add_my_name_entry() */
- break;
- }
-
- case DOMAIN_WAIT:
- {
- work->dom_state = DOMAIN_MST; /* ... become domain master */
- DEBUG(3,("become_domain_master: first stage - register as domain member\n"));
-
- /* update our server status */
- work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MASTER;
- add_server_entry(d,work,myname,work->ServerType|SV_TYPE_LOCAL_LIST_ONLY,
- 0, lp_serverstring(),True);
-
- DEBUG(0,("Samba is now a domain master browser for workgroup %s on subnet %s\n",
- work->work_group, inet_ntoa(d->bcast_ip)));
-
- if (d == wins_subnet)
- {
- /* ok! we successfully registered by unicast with the
- WINS server. we now expect to become the domain
- master on the local subnets. if this fails, it's
- probably a 1.9.16p2 to 1.9.16p11 server's fault.
-
- this is a configuration issue that should be addressed
- by the network administrator - you shouldn't have
- several machines configured as a domain master browser
- for the same WINS scope (except if they are 1.9.17 or
- greater, and you know what you're doing.
-
- see DOMAIN.txt.
-
- */
- add_domain_master_bcast();
- }
- break;
- }
-
- case DOMAIN_MST:
- {
- /* don't have to do anything: just report success */
- DEBUG(3,("domain second stage: there isn't one!\n"));
- break;
- }
- }
-}
-
-
-/*******************************************************************
- become a logon server.
- ******************************************************************/
-void become_logon_server(struct subnet_record *d, struct work_record *work)
-{
- if (!work || !d) return;
-
- if (!lp_domain_logons())
- {
- DEBUG(0,("samba not configured as a logon master.\n"));
- return;
- }
-
- DEBUG(2,("Becoming logon server for %s %s (currently at stage %d)\n",
- work->work_group,inet_ntoa(d->bcast_ip),work->log_state));
-
- switch (work->log_state)
- {
- case LOGON_NONE: /* while we were nothing but a server... */
- {
- DEBUG(3,("go to first stage: register <1c> name\n"));
- work->log_state = LOGON_WAIT;
-
- /* XXXX the 0x1c is apparently something to do with domain logons */
- add_my_name_entry(d, myworkgroup,0x1c,nb_type|NB_ACTIVE|NB_GROUP);
-
- /* DON'T do anything else after calling add_my_name_entry() */
- break;
- }
-
- case LOGON_WAIT:
- {
- work->log_state = LOGON_SRV; /* ... become logon server */
- DEBUG(3,("logon second stage: register \n"));
-
- /* update our server status */
- work->ServerType |= SV_TYPE_NT|SV_TYPE_DOMAIN_MEMBER;
- add_server_entry(d,work,myname,work->ServerType|SV_TYPE_LOCAL_LIST_ONLY
- ,0, lp_serverstring(),True);
-
- /* DON'T do anything else after calling add_my_name_entry() */
- break;
- }
-
- case LOGON_SRV:
- {
- DEBUG(3,("logon third stage: there isn't one!\n"));
- break;
- }
- }
-}
-
-
-/*******************************************************************
- unbecome the local master browser. initates removal of necessary netbios
- names, and tells the world that we are no longer a master browser.
-
- XXXX this _should_ be used to demote to a backup master browser, without
- going straight to non-master browser. another time.
-
- ******************************************************************/
-void unbecome_local_master(struct subnet_record *d, struct work_record *work,
- int remove_type)
-{
- int new_server_type = work->ServerType;
-
- /* can only remove master types with this function */
- remove_type &= SV_TYPE_MASTER_BROWSER;
-
- new_server_type &= ~remove_type;
-
- if (remove_type)
- {
- DEBUG(2,("Becoming local non-master for %s\n",work->work_group));
-
- /* no longer a master browser of any sort */
-
- work->ServerType |= SV_TYPE_POTENTIAL_BROWSER;
- work->ElectionCriterion &= ~0x4;
- work->mst_state = MST_POTENTIAL;
-
- /* announce ourselves as no longer active as a master browser. */
- announce_server(d, work, work->work_group, myname, 0, 0);
- remove_name_entry(d,MSBROWSE ,0x01);
- remove_name_entry(d,work->work_group,0x1d);
- }
-}
-
-
-/*******************************************************************
- unbecome the domain master browser. initates removal of necessary netbios
- names, and tells the world that we are no longer a domain browser.
- ******************************************************************/
-void unbecome_domain_master(struct subnet_record *d, struct work_record *work,
- int remove_type)
-{
- int new_server_type = work->ServerType;
-
- DEBUG(2,("Becoming domain non-master for %s\n",work->work_group));
-
- /* can only remove master or domain types with this function */
- remove_type &= SV_TYPE_DOMAIN_MASTER;
-
- new_server_type &= ~remove_type;
-
- if (remove_type)
- {
- /* no longer a domain master browser of any sort */
-
- work->dom_state = DOMAIN_NONE;
-
- /* announce ourselves as no longer active as a master browser on
- all our local subnets. */
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- work = find_workgroupstruct(d, myworkgroup, False);
-
- /* Remove the name entry without any NetBIOS traffic as that's
- how it was registered. */
- remove_name_entry(d,work->work_group,0x1b);
- }
-
- /* Unregister the 1b name from the WINS server. */
- if(wins_subnet != NULL)
- remove_name_entry(wins_subnet, myworkgroup, 0x1b);
- }
-}
-
-
-/*******************************************************************
- unbecome the logon server. initates removal of necessary netbios
- names, and tells the world that we are no longer a logon server.
- ******************************************************************/
-void unbecome_logon_server(struct subnet_record *d, struct work_record *work,
- int remove_type)
-{
- int new_server_type = work->ServerType;
-
- DEBUG(2,("Becoming logon non-server for %s\n",work->work_group));
-
- /* can only remove master or domain types with this function */
- remove_type &= SV_TYPE_DOMAIN_MEMBER;
-
- new_server_type &= ~remove_type;
-
- if (remove_type)
- {
- /* no longer a master browser of any sort */
-
- work->log_state = LOGON_NONE;
-
- remove_name_entry(d,work->work_group,0x1c);
- }
-}
-
-
-/*******************************************************************
- run the election
- ******************************************************************/
-void run_elections(time_t t)
-{
- static time_t lastime = 0;
-
- struct subnet_record *d;
-
- /* send election packets once a second */
- if (lastime && t-lastime <= 0) return;
-
- lastime = t;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (work->RunningElection)
- {
- send_election(d,work->work_group, work->ElectionCriterion,
- t-StartupTime,myname);
-
- if (work->ElectionCount++ >= 4)
- {
- /* I won! now what :-) */
- DEBUG(2,(">>> Won election on %s %s <<<\n",
- work->work_group,inet_ntoa(d->bcast_ip)));
-
- work->RunningElection = False;
- work->mst_state = MST_POTENTIAL;
-
- become_local_master(d, work);
- }
- }
- }
- }
-}
-
-
-/*******************************************************************
- work out if I win an election
- ******************************************************************/
-static BOOL win_election(struct work_record *work,int version,uint32 criterion,
- int timeup,char *name)
-{
- int mytimeup = time(NULL) - StartupTime;
- uint32 mycriterion = work->ElectionCriterion;
-
- /* If local master is false then never win
- in election broadcasts. */
- if(!lp_local_master())
- {
- DEBUG(3,("win_election: Losing election as local master == False\n"));
- return False;
- }
-
- DEBUG(4,("election comparison: %x:%x %x:%x %d:%d %s:%s\n",
- version,ELECTION_VERSION,
- criterion,mycriterion,
- timeup,mytimeup,
- name,myname));
-
- if (version > ELECTION_VERSION) return(False);
- if (version < ELECTION_VERSION) return(True);
-
- if (criterion > mycriterion) return(False);
- if (criterion < mycriterion) return(True);
-
- if (timeup > mytimeup) return(False);
- if (timeup < mytimeup) return(True);
-
- if (strcasecmp(myname,name) > 0) return(False);
-
- return(True);
-}
-
-
-/*******************************************************************
- process a election packet
-
- An election dynamically decides who will be the master.
- ******************************************************************/
-void process_election(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- struct in_addr ip = dgram->header.source_ip;
- struct subnet_record *d = find_subnet(ip);
- int version = CVAL(buf,0);
- uint32 criterion = IVAL(buf,1);
- int timeup = IVAL(buf,5)/1000;
- char *name = buf+13;
- struct work_record *work;
-
- if (!d) return;
-
- if (ip_equal(d->bcast_ip,wins_ip))
- {
- DEBUG(0,("Unexpected election request from %s %s on WINS net\n",
- name, inet_ntoa(p->ip)));
- return;
- }
-
- name[15] = 0;
-
- DEBUG(3,("Election request from %s %s vers=%d criterion=%08x timeup=%d\n",
- name,inet_ntoa(p->ip),version,criterion,timeup));
-
- if (same_context(dgram)) return;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (!strequal(work->work_group, myworkgroup))
- continue;
-
- if (win_election(work, version,criterion,timeup,name))
- {
- if (!work->RunningElection)
- {
- work->needelection = True;
- work->ElectionCount=0;
- work->mst_state = MST_POTENTIAL;
- }
- }
- else
- {
- work->needelection = False;
-
- if (work->RunningElection || AM_MASTER(work))
- {
- work->RunningElection = False;
- DEBUG(3,(">>> Lost election on %s %s <<<\n",
- work->work_group,inet_ntoa(d->bcast_ip)));
- if (AM_MASTER(work))
- {
- unbecome_local_master(d, work, SV_TYPE_MASTER_BROWSER);
- }
- }
- }
- }
-}
-
-
-/****************************************************************************
- checks whether a browser election is to be run on any workgroup
-
- this function really ought to return the time between election
- packets (which depends on whether samba intends to be a domain
- master or a master browser) in milliseconds.
-
- ***************************************************************************/
-BOOL check_elections(void)
-{
- struct subnet_record *d;
- BOOL run_any_election = False;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work = d->workgrouplist; work; work = work->next)
- {
- run_any_election |= work->RunningElection;
-
- if (work->needelection && !work->RunningElection)
- {
- DEBUG(3,(">>> Starting election on %s %s <<<\n",
- work->work_group,inet_ntoa(d->bcast_ip)));
- work->ElectionCount = 0;
- work->RunningElection = True;
- work->needelection = False;
- }
- }
- }
- return run_any_election;
-}
-
diff --git a/source/nameelect.doc b/source/nameelect.doc
deleted file mode 100644
index df025e2069a..00000000000
--- a/source/nameelect.doc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.1
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameelect.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-
- 0.1 - 22jul96 Andrew.Tridgell@anu.edu.au
- tridge's comments on first revision
-*/
-
-the module nameelect.c deals with initiating, winning, losing
-browsing elections, and checking if browsers are still around,
-and the consequences of getting involved in all this.
-
-an election packet can be received at any time, which will initiate
-an election. samba can also detect that there is no longer a
-master browser and will initiate an election.
-
-there is one way to become a master browser, but there are two
-ways to un-become a master browser. if you lose an election, you
-must stop being a master browser. if you fail to register your
-unique special browser names (either on your local subnet or with
-the WINS server) then you must stop being a master browser.
-
-this is a double fail-safe mechanism to ensure that there is only
-one master browser per workgroup per subnet (and one domain master
-browser - per domain (workgroup) per wide area network).
-
-(a wide area network is created when one or more servers on a
-broadcast-isolated subnet point to the same WINS server).
-
---------
-NOTE FROM TRIDGE:
-
-I'd say "domain master browser" not "WINS server" here. WINS doesn't
-have much to do with browsing, it is the WAN varient of name
-resolution. The name resolution and browsing functions of a netbios
-network are almost entirely separate. Both grew out of systems that
-could only be used on local networks.
-
-To adapt them to WANs, WINS was added for name resolution, and "domain
-master browsers" were added for browse lists. It would be perfectly
-possible to have a WINS server that doesn't even listen to UDP port
-138.
---------
-
-/*************************************************************************
- check_elections()
- *************************************************************************/
-
-this function returns True if samba is in the process of running an
-election on any of its interfaces. a better version of this function
-should return the time-out period in between election packets, in
-milliseconds.
-
-
-/*************************************************************************
- process_election()
- *************************************************************************/
-
-this function is responsible for dealing with the receipt of an election
-browse MAILSLOT packet.
-
-if samba is running an election, it checks the criteria in the packet
-received using win_election() to see if it has lost the election or if
-it should join in the election.
-
-if it loses the election, then it becomes a non-master.
-
-
-/*************************************************************************
- win_election()
- *************************************************************************/
-
-this function returns True if samba has won an election. the criteria
-in order of precedence are:
-
-the election version; the election criteria; the time since samba was
-started; and as a last resort, a name comparison is used.
-
-
-/*************************************************************************
- run_elections()
- *************************************************************************/
-
-this function is responsible for sending out election packets if
-samba is running in an election. once the fourth packet is sent
-out, it is assumed that we have won, and samba initiates becoming
-a master browser.
-
-(it looks like samba sends out an extra packet just to be sure...)
-
-
-/*************************************************************************
- become_nonmaster()
- *************************************************************************/
-
-this function is responsible for down-grading samba's status from
-either domain master to master browser or nothing, or master browser
-to nothing, depending on its current status.
-
-samba can become a non-master in three ways: by losing an election -
-see process_election(); by having one of its special browser names
-de-registered - see name_unregister_work(); by receiving and
-processing a browser reset packet - see process_reset_browser().
-
-when samba stops being a domain master, it must release its unique
-0x1b name. when samba stops being a master browser, it must release
-its unique 0x1d name.
-
-becoming non-master is done on a per-subnet basis.
-
-
-/*************************************************************************
- become_master()
- *************************************************************************/
-
-this function is responsible for slowly turning samba into a
-local master browser or a domain master browser.
-
-
-this is done in stages. note that this could take a while,
-particularly on a broadcast subnet, as we have to wait for
-the implicit registration of each name to be accepted.
-
-as each name is successfully registered, become_master() is
-called again via name_register_work(), in order to initiate
-the next stage (see dead_netbios_entry() - deals with implicit
-name registration and response_name_reg() - deals with explicit
-registration with a WINS server).
-
-stage 1: was MST_NONE - go to MST_NONE and register ^1^2__MSBROWSE__^2^1.
-stage 2: was MST_WON - go to MST_MSB and register WORKGROUP(0x1d)
-stage 3: was MST_MSB - go to MST_BROWSER and register WORKGROUP(0x1b)
-stage 4: was MST_BROWSER - go to MST_DOMAIN (do not pass GO, do not...)
-
-note that this code still does not cope with the distinction
-between different types of nodes, particularly between M and P
-nodes (see rfc1001.txt). that will be developed later.
-
-
-/*************************************************************************
- name_register_work()
- *************************************************************************/
-
-this function is called when a NetBIOS name is successfully
-registered. it will add the registered name into samba's NetBIOS
-records.
-
-it has the additional responsibility that when samba is becoming
-a master browser, it must initiate the next stage in the progress
-towards becoming a master browser.
-
-implicit name registration is done through dead_netbios_entry()
-by time-out. explicit name registration is done through
-response_name_reg() with a WINS server.
-
-
-/*************************************************************************
- name_unregister_work()
- *************************************************************************/
-
-this function is called when there is an objection to a NetBIOS
-name being registered. this will always be done through a negative
-response to a name registration, whether it be by a host that
-already owns the unique name being registered on a subnet, or
-by a WINS server.
-
-the name being objected to must be removed from samba's records.
-
-it has the additional responsibility of checking whether samba is
-currently a master browser or not, and if so it should initiate
-becoming a non-master.
-
-
-
-/*************************************************************************
- send_election()
- *************************************************************************/
-
-this function is responsible for sending a browse mailslot
-datagram election packet (of type ANN_Election). it constructs
-the packet with all the relevant info needed to participate:
-election version; election criteria; time since startup and
-our name.
-
-this function can be used to ensure that initiate but lose an
-election by specifying a criteria and time up of zero. this
-is necessary if we are a master browser and we are about to
-go down (politely!) - see nmbd.c:sig_term().
-
-
-/*************************************************************************
- browser_gone()
- *************************************************************************/
-
-this function is responsible for dealing with the instance when
-the master browser we thought was present on a subnet is no longer
-responding.
-
-if it is samba's workgroup, and it's a local interface, samba
-detects that it can participate in an election on that interface
-and potentially become a master browser or domain master.
-
-if it's a local subnet and not one of samba's workgroups, then
-samba will force an election (which it is not obliged to do).
-remove_workgroup() will be expected to remove all references
-to this workgroup and the servers in it from the database.
-
-if it's a remote subnet and not one of samba's workgroups then
-no election is forced, and remove_workgroup() will be expected
-to remove all server entries from this workgroup _except_ those
-added from the lmhosts file. if there are entries added from
-the lmhosts file, then the workgroup entry will remain,
-otherwise it too will be removed.
-
-
-/*************************************************************************
- check_master_browser()
- *************************************************************************/
-
-this function is responsible for periodically checking whether
-master browsers that samba expects to be alive are alive. this
-is done every CHECK_TIME_MST_BROWSE minutes.
-
-for every workgroup record for which samba is not a master browser,
-on both local and remote interfaces, samba will initiate a
-broadcast query for a master browser on that subnet.
-
-(browser_gone() will be called to deal with the case where no
-response is received to the NAME_QUERY_MST_CHK initiated here.
-no action is required when a response _is_ received, however:
-see nameservresp.c:response_process() and dead_netbios_entry()
-for details)
-
-
diff --git a/source/namelogon.c b/source/namelogon.c
deleted file mode 100644
index 1f57139d56a..00000000000
--- a/source/namelogon.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-
-extern int ClientDGRAM;
-
-#define TEST_CODE /* want to debug unknown browse packets */
-
-extern int DEBUGLEVEL;
-
-extern pstring myname;
-
-
-/****************************************************************************
- process a domain logon packet
-
- **************************************************************************/
-void process_logon_packet(struct packet_struct *p,char *buf,int len)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- char *logname,*q;
- fstring reply_name;
- BOOL add_slashes = False;
- pstring outbuf;
- int code,reply_code;
- char unknown_byte = 0;
- uint16 request_count = 0;
- uint16 token = 0;
-
- if (!lp_domain_logons())
- {
- DEBUG(3,("No domain logons\n"));
- return;
- }
-
-
- code = SVAL(buf,0);
- switch (code)
- {
- case 0:
- {
- char *machine = buf+2;
- char *user = skip_string(machine,1);
- char *tmp;
- logname = skip_string(user,1);
- tmp = skip_string(logname,1);
- unknown_byte = CVAL(tmp,0);
- request_count = SVAL(tmp,1);
- token = SVAL(tmp,3);
-
- reply_code = 0x6;
- fstrcpy(reply_name,myname);
- strupper(reply_name);
- add_slashes = True;
- DEBUG(3,("Domain login request from %s(%s) user=%s token=%x\n",
- machine,inet_ntoa(p->ip),user,token));
- break;
- }
- case 7:
- {
- char *machine = buf+2;
- logname = skip_string(machine,1);
- token = SVAL(skip_string(logname,1),0);
-
- fstrcpy(reply_name,lp_domain_controller());
- if (!*reply_name)
- {
- /* oo! no domain controller. must be us, then */
- fstrcpy(reply_name,myname);
- reply_code = 0xC;
- }
- else
- {
- /* refer logon request to the domain controller */
- reply_code = 0x7;
- }
-
- strupper(reply_name);
- DEBUG(3,("GETDC request from %s(%s), reporting %s 0x%x token=%x\n",
- machine,inet_ntoa(p->ip), reply_name, reply_code,token));
- break;
- }
- default:
- {
- DEBUG(3,("Unknown domain request %d\n",code));
- return;
- }
- }
-
- bzero(outbuf,sizeof(outbuf));
- q = outbuf;
- SSVAL(q,0,reply_code);
- q += 2;
-
- if (token == 0xffff || /* LM 2.0 or later */
- token == 0xfffe) /* WfWg networking */
- {
- if (add_slashes)
- {
- strcpy(q,"\\\\");
- q += 2;
- }
- strcpy(q, reply_name);
- strupper(q);
- q = skip_string(q,1);
-
- if (token == 0xffff) /* LM 2.0 or later */
- {
- SSVAL(q,0,token);
- q += 2;
- }
- }
-
- SSVAL(q,0,0xFFFF);
- q += 2;
-
- send_mailslot_reply(True, logname,ClientDGRAM,outbuf,PTR_DIFF(q,outbuf),
- myname,&dgram->source_name.name[0],0x20,0,p->ip,
- *iface_ip(p->ip));
-}
diff --git a/source/namelogon.doc b/source/namelogon.doc
deleted file mode 100644
index c4a97d0cf16..00000000000
--- a/source/namelogon.doc
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namelogon.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module deals with the first stage of domain logons. there is much
-more work to be done on this: it's all totally undocumented.
-
-
-/*************************************************************************
- process_logon_packet()
- *************************************************************************/
-
-a function that processes logon packets (the most helpful comment yet :-).
diff --git a/source/namepacket.c b/source/namepacket.c
deleted file mode 100644
index 44e449b8c2a..00000000000
--- a/source/namepacket.c
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern int DEBUGLEVEL;
-
-extern int num_response_packets;
-
-BOOL CanRecurse = True;
-extern pstring scope;
-extern struct in_addr wins_ip;
-
-static uint16 name_trn_id=0;
-
-
-/***************************************************************************
- updates the unique transaction identifier
- **************************************************************************/
-void debug_browse_data(char *outbuf, int len)
-{
- int i,j;
- for (i = 0; i < len; i+= 16)
- {
- DEBUG(4, ("%3x char ", i));
-
- for (j = 0; j < 16; j++)
- {
- unsigned char x = outbuf[i+j];
- if (x < 32 || x > 127) x = '.';
-
- if (i+j >= len) break;
- DEBUG(4, ("%c", x));
- }
-
- DEBUG(4, (" hex ", i));
-
- for (j = 0; j < 16; j++)
- {
- if (i+j >= len) break;
- DEBUG(4, (" %02x", (unsigned char)outbuf[i+j]));
- }
-
- DEBUG(4, ("\n"));
- }
-
-}
-
-
-/***************************************************************************
- updates the unique transaction identifier
- **************************************************************************/
-static void update_name_trn_id(void)
-{
- if (!name_trn_id)
- {
- name_trn_id = (time(NULL)%(unsigned)0x7FFF) + (getpid()%(unsigned)100);
- }
- name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
-}
-
-
-/****************************************************************************
- initiate a netbios packet
- ****************************************************************************/
-void initiate_netbios_packet(uint16 *id,
- int fd,int quest_type,char *name,int name_type,
- int nb_flags,BOOL bcast,BOOL recurse,
- struct in_addr to_ip)
-{
- struct packet_struct p;
- struct nmb_packet *nmb = &p.packet.nmb;
- struct res_rec additional_rec;
- char *packet_type = "unknown";
- int opcode = -1;
-
- if (!id) return;
-
- if (quest_type == NMB_STATUS) { packet_type = "nmb_status"; opcode = 0; }
- if (quest_type == NMB_QUERY ) { packet_type = "nmb_query"; opcode = 0; }
- if (quest_type == NMB_REG ) { packet_type = "nmb_reg"; opcode = 5; }
- if (quest_type == NMB_REG_REFRESH ) { packet_type = "nmb_reg_refresh"; opcode = 9; }
- if (quest_type == NMB_REL ) { packet_type = "nmb_rel"; opcode = 6; }
-
- DEBUG(4,("initiating netbios packet: %s %s(%x) (bcast=%s) %s\n",
- packet_type, name, name_type, BOOLSTR(bcast), inet_ntoa(to_ip)));
-
- if (opcode == -1) return;
-
- bzero((char *)&p,sizeof(p));
-
- if (*id == 0xffff) {
- update_name_trn_id();
- *id = name_trn_id; /* allow resending with same id */
- }
-
- nmb->header.name_trn_id = *id;
- nmb->header.opcode = opcode;
- nmb->header.response = False;
-
- nmb->header.nm_flags.bcast = bcast;
- nmb->header.nm_flags.recursion_available = False;
- nmb->header.nm_flags.recursion_desired = recurse;
- nmb->header.nm_flags.trunc = False;
- nmb->header.nm_flags.authoritative = False;
-
- nmb->header.rcode = 0;
- nmb->header.qdcount = 1;
- nmb->header.ancount = 0;
- nmb->header.nscount = 0;
- nmb->header.arcount = (quest_type==NMB_REG ||
- quest_type==NMB_REL ||
- quest_type==NMB_REG_REFRESH) ? 1 : 0;
-
- make_nmb_name(&nmb->question.question_name,name,name_type,scope);
-
- nmb->question.question_type = quest_type == NMB_STATUS ? 0x21 : 0x20;
- nmb->question.question_class = 0x1;
-
- if (quest_type == NMB_REG ||
- quest_type == NMB_REG_REFRESH ||
- quest_type == NMB_REL)
- {
- nmb->additional = &additional_rec;
- bzero((char *)nmb->additional,sizeof(*nmb->additional));
-
- nmb->additional->rr_name = nmb->question.question_name;
- nmb->additional->rr_type = 0x20;
- nmb->additional->rr_class = 0x1;
-
- if (quest_type == NMB_REG || quest_type == NMB_REG_REFRESH)
- nmb->additional->ttl = lp_max_ttl();
- else
- nmb->additional->ttl = 0;
-
- nmb->additional->rdlength = 6;
- nmb->additional->rdata[0] = nb_flags;
- putip(&nmb->additional->rdata[2],(char *)iface_ip(to_ip));
- }
-
- p.ip = to_ip;
- p.port = NMB_PORT;
- p.fd = fd;
- p.timestamp = time(NULL);
- p.packet_type = NMB_PACKET;
-
- debug_nmb_packet(&p);
-
- if (!send_packet(&p)) {
- DEBUG(3,("send_packet to %s %d failed\n",inet_ntoa(p.ip),p.port));
- *id = 0xffff;
- }
-
- return;
-}
-
-
-/****************************************************************************
- reply to a netbios name packet. see rfc1002.txt
- ****************************************************************************/
-void reply_netbios_packet(struct packet_struct *p1,int trn_id,
- int rcode, int rcv_code, int opcode,
- BOOL recursion_available,
- BOOL recursion_desired,
- struct nmb_name *rr_name,int rr_type,int rr_class,int ttl,
- char *data,int len)
-{
- struct packet_struct p;
- struct nmb_packet *nmb = &p.packet.nmb;
- struct res_rec answers;
- char *packet_type = "unknown";
-
- p = *p1;
-
- switch (rcv_code)
- {
- case NMB_STATUS:
- {
- packet_type = "nmb_status";
- break;
- }
- case NMB_QUERY:
- {
- packet_type = "nmb_query";
- break;
- }
- case NMB_REG:
- {
- packet_type = "nmb_reg";
- break;
- }
- case NMB_REL:
- {
- packet_type = "nmb_rel";
- break;
- }
- case NMB_WAIT_ACK:
- {
- packet_type = "nmb_wack";
- break;
- }
- default:
- {
- DEBUG(1,("replying netbios packet: %s %s\n",
- packet_type, namestr(rr_name), inet_ntoa(p.ip)));
-
- return;
- }
- }
-
- DEBUG(4,("replying netbios packet: %s %s\n",
- packet_type, namestr(rr_name), inet_ntoa(p.ip)));
-
- nmb->header.name_trn_id = trn_id;
- nmb->header.opcode = opcode;
- nmb->header.response = True;
- nmb->header.nm_flags.bcast = False;
- nmb->header.nm_flags.recursion_available = recursion_available;
- nmb->header.nm_flags.recursion_desired = recursion_desired;
- nmb->header.nm_flags.trunc = False;
- nmb->header.nm_flags.authoritative = True;
-
- nmb->header.qdcount = 0;
- nmb->header.ancount = 1;
- nmb->header.nscount = 0;
- nmb->header.arcount = 0;
- nmb->header.rcode = rcode;
-
- bzero((char*)&nmb->question,sizeof(nmb->question));
-
- nmb->answers = &answers;
- bzero((char*)nmb->answers,sizeof(*nmb->answers));
-
- nmb->answers->rr_name = *rr_name;
- nmb->answers->rr_type = rr_type;
- nmb->answers->rr_class = rr_class;
- nmb->answers->ttl = ttl;
-
- if (data && len)
- {
- nmb->answers->rdlength = len;
- memcpy(nmb->answers->rdata, data, len);
- }
-
- p.packet_type = NMB_PACKET;
-
- debug_nmb_packet(&p);
-
- send_packet(&p);
-}
-
-
-/*******************************************************************
- the global packet linked-list. incoming entries are added to the
- end of this list. it is supposed to remain fairly short so we
- won't bother with an end pointer.
- ******************************************************************/
-static struct packet_struct *packet_queue = NULL;
-
-/*******************************************************************
- queue a packet into the packet queue
- ******************************************************************/
-void queue_packet(struct packet_struct *packet)
-{
- struct packet_struct *p;
-
- if (!packet_queue) {
- packet->prev = NULL;
- packet->next = NULL;
- packet_queue = packet;
- return;
- }
-
- /* find the bottom */
- for (p=packet_queue;p->next;p=p->next) ;
-
- p->next = packet;
- packet->next = NULL;
- packet->prev = p;
-}
-
-/****************************************************************************
- determine if a packet is for us. Note that to have any chance of
- being efficient we need to drop as many packets as possible at this
- stage as subsequent processing is expensive.
-
- We also must make absolutely sure we don't tread on another machines
- property by answering a packet that is not for us.
- ****************************************************************************/
-static BOOL listening(struct packet_struct *p,struct nmb_name *n)
-{
- struct subnet_record *d;
- struct name_record *n1;
-
- /* We explicitly don't search WINS here - this will be done
- in find_name_search if it was a packet from a non-local subnet. */
- d = find_subnet(p->ip);
-
- n1 = find_name_search(&d,n,FIND_LOCAL|FIND_WINS|FIND_SELF,p->ip);
-
- return (n1 != NULL);
-}
-
-
-/****************************************************************************
- process udp 138 datagrams
- ****************************************************************************/
-static void process_dgram(struct packet_struct *p)
-{
- char *buf;
- char *buf2;
- int len;
- struct dgram_packet *dgram = &p->packet.dgram;
-
- /* if we aren't listening to the destination name then ignore the packet */
- if (!listening(p,&dgram->dest_name))
- {
- DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s(%x) from %s\n",
- dgram->dest_name.name, dgram->dest_name.name_type, inet_ntoa(p->ip)));
- return;
- }
-
- if (dgram->header.msg_type != 0x10 &&
- dgram->header.msg_type != 0x11 &&
- dgram->header.msg_type != 0x12)
- {
- /* don't process error packets etc yet */
- DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s(%d) from %s as it is \
- an error packet of type %x\n",
- dgram->dest_name.name, dgram->dest_name.name_type,
- inet_ntoa(p->ip), dgram->header.msg_type));
- return;
- }
-
- buf = &dgram->data[0];
- buf -= 4; /* XXXX for the pseudo tcp length -
- someday I need to get rid of this */
-
- if (CVAL(buf,smb_com) != SMBtrans) return;
-
- len = SVAL(buf,smb_vwv11);
- buf2 = smb_base(buf) + SVAL(buf,smb_vwv12);
-
- DEBUG(4,("process_dgram: datagram from %s to %s for %s of type %d len=%d\n",
- namestr(&dgram->source_name),namestr(&dgram->dest_name),
- smb_buf(buf),CVAL(buf2,0),len));
-
-
- if (len <= 0) return;
-
- /* datagram packet received for the browser mailslot */
- if (strequal(smb_buf(buf),BROWSE_MAILSLOT)) {
- process_browse_packet(p,buf2,len);
- return;
- }
-
- /* datagram packet received for the domain log on mailslot */
- if (strequal(smb_buf(buf),NET_LOGON_MAILSLOT)) {
- process_logon_packet(p,buf2,len);
- return;
- }
-}
-
-/****************************************************************************
- process a nmb packet
- ****************************************************************************/
-static void process_nmb(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
-
- debug_nmb_packet(p);
-
- switch (nmb->header.opcode)
- {
- case 8: /* what is this?? */
- case NMB_REG:
- case NMB_REG_REFRESH:
- {
- if (nmb->header.response)
- {
- if (nmb->header.ancount ==0) break;
- response_netbios_packet(p); /* response to registration dealt
- with here */
- }
- else
- {
- if (nmb->header.qdcount==0 || nmb->header.arcount==0) break;
- reply_name_reg(p);
- }
- break;
- }
-
- case 0:
- {
- if (nmb->header.response)
- {
- switch (nmb->question.question_type)
- {
- case 0x0:
- {
- response_netbios_packet(p);
- break;
- }
- }
- return;
- }
- else if (nmb->header.qdcount>0)
- {
- switch (nmb->question.question_type)
- {
- case NMB_QUERY:
- {
- reply_name_query(p);
- break;
- }
- case NMB_STATUS:
- {
- reply_name_status(p);
- break;
- }
- }
- return;
- }
- break;
- }
-
- case NMB_REL:
- {
- if (nmb->header.response)
- {
- if (nmb->header.ancount ==0) break;
- response_netbios_packet(p); /* response to release dealt
- with here */
- }
- else
- {
- if (nmb->header.qdcount==0 || nmb->header.arcount==0) break;
- reply_name_release(p);
- }
- break;
- }
- }
-}
-
-
-/*******************************************************************
- run elements off the packet queue till its empty
- ******************************************************************/
-void run_packet_queue()
-{
- struct packet_struct *p;
-
- while ((p=packet_queue))
- {
- switch (p->packet_type)
- {
- case NMB_PACKET:
- process_nmb(p);
- break;
-
- case DGRAM_PACKET:
- process_dgram(p);
- break;
- }
-
- packet_queue = packet_queue->next;
- if (packet_queue) packet_queue->prev = NULL;
- free_packet(p);
- }
-}
-
-/****************************************************************************
- listens for NMB or DGRAM packets, and queues them
- ***************************************************************************/
-void listen_for_packets(BOOL run_election)
-{
- fd_set fds;
- int selrtn;
- struct timeval timeout;
-
- FD_ZERO(&fds);
- FD_SET(ClientNMB,&fds);
- FD_SET(ClientDGRAM,&fds);
-
- /* during elections and when expecting a netbios response packet we
- need to send election packets at tighter intervals
-
- ideally it needs to be the interval (in ms) between time now and
- the time we are expecting the next netbios packet */
-
- timeout.tv_sec = (run_election||num_response_packets) ? 1:NMBD_SELECT_LOOP;
- timeout.tv_usec = 0;
-
- /* We can only take term signals when we are in the select. */
- BlockSignals(False, SIGTERM);
- selrtn = sys_select(&fds,&timeout);
- BlockSignals(True, SIGTERM);
-
- if (FD_ISSET(ClientNMB,&fds))
- {
- struct packet_struct *packet = read_packet(ClientNMB, NMB_PACKET);
- if (packet)
- {
- if (ismyip(packet->ip) && packet->port == NMB_PORT)
- {
- DEBUG(7,("discarding own packet from %s:%d\n",
- inet_ntoa(packet->ip),packet->port));
- free_packet(packet);
- }
- else
- {
- queue_packet(packet);
- }
- }
- }
-
- if (FD_ISSET(ClientDGRAM,&fds))
- {
- struct packet_struct *packet = read_packet(ClientDGRAM, DGRAM_PACKET);
- if (packet)
- {
- if (ismyip(packet->ip) && packet->port == DGRAM_PORT)
- {
- DEBUG(7,("discarding own packet from %s:%d\n",
- inet_ntoa(packet->ip),packet->port));
- free_packet(packet);
- }
- else
- {
- queue_packet(packet);
- }
- }
- }
-}
-
-
-
-/****************************************************************************
- construct and send a netbios DGRAM
-
- Note that this currently sends all answers to port 138. thats the
- wrong things to do! I should send to the requestors port. XXX
- **************************************************************************/
-BOOL send_mailslot_reply(BOOL unique, char *mailslot,int fd,char *buf,int len,char *srcname,
- char *dstname,int src_type,int dest_type,
- struct in_addr dest_ip,struct in_addr src_ip)
-{
- struct packet_struct p;
- struct dgram_packet *dgram = &p.packet.dgram;
- char *ptr,*p2;
- char tmp[4];
-
- /* ha ha. no. do NOT send packets to 255.255.255.255: it's a pseudo address */
- if (ip_equal(wins_ip, dest_ip)) return False;
-
- bzero((char *)&p,sizeof(p));
-
- update_name_trn_id();
-
- /* DIRECT GROUP or UNIQUE datagram */
- dgram->header.msg_type = unique ? 0x10 : 0x11;
- dgram->header.flags.node_type = M_NODE;
- dgram->header.flags.first = True;
- dgram->header.flags.more = False;
- dgram->header.dgm_id = name_trn_id;
- dgram->header.source_ip = src_ip;
- dgram->header.source_port = DGRAM_PORT;
- dgram->header.dgm_length = 0; /* let build_dgram() handle this */
- dgram->header.packet_offset = 0;
-
- make_nmb_name(&dgram->source_name,srcname,src_type,scope);
- make_nmb_name(&dgram->dest_name,dstname,dest_type,scope);
-
- ptr = &dgram->data[0];
-
- /* now setup the smb part */
- ptr -= 4; /* XXX ugliness because of handling of tcp SMB length */
- memcpy(tmp,ptr,4);
- set_message(ptr,17,17 + len,True);
- memcpy(ptr,tmp,4);
-
- CVAL(ptr,smb_com) = SMBtrans;
- SSVAL(ptr,smb_vwv1,len);
- SSVAL(ptr,smb_vwv11,len);
- SSVAL(ptr,smb_vwv12,70 + strlen(mailslot));
- SSVAL(ptr,smb_vwv13,3);
- SSVAL(ptr,smb_vwv14,1);
- SSVAL(ptr,smb_vwv15,1);
- SSVAL(ptr,smb_vwv16,2);
- p2 = smb_buf(ptr);
- strcpy(p2,mailslot);
- p2 = skip_string(p2,1);
-
- memcpy(p2,buf,len);
- p2 += len;
-
- dgram->datasize = PTR_DIFF(p2,ptr+4); /* +4 for tcp length */
-
- p.ip = dest_ip;
- p.port = DGRAM_PORT;
- p.fd = ClientDGRAM;
- p.timestamp = time(NULL);
- p.packet_type = DGRAM_PACKET;
-
- DEBUG(4,("send mailslot %s from %s %s", mailslot,
- inet_ntoa(src_ip),namestr(&dgram->source_name)));
- DEBUG(4,("to %s %s\n", inet_ntoa(dest_ip),namestr(&dgram->dest_name)));
-
- return(send_packet(&p));
-}
diff --git a/source/namepacket.doc b/source/namepacket.doc
deleted file mode 100644
index 159a50738c5..00000000000
--- a/source/namepacket.doc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namepacket.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module deals with packets: sending, receiving, queueing
-and some basic interpretation (e.g it excludes datagram
-error packets at the moment).
-
-the packet queueing mechanism was originally introduced when
-samba dealt with responses by sending a packet, receiving
-packets and queueing all packets that didn't match up with
-the response expected. this is fine in a single-thread
-environment, but samba now deals with response packets by
-queueing the responses. to some extent, therefore, this
-queue_packet mechanism is redundant.
-
-
-/*************************************************************************
- send_mailslot_reply()
- *************************************************************************/
-
-this function is responsible for sending a MAILSLOT packet.
-
-it will _not_ send packets to the pseudo WINS subnet's address of
-255.255.255.255: this would be disastrous.
-
-each packet sent out has a unique transaction identifier. this is done
-so that responses can be matched later with the original purpose for
-the packet being sent out in the first place.
-
-
-/*************************************************************************
- listen_for_packets()
- *************************************************************************/
-
-this function is responsible for reading NMB and DGRAM packets, and then
-queueing them. it will normally time-out for NMBD_SELECT_LOOP seconds, but
-if there is an election currently running or we are expecting a response
-then this time is reduced to 1 second.
-
-note: the time-out period needs refining to the millisecond level.
-
-
-/*************************************************************************
- queue_packet()
- *************************************************************************/
-
-this function is responsible for queueing any NMB and DGRAM packets passed
-to it. these packets will be removed from the queue in run_packet_queue().
-
-
-/*************************************************************************
- run_packet_queue()
- *************************************************************************/
-
-this function is responsible for taking a packet off the queue,
-identifying whether it is an NMB or a DGRAM packet, processing
-it accordingly and deleting it. this process continues until
-there are no more packets on the queue.
-
-
-/*************************************************************************
- process_nmb()
- *************************************************************************/
-
-this function receives a packet identified as a netbios packet.
-it further identifies whether it is a response or a query packet.
-by identifying the type of packet (name registration, query etc)
-process_nmb() will call the appropriate function to deal with the
-type of packet received.
-
-
-/*************************************************************************
- process_dgram()
- *************************************************************************/
-
-this function is responsible for identifying whether the datagram
-packet received is a browser packet or a domain logon packet. it
-also does some filtering of certain types of packets (e.g it
-filters out error packets).
-
-
-/*************************************************************************
- reply_netbios_packet()
- *************************************************************************/
-
-this function is responsible for sending a reply to another NetBIOS
-packet from another host. it can be used to send a reply to a name
-registration, name release, name query or name status request.
-
-the reply can be either a positive or a negative one.
-
-
-/*************************************************************************
- initiate_netbios_packet()
- *************************************************************************/
-
-this function is responsible for construction a netbios packet and sending
-it. if the packet has not had a unique transaction id allocated to it,
-then initiate_netbios_packet() will give it one.
-
-
-/*************************************************************************
- update_name_trn_id()
- *************************************************************************/
-
-this function is responsible for allocating unique transaction identifiers
-for each new packet sent on the network.
-
-
diff --git a/source/namequery.doc b/source/namequery.doc
deleted file mode 100644
index 4337cfb7e2a..00000000000
--- a/source/namequery.doc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namequery.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module contains non-threaded versions of name status and name
-query functions. if a multi-threaded nmbd was to be written, these
-functions would be the starting point.
-
-at the moment, the expected response queueing system is used to
-replace these functions without needing to multi-thread nmbd.
-
-these functions are used in smbclient and nmblookup at present to
-avoid having the vast quantities of complex and unused code needed
-to support even a simple name query (or providing stubs for the
-unused side of these functions).
-
-there is a down-side to these functions, which is all microsoft's
-fault. microsoft machines always always reply to queries on the
-priveleged ports, rather than following the usual tcp/ip mechanism
-of replying on the client's port (the exception to this i am led
-to believe is windows nt 3.50).
-
-as a result of this, in order to receive a response to a name
-query from a microsoft machine, we must be able to listen on
-the priveleged netbios name server ports. this is simply not
-possible with some versions of unix, unless you have root access.
-
-it is also not possible if you run smbclient or nmblookup on an
-interface that already has been claimed by the netbios name server
-daemon nmbd.
-
-all in all, i wish that microsoft would fix this.
-
-a solution does exist: nmbd _does_ actually reply on the client's
-port, so if smbclient and nmblookup were to use nmbd as a proxy
-forwarder of queries (or to use samba's WINS capabilities) then
-a query could be made without needing access to the priveleged
-ports. in order to do this properly, samba must implement secured
-netbios name server functionality (see rfc1001.txt 15.1.6).
-(lkcl 01aug96: samba now supports secured name registration)
-
-/*************************************************************************
- name_query()
- *************************************************************************/
-
-
-
-/*************************************************************************
- name_status()
- *************************************************************************/
-
-
-
-/*************************************************************************
- _interpret_node_status()
- *************************************************************************/
-
-
-this is a older version of interpret_node_status().
-
diff --git a/source/nameresp.c b/source/nameresp.c
deleted file mode 100644
index f44171f4b67..00000000000
--- a/source/nameresp.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios library routines
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: nameresp.c
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern struct subnet_record *subnetlist;
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern struct in_addr ipzero;
-extern struct in_addr wins_ip;
-
-
-/***************************************************************************
- deals with an entry before it dies
- **************************************************************************/
-static void dead_netbios_entry(struct subnet_record *d,
- struct response_record *n)
-{
- DEBUG(3,("Removing dead netbios entry for %s %s (num_msgs=%d)\n",
- inet_ntoa(n->send_ip), namestr(&n->name), n->num_msgs));
-
- debug_state_type(n->state);
-
- switch (n->state)
- {
- case NAME_QUERY_CONFIRM:
- {
- if (!lp_wins_support()) return; /* only if we're a WINS server */
-
- if (n->num_msgs == 0)
- {
- /* oops. name query had no response. check that the name is
- unique and then remove it from our WINS database */
-
- /* IMPORTANT: see query_refresh_names() */
-
- if ((!NAME_GROUP(n->nb_flags)))
- {
- struct subnet_record *d1 = wins_subnet;
- if (d1)
- {
- /* remove the name that had been registered with us,
- and we're now getting no response when challenging.
- see rfc1001.txt 15.5.2
- */
- remove_netbios_name(d1, n->name.name, n->name.name_type,
- REGISTER, n->send_ip);
- }
- }
- }
- break;
- }
-
- case NAME_QUERY_MST_CHK:
- {
- /* if no response received, the master browser must have gone
- down on that subnet, without telling anyone. */
-
- /* IMPORTANT: see response_netbios_packet() */
-
- if (n->num_msgs == 0)
- browser_gone(n->name.name, n->send_ip);
- break;
- }
-
- case NAME_RELEASE:
- {
- /* if no response received, it must be OK for us to release the
- name. nobody objected (including a potentially dead or deaf
- WINS server) */
-
- /* IMPORTANT: see response_name_release() */
-
- if (ismyip(n->send_ip))
- {
- name_unregister_work(d,n->name.name,n->name.name_type);
- }
- if (!n->bcast && n->num_msgs == 0)
- {
- DEBUG(0,("WINS server did not respond to name release!\n"));
- /* XXXX whoops. we have problems. must deal with this */
- }
- break;
- }
-
- case NAME_REGISTER_CHALLENGE:
- {
- /* name challenge: no reply. we can reply to the person that
- wanted the unique name and tell them that they can have it
- */
-
- add_name_respond(d,n->fd,d->myip, n->response_id ,&n->name,
- n->nb_flags, GET_TTL(0),
- n->reply_to_ip, True, n->reply_to_ip);
-
- if (!n->bcast && n->num_msgs == 0)
- {
- DEBUG(1,("WINS server did not respond to name registration!\n"));
- /* XXXX whoops. we have problems. must deal with this */
- }
- break;
- }
-
- case NAME_REGISTER:
- {
- /* if no response received, and we are using a broadcast registration
- method, it must be OK for us to register the name: nobody objected
- on that subnet. if we are using a WINS server, then the WINS
- server must be dead or deaf.
- */
- if (n->num_msgs == 0)
- {
- if (n->bcast)
- {
- /* broadcast method: implicit acceptance of the name registration
- by not receiving any objections. */
-
- /* IMPORTANT: see response_name_reg() */
-
- name_register_work(d,n->name.name,n->name.name_type,
- n->nb_flags, n->ttl, n->reply_to_ip, n->bcast);
- }
- else
- {
- /* received no response. rfc1001.txt states that after retrying,
- we should assume the WINS server is dead, and fall back to
- broadcasting (see bits about M nodes: can't find any right
- now) */
-
- DEBUG(1,("WINS server did not respond to name registration!\n"));
- /* XXXX whoops. we have problems. must deal with this */
- }
- }
- break;
- }
-
- case NAME_QUERY_DOMAIN:
- {
- /* if no response was received, there is no domain controller for
- this DOMAIN registered within WINS. it's ok for us to register
- the DOMAIN<1b> name.
- */
-
- if (n->num_msgs == 0)
- {
- struct work_record *work = find_workgroupstruct(d,n->name.name,False);
- if (work && d)
- {
- become_domain_master(d,work);
- }
- }
- else
- {
- DEBUG(1, ("nmbd configured as domain master and one already exists\n"));
- }
- break;
- }
-
- default:
- {
- /* nothing to do but delete the dead expected-response structure */
- /* this is normal. */
- break;
- }
- }
-}
-
-
-/*******************************************************************
- remove old name response entries
-
- XXXX retry code needs to be added, including a retry wait period and a count
- see name_query() and name_status() for suggested implementation.
-
- ******************************************************************/
-void expire_netbios_response_entries(time_t t)
-{
- struct subnet_record *d;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct response_record *n, *nextn;
-
- for (n = d->responselist; n; n = nextn)
- {
- nextn = n->next;
-
- if (n->repeat_time <= t)
- {
- if (n->repeat_count > 0)
- {
- /* resend the entry */
- initiate_netbios_packet(&n->response_id, n->fd, n->quest_type,
- n->name.name, n->name.name_type,
- n->nb_flags, n->bcast, n->recurse, n->send_ip);
-
- n->repeat_time += n->repeat_interval; /* XXXX ms needed */
- n->repeat_count--;
-
- }
- else
- {
- DEBUG(4,("timeout response %d for %s %s\n",
- n->response_id, namestr(&n->name),
- inet_ntoa(n->send_ip)));
-
- dead_netbios_entry(d,n); /* process the non-response */
- remove_response_record(d,n); /* remove the non-response */
-
- continue;
- }
- }
- }
- }
-}
-
-
-/****************************************************************************
- wrapper function to override a broadcast message and send it to the WINS
- name server instead, if it exists. if wins is false, and there has been no
- WINS server specified, the packet will NOT be sent.
- ****************************************************************************/
-struct response_record *queue_netbios_pkt_wins(
- int fd,int quest_type,enum state_type state,
- char *name,int name_type,int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- struct in_addr send_ip, struct in_addr reply_to_ip)
-{
- /* XXXX note: please see rfc1001.txt section 10 for details on this
- function: it is currently inappropriate to use this - it will do
- for now - once there is a clarification of B, M and P nodes and
- which one samba is supposed to be
- */
-
- if ((!lp_wins_support()) && (*lp_wins_server()))
- {
- /* samba is not a WINS server, and we are using a WINS server */
- struct in_addr real_wins_ip;
- real_wins_ip = *interpret_addr2(lp_wins_server());
-
- if (!zero_ip(real_wins_ip))
- {
- send_ip = real_wins_ip;
- }
- else
- {
- /* oops. smb.conf's wins server parameter MUST be a host_name
- or an ip_address. */
- DEBUG(0,("invalid smb.conf parameter 'wins server'\n"));
- }
- }
-
- if (zero_ip(send_ip)) return NULL;
-
- return queue_netbios_packet(wins_subnet,fd, quest_type, state,
- name, name_type, nb_flags, ttl,
- server_type,my_name,my_comment,
- False, True, send_ip, reply_to_ip);
-}
-
-
-/****************************************************************************
- initiate a netbios name query to find someone's or someones' IP
- this is intended to be used (not exclusively) for broadcasting to
- master browsers (WORKGROUP(1d or 1b) or __MSBROWSE__(1)) to get
- complete lists across a wide area network
- ****************************************************************************/
-struct response_record *queue_netbios_packet(struct subnet_record *d,
- int fd,int quest_type,enum state_type state,char *name,
- int name_type,int nb_flags, time_t ttl,
- int server_type, char *my_name, char *my_comment,
- BOOL bcast,BOOL recurse,
- struct in_addr send_ip, struct in_addr reply_to_ip)
-{
- struct response_record *n;
- uint16 id = 0xffff;
-
- /* ha ha. no. do NOT broadcast to 255.255.255.255: it's a pseudo address */
- if (ip_equal(wins_ip, send_ip)) return NULL;
-
- initiate_netbios_packet(&id, fd, quest_type, name, name_type,
- nb_flags, bcast, recurse, send_ip);
-
- if (id == 0xffff) {
- DEBUG(4,("did not initiate netbios packet: %s\n", inet_ntoa(send_ip)));
- return NULL;
- }
-
- if ((n = make_response_queue_record(state,id,fd,
- quest_type,name,name_type,nb_flags,ttl,
- server_type,my_name, my_comment,
- bcast,recurse,send_ip,reply_to_ip)))
- {
- add_response_record(d,n);
- return n;
- }
- return NULL;
-}
diff --git a/source/nameresp.doc b/source/nameresp.doc
deleted file mode 100644
index cfe63500c88..00000000000
--- a/source/nameresp.doc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameresp.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-the netbios expected response code is a key part of samba's NetBIOS
-handling capabilities. it allows samba to carry on dealing with
-other things while expecting a response from one or more hosts.
-
-this allows samba to simultaneously deal with registering its names
-with another WINS server, register its names on its local subnets,
-query any hosts that have registered with samba in its capacity as
-a WINS server, and at a later date it will be also be able handle
-END-NODE CHALLENGES (see rfc1001.txt 15.2.2.2 and 15.2.2.3 - secured
-NBNS functionality).
-
-all at once!
-
-when a netbios packet is sent out by samba and it expects a response,
-a record of all the relevant information is kept (most importantly,
-the unique transaction id associated which will come back to us in
-a response packet is recorded, and also recorded is the reason that
-the original packet was sent out by samba in the first place!).
-
-if a response is received, then the unique transaction identifier
-returned in the response packet is searched for in the expected
-response records. the record indicates why the initial request was
-made (and therefore the type of response can be verified) and
-appropriate action can be taken.
-
-when no responses, after a number of retries, are not received, then
-samba may take appropriate action. this is a crucial part of samba's
-operation: for a key number of NetBIOS operations, no response is an
-implicit positive response.
-
-module nameresp deals with the initial transmission, re-transmission
-and time-out of netbios response records.
-
-module namedbresp deals with the maintenance of the list of expected
-responses - creation, finding and removal.
-
-
-/*************************************************************************
- queue_netbios_packet()
- *************************************************************************/
-
-this function is responsible for sending out a netbios packet, and then
-making a record of the information that was sent out. a response will
-be expected later (or not, as the case may be).
-
-if a response is received, response_netbios_packet() will deal with it.
-otherwise, it will be dealt with in expire_netbios_response_entries().
-
-
-/*************************************************************************
- queue_netbios_pkt_wins()
- *************************************************************************/
-
-this function is a wrapper around queue_netbios_packet(). there is
-some confusion about B, M and P nodes (see rfc1001.txt section 10) -
-confusion introduced by luke :-) - which needs sorting out.
-
-for example, rfc1001.txt 15.2.3 - an M node must attempt to register a
-name first as a B node, then attempt to register as an M node. negative
-responses on either of these attempts is a failure to register the
-name.
-
-this is NOT the case with a P node.
-
-
-/*************************************************************************
- expire_netbios_response_entries()
- *************************************************************************/
-
-this function is responsible for dealing with queued response records
-that have not received a response packet matching their unique
-transaction id.
-
-if the retry count for any record is non-zero, and its time-out period
-has expired, the retry count is reduced, the time-out period is stepped
-forward and the packet is re-transmitted (from the information stored
-in the queued response record) with the same unique transaction id of
-the initial attempt at soliciting a response.
-
-if the retry count is zero, then the packet is assumed to have expired.
-dead_netbios_entry() is called to deal with the possibility of an error
-or a problem (or in certain instances, no answer is an implicit
-positive response!).
-
-the expected response record is then deleted, and the number of expected
-responses reduced. when this count gets to zero, listen_for_packets()
-will no longer time-out for 1 second on account of expecting response
-packets.
-
-
-/*************************************************************************
- dead_netbios_entry()
- *************************************************************************/
-
-this function is responsible for dealing with the case when a NetBIOS
-response to a packet sent out by samba was not received. for certain
-transactions, this may be normal. for others, under certain conditions
-it may constitute either an error or a problem with or failure of one
-or more hosts.
-
-- NAME_QUERY_CONFIRM
-
-when a samba 'state' of type NAME_QUERY_CONFIRM is sent, a response
-may or may not be forthcoming. if no response is received to a unique
-name, then the record is removed from samba's WINS database. non-unique
-names are simply expected to die off on a time-to-live basis (see
-rfc1001.txt 15.1.3.4)
-
-query_refresh_names() issues this samba 'state'
-response_name_query_sync() deals with responses to NAME_QUERY_CONFIRM.
-
-- NAME_QUERY_MST_CHK
-
-when a samba 'state' of type NAME_QUERY_MST_CHK is sent, and a response
-is not received, this implies that a master browser will have failed.
-remedial action may need to be taken, for example if samba is a member
-of that workgroup and it is also a potential master browser it could
-force an election.
-
-check_master_browser() issues this samba 'state'.
-response_process() does nothing if a response is received. this is normal.
-
-- NAME_RELEASE
-
-when a samba 'state' of type NAME_RELEASE is sent, and a response is
-not received, it is assumed to be acceptable to release the name. if the
-original response was sent to another WINS server, then that WINS server
-may be inaccessible or may have failed. if so, then at a later date
-samba should take this into account (see rfc1001.txt 10.3).
-
-remove_name_entry() issues this samba 'state'
-response_name_rel() deals with responses to NAME_RELEASE.
-
-- NAME_REGISTER
-
-when a samba 'state' of type NAME_REGISTER is sent, and a response is
-not received, if the registration was done by broadcast, it is assumed
-that there are no objections to the registration of this name, and samba
-adds the name to the appropriate subnet record name database. if the
-registration was point-to-point (i.e with another WINS server) then that
-WINS server may be inaccessible or may have failed. if so, then at a later
-date samba should take this into account (see rfc1001.txt 10.3).
-
-add_my_name_entry() issues this samba 'state'
-response_name_reg() deals with responses to NAME_REGISTER.
-
-no action is taken for any other kinds of samba 'states' if a response
-is not received. this is not to say that action may not be appropriate,
-just that it's not been looked at yet :-)
-
-
diff --git a/source/nameserv.c b/source/nameserv.c
deleted file mode 100644
index ccd0ef379cb..00000000000
--- a/source/nameserv.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: nameserv.c
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- module nameserv contains name server management functions
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern pstring myname;
-extern fstring myworkgroup;
-extern char **my_netbios_names;
-extern struct in_addr ipzero;
-extern struct in_addr wins_ip;
-
-extern struct subnet_record *subnetlist;
-
-extern uint16 nb_type; /* samba's NetBIOS type */
-
-/****************************************************************************
- remove an entry from the name list
-
- note: the name will _always_ be removed
- XXXX at present, the name is removed _even_ if a WINS server says keep it.
-
- ****************************************************************************/
-void remove_name_entry(struct subnet_record *d, char *name,int type)
-{
- /* XXXX BUG: if samba is offering WINS support, it should still broadcast
- a de-registration packet to the local subnet before removing the
- name from its local-subnet name database. */
-
- int search = FIND_SELF;
- struct name_record n;
- struct name_record *n2=NULL;
-
- make_nmb_name(&n.name,name,type,scope);
-
- if(d == wins_subnet)
- search |= FIND_WINS;
- else
- search |= FIND_LOCAL;
-
- if ((n2 = find_name_search(&d, &n.name, search, ipzero)))
- {
- /* check name isn't already being de-registered */
- if (NAME_DEREG(n2->ip_flgs[0].nb_flags))
- return;
-
- /* mark the name as in the process of deletion. */
- n2->ip_flgs[0].nb_flags &= NB_DEREG;
- }
-
- if (!n2) return;
-
- /* Only remove names with non-zero death times. */
- if(n2->death_time == 0)
- {
- DEBUG(5,("remove_name_entry: Name %s(%d) has zero ttl - not removing.\n",
- name, type));
- return;
- }
-
- /* remove the name immediately. even if the spec says we should
- first try to release them, this is too dangerous with our current
- name structures as otherwise we will end up replying to names we
- don't really own */
- remove_netbios_name(d,name,type,SELF,n2->ip_flgs[0].ip);
-
- if (ip_equal(d->bcast_ip, wins_ip))
- {
- if (!lp_wins_support())
- {
- /* not a WINS server: we have to release them on the network */
- queue_netbios_pkt_wins(ClientNMB,NMB_REL,NAME_RELEASE,
- name, type, 0, 0,0,NULL,NULL,
- ipzero, ipzero);
- }
- }
- else
- {
- /* local interface: release them on the network */
- queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
- name, type, 0, 0,0,NULL,NULL,
- True, False, d->bcast_ip, d->bcast_ip);
- }
-}
-
-
-/****************************************************************************
- add an entry to the name list
-
- big note: our name will _always_ be added (if there are no objections).
- it's just a matter of when this will be done (e.g after a time-out).
-
- ****************************************************************************/
-void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
-{
- BOOL re_reg = False;
- struct nmb_name n;
-
- if (!d) return;
-
- /* not that it particularly matters, but if the SELF name already exists,
- it must be re-registered, rather than just registered */
-
- make_nmb_name(&n, name, type, scope);
- if (find_name(d->namelist, &n, SELF))
- re_reg = True;
-
- /* XXXX BUG: if samba is offering WINS support, it should still add the
- name entry to a local-subnet name database. see rfc1001.txt 15.1.1 p28
- regarding the point about M-nodes. */
-
- if (ip_equal(d->bcast_ip, wins_ip))
- {
- if (lp_wins_support())
- {
- /* we are a WINS server. */
- if(lp_wins_support())
- {
- DEBUG(4,("add_my_name_entry: samba as WINS server adding: "));
- }
-
- /* this will call add_netbios_entry() */
- name_register_work(d, name, type, nb_flags,0, ipzero, False);
- }
- else
- {
- DEBUG(4,("add_my_name_entry registering name %s with WINS server.\n",
- name));
-
- /* a time-to-live allows us to refresh this name with the WINS server. */
- queue_netbios_pkt_wins(ClientNMB,
- re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
- name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
- ipzero, ipzero);
- }
- }
- else
- {
- /* broadcast the packet, but it comes from ipzero */
- queue_netbios_packet(d,ClientNMB,
- re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
- name, type, nb_flags, GET_TTL(0),0,NULL,NULL,
- True, False, d->bcast_ip, ipzero);
- }
-}
-
-
-/****************************************************************************
- add the internet group <1c> domain logon names by wins unicast and broadcast.
- ****************************************************************************/
-void add_domain_logon_names(void)
-{
- struct subnet_record *d;
-
- if (!lp_domain_logons()) return;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *work = find_workgroupstruct(d, myworkgroup, True);
-
- if (work && work->log_state == LOGON_NONE)
- {
- struct nmb_name n;
- make_nmb_name(&n,myworkgroup,0x1c,scope);
-
- if (!find_name(d->namelist, &n, FIND_SELF))
- {
- /* logon servers are group names. don't expect failure */
-
- DEBUG(0,("%s attempting to become logon server for %s %s\n",
- timestring(), myworkgroup, inet_ntoa(d->bcast_ip)));
-
- become_logon_server(d, work);
- }
- }
- }
-}
-
-
-/****************************************************************************
- add the <1b> domain master names by broadcast.
- ****************************************************************************/
-void add_domain_master_bcast(void)
-{
- struct subnet_record *d;
-
- if (!lp_domain_master()) return;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work = find_workgroupstruct(d, myworkgroup, True);
-
- if (work && work->dom_state == DOMAIN_NONE)
- {
- struct nmb_name n;
- make_nmb_name(&n,myworkgroup,0x1b,scope);
-
- if (!find_name(d->namelist, &n, FIND_SELF))
- {
- DEBUG(0,("%s add_domain_names: attempting to become domain \
-master browser on workgroup %s %s\n",
- timestring(), myworkgroup, inet_ntoa(d->bcast_ip)));
-
- /* send out a query to establish whether there's a
- domain controller on the local subnet. if not,
- we can become a domain controller. it's only
- polite that we check, before claiming the
- NetBIOS name 0x1b.
- */
-
- DEBUG(0,("add_domain_names:querying subnet %s \
-for domain master on workgroup %s\n",
- inet_ntoa(d->bcast_ip), myworkgroup));
-
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,
- NAME_QUERY_DOMAIN,
- myworkgroup, 0x1b,
- 0, 0,0,NULL,NULL,
- True, False,
- d->bcast_ip, d->bcast_ip);
- }
- }
- }
-}
-
-
-/****************************************************************************
- add the <1b> domain master name by wins unicast.
- ****************************************************************************/
-void add_domain_master_wins(void)
-{
- struct work_record *work;
-
- if (!lp_domain_master() || wins_subnet == NULL) return;
-
- work = find_workgroupstruct(wins_subnet, myworkgroup, True);
-
- if (work && work->dom_state == DOMAIN_NONE)
- {
- struct nmb_name n;
- make_nmb_name(&n,myworkgroup,0x1b,scope);
-
- if (!find_name(wins_subnet->namelist, &n, FIND_SELF))
- {
- DEBUG(0,("%s add_domain_names: attempting to become domain \
-master browser on workgroup %s %s\n",
- timestring(), myworkgroup, inet_ntoa(wins_subnet->bcast_ip)));
-
- if (lp_wins_support())
- {
- /* use the wins server's capabilities (indirectly). if
- someone has already registered the domain<1b>
- name with the WINS server, then the WINS
- server's job is to _check_ that the owner still
- wants it, before giving it away.
- */
-
- DEBUG(1,("%s initiate become domain master for %s\n",
- timestring(), myworkgroup));
-
- become_domain_master(wins_subnet, work);
- }
- else
- {
- /* send out a query to establish whether there's a
- domain controller on the WINS subnet. if not,
- we can become a domain controller. it's only
- polite that we check, before claiming the
- NetBIOS name 0x1b.
- */
-
- DEBUG(0,("add_domain_names:querying WINS \
-for domain master on workgroup %s\n", myworkgroup));
-
- queue_netbios_pkt_wins(ClientNMB,NMB_QUERY,
- NAME_QUERY_DOMAIN,
- myworkgroup, 0x1b,
- 0, 0,0,NULL,NULL,
- ipzero, ipzero);
- }
- }
- }
-}
-
-
-/****************************************************************************
- add the domain logon server and domain master browser names
-
- this code was written so that several samba servers can co-operate in
- sharing the task of (one server) being a domain master, and of being
- domain logon servers.
-
- **************************************************************************/
-void add_domain_names(time_t t)
-{
- static time_t lastrun = 0;
-
- if (lastrun != 0 && t < lastrun + CHECK_TIME_ADD_DOM_NAMES * 60) return;
- lastrun = t;
-
- /* do the "internet group" - <1c> names */
- add_domain_logon_names();
-
- /* do the domain master names */
- if (wins_subnet != NULL)
- {
- /* if the registration of the <1b> name is successful, then
- add_domain_master_bcast() will be called. this will
- result in domain logon services being gracefully provided,
- as opposed to the aggressive nature of 1.9.16p2 to 1.9.16p11.
-
- which, due to a bug in namelogon.c from 1.9.16p2 to 1.9.16p11
- cannot _provide_ domain master / domain logon services!!!
-
- */
- add_domain_master_wins();
- }
- else
- {
- add_domain_master_bcast();
- }
-}
-
-/****************************************************************************
- add the magic samba names, useful for finding samba servers
- **************************************************************************/
-void add_my_names(void)
-{
- struct subnet_record *d;
- /* each subnet entry, including WINS pseudo-subnet, has SELF names */
-
- /* XXXX if there was a transport layer added to samba (ipx/spx etc) then
- there would be yet _another_ for-loop, this time on the transport type
- */
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- int n;
- BOOL wins = (lp_wins_support() && (d == wins_subnet));
-
- /* Add all our names including aliases. */
- for (n=0; my_netbios_names[n]; n++)
- {
- add_my_name_entry(d, my_netbios_names[n],0x20,nb_type|NB_ACTIVE);
- add_my_name_entry(d, my_netbios_names[n],0x03,nb_type|NB_ACTIVE);
- add_my_name_entry(d, my_netbios_names[n],0x00,nb_type|NB_ACTIVE);
- }
-
- /* these names are added permanently (ttl of zero) and will NOT be
- refreshed with the WINS server */
- add_netbios_entry(d,"*",0x0,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
- add_netbios_entry(d,"*",0x20,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
- add_netbios_entry(d,"__SAMBA__",0x20,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
- add_netbios_entry(d,"__SAMBA__",0x00,nb_type|NB_ACTIVE,0,SELF,d->myip,False,wins);
- }
-}
-
-
-/****************************************************************************
- remove all the samba names... from a WINS server if necessary.
- **************************************************************************/
-void remove_my_names()
-{
- struct subnet_record *d;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct name_record *n, *next;
-
- for (n = d->namelist; n; n = next)
- {
- next = n->next;
- if (n->source == SELF)
- {
- /* get all SELF names removed from the WINS server's database */
- /* XXXX note: problem occurs if this removes the wrong one! */
-
- remove_name_entry(d,n->name.name, n->name.name_type);
- }
- }
- }
-}
-
-
-/*******************************************************************
- refresh my own names
- ******************************************************************/
-void refresh_my_names(time_t t)
-{
- struct subnet_record *d;
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct name_record *n;
-
- for (n = d->namelist; n; n = n->next)
- {
- /* each SELF name has an individual time to be refreshed */
- if (n->source == SELF && n->refresh_time < t &&
- n->death_time != 0)
- {
- add_my_name_entry(d,n->name.name,n->name.name_type,
- n->ip_flgs[0].nb_flags);
- /* they get a new lease on life :-) */
- n->death_time += GET_TTL(0);
- n->refresh_time += GET_TTL(0);
- }
- }
- }
-}
-
-
-/*******************************************************************
- queries names occasionally. an over-cautious, non-trusting WINS server!
-
- this function has been added because nmbd could be restarted. it
- is generally a good idea to check all the names that have been
- reloaded from file.
-
- XXXX which names to poll and which not can be refined at a later date.
- ******************************************************************/
-void query_refresh_names(time_t t)
-{
- struct name_record *n;
- struct subnet_record *d = wins_subnet;
-
- static time_t lasttime = 0;
-
- int count = 0;
- int name_refresh_time = NAME_POLL_REFRESH_TIME;
- int max_count = name_refresh_time * 2 / NAME_POLL_INTERVAL;
- if (max_count > 10) max_count = 10;
-
- name_refresh_time = NAME_POLL_INTERVAL * max_count / 2;
-
- /* if (!lp_poll_wins()) return; polling of registered names allowed */
-
- if (!d) return;
-
- if (!lasttime) lasttime = t;
- if (t - lasttime < NAME_POLL_INTERVAL) return;
-
- lasttime = time(NULL);
-
- for (n = d->namelist; n; n = n->next)
- {
- /* only do unique, registered names */
-
- if (n->source != REGISTER) continue;
- if (!NAME_GROUP(n->ip_flgs[0].nb_flags)) continue;
-
- if (n->refresh_time < t)
- {
- DEBUG(3,("Polling name %s\n", namestr(&n->name)));
-
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_CONFIRM,
- n->name.name, n->name.name_type,
- 0,0,0,NULL,NULL,
- False,False,n->ip_flgs[0].ip,n->ip_flgs[0].ip);
- count++;
- }
-
- if (count >= max_count)
- {
- /* don't do too many of these at once, but do enough to
- cover everyone in the list */
- return;
- }
-
- /* this name will be checked on again, if it's not removed */
- n->refresh_time += name_refresh_time;
- }
-}
-
diff --git a/source/nameserv.doc b/source/nameserv.doc
deleted file mode 100644
index af4934ade21..00000000000
--- a/source/nameserv.doc
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameserv.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module deals with general maintenance of NetBIOS names.
-
-/*************************************************************************
- query_refresh_names()
- *************************************************************************/
-
-this function is responsible for polling all names registered in the
-WINS database. it is planned to enable this function should samba
-detect an inconsistency on the network, which could occur if the
-samba NetBIOS daemon dies and is restarted.
-
-polling is done very infrequently, but all names will be covered
-within a period NAME_POLL_REFRESH_TIME. a group of at most ten names
-will be queried at once, at intervals of NAME_POLL_INTERVAL seconds.
-if the total number of names queried in this way will take too long,
-then the time that an individual name will next be polled is
-increased accordingly.
-
-name query polling is functionality over-and-above the normal
-requirement (see rfc1001.txt 15.1.7 point 7). it is normally the
-responsibility of the owner of a name to re-register the name at
-regular intervals.
-
-
-/*************************************************************************
- refresh_my_names()
- *************************************************************************/
-
-this function is responsible for refreshing samba's names that have
-been registered with other servers on a local subnet, or with another
-WINS server if samba is using one.
-
-samba's names' refresh_time will be updated through the use of the function
-add_my_name_entry().
-
-
-/*************************************************************************
- remove_my_names()
- *************************************************************************/
-
-this function is responsible for removing all samba's SELF names. it
-is used when samba receives a SIG_TERM. samba at present does not wait
-for the WINS server to reply to the name releases sent out.
-
-
-/*************************************************************************
- add_my_names()
- *************************************************************************/
-
-this function is responsible for adding and registering if necessary all
-samba's SELF names, on each of its local subnets and with another WINS
-server if samba is using one.
-
-/*************************************************************************
- add_my_name_entry()
- *************************************************************************/
-
-this function is responsible for registering or re-registering one of
-samba's names, either on the local subnet or with another WINS server
-if samba is using one.
-
-if the name is already in samba's database, then it is re-registered,
-otherwise it is simply registered.
-
-if the name is being registered in a WINS capacity (the subnet to which
-the name should be added is the WINS pseudo-subnet) then we add the entry
-immediately if samba is a WINS server. it uses name_register_work()
-because if the name is being added as part of becoming a master browser,
-we want to carry on that process. if the name is registered with another
-WINS server, we must wait for an answer from that WINS server. either
-name_register_work() or name_unregister_work() will be called as a result.
-
-if the name is being registered on a local subnet, then it is
-broadcast. an explicit rejection from another host will result
-in name_unregister_work() being called. no response will, after
-retrying, result in name_register_work() being called.
-
-what ever method is used, the name will either be registered
-or rejected, and what ever process was taking place (becoming
-a master browser for example) will carry on.
-
-expire_netbios_response_entries() is responsible for taking further
-action if no response to the registration is received.
-
-note that there may be a large number of function calls on the
-stack if become_master() is called and samba is configured as
-a WINS server. the loop will be:
-
-become_master(), add_my_name_entry(), name_register_work() and
-back to become_master() with the new value of the workgroup
-'state'.
-
-
-/*************************************************************************
- remove_name_entry()
- *************************************************************************/
-
-this function is responsible for removing a NetBIOS name. if the name
-being removed is registered on a local subnet, a name release should be
-broadcast on the local subnet.
-
-if the name is being released in a WINS capacity (the subnet to
-which the name should be added is the WINS pseudo-subnet) then we
-remove the entry immediately if samba is a WINS server. it uses
-name_unregister_work() because if the name is being added as part of
-becoming a master browser, we want to terminate that process. if the
-name is released from another WINS server, we must wait for an
-answer from that WINS server. name_unregister_work() will
-definitely be called as a result, because at present we ignore
-negative responses for a name release from a WINS server.
-
-if the name is being releasedd on a local subnet, then it is
-broadcast. name_unregister_work() will definitely be called
-because we ignore negative name releases at present.
-
-what ever method is used, the name will be released. (NOT TRUE!
-see response_name_release())
-
-expire_netbios_response_entries() is responsible for taking further action
-if no response to the name release is received.
-
-
-/*************************************************************************
- load_netbios_names()
- *************************************************************************/
-
-this function is responsible for loading any NetBIOS names that samba,
-in its WINS capacity, has written out to disk. all the relevant details
-are recorded in this file, including the time-to-live. should the
-time left to live be small, the name is not added back in to samba's
-WINS database.
-
diff --git a/source/nameservreply.c b/source/nameservreply.c
deleted file mode 100644
index 5b9c476549d..00000000000
--- a/source/nameservreply.c
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Module name: nameservreply.c
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 04 jul 96: lkcl@pires.co.uk
- created module nameservreply containing NetBIOS reply functions
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-
-extern int DEBUGLEVEL;
-
-extern struct in_addr wins_ip;
-
-/****************************************************************************
-send a registration / release response: pos/neg
-**************************************************************************/
-static void send_name_response(int fd, struct in_addr from_ip,
- int name_trn_id, int opcode, BOOL success,
- BOOL recursion_available, BOOL recursion_desired,
- struct nmb_name *reply_name, int nb_flags, int ttl,
- struct in_addr ip)
-{
- char rdata[6];
- struct packet_struct p;
-
- int rcode = 0;
-
- if (success == False)
- {
- /* NEGATIVE RESPONSE */
- rcode = 6;
- }
- else if (opcode == NMB_REG && !recursion_available)
- {
- /* END-NODE CHALLENGE REGISTRATION RESPONSE */
- rcode = 0;
- }
-
- rdata[0] = nb_flags;
- rdata[1] = 0;
- putip(&rdata[2],(char *)&ip);
-
- p.ip = from_ip;
- p.port = NMB_PORT;
- p.fd = fd;
- p.timestamp = time(NULL);
- p.packet_type = NMB_PACKET;
-
- reply_netbios_packet(&p,name_trn_id,
- rcode,opcode,opcode,
- recursion_available, recursion_desired,
- reply_name, 0x20, 0x1,
- ttl,
- rdata, 6);
-}
-
-/****************************************************************************
- add a netbios entry. respond to the (possibly new) owner.
- **************************************************************************/
-void add_name_respond(struct subnet_record *d, int fd, struct in_addr from_ip,
- uint16 response_id,
- struct nmb_name *name,
- int nb_flags, int ttl, struct in_addr register_ip,
- BOOL new_owner, struct in_addr reply_to_ip)
-{
- /* register the old or the new owners' ip */
- add_netbios_entry(d,name->name,name->name_type,
- nb_flags,ttl,REGISTER,register_ip,False,True);
-
- /* reply yes or no to the host that requested the name */
- /* see rfc1002.txt - 4.2.10 and 4.2.11 */
- send_name_response(fd,from_ip, response_id, NMB_REG,
- new_owner,
- True, True,
- name, nb_flags, ttl, reply_to_ip);
-}
-
-
-/****************************************************************************
-reply to a name release
-****************************************************************************/
-void reply_name_release(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- struct in_addr ip;
- int nb_flags = nmb->additional->rdata[0];
- BOOL bcast = nmb->header.nm_flags.bcast;
- struct name_record *n;
- struct subnet_record *d = NULL;
- int search = 0;
- BOOL success = False;
-
- putip((char *)&ip,&nmb->additional->rdata[2]);
-
- DEBUG(3,("Name release on name %s\n",
- namestr(&nmb->question.question_name)));
-
- if (!(d = find_req_subnet(p->ip, bcast)))
- {
- DEBUG(3,("response packet: bcast %s not known\n",
- inet_ntoa(p->ip)));
- return;
- }
-
- if (bcast)
- search |= FIND_LOCAL;
- else
- search |= FIND_WINS;
-
- n = find_name_search(&d, &nmb->question.question_name,
- search, ip);
-
- /* XXXX under what conditions should we reject the removal?? */
- /* For now - remove if the names match and the group bit matches. */
- if (n && (n->source != SELF) && (NAME_GROUP(n->ip_flgs[0].nb_flags) == NAME_GROUP(nb_flags)))
- {
- success = True;
-
- /* If it's a group name not ending in 1c (not an internet name)
- then just allow it to fade out of existance by timing out. */
- if(NAME_GROUP(nb_flags) && (n->name.name_type != 0x1c))
- {
- DEBUG(5, ("reply_name_release: Allow group name %s(%d) to fade out on \
-subnet %s\n", namestr(&nmb->question.question_name), n->name.name_type,
- inet_ntoa(d->bcast_ip)));
- }
- else
- {
- DEBUG(5, ("reply_name_release: Removing name %s on subnet %s\n",
- namestr(&nmb->question.question_name), inet_ntoa(d->bcast_ip)));
- remove_name(d,n);
- n = NULL;
- }
- }
-
- if (bcast) return;
-
- /* Send a NAME RELEASE RESPONSE (pos/neg) see rfc1002.txt 4.2.10-11 */
- send_name_response(p->fd,p->ip, nmb->header.name_trn_id, NMB_REL,
- success, False, False,
- &nmb->question.question_name, nb_flags, 0, ip);
-}
-
-
-/****************************************************************************
-reply to a reg request
-**************************************************************************/
-void reply_name_reg(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- struct nmb_name *question = &nmb->question.question_name;
-
- struct nmb_name *reply_name = question;
-
- char *qname = question->name;
- int qname_type = question->name_type;
-
- BOOL bcast = nmb->header.nm_flags.bcast;
-
- int ttl = GET_TTL(nmb->additional->ttl);
- int nb_flags = nmb->additional->rdata[0];
- BOOL group = NAME_GROUP(nb_flags);
-
- struct subnet_record *d = NULL;
- struct name_record *n = NULL;
-
- BOOL success = True;
- BOOL secured_redirect = False;
-
- struct in_addr ip, from_ip;
- int search = 0;
-
- putip((char *)&from_ip,&nmb->additional->rdata[2]);
- ip = from_ip;
-
- DEBUG(3,("Name registration for name %s at %s - ",
- namestr(question),inet_ntoa(ip)));
-
- if (group)
- {
- /* apparently we should return 255.255.255.255 for group queries
- (email from MS) */
- ip = *interpret_addr2("255.255.255.255");
- }
-
- if (!(d = find_req_subnet(p->ip, bcast)))
- {
- DEBUG(3,("reply_name_reg: subnet %s not known\n",
- inet_ntoa(p->ip)));
- return;
- }
-
- if (bcast)
- search |= FIND_LOCAL;
- else
- search |= FIND_WINS;
-
- /* see if the name already exists */
- n = find_name_search(&d, question, search, from_ip);
-
- if (n)
- {
- DEBUG(3,("found\n"));
- if (!group) /* unique names */
- {
- if (n->source == SELF || NAME_GROUP(n->ip_flgs[0].nb_flags))
- {
- /* no-one can register one of samba's names, nor can they
- register a name that's a group name as a unique name */
-
- success = False;
- }
- else if(!ip_equal(ip, n->ip_flgs[0].ip))
- {
- /* XXXX rfc1001.txt says:
- * if we are doing secured WINS, we must send a Wait-Acknowledge
- * packet (WACK) to the person who wants the name, then do a
- * name query on the person who currently owns the unique name.
- * if the current owner still says they own it, the person who wants
- * the name can't have it. if they do not, or are not alive, they can.
- */
-
- secured_redirect = True;
-
- reply_name = &n->name;
- }
- else
- {
- n->ip_flgs[0].ip = ip;
- n->death_time = ttl?p->timestamp+ttl*3:0;
- DEBUG(3,("%s owner: %s\n",namestr(&n->name),inet_ntoa(n->ip_flgs[0].ip)));
- }
- }
- else
- {
- /* refresh the name */
- if (n->source != SELF)
- {
- n->death_time = ttl?p->timestamp + ttl*3:0;
- }
- }
-
- /* XXXX bug reported by terryt@ren.pc.athabascau.ca */
- /* names that people have checked for and not found get DNSFAILed.
- we need to update the name record if someone then registers */
-
- if (n->source == DNSFAIL)
- n->source = REGISTER;
-
- }
- else
- {
- DEBUG(3,("not found\n"));
- /* add the name to our name/subnet, or WINS, database */
- n = add_netbios_entry(d,qname,qname_type,nb_flags,ttl,REGISTER,ip,
- True,!bcast);
- }
-
- /* if samba owns a unique name on a subnet, then it must respond and
- disallow the attempted registration. if the registration is
- successful by broadcast, only then is there no need to respond
- (implicit registration: see rfc1001.txt 15.2.1).
- */
-
- if (bcast && success) return;
-
- if (secured_redirect)
- {
- char rdata[2];
-
- /* XXXX i am confused. RSVAL or SSVAL? assume NMB byte ordering */
- RSSVAL(rdata,0,(nmb->header.opcode&0xf) + ((nb_flags&0xff) << 4));
-
- /* XXXX mistake in rfc1002.txt? 4.2.16: NULL is 0xa see 4.2.1.3
- type = 0x0a; see rfc1002.txt 4.2.1.3
- class = 0x01; see rfc1002.txt 4.2.16
- */
-
- /* send WAIT ACKNOWLEDGEMENT see rfc1002.txt 4.2.16 */
- reply_netbios_packet(p,nmb->header.name_trn_id,
- 0,NMB_WAIT_ACK,NMB_WAIT_ACK,
- False,False,
- reply_name, 0x0a, 0x01,
- 15*1000, /* 15 seconds long enough to wait? */
- rdata, 2);
-
- /* initiate some enquiries to the current owner. */
- queue_netbios_packet(d,ClientNMB,NMB_QUERY,
- NAME_REGISTER_CHALLENGE,
- reply_name->name,reply_name->name_type,
- nb_flags,0,0,NULL,NULL,
- False, False,
- n->ip_flgs[0].ip, p->ip);
- }
- else
- {
- /* Send a NAME REGISTRATION RESPONSE (pos/neg) see rfc1002.txt 4.2.5-6
- or an END-NODE CHALLENGE REGISTRATION RESPONSE see rfc1002.txt 4.2.7
- */
-
- send_name_response(p->fd,p->ip, nmb->header.name_trn_id, NMB_REG,
- success,
- True, True,
- reply_name, nb_flags, ttl, ip);
- }
-}
-
-/* this is used to sort names for a name status into a sensible order
- we put our own names first, then in alphabetical order */
-static int status_compare(char *n1,char *n2)
-{
- extern pstring myname;
- int l1,l2,l3;
-
- /* its a bit tricky because the names are space padded */
- for (l1=0;l1<15 && n1[l1] && n1[l1] != ' ';l1++) ;
- for (l2=0;l2<15 && n2[l2] && n2[l2] != ' ';l2++) ;
- l3 = strlen(myname);
-
- if ((l1==l3) && strncmp(n1,myname,l3) == 0 &&
- (l2!=l3 || strncmp(n2,myname,l3) != 0))
- return -1;
-
- if ((l2==l3) && strncmp(n2,myname,l3) == 0 &&
- (l1!=l3 || strncmp(n1,myname,l3) != 0))
- return 1;
-
- return memcmp(n1,n2,18);
-}
-
-
-/****************************************************************************
- reply to a name status query
-
- combine the list of the local interface on which the query was made with
- the names registered via wins.
- ****************************************************************************/
-void reply_name_status(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- char *qname = nmb->question.question_name.name;
- int ques_type = nmb->question.question_name.name_type;
- char rdata[MAX_DGRAM_SIZE];
- char *countptr, *buf, *bufend, *buf0;
- int names_added,i;
- struct name_record *n;
- struct subnet_record *d = NULL;
- int search = FIND_SELF | FIND_WINS | FIND_LOCAL;
-
- /* NOTE: we always treat a name status lookup as a bcast */
- if (!(d = find_req_subnet(p->ip, True)))
- {
- DEBUG(3,("Name status req: bcast %s not known\n",
- inet_ntoa(p->ip)));
- return;
- }
-
- DEBUG(3,("Name status for name %s %s\n",
- namestr(&nmb->question.question_name),
- inet_ntoa(p->ip)));
-
- n = find_name_search(&d, &nmb->question.question_name,
- search, p->ip);
-
- if (!n) return;
-
- /* XXXX hack, we should calculate exactly how many will fit */
- bufend = &rdata[MAX_DGRAM_SIZE] - 18;
- countptr = buf = rdata;
- buf += 1;
- buf0 = buf;
-
- names_added = 0;
-
- n = d->namelist;
-
- while (buf < bufend)
- {
- if (n->source == SELF)
- {
- int name_type = n->name.name_type;
-
- /* check if we want to exclude other workgroup names
- from the response. if we don't exclude them, windows clients
- get confused and will respond with an error for NET VIEW */
-
- if (!strequal(n->name.name,"*") &&
- !strequal(n->name.name,"__SAMBA__") &&
- (name_type < 0x1b || name_type >= 0x20 ||
- ques_type < 0x1b || ques_type >= 0x20 ||
- strequal(qname, n->name.name)))
- {
- /* start with first bit of putting info in buffer: the name */
- bzero(buf,18);
- sprintf(buf,"%-15.15s",n->name.name);
- strupper(buf);
-
- /* put name type and netbios flags in buffer */
- buf[15] = name_type;
- buf[16] = n->ip_flgs[0].nb_flags;
-
- buf += 18;
-
- names_added++;
- }
- }
-
- /* remove duplicate names */
- qsort(buf0,names_added,18,QSORT_CAST status_compare);
-
- for (i=1;i<names_added;i++) {
- if (memcmp(buf0 + 18*i,buf0 + 18*(i-1),16) == 0) {
- names_added--;
- if (names_added == i) break;
- memmove(buf0 + 18*i,buf0 + 18*(i+1),18*(names_added-i));
- i--;
- }
- }
-
- buf = buf0 + 18*names_added;
-
- n = n->next;
-
- if (!n)
- {
- /* end of this name list: add wins names too? */
- struct subnet_record *w_d;
-
- if (!(w_d = wins_subnet)) break;
-
- if (w_d != d)
- {
- d = w_d;
- n = d->namelist; /* start on the wins name list */
- }
- }
- if (!n) break;
- }
-
- SCVAL(countptr,0,names_added);
-
- /* XXXXXXX we should fill in more fields of the statistics structure */
- bzero(buf,64);
- {
- extern int num_good_sends,num_good_receives;
- SIVAL(buf,20,num_good_sends);
- SIVAL(buf,24,num_good_receives);
- }
-
- buf += 46;
-
- /* Send a POSITIVE NAME STATUS RESPONSE */
- reply_netbios_packet(p,nmb->header.name_trn_id,
- 0,NMB_STATUS,0,False, False,
- &nmb->question.question_name,
- 0x21, 0x01,
- 0, rdata,PTR_DIFF(buf,rdata));
-}
-
-
-/***************************************************************************
-reply to a name query.
-
-with broadcast name queries:
-
- - only reply if the query is for one of YOUR names. all other machines on
- the network will be doing the same thing (that is, only replying to a
- broadcast query if they own it)
- NOTE: broadcast name queries should only be sent out by a machine
- if they HAVEN'T been configured to use WINS. this is generally bad news
- in a wide area tcp/ip network and should be rectified by the systems
- administrator. USE WINS! :-)
- - the exception to this is if the query is for a Primary Domain Controller
- type name (0x1b), in which case, a reply is sent.
-
- - NEVER send a negative response to a broadcast query. no-one else will!
-
-with directed name queries:
-
- - if you are the WINS server, you are expected to respond with either
- a negative response, a positive response, or a wait-for-acknowledgement
- packet, and then later on a pos/neg response.
-
-****************************************************************************/
-void reply_name_query(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- struct nmb_name *question = &nmb->question.question_name;
- int name_type = question->name_type;
-
- BOOL bcast = nmb->header.nm_flags.bcast;
- BOOL query_is_to_wins_server = (!bcast &&
- nmb->header.nm_flags.recursion_desired);
- int ttl=0;
- int rcode = 0;
- int nb_flags = 0;
- struct in_addr retip;
- char rdata[6];
- struct subnet_record *d = NULL;
- BOOL success = True;
- struct name_record *n = NULL;
- BOOL acting_as_wins_server = lp_wins_support();
-
- /* directed queries are for WINS server: broadcasts are local SELF queries.
- the exception is Domain Master names. */
-
- if (query_is_to_wins_server)
- {
- /* queries to the WINS server involve the WINS server subnet */
- if (!(d = wins_subnet))
- {
- DEBUG(3,("name query: wins search %s not known\n",
- inet_ntoa(p->ip)));
- success = False;
- }
- }
- else
- {
- /* queries to the WINS client involve, unfortunately, the WINS subnet
- because it contains WINS client (SELF) entries, as _well_ as WINS
- server entries. not good.
- */
-
- if (!(d = find_subnet(*iface_bcast(p->ip))))
- {
- DEBUG(3,("name query: interface for %s not known\n",
- inet_ntoa(p->ip)));
- success = False;
- }
- }
-
- DEBUG(3,("Name query from %s for name %s<0x%x>\n",
- inet_ntoa(p->ip), question->name, question->name_type));
-
- if (!bcast && (name_type == 0x1d) && lp_wins_support())
- {
- /* see WINS manager HELP - 'How WINS Handles Special Names' */
- /* a WINS query (unicasted) for a 0x1d name must always return False */
- success = False;
- }
-
- if (success)
- {
- /* look up the name in the cache */
- n = find_name_search(&d, question, FIND_LOCAL, p->ip);
-
- /* it is a name that already failed DNS lookup or it's expired */
- if (n && (n->source == DNSFAIL ||
- (n->death_time && n->death_time < p->timestamp)))
- {
- success = False;
- }
-
- /* do we want to do dns lookups? */
- /* XXXX this DELAYS nmbd while it does a search. lp_dns_proxy()
- can be switched off, to ensure that the blocking doesn't occur.
- a better solution would be to fork, but this will require a
- mechanism to carry on processing after the query is resolved
- (similar to the netbios queue).
- */
- if (success && !n && (lp_dns_proxy() || !bcast))
- {
- n = dns_name_search(question, p->timestamp);
- }
- }
-
- if (!n) success = False;
-
- if (success)
- {
- if (bcast && n->source != SELF && name_type != 0x1b)
- {
- /* don't respond to broadcast queries unless the query is for
- a name we own or it is for a Primary Domain Controller name */
-
- if (!lp_wins_proxy() ||
- same_net(p->ip,n->ip_flgs[0].ip,*iface_nmask(p->ip)))
- {
- /* never reply with a negative response to broadcast queries */
- return;
- }
- }
-
- /* name is directed query, or it's self, or it's a Domain Master type
- name, or we're replying on behalf of a caller because they are on a
- different subnet and cannot hear the broadcast. XXXX lp_wins_proxy
- should be switched off in environments where broadcasts are forwarded
- */
-
- /* XXXX note: for proxy servers, we should forward the query on to
- another WINS server if the name is not in our database, or we are
- not a WINS server ourselves
- */
- ttl = n->death_time ? n->death_time - p->timestamp : GET_TTL(0);
- retip = n->ip_flgs[0].ip;
- nb_flags = n->ip_flgs[0].nb_flags;
- }
-
- if (!success && bcast) return; /* never reply negative response to bcasts */
-
- /* if the IP is 0 then substitute my IP */
- if (zero_ip(retip)) retip = *iface_ip(p->ip);
-
- /* SPECIAL CASE... If we are a WINS server and the request is explicitly
- *to* the WINS server and the name type is WORKGROUP<0x1e> we should
- respond with the local broadcast address 255.255.255.255.
- */
- if(!bcast && (name_type == 0x1e) && lp_wins_support())
- retip = *interpret_addr2("255.255.255.255");
-
- if (success)
- {
- rcode = 0;
- DEBUG(3,("OK %s\n",inet_ntoa(retip)));
- }
- else
- {
- rcode = 3;
- DEBUG(3,("UNKNOWN\n"));
- }
-
- if (success)
- {
- rdata[0] = nb_flags;
- rdata[1] = 0;
- putip(&rdata[2],(char *)&retip);
- }
-
- /* see rfc1002.txt 4.2.13 */
-
- reply_netbios_packet(p,nmb->header.name_trn_id,
- rcode,NMB_QUERY,0,
- (query_is_to_wins_server && acting_as_wins_server ?
- True : False), /* recursion_available flag */
- True, /* recursion_desired_flag */
- &nmb->question.question_name,
- 0x20, 0x01,
- ttl,
- rdata, success ? 6 : 0);
-}
diff --git a/source/nameservreply.doc b/source/nameservreply.doc
deleted file mode 100644
index a5acf8a9c26..00000000000
--- a/source/nameservreply.doc
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameservreply.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-/*************************************************************************
- reply_name_query()
- *************************************************************************/
-
-this function is responsible for replying to a NetBIOS name query.
-
-there are two kinds of name queries: directed, and broadcast. directed
-queries are usually sent to samba in its WINS capacity. such hosts are
-termed 'point-to-point' hosts. broadcast queries are usually sent from
-'broadcast' or 'mixed' hosts.
-
-broadcasting is used by either older NetBIOS hosts, new NetBIOS hosts that
-have not had WINS capabilities added and new NetBIOS hosts that think the
-WINS server has died.
-
-the samba NetBIOS name database is divided into sections, on a
-per-subnet basis. there is also a WINS NetBIOS name database, and for
-convenience this is added as a pseudo-subnet with the ip address of
-255.255.255.255.
-
-the local subnet NetBIOS name databases only contain samba's names.
-the reason for this is that if a broadcast query is received, a NetBIOS
-hosts is only expected to respond if that query is for one of its own
-names (the exception to this is if a host is configured as a 'proxy'
-server, in which case, samba should redirect the query to another WINS
-server).
-
-the WINS pseudo-subnet NetBIOS database contains all NetBIOS names
-that are not 'special browser' type names (regarding this i am a
-_bit_ confused :-). names of type 0x01, 0x1d and 0x1e i consider to
-be 'special browser' names. at the moment. maybe.
-
-the type of search to be initiated is determined. if the NetBIOS name
-type is a non-special-browser name, then the WINS database is included
-in the search.
-
-if the name is not a special browser name, then we need to find the
-right subnet that the query came from. this is done using
-find_req_subnet(). this also has the benefit of stopping any queries
-from subnets that samba does not know about.
-
-if the query is a broadcast query, then the database of the local subnet
-is included in the search.
-
-the name is then searched for in the appropriate NetBIOS data structures.
-if it is found, then we need to check whether it is appropriate for us
-to reply to such a query.
-
-we will only reply if the query is a directed query, the name belongs to
-samba on that subnet, or the name is a domain master browser type,
-or we're doing replies on behalf of hosts on subnets not known to the
-host issuing the query. in the latter instance, it would be appropriate
-if samba is using a WINS server for it to forward the name query on to
-this WINS server.
-
-reply_name_query() then takes note of all the information that is
-needed to construct a reply to the caller. a negative reply (if the
-name is unknown to samba) or a positive reply (the name is known to
-samba) is then issued.
-
-
-/*************************************************************************
- reply_name_status()
- *************************************************************************/
-
-this function is responsible for constructing a reply to a NetBIOS
-name status query. this response contains all samba's NetBIOS names
-on the subnet that the query came in from.
-
-a reply will only be made if the NetBIOS name being queried exists.
-
-see rfc1001.txt and rfc1002.txt for details of the name status reply.
-
-
-/*************************************************************************
- reply_name_reg()
- *************************************************************************/
-
-this function is responsible for updating the NetBIOS name database
-from registration packets sent out by hosts wishing to register a
-name, and for informing them, if necessary, if this is acceptable
-or not.
-
-name registration can be done by broadcast or by point-to-point,
-i.e the registration is sent directly to samba in its capacity as
-a WINS server.
-
-if the name registration is done by broadcast (see rfc1001.txt 15.2.1),
-then samba's involvement in replying is limited to whether that name
-is owned by samba or not, on the relevant subnet.
-
-if the name registration is done point-to-point (see rfc1001.txt 15.2.2)
-then samba will first need to check its WINS name database records and
-proceed accordingly.
-
-samba looks for the appropriate subnet record that the registration
-should be added to / checked against, using find_req_subnet().
-
-next, the name is searched for in the local database or the WINS
-database as appropriate.
-
-if the name is not found, then it is added to the NetBIOS name database,
-using add_netbios_entry(), which may choose not to add the name (not
-that this affects the registration of the name on the network in any way).
-it will only add names to the WINS database, and even then it will only
-add non-special-browser type names.
-
-if the name is found, then samba must decide whether to accept the name
-or not. a group name is always added. for unique names, further checks
-need to be carried out.
-
-firstly, if the name in the database is one of samba's names, or if the
-name in the database is a group name, then it cannot be added as a unique
-name belonging to someone else. it is therefore rejected.
-
-secondly, if the ip address of the name being registered does not match
-against the ip in the database, then the unique name may belong to
-someone else. a check needs to be carried out with the owner in case
-they still wish to keep this name. a detailed discussion of what action
-to take is in rfc1001.txt 15.2.2.2 and 15.2.2.3.
-
-samba currently implements non-secured WINS, whereupon the responsibility
-for checking the name is passed on to the host doing the registration.
-rfc1001.txt refers to this as an END-NODE CHALLENGE REGISTRATION RESPONSE.
-(samba itself cannot yet cope with receiving such responses if it
-registers its names with another WINS server).
-
-having decided what kind of response to send (if any - acceptance of
-name registrations by broadcast is implicit), samba will send either a
-positive or negative NAME REGISTRATION RESPONSE, or an END-NODE CHALLENGE
-REGISTRATION RESPONSE to the host that initially sent the registration.
-
-whew.
-
-
-/*************************************************************************
- reply_name_release()
- *************************************************************************/
-
-this function is responsible for removing a NetBIOS name from the
-database when a server sends a release packet.
-
-samba looks for the appropriate subnet record that the release should
-be removed from, using find_req_subnet(). next, the name is searched
-for in the local database or the WINS database as appropriate.
-
-if the name is found, it is removed from the database and a
-positive reply is sent confirming this. if the name is not
-found, a negative reply is sent.
-
-a reply is _not_ sent if the release was done by broadcast: the
-release is implicit, and we should be grateful that they bothered
-to tell us. if the release was done by directed packet, then
-we deal with it as a WINS server and must reply (pos / neg).
-
-at present, the criteria for removing a name have yet to be
-developed / experimented with. at present, the only flags that
-are checked are the NetBIOS flags.
-
-
-/*************************************************************************
- send_name_response()
- *************************************************************************/
-
-this function is a wrap around reply_netbios_packet(). it sends
-a response to a name registration or release packet, minimising
-the function parameters needed to do this.
-
-if the function is called with the parameter 'success' set to
-True, then a positive response (to the registration or release)
-is made (see rfc1002.txt 4.2.5 and 4.2.10). if this parameter
-is False, then a negative response is issued (see rfc1002.txt
-4.2.6 and 4.2.11)
-
-if the function is called with a registration code, and the
-parameter 'recurse' is False, then an End-Node Challenge
-Registration response is issued (see rfc1002.txt 4.2.7)
-
-note: this function could also easily be used for name conflict
-demand (see rfc1002.txt 4.2.8).
-
-note: End-Node Challenge Registration response is only sent in
-non-secured NetBIOS Name Server implementations. samba now
-implements secured NetBIOS Name Server functionality (see
-rfc1001.txt 15.1.6).
-
diff --git a/source/nameservresp.c b/source/nameservresp.c
deleted file mode 100644
index a88481d06b0..00000000000
--- a/source/nameservresp.c
+++ /dev/null
@@ -1,848 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- Module name: nameservresp.c
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
- 05 jul 96: lkcl@pires.co.uk
- created module nameservresp containing NetBIOS response functions
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern fstring myworkgroup;
-extern struct in_addr ipzero;
-extern struct in_addr wins_ip;
-extern struct in_addr ipzero;
-
-
-#define GET_TTL(ttl) ((ttl)?MIN(ttl,lp_max_ttl()):lp_max_ttl())
-
-
-/****************************************************************************
- response for a reg release received. samba has asked a WINS server if it
- could release a name.
- **************************************************************************/
-static void response_name_release(struct nmb_name *ans_name,
- struct subnet_record *d, struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- char *name = ans_name->name;
- int type = ans_name->name_type;
-
- DEBUG(4,("response name release received\n"));
-
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
- {
- /* IMPORTANT: see expire_netbios_response_entries() */
-
- struct in_addr found_ip;
- putip((char*)&found_ip,&nmb->answers->rdata[2]);
-
- /* NOTE: we only release our own names at present */
- if (ismyip(found_ip))
- {
- name_unregister_work(d,name,type);
- }
- else
- {
- DEBUG(2,("name release for different ip! %s %s\n",
- inet_ntoa(found_ip), namestr(ans_name)));
- }
- }
- else
- {
- DEBUG(2,("name release for %s rejected!\n", namestr(ans_name)));
-
- /* XXXX PANIC! what to do if it's one of samba's own names? */
-
- /* XXXX do we honestly care if our name release was rejected?
- only if samba is issuing the release on behalf of some out-of-sync
- server. if it's one of samba's SELF names, we don't care. */
- }
-}
-
-
-/****************************************************************************
-response for a reg request received
-**************************************************************************/
-static void response_name_reg(struct nmb_name *ans_name,
- struct subnet_record *d, struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- BOOL bcast = nmb->header.nm_flags.bcast;
- char *name = ans_name->name;
- int type = ans_name->name_type;
-
- DEBUG(4,("response name registration received!\n"));
-
-#if 1
- /* This code is neccesitated due to bugs in earlier versions of
- Samba (up to 1.9.16p11). They respond to a broadcast
- name registration of WORKGROUP<1b> when they should
- not. Hence, until these versions are gone, we should
- treat such errors as success for this particular
- case only. jallison@whistle.com.
- */
- if ( ((d != wins_subnet) && (nmb->header.rcode == 6) && strequal(myworkgroup, name) &&
- (type == 0x1b)) ||
- (nmb->header.rcode == 0 && nmb->answers->rdata))
-#else
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
-#endif
- {
- /* IMPORTANT: see expire_netbios_response_entries() */
-
- int nb_flags = nmb->answers->rdata[0];
- int ttl = nmb->answers->ttl;
- struct in_addr found_ip;
-
- putip((char*)&found_ip,&nmb->answers->rdata[2]);
-
- name_register_work(d,name,type,nb_flags,ttl,found_ip,bcast);
- }
- else
- {
- DEBUG(2,("name registration for %s rejected by ip %s!\n",
- namestr(ans_name), inet_ntoa(p->ip)));
-
- /* oh dear. we have problems. possibly unbecome a master browser. */
- name_unregister_work(d,name,type);
- }
-}
-
-/****************************************************************************
- response from a name query server check. states of type NAME_QUERY_DOM_SRV_CHK,
- NAME_QUERY_SRV_CHK, and NAME_QUERY_FIND_MST dealt with here.
- ****************************************************************************/
-static void response_server_check(struct nmb_name *ans_name,
- struct response_record *n, struct subnet_record *d, struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- struct in_addr send_ip;
- enum state_type cmd;
-
- /* This next fix was from Bernhard Laeser <nlaesb@ascom.ch>
- who noticed we were replying directly back to the server
- we sent to - rather than reading the response.
- */
-
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
- putip((char*)&send_ip,&nmb->answers->rdata[2]);
- else
- {
-
- DEBUG(2,("response_server_check: name query for %s failed\n",
- namestr(ans_name)));
- return;
- }
-
- /* issue another state: this time to do a name status check */
-
- cmd = (n->state == NAME_QUERY_DOM_SRV_CHK) ?
- NAME_STATUS_DOM_SRV_CHK : NAME_STATUS_SRV_CHK;
-
- /* initiate a name status check on address given in the reply
- record. In addition, the workgroup being checked has been stored
- in the response_record->my_name (see announce_master) we
- also propagate this into the same field. */
- queue_netbios_packet(d,ClientNMB,NMB_STATUS, cmd,
- ans_name->name, ans_name->name_type,
- 0,0,0,n->my_name,NULL,
- False,False,send_ip,n->reply_to_ip);
-}
-
-
-/****************************************************************************
- interpret a node status response. this is pretty hacked: we need two bits of
- info. a) the name of the workgroup b) the name of the server. it will also
- add all the names it finds into the namelist.
-****************************************************************************/
-static BOOL interpret_node_status(struct subnet_record *d,
- char *p, struct nmb_name *name,int t,
- char *serv_name, struct in_addr ip, BOOL bcast)
-{
- int numnames = CVAL(p,0);
- BOOL found = False;
-
- DEBUG(4,("received %d names\n",numnames));
-
- p += 1;
-
- if (serv_name) *serv_name = 0;
-
- while (numnames--)
- {
- char qname[17];
- int type;
- fstring flags;
- int nb_flags;
-
- BOOL group = False;
- BOOL add = False;
-
- *flags = 0;
-
- StrnCpy(qname,p,15);
- type = CVAL(p,15);
- nb_flags = p[16];
- trim_string(qname,NULL," ");
-
- p += 18;
-
- if (NAME_GROUP (nb_flags)) { strcat(flags,"<GROUP> "); group=True;}
- if (NAME_BFLAG (nb_flags)) { strcat(flags,"B "); }
- if (NAME_PFLAG (nb_flags)) { strcat(flags,"P "); }
- if (NAME_MFLAG (nb_flags)) { strcat(flags,"M "); }
- if (NAME_HFLAG (nb_flags)) { strcat(flags,"H "); }
- if (NAME_DEREG (nb_flags)) { strcat(flags,"<DEREGISTERING> "); }
- if (NAME_CONFLICT (nb_flags)) { strcat(flags,"<CONFLICT> "); }
- if (NAME_ACTIVE (nb_flags)) { strcat(flags,"<ACTIVE> "); add=True; }
- if (NAME_PERMANENT(nb_flags)) { strcat(flags,"<PERMANENT> "); add=True;}
-
- /* we want the server name */
- if (serv_name && !*serv_name && !group && type == 0x20)
- {
- StrnCpy(serv_name,qname,15);
- serv_name[15] = 0;
- }
-
- /* looking for a name and type? */
- if (name && !found && (t == type))
- {
- /* take a guess at some of the name types we're going to ask for.
- evaluate whether they are group names or no... */
- if (((t == 0x1b || t == 0x1d || t == 0x20 ) && !group) ||
- ((t == 0x1c || t == 0x1e ) && group))
- {
- found = True;
- make_nmb_name(name,qname,type,scope);
- }
- }
-
- DEBUG(4,("\t%s(0x%x)\t%s\n",qname,type,flags));
- }
- DEBUG(4,("num_good_sends=%d num_good_receives=%d\n",
- IVAL(p,20),IVAL(p,24)));
- return found;
-}
-
-
-/****************************************************************************
- response from a name status check. states of type NAME_STATUS_DOM_SRV_CHK
- and NAME_STATUS_SRV_CHK dealt with here.
- ****************************************************************************/
-static void response_name_status_check(struct in_addr ip,
- struct nmb_packet *nmb, BOOL bcast,
- struct response_record *n, struct subnet_record *d)
-{
- /* NMB_STATUS arrives: contains workgroup name and server name required.
- amongst other things. */
-
- struct nmb_name name;
- fstring serv_name;
-
- if (interpret_node_status(d,nmb->answers->rdata,
- &name,0x20,serv_name,ip,bcast))
- {
- if (*serv_name)
- {
- /* response_record->my_name contains the
- workgroup name to sync with. See
- response_server_check() */
- sync_server(n->state,serv_name,
- n->my_name,name.name_type, d, n->send_ip);
- }
- }
- else
- {
- DEBUG(1,("No 0x20 name type in interpret_node_status()\n"));
- }
-}
-
-
-/****************************************************************************
- response from a name query for secured WINS registration. a state of
- NAME_REGISTER_CHALLENGE is dealt with here.
- ****************************************************************************/
-static void response_name_query_register(struct nmb_packet *nmb,
- struct nmb_name *ans_name,
- struct response_record *n, struct subnet_record *d)
-{
- struct in_addr register_ip;
- BOOL new_owner;
-
- DEBUG(4, ("Name query at %s ip %s - ",
- namestr(&n->name), inet_ntoa(n->send_ip)));
-
- if (!name_equal(&n->name, ans_name))
- {
- /* someone gave us the wrong name as a reply. oops. */
- /* XXXX should say to them 'oi! release that name!' */
-
- DEBUG(4,("unexpected name received: %s\n", namestr(ans_name)));
- return;
- }
-
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
- {
- /* we had sent out a name query to the current owner
- of a name because someone else wanted it. now they
- have responded saying that they still want the name,
- so the other host can't have it.
- */
-
- /* first check all the details are correct */
-
- int nb_flags = nmb->answers->rdata[0];
- struct in_addr found_ip;
-
- putip((char*)&found_ip,&nmb->answers->rdata[2]);
-
- if (nb_flags != n->nb_flags)
- {
- /* someone gave us the wrong nb_flags as a reply. oops. */
- /* XXXX should say to them 'oi! release that name!' */
-
- DEBUG(4,("expected nb_flags: %d\n", n->nb_flags));
- DEBUG(4,("unexpected nb_flags: %d\n", nb_flags));
- return;
- }
-
- if (!ip_equal(n->send_ip, found_ip))
- {
- /* someone gave us the wrong ip as a reply. oops. */
- /* XXXX should say to them 'oi! release that name!' */
-
- DEBUG(4,("expected ip: %s\n", inet_ntoa(n->send_ip)));
- DEBUG(4,("unexpected ip: %s\n", inet_ntoa(found_ip)));
- return;
- }
-
- DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
-
- /* fine: now tell the other host they can't have the name */
- register_ip = n->send_ip;
- new_owner = False;
- }
- else
- {
- DEBUG(4, (" NEGATIVE RESPONSE!\n"));
-
- /* the owner didn't want the name: the other host can have it */
- register_ip = n->reply_to_ip;
- new_owner = True;
- }
-
- /* register the old or the new owners' ip */
- add_name_respond(d, n->fd, d->myip, n->response_id,&n->name,n->nb_flags,
- GET_TTL(0), register_ip,
- new_owner, n->reply_to_ip);
-}
-
-
-/****************************************************************************
- response from a name query to sync browse lists or to update our netbios
- entry. states of type NAME_QUERY_SYNC and NAME_QUERY_CONFIRM
- ****************************************************************************/
-static void response_name_query_sync(struct nmb_packet *nmb,
- struct nmb_name *ans_name, BOOL bcast,
- struct response_record *n, struct subnet_record *d)
-{
- DEBUG(4, ("Name query at %s ip %s - ",
- namestr(&n->name), inet_ntoa(n->send_ip)));
-
- if (!name_equal(&n->name, ans_name))
- {
- /* someone gave us the wrong name as a reply. oops. */
- DEBUG(4,("unexpected name received: %s\n", namestr(ans_name)));
- return;
- }
-
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
- {
- int nb_flags = nmb->answers->rdata[0];
- struct in_addr found_ip;
-
- putip((char*)&found_ip,&nmb->answers->rdata[2]);
-
- if (!ip_equal(n->send_ip, found_ip))
- {
- /* someone gave us the wrong ip as a reply. oops. */
- DEBUG(4,("expected ip: %s\n", inet_ntoa(n->send_ip)));
- DEBUG(4,("unexpected ip: %s\n", inet_ntoa(found_ip)));
- return;
- }
-
- DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
-
- if (n->state == NAME_QUERY_SYNC_LOCAL ||
- n->state == NAME_QUERY_SYNC_REMOTE)
- {
- struct work_record *work = NULL;
- /* We cheat here as we know that the workgroup name has
- been placed in the my_comment field of the
- response_record struct by the code in
- start_sync_browse_entry().
- */
- if ((work = find_workgroupstruct(d, n->my_comment, False)))
- {
- BOOL local_list_only = n->state == NAME_QUERY_SYNC_LOCAL;
-
- /* the server is there: sync quick before it (possibly) dies! */
- sync_browse_lists(d, work, ans_name->name, ans_name->name_type,
- found_ip, local_list_only);
- }
- }
- else
- {
- /* update our netbios name list (re-register it if necessary) */
- add_netbios_entry(d, ans_name->name, ans_name->name_type,
- nb_flags,GET_TTL(0),REGISTER,
- found_ip,False,!bcast);
- }
- }
- else
- {
- DEBUG(4, (" NEGATIVE RESPONSE!\n"));
-
- if (n->state == NAME_QUERY_CONFIRM)
- {
- /* XXXX remove_netbios_entry()? */
- /* lots of things we ought to do, here. if we get here,
- then we're in a mess: our name database doesn't match
- reality. sort it out
- */
- remove_netbios_name(d,n->name.name, n->name.name_type,
- REGISTER,n->send_ip);
- }
- }
-}
-
-/****************************************************************************
- response from a name query for DOMAIN<1b>
- NAME_QUERY_DOMAIN is dealt with here - we are trying to become a domain
- master browser and WINS replied - check it's our address.
- ****************************************************************************/
-static void response_name_query_domain(struct nmb_name *ans_name,
- struct nmb_packet *nmb,
- struct response_record *n, struct subnet_record *d)
-{
- DEBUG(4, ("response_name_query_domain: Got %s response from %s for query \
-for %s\n", nmb->header.rcode == 0 ? "success" : "failure",
- inet_ntoa(n->send_ip), namestr(ans_name)));
-
- /* Check the name is correct and ip address returned is our own. If it is then we
- just remove the response record.
- */
- if (name_equal(&n->name, ans_name) && (nmb->header.rcode == 0) && (nmb->answers->rdata))
- {
- struct in_addr found_ip;
-
- putip((char*)&found_ip,&nmb->answers->rdata[2]);
- /* Samba 1.9.16p11 servers seem to return the broadcast address for this
- query. */
- if (ismyip(found_ip) || ip_equal(wins_ip, found_ip) || ip_equal(ipzero, found_ip))
- {
- DEBUG(4, ("response_name_query_domain: WINS server returned our ip \
-address. Pretending we never received response.\n"));
- n->num_msgs = 0;
- n->repeat_count = 0;
- n->repeat_time = 0;
- }
- else
- {
- DEBUG(0,("response_name_query_domain: WINS server already has a \
-domain master browser registered %s at address %s\n",
- namestr(ans_name), inet_ntoa(found_ip)));
- }
- }
- else
- {
- /* Negative/incorrect response. No domain master
- browser was registered - pretend we didn't get this response.
- */
- n->num_msgs = 0;
- n->repeat_count = 0;
- n->repeat_time = 0;
- }
-
-}
-
-/****************************************************************************
- report the response record type
- ****************************************************************************/
-static void debug_rr_type(int rr_type)
-{
- switch (rr_type)
- {
- case NMB_STATUS: DEBUG(3,("Name status ")); break;
- case NMB_QUERY : DEBUG(3,("Name query ")); break;
- case NMB_REG : DEBUG(3,("Name registration ")); break;
- case NMB_REL : DEBUG(3,("Name release ")); break;
- default : DEBUG(1,("wrong response packet type received")); break;
- }
-}
-
-/****************************************************************************
- report the response record nmbd state
- ****************************************************************************/
-void debug_state_type(int state)
-{
- /* report the state type to help debugging */
- switch (state)
- {
- case NAME_QUERY_DOM_SRV_CHK : DEBUG(4,("NAME_QUERY_DOM_SRV_CHK\n")); break;
- case NAME_QUERY_SRV_CHK : DEBUG(4,("NAME_QUERY_SRV_CHK\n")); break;
- case NAME_QUERY_FIND_MST : DEBUG(4,("NAME_QUERY_FIND_MST\n")); break;
- case NAME_QUERY_MST_CHK : DEBUG(4,("NAME_QUERY_MST_CHK\n")); break;
- case NAME_QUERY_CONFIRM : DEBUG(4,("NAME_QUERY_CONFIRM\n")); break;
- case NAME_QUERY_SYNC_LOCAL : DEBUG(4,("NAME_QUERY_SYNC_LOCAL\n")); break;
- case NAME_QUERY_SYNC_REMOTE : DEBUG(4,("NAME_QUERY_SYNC_REMOTE\n")); break;
- case NAME_QUERY_DOMAIN : DEBUG(4,("NAME_QUERY_DOMAIN\n")); break;
-
- case NAME_REGISTER : DEBUG(4,("NAME_REGISTER\n")); break;
- case NAME_REGISTER_CHALLENGE : DEBUG(4,("NAME_REGISTER_CHALLENGE\n"));break;
-
- case NAME_RELEASE : DEBUG(4,("NAME_RELEASE\n")); break;
-
- case NAME_STATUS_DOM_SRV_CHK : DEBUG(4,("NAME_STATUS_DOM_SRV_CHK\n")); break;
- case NAME_STATUS_SRV_CHK : DEBUG(4,("NAME_STATUS_SRV_CHK\n")); break;
-
- default: break;
- }
-}
-
-/****************************************************************************
- report any problems with the fact that a response has been received.
-
- (responses for certain types of operations are only expected from one host)
- ****************************************************************************/
-static BOOL response_problem_check(struct response_record *n,
- struct nmb_packet *nmb, char *ans_name)
-{
- switch (nmb->answers->rr_type)
- {
- case NMB_REL:
- {
- if (n->num_msgs > 1)
- {
- DEBUG(1,("more than one release name response received!\n"));
- return True;
- }
- break;
- }
-
- case NMB_REG:
- {
- if (n->num_msgs > 1)
- {
- DEBUG(1,("more than one register name response received!\n"));
- return True;
- }
- break;
- }
-
- case NMB_QUERY:
- {
- if (n->num_msgs > 1)
- {
- if (nmb->header.rcode == 0 && nmb->answers->rdata)
- {
- int nb_flags = nmb->answers->rdata[0];
-
- if ((!NAME_GROUP(nb_flags)))
- {
- /* oh dear. more than one person responded to a
- unique name.
- there is either a network problem, a
- configuration problem
- or a server is mis-behaving */
-
- /* XXXX mark the name as in conflict, and then let the
- person who just responded know that they
- must also mark it
- as in conflict, and therefore must NOT use it.
- see rfc1001.txt 15.1.3.5 */
-
- /* this may cause problems for some
- early versions of nmbd */
-
- switch (n->state)
- {
- case NAME_QUERY_FIND_MST:
- {
- /* query for ^1^2__MSBROWSE__^2^1 expect
- lots of responses */
- return False;
- }
- case NAME_QUERY_DOM_SRV_CHK:
- case NAME_QUERY_SRV_CHK:
- case NAME_QUERY_MST_CHK:
- {
- if (!strequal(ans_name,n->name.name))
- {
- /* one subnet, one master browser
- per workgroup */
- /* XXXX force an election? */
-
- DEBUG(3,("more than one master browser replied!\n"));
- return True;
- }
- break;
- }
- default: break;
- }
- DEBUG(3,("Unique Name conflict detected!\n"));
- return True;
- }
- }
- else
- {
- /* we have received a negative reply,
- having already received
- at least one response (pos/neg).
- something's really wrong! */
-
- DEBUG(3,("wierd name query problem detected!\n"));
- return True;
- }
- }
- }
- }
- return False;
-}
-
-#if 0
-/****************************************************************************
- check that the response received is compatible with the response record
- ****************************************************************************/
-static BOOL response_compatible(struct response_record *n,
- struct nmb_packet *nmb)
-{
- switch (n->state)
- {
- case NAME_RELEASE:
- {
- if (nmb->answers->rr_type != 0x20)
- {
- DEBUG(1,("Name release reply has wrong answer rr_type\n"));
- return False;
- }
- break;
- }
-
- case NAME_REGISTER:
- {
- if (nmb->answers->rr_type != 0x20)
- {
- DEBUG(1,("Name register reply has wrong answer rr_type\n"));
- return False;
- }
- break;
- }
-
- case NAME_REGISTER_CHALLENGE: /* this is a query: we then do a register */
- case NAME_QUERY_CONFIRM:
- case NAME_QUERY_SYNC_LOCAL:
- case NAME_QUERY_SYNC_REMOTE:
- case NAME_QUERY_DOM_SRV_CHK:
- case NAME_QUERY_SRV_CHK:
- case NAME_QUERY_FIND_MST:
- case NAME_QUERY_MST_CHK:
- {
- if (nmb->answers->rr_type != 0x20)
- {
- DEBUG(1,("Name query reply has wrong answer rr_type\n"));
- return False;
- }
- break;
- }
-
- case NAME_STATUS_DOM_SRV_CHK:
- case NAME_STATUS_SRV_CHK:
- {
- if (nmb->answers->rr_type != 0x21)
- {
- DEBUG(1,("Name status reply has wrong answer rr_type\n"));
- return False;
- }
- break;
- }
-
- default:
- {
- DEBUG(1,("unknown state type received in response_netbios_packet\n"));
- return False;
- }
- }
- return True;
-}
-#endif
-
-
-/****************************************************************************
- process the response packet received
- ****************************************************************************/
-static void response_process(struct subnet_record *d, struct packet_struct *p,
- struct response_record *n, struct nmb_packet *nmb,
- BOOL bcast, struct nmb_name *ans_name)
-{
- switch (n->state)
- {
- case NAME_RELEASE:
- {
- response_name_release(ans_name, d, p);
- break;
- }
-
- case NAME_REGISTER:
- {
- response_name_reg(ans_name, d, p);
- break;
- }
-
- case NAME_REGISTER_CHALLENGE:
- {
- response_name_query_register(nmb, ans_name, n, d);
- break;
- }
-
- case NAME_QUERY_DOM_SRV_CHK:
- case NAME_QUERY_SRV_CHK:
- case NAME_QUERY_FIND_MST:
- {
- response_server_check(ans_name, n, d, p);
- break;
- }
-
- case NAME_STATUS_DOM_SRV_CHK:
- case NAME_STATUS_SRV_CHK:
- {
- response_name_status_check(p->ip, nmb, bcast, n, d);
- break;
- }
-
- case NAME_QUERY_CONFIRM:
- case NAME_QUERY_SYNC_LOCAL:
- case NAME_QUERY_SYNC_REMOTE:
- {
- response_name_query_sync(nmb, ans_name, bcast, n, d);
- break;
- }
- case NAME_QUERY_MST_CHK:
- {
- /* no action required here. it's when NO responses are received
- that we need to do something. see expire_name_query_entries() */
-
- DEBUG(4, ("Master browser exists for %s at %s (just checking!)\n",
- namestr(&n->name), inet_ntoa(n->send_ip)));
- break;
- }
-
- case NAME_QUERY_DOMAIN:
- {
- /* We were asking to be a domain master browser, and someone
- replied. If it was the WINS server and the IP it is
- returning is our own - then remove the record and pretend
- we didn't get a response. Else we do nothing and let
- dead_netbios_entry deal with it.
- We can only become domain master browser
- when no broadcast responses are received and WINS
- either contains no entry for the DOMAIN<1b> name or
- contains our IP address.
- */
- response_name_query_domain(ans_name, nmb, n, d);
- break;
- }
- default:
- {
- DEBUG(1,("unknown state type received in response_netbios_packet\n"));
- break;
- }
- }
-}
-
-
-/****************************************************************************
- response from a netbios packet.
- ****************************************************************************/
-void response_netbios_packet(struct packet_struct *p)
-{
- struct nmb_packet *nmb = &p->packet.nmb;
- struct nmb_name *ans_name = NULL;
- BOOL bcast = nmb->header.nm_flags.bcast;
- struct response_record *n;
- struct subnet_record *d = NULL;
-
- if (!(n = find_response_record(&d,nmb->header.name_trn_id))) {
- DEBUG(2,("unknown netbios response (received late or from nmblookup?)\n"));
- return;
- }
-
- if (!d)
- {
- DEBUG(2,("response packet: subnet %s not known\n", inet_ntoa(p->ip)));
- return;
- }
-
- /* args wrong way round: spotted by ccm@shentel.net */
- if (!same_net(d->bcast_ip, p->ip, d->mask_ip)) /* copes with WINS 'subnet' */
- {
- DEBUG(2,("response from %s. ", inet_ntoa(p->ip)));
- DEBUG(2,("expected on subnet %s. hmm.\n", inet_ntoa(d->bcast_ip)));
- }
-
- if (nmb->answers == NULL)
- {
- /* hm. the packet received was a response, but with no answer. wierd! */
- DEBUG(2,("NMB packet response from %s (bcast=%s) - UNKNOWN\n",
- inet_ntoa(p->ip), BOOLSTR(bcast)));
- return;
- }
-
- ans_name = &nmb->answers->rr_name;
- DEBUG(3,("response for %s from %s (bcast=%s)\n",
- namestr(ans_name), inet_ntoa(p->ip), BOOLSTR(bcast)));
-
- debug_rr_type(nmb->answers->rr_type);
-
- n->num_msgs++; /* count number of responses received */
- n->repeat_count = 0; /* don't resend: see expire_netbios_packets() */
-
- debug_state_type(n->state);
-
- /* problem checking: multiple responses etc */
- if (response_problem_check(n, nmb, ans_name->name))
- return;
-
- /* now deal with the current state */
- response_process(d, p, n, nmb, bcast, ans_name);
-}
diff --git a/source/nameservresp.doc b/source/nameservresp.doc
deleted file mode 100644
index 635db45084f..00000000000
--- a/source/nameservresp.doc
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.0
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: nameservresp.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-*/
-
-this module deals with the receipt of response packets. the
-response packets are expected to be received, and there is a
-record of this kept (see also: modules nameresp and namedbresp)
-
-point of interest to design purists: every function in this
-module is static except response_netbios_packet().
-
-/*************************************************************************
- response_netbios_packet()
- *************************************************************************/
-
-this function receives netbios response packets. the samba server
-(or a rogue tcp/ip system, or nmblookup) will have sent out a packet
-requesting a response. a client (or a rogue tcp/ip system) responds
-to that request.
-
-this function checks the validity of the packet it receives.
-the expected response records are searched for the transaction id,
-to see if it's a response expected by the samba server. if it isn't
-it's reported as such, and ignored.
-
-if the response is found, then the subnet it was expected from will
-also have been found. the subnet it actually came in on can be
-checked against the subnet it was expected from and reported,
-otherwise this function just carries on.
-
-the number of responses received is increased, and the number of
-retries left to be sent is set to zero.
-
-after debug information is reported, and validation of the netbios
-packet (e.g only one response from one machine is expected for some
-functions) has occurred, the packet is processed. when the initial
-request was sent out, the expected response record was flagged with,
-for lack of a better word, a samba 'state' type. whenever a
-response is received, the appropriate function is called to carry on
-where the program control flow was interrupted while awaiting exactly
-such a response.
-
-please note that _not_ receiving a response is dealt with in another
-area of code - expire_netbios_response_entries().
-
-
-/*************************************************************************
- response_name_query_sync()
- *************************************************************************/
-
-this function receives responses to samba 'states' NAME_QUERY_SYNC and
-NAME_QUERY_CONFIRM.
-
-NAME_QUERY_SYNC: name query a server before synchronising browse lists.
-NAME_QUERY_CONFIRM: name query a server to check that it's alive.
-
-a NAME_QUERY_SYNC will be carried out in order to check that a server
-is alive before syncing browse lists. we don't want to delay the SMB
-NetServerEnum api just because the server has gone down: we have too
-much else to do.
-
-a NAME_QUERY_CONFIRM is just a name query to see whether the server is
-alive. these queries are sent out by samba's WINS server side, to verify
-its netbios name database of all machines that have registered with it.
-
-we don't normally expect a negative response from such a query, although
-we may do so if the query was sent to another WINS server. the registered
-entry should be removed if we receive a negative response.
-
-
-/*************************************************************************
- response_name_status_check()
- *************************************************************************/
-
-this function receives responses to samba 'states' NAME_STATUS_SRV_CHK
-and NAME_STATUS_DOM_SRV_CHK
-
-NAME_STATUS_DOM_SRV_CHK: name status a domain master browser
- confirm its domain and then initiate syncing
- its browse list.
-
-NAME_STATUS_SRV_CHK: same as NAME_STATUS_DOM_SRV_CHK except the
- name status is issued to a master browser.
-
-if we don't know what workgroup a server is responsible for, but we
-know that there is a master browser at a certain ip, we can issue a
-name status check. from the response received, there will be
-a master browser netbios entry. this will allow us to synchronise
-browse lists with that machine and then add the information to the
-correct part of samba's workgroup - server database.
-
-
-/*************************************************************************
- response_server_check()
- *************************************************************************/
-
-this function receives responses to samba 'states' NAME_QUERY_DOM_SRV_CHK,
-NAME_QUERY_SRV_CHK and NAME_QUERY_FIND_MST.
-
-NAME_QUERY_FIND_MST: issued as a broadcast when we wish to find out all
- master browsers (i.e all servers that have registered
- the NetBIOS name ^1^2__MSBROWSE__^2(0x1), and then
- issue a NAME_STATUS_MASTER_CHECK on any servers that
- respond, which will initiate a sync browse lists.
-
-NAME_QUERY_DOM_SRV_CHK: same as a NAME_QUERY_FIND_MST except this is sent
- to a domain master browser.
-
-NAME_QUERY_SRV_CHK: same as a NAME_QUERY_DOM_SRV_CHK except this is sent to
- a master browser.
-
-the purpose of each of these states is to do a broadcast name query, or
-a name query directed at a WINS server, then to all hosts that respond,
-we issue a name status check, which will confirm for us the workgroup
-or domain name, and then initiate issuing a sync browse list call with
-that server.
-
-a NAME_QUERY_SRV_CHK is sent when samba receives a list of backup
-browsers. it checks to see if that server is alive (by doing a
-name query on a server) and then syncs browse lists with it.
-
-
-/*************************************************************************
- response_name_reg()
- *************************************************************************/
-
-this function is responsible for dealing with samba's registration
-attempts, by broadcast to a local subnet, or point-to-point with
-another WINS server.
-
-please note that it cannot cope with END-NODE CHALLENGE REGISTRATION
-RESPONSEs at present.
-
-when a response is received, samba determines if the response is a
-positive or a negative one. if it is a positive response, the name
-is added to samba's database.
-
-when a negative response is received, samba will remove the name
-from its database. if, however, the name is a browser type (0x1b is
-a domain master browser type name; or 0x1d, which is a local master
-browser type name) then it must also stop being a domain master
-browser or master browser respectively, depending on what kind
-of name was rejected.
-
-(when no response is received, then expire_netbios_response_entries()
-is expected to deal with this. the only case that is dealt with here
-at present is when the registration was done by broadcast. if there
-is no challenge to the broadcast registration, it is implicitly
-assumed that claiming the name is acceptable).
-
-
-/*************************************************************************
- response_name_release()
- *************************************************************************/
-
-this function is responsible for removing samba's NetBIOS name when
-samba contacts another WINS server with which it had registered the
-name.
-
-only positive name releases are expected and dealt with. exactly what
-to do if a negative name release (i.e someone says 'oi! you have to
-keep that name!') is received is uncertain.
-
-(when no response is received, then expire_netbios_response_entries()
-is expected to deal with this. if there is no challenge to the release
-of the name, the name is then removed from that subnet's NetBIOS
-name database).
-
diff --git a/source/namework.c b/source/namework.c
deleted file mode 100644
index 3e1ac220058..00000000000
--- a/source/namework.c
+++ /dev/null
@@ -1,723 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-#define TEST_CODE /* want to debug unknown browse packets */
-
-extern int DEBUGLEVEL;
-extern pstring scope;
-extern BOOL CanRecurse;
-
-extern pstring myname;
-extern fstring myworkgroup;
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern struct in_addr ipzero;
-
-extern int workgroup_count; /* total number of workgroups we know about */
-
-/* this is our domain/workgroup/server database */
-extern struct subnet_record *subnetlist;
-
-extern int updatecount;
-
-/* backup request types: which servers are to be included */
-#define MASTER_TYPE (SV_TYPE_MASTER_BROWSER)
-#define DOMCTL_TYPE (SV_TYPE_DOMAIN_CTRL )
-
-extern time_t StartupTime;
-
-extern BOOL updatedlists;
-
-/****************************************************************************
-tell a server to become a backup browser
-state - 0x01 become backup instead of master
- - 0x02 remove all entries in browse list and become non-master
- - 0x04 stop master browser service altogether. NT ignores this
-**************************************************************************/
-void reset_server(char *name, int state, struct in_addr ip)
-{
- char outbuf[20];
- char *p;
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf;
-
- CVAL(p,0) = ANN_ResetBrowserState;
- CVAL(p,2) = state;
- p += 2;
-
- DEBUG(2,("sending reset to %s %s of state %d\n",
- name,inet_ntoa(ip),state));
-
- send_mailslot_reply(False,BROWSE_MAILSLOT,ClientDGRAM,
- outbuf,PTR_DIFF(p,outbuf),
- myname,name,0x20,0x1d,ip,*iface_ip(ip));
-}
-
-
-/****************************************************************************
-tell a server to become a backup browser
-**************************************************************************/
-void tell_become_backup(void)
-{
- /* XXXX note: this function is currently unsuitable for use, as it
- does not properly check that a server is in a fit state to become
- a backup browser before asking it to be one.
- */
-
- struct subnet_record *d;
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work = d->workgrouplist; work; work = work->next)
- {
- struct server_record *s;
- int num_servers = 0;
- int num_backups = 0;
-
- for (s = work->serverlist; s; s = s->next)
- {
- if (s->serv.type & SV_TYPE_DOMAIN_ENUM) continue;
-
- num_servers++;
-
- if (is_myname(s->serv.name)) continue;
-
- if (s->serv.type & SV_TYPE_BACKUP_BROWSER) {
- num_backups++;
- continue;
- }
-
- if (s->serv.type & SV_TYPE_MASTER_BROWSER) continue;
-
- if (!(s->serv.type & SV_TYPE_POTENTIAL_BROWSER)) continue;
-
- DEBUG(3,("num servers: %d num backups: %d\n",
- num_servers, num_backups));
-
- /* make first server a backup server. thereafter make every
- tenth server a backup server */
- if (num_backups != 0 && (num_servers+9) / num_backups > 10)
- {
- continue;
- }
-
- DEBUG(2,("sending become backup to %s %s for %s\n",
- s->serv.name, inet_ntoa(d->bcast_ip),
- work->work_group));
-
- /* type 11 request from MYNAME(20) to WG(1e) for SERVER */
- do_announce_request(s->serv.name, work->work_group,
- ANN_BecomeBackup, 0x20, 0x1e, d->bcast_ip);
- }
- }
- }
-}
-
-
-/*******************************************************************
- same context: scope. should check name_type as well, and makes sure
- we don't process messages from ourselves
- ******************************************************************/
-BOOL same_context(struct dgram_packet *dgram)
-{
- if (!strequal(dgram->dest_name .scope,scope )) return(True);
- if ( is_myname(dgram->source_name.name)) return(True);
-
- return(False);
-}
-
-
-/*******************************************************************
- process a domain announcement frame
-
- Announce frames come in 3 types. Servers send host announcements
- (command=1) to let the master browswer know they are
- available. Master browsers send local master announcements
- (command=15) to let other masters and backups that they are the
- master. They also send domain announcements (command=12) to register
- the domain
-
- The comment field of domain announcements contains the master
- browser name. The servertype is used by NetServerEnum to select
- resources. We just have to pass it to smbd (via browser.dat) and let
- the client choose using bit masks.
- ******************************************************************/
-static void process_localnet_announce(struct packet_struct *p,uint16 command,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- struct subnet_record *d = find_subnet(p->ip); /* Explicitly exclude WINS - local nets only */
- int update_count = CVAL(buf,0);
-
- int ttl = IVAL(buf,1)/1000;
- char *name = buf+5;
- int osmajor=CVAL(buf,21);
- int osminor=CVAL(buf,22);
- uint32 servertype = IVAL(buf,23);
- uint32 browse_type= CVAL(buf,27);
- uint32 browse_sig = CVAL(buf,29);
- char *comment = buf+31;
-
- struct work_record *work;
- char *work_name;
- char *serv_name = dgram->source_name.name;
- BOOL add = False;
-
- comment[43] = 0;
-
- DEBUG(4,("Announce(%d) %s(%x)",command,name,name[15]));
- DEBUG(4,("%s count=%d ttl=%d OS=(%d,%d) type=%08x sig=%4x %4x comment=%s\n",
- namestr(&dgram->dest_name),update_count,ttl,osmajor,osminor,
- servertype,browse_type,browse_sig,comment));
-
- name[15] = 0;
-
- if (dgram->dest_name.name_type == 0 && command == ANN_HostAnnouncement)
- {
- DEBUG(2,("Announce to nametype(0) not supported yet\n"));
- return;
- }
-
- if (command == ANN_DomainAnnouncement &&
- ((!strequal(dgram->dest_name.name, MSBROWSE)) ||
- dgram->dest_name.name_type != 0x1))
- {
- DEBUG(0,("Announce(%d) from %s should be __MSBROWSE__(1) not %s\n",
- command, inet_ntoa(p->ip), namestr(&dgram->dest_name)));
- return;
- }
-
- if (!strequal(dgram->dest_name.scope,scope )) return;
-
- if (command == ANN_DomainAnnouncement) {
- /* XXXX if we are a master browser for the workgroup work_name,
- then there is a local subnet configuration problem. only
- we should be sending out such domain announcements, because
- as the master browser, that is our job.
-
- stop being a master browser, and force an election. this will
- sort out the network problem. hopefully.
- */
-
- work_name = name;
- add = True;
- } else {
- work_name = dgram->dest_name.name;
- }
-
- /* we need some way of finding out about new workgroups
- that appear to be sending packets to us. The name_type checks make
- sure we don't add host names as workgroups */
- if (command == ANN_HostAnnouncement &&
- (dgram->dest_name.name_type == 0x1d ||
- dgram->dest_name.name_type == 0x1e))
- add = True;
-
- DEBUG(4,("search for workgroup: %s (add? %s)\n",
- work_name, BOOLSTR(add)));
-
- if (!(work = find_workgroupstruct(d, work_name,add)))
- return;
-
- DEBUG(4, ("workgroup %s on %s\n", work->work_group, serv_name));
-
- ttl = GET_TTL(ttl);
-
- /* add them to our browse list, and update the browse.dat file */
- add_server_entry(d,work,name,servertype|SV_TYPE_LOCAL_LIST_ONLY,ttl,comment,True);
- updatedlists = True;
-
-#if 0
- /* the tell become backup code is broken, no great harm is done by
- disabling it */
- tell_become_backup();
-#endif
-}
-
-/*******************************************************************
- process a master announcement frame
- Domain master browsers recieve these from local masters. The Domain
- master should then issue a sync with the local master, asking for
- that machines local server list.
- ******************************************************************/
-static void process_master_announce(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- char *name = buf;
- struct work_record *work;
- name[15] = 0;
-
- DEBUG(3,("process_master_announce: Master Announce from %s (%s)\n",name,inet_ntoa(p->ip)));
-
- if (same_context(dgram)) return;
-
- if (!wins_subnet)
- {
- DEBUG(3,("process_master_announce: No wins subnet !\n"));
- return;
- }
-
- if (!lp_domain_master())
- {
- DEBUG(3,("process_master_announce: Not configured as domain master - ignoring master announce.\n"));
- return;
- }
-
- for (work = wins_subnet->workgrouplist; work; work = work->next)
- {
- if (AM_MASTER(work) || AM_DOMMST(work))
- {
- /* merge browse lists with them */
- add_browser_entry(name,0x1d, work->work_group,30,wins_subnet,p->ip,True);
- }
- }
-}
-
-/*******************************************************************
- process a receive backup list request
-
- we receive a list of servers, and we attempt to locate them all on
- our local subnet, and sync browse lists with them on the workgroup
- they are said to be in.
-
- XXXX NOTE: this function is in overdrive. it should not really do
- half of what it actually does (it should pick _one_ name from the
- list received and sync with it at regular intervals, rather than
- sync with them all only once!)
-
- ******************************************************************/
-static void process_rcv_backup_list(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- int count = CVAL(buf,0);
- uint32 info = IVAL(buf,1); /* XXXX caller's incremental info */
- char *buf1;
-
- DEBUG(3,("Receive Backup ack for %s from %s total=%d info=%d\n",
- namestr(&dgram->dest_name), inet_ntoa(p->ip),
- count, info));
-
- if (same_context(dgram)) return;
-
- if (count <= 0) return;
-
- /* go through the list of servers attempting to sync browse lists */
- for (buf1 = buf+5; *buf1 && count; buf1 = skip_string(buf1, 1), --count)
- {
- struct in_addr back_ip;
- /* struct subnet_record *d; */
-
- DEBUG(4,("Searching for backup browser %s at %s...\n",
- buf1, inet_ntoa(p->ip)));
-
- /* XXXX assume name is a DNS name NOT a netbios name. a more complete
- approach is to use reply_name_query functionality to find the name */
-
- back_ip = *interpret_addr2(buf1);
-
- if (zero_ip(back_ip))
- {
- DEBUG(4,("Failed to find backup browser server using DNS\n"));
- continue;
- }
-
- DEBUG(4,("Found browser server at %s\n", inet_ntoa(back_ip)));
- DEBUG(4,("END THIS LOOP: CODE NEEDS UPDATING\n"));
-
-#if 0
- /* XXXX function needs work */
- continue;
-
- if ((d = find_subnet(back_ip)))
- {
- struct subnet_record *d1;
- for (d1 = subnetlist; d1; d1 = d1->next)
- {
- struct work_record *work;
- for (work = d1->workgrouplist; work; work = work->next)
- {
- if (work->token == 0 /* token */)
- {
- queue_netbios_packet(d1,ClientNMB,NMB_QUERY,NAME_QUERY_SRV_CHK,
- work->work_group,0x1d,
- 0,0,0,NULL,NULL,
- False,False,back_ip,back_ip);
- return;
- }
- }
- }
- }
-#endif
- }
-}
-
-
-/****************************************************************************
- send a backup list response.
- **************************************************************************/
-static void send_backup_list(char *work_name, struct nmb_name *src_name,
- int token, uint32 info,
- int name_type, struct in_addr ip)
-{
- char outbuf[1024];
- char *p, *countptr, *nameptr;
- int count = 0;
- char *theirname = src_name->name;
-
- DEBUG(3,("sending backup list of %s to %s: %s(%x) %s(%x)\n",
- work_name, inet_ntoa(ip),
- myname,0x0,theirname,0x0));
-
- if (name_type == 0x1d)
- {
- DEBUG(4,("master browsers: "));
- }
- else if (name_type == 0x1b)
- {
- DEBUG(4,("domain controllers: "));
- }
- else
- {
- DEBUG(0,("backup request for unknown type %0x\n", name_type));
- return;
- }
-
- bzero(outbuf,sizeof(outbuf));
- p = outbuf;
-
- CVAL(p,0) = ANN_GetBackupListResp; /* backup list response */
-
- p++;
- countptr = p;
-
- SIVAL(p,1,info); /* the sender's unique info */
-
- p += 5;
-
- nameptr = p;
-
-#if 0
-
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *work;
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- struct server_record *s;
-
- if (!strequal(work->work_group, work_name)) continue;
-
- for (s = work->serverlist; s; s = s->next)
- {
- BOOL found = False;
- char *n;
-
- if (s->serv.type & SV_TYPE_DOMAIN_ENUM) continue;
-
- for (n = nameptr; n < p; n = skip_string(n, 1))
- {
- if (strequal(n, s->serv.name)) found = True;
- }
-
- if (found) continue; /* exclude names already added */
-
- /* workgroup request: include all backup browsers in the list */
- /* domain request: include all domain members in the list */
-
- if ((name_type == 0x1d && (s->serv.type & MASTER_TYPE)) ||
- (name_type == 0x1b && (s->serv.type & DOMCTL_TYPE)))
- {
- DEBUG(4, ("%s ", s->serv.name));
-
- count++;
- strcpy(p,s->serv.name);
- strupper(p);
- p = skip_string(p,1);
- }
- }
- }
- }
-
-#endif
-
- count++;
- strcpy(p,myname);
- strupper(p);
- p = skip_string(p,1);
-
- if (count == 0)
- {
- DEBUG(4, ("none\n"));
- }
- else
- {
- DEBUG(4, (" - count %d\n", count));
- }
-
- CVAL(countptr, 0) = count;
-
- {
- int len = PTR_DIFF(p, outbuf);
- debug_browse_data(outbuf, len);
- }
- send_mailslot_reply(False,BROWSE_MAILSLOT,ClientDGRAM,
- outbuf,PTR_DIFF(p,outbuf),
- myname,theirname,0x0,0x0,ip,*iface_ip(ip));
-}
-
-
-/*******************************************************************
- process a send backup list request
-
- A client sends a backup list request to ask for a list of servers on
- the net that maintain server lists for a domain. A server is then
- chosen from this list to send NetServerEnum commands to to list
- available servers.
-
- Currently samba only sends back one name in the backup list, its
- own. For larger nets we'll have to add backups and send "become
- backup" requests occasionally.
- ******************************************************************/
-static void process_send_backup_list(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- struct in_addr ip = dgram->header.source_ip;
- struct subnet_record *d;
- struct work_record *work;
-
- int token = CVAL(buf,0); /* sender's key index for the workgroup */
- uint32 info = IVAL(buf,1); /* XXXX don't know: some sort of info */
- int name_type = dgram->dest_name.name_type;
-
- if (same_context(dgram)) return;
-
- if (name_type != 0x1b && name_type != 0x1d) {
- DEBUG(0,("backup request to wrong type %d from %s\n",
- name_type,inet_ntoa(ip)));
- return;
- }
-
- for (d = subnetlist; d; d = d->next)
- {
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (strequal(work->work_group, dgram->dest_name.name))
- {
- DEBUG(2,("sending backup list to %s %s id=%x\n",
- namestr(&dgram->dest_name),inet_ntoa(ip),info));
-
- send_backup_list(work->work_group,&dgram->source_name,
- token,info,name_type,ip);
- return;
- }
- }
- }
-}
-
-
-/*******************************************************************
- process a reset browser state
-
- diagnostic packet:
- 0x1 - stop being a master browser and become a backup browser.
- 0x2 - discard browse lists, stop being a master browser, try again.
- 0x4 - stop being a master browser forever. no way. ain't gonna.
-
- ******************************************************************/
-static void process_reset_browser(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- int state = CVAL(buf,0);
-
- DEBUG(1,("received diagnostic browser reset request to %s state=0x%X\n",
- namestr(&dgram->dest_name), state));
-
- /* stop being a master but still deal with being a backup browser */
- if (state & 0x1)
- {
- struct subnet_record *d;
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_EXCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work = d->workgrouplist; work; work = work->next)
- {
- if (AM_MASTER(work))
- {
- unbecome_local_master(d,work,SV_TYPE_MASTER_BROWSER);
- }
- }
- }
- }
-
- /* XXXX documentation inconsistency: the above description does not
- exactly tally with what is implemented for state & 0x2
- */
-
- /* totally delete all servers and start afresh */
- if (state & 0x2)
- {
- struct subnet_record *d;
- for (d = FIRST_SUBNET; d; d = NEXT_SUBNET_INCLUDING_WINS(d))
- {
- struct work_record *work;
- for (work=d->workgrouplist;work;work=remove_workgroup(d,work,True));
- }
- add_my_subnets(myworkgroup);
- }
-
- /* stop browsing altogether. i don't think this is a good idea! */
- if (state & 0x4)
- {
- DEBUG(1,("ignoring request to stop being a browser. sorry!\n"));
- }
-}
-
-/*******************************************************************
- process a announcement request
-
- clients send these when they want everyone to send an announcement
- immediately. This can cause quite a storm of packets!
- ******************************************************************/
-static void process_announce_request(struct packet_struct *p,char *buf)
-{
- struct dgram_packet *dgram = &p->packet.dgram;
- struct work_record *work;
- struct in_addr ip = dgram->header.source_ip;
- struct subnet_record *d = find_subnet(ip); /* Explicitly NO WINS */
- int token = CVAL(buf,0);
- char *name = buf+1;
-
- name[15] = 0;
-
- DEBUG(3,("process_announce_request: Announce request from %s to %s token=0x%X\n",
- name,namestr(&dgram->dest_name), token));
-
- if (is_myname(dgram->source_name.name)) return;
-
- /* XXXX BUG or FEATURE?: need to ensure that we are a member of
- this workgroup before announcing, particularly as we only
- respond on local interfaces anyway.
-
- if (strequal(dgram->dest_name, myworkgroup) return; ???
- */
-
- if (!d)
- {
- DEBUG(3,("process_announce_request: No local interface to announce to %s\n",
- name));
- return;
- }
-
- for (work = d->workgrouplist; work; work = work->next)
- {
- /* XXXX BUG: the destination name type should also be checked,
- not just the name. e.g if the name is WORKGROUP(0x1d) then
- we should only respond if we own that name */
-
- if (strequal(dgram->dest_name.name,work->work_group))
- {
- work->needannounce = True;
- }
- }
-}
-
-
-
-/****************************************************************************
-process a browse frame
-****************************************************************************/
-void process_browse_packet(struct packet_struct *p,char *buf,int len)
-{
- int command = CVAL(buf,0);
- switch (command)
- {
- case ANN_HostAnnouncement:
- case ANN_DomainAnnouncement:
- case ANN_LocalMasterAnnouncement:
- {
- debug_browse_data(buf, len);
- process_localnet_announce(p,command,buf+1);
- break;
- }
-
- case ANN_AnnouncementRequest:
- {
- process_announce_request(p,buf+1);
- break;
- }
-
- case ANN_Election:
- {
- process_election(p,buf+1);
- break;
- }
-
- case ANN_GetBackupListReq:
- {
- debug_browse_data(buf, len);
- process_send_backup_list(p,buf+1);
- break;
- }
-
- case ANN_GetBackupListResp:
- {
- debug_browse_data(buf, len);
- process_rcv_backup_list(p, buf+1);
- break;
- }
-
- case ANN_ResetBrowserState:
- {
- process_reset_browser(p, buf+1);
- break;
- }
-
- case ANN_MasterAnnouncement:
- {
- process_master_announce(p,buf+1);
- break;
- }
-
- default:
- {
- struct dgram_packet *dgram = &p->packet.dgram;
- DEBUG(4,("ignoring browse packet %d from %s %s to %s\n",
- command, namestr(&dgram->source_name),
- inet_ntoa(p->ip), namestr(&dgram->dest_name)));
- }
- }
-}
-
-
diff --git a/source/namework.doc b/source/namework.doc
deleted file mode 100644
index 958a86c8668..00000000000
--- a/source/namework.doc
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- Unix SMB/Netbios documentation.
- Version 0.1
- Copyright (C) Luke Leighton Andrew Tridgell 1996
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Document name: namework.doc
-
- Revision History:
-
- 0.0 - 02jul96 : lkcl@pires.co.uk
- created
-
- 0.1 - 22jul96 Andrew.Tridgell@anu.edu.au
- tridge's comments on first revision
-*/
-
-the module namework.c deals with NetBIOS datagram packets, primarily.
-it deals with nmbd's workgroup browser side and the domain log in
-side. none of the functionality here has specification documents available.
-empirical observation of packet traces has been the order of the day,
-along with some guess-work.
-
-beware!
-
-the receipt of datagram packets for workgroup browsing are dealt with here.
-some of the functions listed here will call others outside of this
-module, or will activate functionality dealt with by other modules
-(namedb, nameannounce, nameelect, namelogon, and namebrowse).
-
-
-/*************************************************************************
- process_browse_packet()
- *************************************************************************/
-
-this function is responsible for further identifying which type of
-browser datagram packet has been received, and dealing with it
-accordingly. if the packet is not dealt with, then an error is
-logged along with the type of packet that has been received.
-
-if listening_type() was in use, then it would be used here.
-
-the types of packets received and dealt with are:
-
-- ANN_HostAnnouncement
-- ANN_DomainAnnouncement
-- ANN_LocalMasterAnnouncement
-
-these are all identical in format and can all be processed by
-process_announce(). an announcement is received from a host
-(either a master browser telling us about itself, a server
-telling us about itself or a master browser telling us about
-a domain / workgroup)
-
-- ANN_AnnouncementRequest
-
-these are sent by master browsers or by servers. it is a
-request to announce ourselves as appropriate by sending
-either a ANN_HostAnnouncement datagram or both an
-ANN_DomainAnnouncement and an ANN_LocalMasterAnnouncement
-if we are a master browser (but not both).
-
-- ANN_Election
-
-this is an election datagram. if samba has been configured
-as a domain master then it will also send out election
-datagrams.
-
-- ANN_GetBackupListReq
-
-this is a request from another server for us to send a
-backup list of all servers that we know about. we respond
-by sending a datagram ANN_GetBackupListResp. the protocol
-here is a little dicey.
-
-- ANN_GetBackupListResp
-
-this is a response from another server that we have sent an
-ANN_GetBackupListReq to. the protocol is a little dicey.
-
-- ANN_BecomeBackup
-
-this is a message sent by a master browser to a
-potential master browser, indicating that it should become
-a backup master browser for the workgroup it is a member
-of. samba does not respond at present to such datagrams,
-and it also sends out such datagrams for the wrong reasons
-(this code has now been disabled until this is fixed).
-
-- ANN_ResetBrowserState
-
-this datagram is sent for trouble-shooting purposes.
-it asks a browser to clear out its server lists, or to
-stop becoming a master browser altogether. NT/AS and
-samba do not implement this latter option.
-
-- ANN_MasterAnnouncement
-
-this datagram is sent by a master browser to a domain master
-browser. it is a way to ensure that master browsers are kept in sync
-with a domain master browser across a wide area network. on
-receipt of an ANN_MasterAnnouncement we should sync browse lists with
-the sender.
-
-(i never got the hang of this one when i was experimenting.
-i forget exactly what it's for, and i never fully worked
-out how to coax a server to send it. :-)
-
-NOTE FROM TRIDGE: The reason you didn't work out how to coax a server
-into sending it is that you can't (or shouldn't try!). Basically these
-"master announce" datagrams are the way that separate netbios subnets
-are linked together to form a complete browse net. The way it works is
-that the local master decides it is going to inform the domain master
-of its presence, then sends this master announce to the domain
-master. The domain master then syncs with the local master using a
-"local only" sync. The whole transaction is initiated by the local
-master, not the domain master, so the domain master should not do any
-of this if it does not first receive a "master announcement". The
-local domain masters need to be configured to know the IP address of
-the domain master.
-
-
-/*************************************************************************
- listening_type()
- *************************************************************************/
-
-
-a datagram packet is sent from one NetBIOS name of a specific type
-to another NetBIOS name of a specific type. certain types of
-datagrams are only expected from certain types of NetBIOS names.
-
-this function is intended to catch errors in the type of datagrams
-received from different NetBIOS names. it is currently incomplete
-due to lack of information on the types of names and the datagrams
-they send.
-
-
-/*************************************************************************
- process_announce_request()
- *************************************************************************/
-
-this function is responsible for dealing with announcement requests.
-if the type of name that the request is sent to matches our current
-status, then we should respond. otherwise, the datagram should be
-ignored.
-
-samba only responds on its local subnets.
-
-at present, just the name is checked to see if the packet is for us.
-what should be done is that if we own the name (e.g WORGROUP(0x1d)
-or WORKGROUP(0x1b) then we should respond, otherwise, ignore the
-datagram.
-
-if the name is for us, and we are a member of that workgroup, then
-samba should respond.
-
-note that samba does not respond immediately. this is to ensure that
-if the master browser for the workgroup that samba is a member of
-sends out a broadcast request announcement, that that master browser
-is not swamped with replies. it is therefore up to samba to reply
-at some random interval. hence, a flag is set indicating the need
-to announce later.
-
-
-/*************************************************************************
- process_reset_browser()
- *************************************************************************/
-
-this function is responsible for dealing with reset state datagrams.
-there are three kinds of diagnostic reset requests:
-
-- stop being a master browser
-- discard browse lists, stop being a master browser, and run for re-election
-- stop being a master browser forever.
-
-samba and windows nt do not implement the latter option.
-
-there appears to be a discrepancy between this description and the
-code actually implemented.
-
-
-/*************************************************************************
- process_send_backup_list()
- *************************************************************************/
-
-this function is part of samba's domain master browser functionality.
-
-it is responsible for giving master browsers a list of other browsers
-that maintain backup lists of servers for that master browser's workgroup.
-
-it is also responsible for giving master browsers a list of domain master
-browsers for that local master browser's domain.
-
-a correct way to think of this function is that it is a 'request to
-send out a backup list for the requested workgroup or domain'.
-
-i have some suspicions and intuitions about this function and how it
-is to actually be used. there is no documentation on this, so it is a
-matter of experimenting until it's right.
-
-
-/*************************************************************************
- send_backup_list()
- *************************************************************************/
-
-this function is responsible for compiling a list of either master
-browsers and backup master browsers or domain master browsers and
-backup domain master browsers. samba constructs this list from its
-workgroup / server database.
-
-the list is then sent to the host that requested it by sending an
-ANN_GetBackupListResp datagram to this host.
-
-
-NOTE FROM TRIDGE: The "backup list" stuff is only relevant to
-local subnets. It has nothing to do with PDCs or domain masters. Its
-function is twofold:
-
-1) spread the browsing load over multiple servers so one server
-doesn't get overloaded with browse requests
-2) make sure the database doesn't get lost completely if the master
-goes down
-
-To accomplish this a few things are supposed to be done:
-
-- the master browser maintains a list of "backup browsers".
-
-- backup browsers are are machines that are just like ordinary servers
-but also maintain a browse list and respond to "NetServerEnum"
-requests
-
-- when a server initially announces itself to the master it may set
-its "maintain browse list" flag to auto.
-
-- when a master browser sees a server announcement with "auto" set it
-may send a "become backup" to that server telling it to become a
-backup.
-
-- the master has a simple algorithm to determine how many backups it wants
-given the number of hosts on the net
-
-- when a client wishes to get a browse list it asks the master for a
-backup list. The master sends it the current list of backup browsers,
-including itself. The client caches this list. The client then sends
-the NetServerEnum to a random member of this list easch time it wants
-to browse. This spreads the load.
-
-
-
-/*************************************************************************
- process_rcv_backup_list()
- *************************************************************************/
-
-this function is implemented with a slightly over-kill algorithm.
-the correct functionality is to pick any three names at random from
-the list that is received from this datagram, and then at intervals
-contact _one_ of them for a list of browser, in order to update
-samba's browse list.
-
-samba contacts every single one of the backup browsers listed, through
-the use of a NAME_QUERY_SRV_CHK 'state'.
-
-
-/*************************************************************************
- process_master_announce()
- *************************************************************************/
-
-this function is responsible for synchronising browse lists with a
-master browser that contacts samba in its capacity as a domain master
-browser.
-
-the function add_browser_entry() is used to add the server that
-contacts us to our list of browser to sync browse lists with at
-some point in the near future.
-
-
-/*************************************************************************
- process_announce()
- *************************************************************************/
-
-this function is responsible for dealing with the three types of
-announcement type datagrams that samba recognises. some appropriate
-type-checking is done on the name that the datagram is sent to.
-
-samba does not at present deal with LanManager announcements.
-
-these announcements are for updating the browse entry records.
-each browse entry has a time-to-live associated with it. each server
-must refresh its entry with all other servers by broadcasting
-Announcements. if it does not do so, then other servers will not
-know about that machine, and the records on each server of that
-other machine will die.
-
-if an ANN_DomainAnnouncement is received, then this will be from
-a master browser. only one machine on any given broadcast area (e.g
-a subnet) should be broadcasting such announcements. the information
-it contains tells other servers that there is a master browser for
-this workgroup. if another server thinks that it is also a master
-browser for the same workgroup, then it should stop being a master
-browser and force an election.
-
-if an ANN_LocalMasterAnnouncement is received, then a master browser
-is telling us that it exists. i am uncertain that anything else
-actually needs to be done with this, other than to shout 'hooray' and
-'thank you for informing me of this fact'.
-
-
-/*************************************************************************
- listening_name()
- *************************************************************************/
-
-this function is an over-simplified way of identifying whether we
-should be responding to a datagram that has been received.
-
-
-/*************************************************************************
- same_context()
- *************************************************************************/
-
-this function helps us to identify whether we should be responding to
-a datagram that has been received.
-
-
-/*************************************************************************
- tell_become_backup()
- *************************************************************************/
-
-this function is part of samba's domain master browser capabilities.
-it is responsible for finding appropriate servers to tell to become a
-backup master browser for the domain that samba controls.
-
-other servers that contact samba asking for a list of backup browsers
-will then be given that server's name, and that server can expect to
-receive NetServerEnum requests for lists of servers and workgroups.
-
-this function must be updated before it is in a fit state to be used.
-it must properly check whether a server is prepared to become a backup
-browser before actually asking it to be one.
-
-
-/*************************************************************************
- reset_server()
- *************************************************************************/
-
-this function is responsible for issuing an ANN_ResetBrowserState to
-the specified server, asking it to reset its browser information.
-
-see process_reset_browser() for details on this function.
-
-
diff --git a/source/nmbd/nmbd.c b/source/nmbd/nmbd.c
deleted file mode 100644
index 3f0279908da..00000000000
--- a/source/nmbd/nmbd.c
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines and daemon - version 2
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 14 jan 96: lkcl@pires.co.uk
- added multiple workgroup domain master support
-
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-extern pstring debugf;
-pstring servicesf = CONFIGFILE;
-
-extern pstring scope;
-
-int ClientNMB = -1;
-int ClientDGRAM = -1;
-
-extern pstring myhostname;
-static pstring host_file;
-extern pstring myname;
-extern fstring myworkgroup;
-extern char **my_netbios_names;
-
-/* are we running as a daemon ? */
-static BOOL is_daemon = False;
-
-/* what server type are we currently */
-
-time_t StartupTime =0;
-
-extern struct in_addr ipzero;
-
- /****************************************************************************
- catch a sigterm
- ****************************************************************************/
-static int sig_term()
-{
- BlockSignals(True,SIGTERM);
-
- DEBUG(0,("Got SIGTERM: going down...\n"));
-
- /* write out wins.dat file if samba is a WINS server */
- dump_names();
-
- /* remove all samba names, with wins server if necessary. */
- remove_my_names();
-
- /* announce all server entries as 0 time-to-live, 0 type */
- /* XXXX don't care if we never receive a response back... yet */
- announce_my_servers_removed();
-
- /* XXXX other things: if we are a master browser, force an election? */
-
- exit(0);
- /* Keep compiler happy.. */
- return 0;
-}
-
-
-/****************************************************************************
-catch a sighup
-****************************************************************************/
-static int sig_hup(void)
-{
- BlockSignals(True,SIGHUP);
-
- DEBUG(0,("Got SIGHUP (reload not implemented)\n"));
- dump_names();
- reload_services(True);
-
- set_samba_nb_type();
-
- BlockSignals(False,SIGHUP);
-#ifndef DONT_REINSTALL_SIG
- signal(SIGHUP,SIGNAL_CAST sig_hup);
-#endif
- return(0);
-}
-
-/****************************************************************************
-catch a sigpipe
-****************************************************************************/
-static int sig_pipe(void)
-{
- BlockSignals(True,SIGPIPE);
-
- DEBUG(0,("Got SIGPIPE\n"));
- if (!is_daemon)
- exit(1);
- BlockSignals(False,SIGPIPE);
- return(0);
-}
-
-#if DUMP_CORE
-/*******************************************************************
-prepare to dump a core file - carefully!
-********************************************************************/
-static BOOL dump_core(void)
-{
- char *p;
- pstring dname;
- pstrcpy(dname,debugf);
- if ((p=strrchr(dname,'/'))) *p=0;
- strcat(dname,"/corefiles");
- mkdir(dname,0700);
- sys_chown(dname,getuid(),getgid());
- chmod(dname,0700);
- if (chdir(dname)) return(False);
- umask(~(0700));
-
-#ifndef NO_GETRLIMIT
-#ifdef RLIMIT_CORE
- {
- struct rlimit rlp;
- getrlimit(RLIMIT_CORE, &rlp);
- rlp.rlim_cur = MAX(4*1024*1024,rlp.rlim_cur);
- setrlimit(RLIMIT_CORE, &rlp);
- getrlimit(RLIMIT_CORE, &rlp);
- DEBUG(3,("Core limits now %d %d\n",rlp.rlim_cur,rlp.rlim_max));
- }
-#endif
-#endif
-
-
- DEBUG(0,("Dumping core in %s\n",dname));
- return(True);
-}
-#endif
-
-
-/****************************************************************************
-possibly continue after a fault
-****************************************************************************/
-static void fault_continue(void)
-{
-#if DUMP_CORE
- dump_core();
-#endif
-}
-
-/*******************************************************************
- expire old names from the namelist and server list
- ******************************************************************/
-static void expire_names_and_servers(time_t t)
-{
- static time_t lastrun = 0;
-
- if (!lastrun) lastrun = t;
- if (t < lastrun + 5) return;
- lastrun = t;
-
- expire_names(t);
- expire_servers(t);
-}
-
-/*****************************************************************************
- reload the services file
- **************************************************************************/
-BOOL reload_services(BOOL test)
-{
- BOOL ret;
- extern fstring remote_machine;
-
- strcpy(remote_machine,"nmbd");
-
- if (lp_loaded())
- {
- pstring fname;
- pstrcpy(fname,lp_configfile());
- if (file_exist(fname,NULL) && !strcsequal(fname,servicesf))
- {
- pstrcpy(servicesf,fname);
- test = False;
- }
- }
-
- if (test && !lp_file_list_changed())
- return(True);
-
- ret = lp_load(servicesf,True);
-
- /* perhaps the config filename is now set */
- if (!test) {
- DEBUG(3,("services not loaded\n"));
- reload_services(True);
- }
-
- /* Do a sanity check for a misconfigured nmbd */
- if(lp_wins_support() && *lp_wins_server()) {
- DEBUG(0,("ERROR: both 'wins support = true' and 'wins server = <server>' \
-cannot be set in the smb.conf file. nmbd aborting.\n"));
- exit(10);
- }
-
- return(ret);
-}
-
-
-
-/****************************************************************************
-load a netbios hosts file
-****************************************************************************/
-static void load_hosts_file(char *fname)
-{
- FILE *f = fopen(fname,"r");
- pstring line;
- if (!f) {
- DEBUG(2,("Can't open lmhosts file %s\n",fname));
- return;
- }
-
- while (!feof(f))
- {
- pstring ip,name,flags,extra;
- struct subnet_record *d;
- char *ptr;
- int count = 0;
- struct in_addr ipaddr;
- enum name_source source = LMHOSTS;
-
- if (!fgets_slash(line,sizeof(pstring),f)) continue;
-
- if (*line == '#') continue;
-
- strcpy(ip,"");
- strcpy(name,"");
- strcpy(flags,"");
-
- ptr = line;
-
- if (next_token(&ptr,ip ,NULL)) ++count;
- if (next_token(&ptr,name ,NULL)) ++count;
- if (next_token(&ptr,flags,NULL)) ++count;
- if (next_token(&ptr,extra,NULL)) ++count;
-
- if (count <= 0) continue;
-
- if (count > 0 && count < 2) {
- DEBUG(0,("Ill formed hosts line [%s]\n",line));
- continue;
- }
-
- if (count >= 4) {
- DEBUG(0,("too many columns in %s (obsolete syntax)\n",fname));
- continue;
- }
-
- DEBUG(4, ("lmhost entry: %s %s %s\n", ip, name, flags));
-
- if (strchr(flags,'G') || strchr(flags,'S')) {
- DEBUG(0,("group flag in %s ignored (obsolete)\n",fname));
- continue;
- }
-
- if (strchr(flags,'M')) {
- source = SELF;
- pstrcpy(myname,name);
- }
-
- ipaddr = *interpret_addr2(ip);
- d = find_subnet_all(ipaddr);
- if (d) {
- add_netbios_entry(d,name,0x00,NB_ACTIVE,0,source,ipaddr,True,True);
- add_netbios_entry(d,name,0x20,NB_ACTIVE,0,source,ipaddr,True,True);
- }
- }
-
- fclose(f);
-}
-
-
-/****************************************************************************
- The main select loop.
- ***************************************************************************/
-static void process(void)
-{
- BOOL run_election;
-
- while (True)
- {
- time_t t = time(NULL);
- run_election = check_elections();
- listen_for_packets(run_election);
-
- run_packet_queue();
- run_elections(t);
-
- announce_host(t);
- announce_master(t);
- announce_remote(t);
-
- query_refresh_names(t);
-
- expire_names_and_servers(t);
- expire_netbios_response_entries(t);
- refresh_my_names(t);
-
- write_browse_list(t);
- do_browser_lists(t);
- check_master_browser(t);
- add_domain_names(t);
- }
-}
-
-
-/****************************************************************************
- open the socket communication
-****************************************************************************/
-static BOOL open_sockets(BOOL isdaemon, int port)
-{
- struct hostent *hp;
-
- /* get host info */
- if ((hp = Get_Hostbyname(myhostname)) == 0) {
- DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",myhostname));
- return False;
- }
-
- if (isdaemon)
- ClientNMB = open_socket_in(SOCK_DGRAM, port,0,interpret_addr(lp_socket_address()));
- else
- ClientNMB = 0;
-
- ClientDGRAM = open_socket_in(SOCK_DGRAM,DGRAM_PORT,3,interpret_addr(lp_socket_address()));
-
- if (ClientNMB == -1)
- return(False);
-
- signal(SIGPIPE, SIGNAL_CAST sig_pipe);
-
- set_socket_options(ClientNMB,"SO_BROADCAST");
- set_socket_options(ClientDGRAM,"SO_BROADCAST");
-
- DEBUG(3,("Sockets opened.\n"));
- return True;
-}
-
-
-/****************************************************************************
- initialise connect, service and file structs
-****************************************************************************/
-static BOOL init_structs()
-{
- extern fstring local_machine;
- char *p, *ptr;
- int namecount;
- int n;
- int nodup;
- pstring nbname;
-
- if (! *myname) {
- fstrcpy(myname,myhostname);
- p = strchr(myname,'.');
- if (p) *p = 0;
- }
- strupper(myname);
-
- /* Add any NETBIOS name aliases. Ensure that the first entry
- is equal to myname. */
- /* Work out the max number of netbios aliases that we have */
- ptr=lp_netbios_aliases();
- for (namecount=0; next_token(&ptr,nbname,NULL); namecount++)
- ;
- if (*myname)
- namecount++;
-
- /* Allocate space for the netbios aliases */
- if((my_netbios_names=(char **)malloc(sizeof(char *)*(namecount+1))) == NULL)
- {
- DEBUG(0,("init_structs: malloc fail.\n"));
- return False;
- }
-
- /* Use the myname string first */
- namecount=0;
- if (*myname)
- my_netbios_names[namecount++] = myname;
-
- ptr=lp_netbios_aliases();
- while (next_token(&ptr,nbname,NULL)) {
- strupper(nbname);
- /* Look for duplicates */
- nodup=1;
- for(n=0; n<namecount; n++) {
- if (strcmp(nbname, my_netbios_names[n])==0)
- nodup=0;
- }
- if (nodup)
- my_netbios_names[namecount++]=strdup(nbname);
- }
-
- /* Check the strdups succeeded. */
- for(n = 0; n < namecount; n++)
- if(my_netbios_names[n]==NULL)
- {
- DEBUG(0,("init_structs: malloc fail when allocating names.\n"));
- return False;
- }
-
- /* Terminate name list */
- my_netbios_names[namecount++]=NULL;
-
- fstrcpy(local_machine,myname);
- trim_string(local_machine," "," ");
- p = strchr(local_machine,' ');
- if (p)
- *p = 0;
- strlower(local_machine);
-
- DEBUG(5, ("Netbios name list:-\n"));
- for (n=0; my_netbios_names[n]; n++)
- DEBUG(5, ("my_netbios_names[%d]=\"%s\"\n", n, my_netbios_names[n]));
-
- return True;
-}
-
-/****************************************************************************
-usage on the program
-****************************************************************************/
-static void usage(char *pname)
-{
- DEBUG(0,("Incorrect program usage - is the command line correct?\n"));
-
- printf("Usage: %s [-n name] [-D] [-p port] [-d debuglevel] [-l log basename]\n",pname);
- printf("Version %s\n",VERSION);
- printf("\t-D become a daemon\n");
- printf("\t-p port listen on the specified port\n");
- printf("\t-d debuglevel set the debuglevel\n");
- printf("\t-l log basename. Basename for log/debug files\n");
- printf("\t-n netbiosname. the netbios name to advertise for this host\n");
- printf("\t-H hosts file load a netbios hosts file\n");
- printf("\n");
-}
-
-
-/****************************************************************************
- main program
- **************************************************************************/
- int main(int argc,char *argv[])
-{
- int port = NMB_PORT;
- int opt;
- extern FILE *dbf;
- extern char *optarg;
- char pidFile[100] = { 0 };
-
- *host_file = 0;
-
- StartupTime = time(NULL);
-
- TimeInit();
-
- strcpy(debugf,NMBLOGFILE);
-
- setup_logging(argv[0],False);
-
- charset_initialise();
-
-#ifdef LMHOSTSFILE
- strcpy(host_file,LMHOSTSFILE);
-#endif
-
- /* this is for people who can't start the program correctly */
- while (argc > 1 && (*argv[1] != '-')) {
- argv++;
- argc--;
- }
-
- fault_setup(fault_continue);
-
- signal(SIGHUP ,SIGNAL_CAST sig_hup);
- signal(SIGTERM,SIGNAL_CAST sig_term);
-
- while ((opt = getopt(argc, argv, "s:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:f:")) != EOF)
- {
- switch (opt)
- {
- case 'f':
- strncpy(pidFile, optarg, sizeof(pidFile));
- break;
- case 's':
- pstrcpy(servicesf,optarg);
- break;
- case 'N':
- case 'B':
- case 'I':
- case 'C':
- case 'G':
- DEBUG(0,("Obsolete option '%c' used\n",opt));
- break;
- case 'H':
- pstrcpy(host_file,optarg);
- break;
- case 'n':
- pstrcpy(myname,optarg);
- strupper(myname);
- break;
- case 'l':
- sprintf(debugf,"%s.nmb",optarg);
- break;
- case 'i':
- pstrcpy(scope,optarg);
- strupper(scope);
- break;
- case 'D':
- is_daemon = True;
- break;
- case 'd':
- DEBUGLEVEL = atoi(optarg);
- break;
- case 'p':
- port = atoi(optarg);
- break;
- case 'h':
- usage(argv[0]);
- exit(0);
- break;
- default:
- if (!is_a_socket(0)) {
- usage(argv[0]);
- }
- break;
- }
- }
-
- DEBUG(1,("%s netbios nameserver version %s started\n",timestring(),VERSION));
- DEBUG(1,("Copyright Andrew Tridgell 1994-1997\n"));
-
- if(!get_myname(myhostname,NULL))
- {
- DEBUG(0,("Unable to get my hostname - exiting.\n"));
- return -1;
- }
-
- if (!reload_services(False))
- return(-1);
-
- codepage_initialise(lp_client_code_page());
-
- if(!init_structs())
- return -1;
-
- reload_services(True);
-
- pstrcpy(myworkgroup, lp_workgroup());
-
- if (strequal(myworkgroup,"*")) {
- DEBUG(0,("ERROR: a workgroup name of * is no longer supported\n"));
- exit(1);
- }
-
- set_samba_nb_type();
-
- if (!is_daemon && !is_a_socket(0)) {
- DEBUG(0,("standard input is not a socket, assuming -D option\n"));
- is_daemon = True;
- }
-
- if (is_daemon) {
- DEBUG(2,("%s becoming a daemon\n",timestring()));
- become_daemon();
- }
-
- if (*pidFile)
- {
- int fd;
- char buf[20];
-
- if ((fd = open(pidFile,
-#ifdef O_NONBLOCK
- O_NONBLOCK |
-#endif
- O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)
- {
- DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno)));
- exit(1);
- }
- if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False)
- {
- DEBUG(0,("ERROR: nmbd is already running\n"));
- exit(1);
- }
- sprintf(buf, "%u\n", (unsigned int) getpid());
- if (write(fd, buf, strlen(buf)) < 0)
- {
- DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno)));
- exit(1);
- }
- /* Leave pid file open & locked for the duration... */
- }
-
-
- DEBUG(3,("Opening sockets %d\n", port));
-
- if (!open_sockets(is_daemon,port)) return 1;
-
- load_interfaces();
- add_my_subnets(myworkgroup);
-
- add_my_names();
-
- DEBUG(3,("Checked names\n"));
-
- load_netbios_names();
-
- DEBUG(3,("Loaded names\n"));
-
- if (*host_file) {
- load_hosts_file(host_file);
- DEBUG(3,("Loaded hosts file\n"));
- }
-
- write_browse_list(time(NULL));
-
- DEBUG(3,("Dumped names\n"));
-
- /* We can only take sigterm signals in the select. */
- BlockSignals(True,SIGTERM);
- process();
- close_sockets();
-
- if (dbf)
- fclose(dbf);
- return(0);
-}
diff --git a/source/nmbsync.c b/source/nmbsync.c
deleted file mode 100644
index de2f7aa00f1..00000000000
--- a/source/nmbsync.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT netbios routines to synchronise browse lists
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/* We *must have REPLACE_GETPASS defined here before the includes. */
-#define REPLACE_GETPASS
-#include "includes.h"
-
-extern int ClientNMB;
-extern int ClientDGRAM;
-
-extern int DEBUGLEVEL;
-
-extern pstring myname;
-
-extern int name_type;
-extern int max_protocol;
-extern struct in_addr dest_ip;
-extern int pid;
-extern int gid;
-extern int uid;
-extern int mid;
-extern BOOL got_pass;
-extern BOOL have_ip;
-extern pstring workgroup;
-extern pstring service;
-extern pstring desthost;
-extern BOOL connect_as_ipc;
-
-/****************************************************************************
-fudge for getpass function
-****************************************************************************/
-char *getsmbpass(char *pass)
-{
- return "dummy"; /* return anything: it should be ignored anyway */
-}
-
-/****************************************************************************
-adds information retrieved from a NetServerEnum call
-****************************************************************************/
-static BOOL add_info(struct subnet_record *d, struct work_record *work, int servertype)
-{
- char *rparam = NULL;
- char *rdata = NULL;
- int rdrcnt,rprcnt;
- char *p;
- pstring param;
- int uLevel = 1;
- int count = -1;
-
- /* now send a SMBtrans command with api ServerEnum? */
- p = param;
- SSVAL(p,0,0x68); /* api number */
- p += 2;
- strcpy(p,"WrLehDz");
- p = skip_string(p,1);
-
- strcpy(p,"B16BBDz");
-
- p = skip_string(p,1);
- SSVAL(p,0,uLevel);
- SSVAL(p,2,BUFFER_SIZE - SAFETY_MARGIN); /* buf length */
- p += 4;
- SIVAL(p,0,servertype);
- p += 4;
-
- pstrcpy(p, work->work_group);
- p = skip_string(p,1);
-
- if (cli_call_api(PTR_DIFF(p,param),0, 8,BUFFER_SIZE - SAFETY_MARGIN,
- &rprcnt,&rdrcnt, param,NULL,
- &rparam,&rdata))
- {
- int res = SVAL(rparam,0);
- int converter=SVAL(rparam,2);
- int i;
-
- if (res == 0)
- {
- count=SVAL(rparam,4);
- p = rdata;
-
- for (i = 0;i < count;i++, p += 26)
- {
- char *sname = p;
- uint32 stype = IVAL(p,18) & ~SV_TYPE_LOCAL_LIST_ONLY;
- int comment_offset = IVAL(p,22) & 0xFFFF;
- char *cmnt = comment_offset?(rdata+comment_offset-converter):"";
-
- struct work_record *w = work;
-
- DEBUG(4, ("\t%-16.16s %08x %s\n", sname, stype, cmnt));
-
- if (stype & SV_TYPE_DOMAIN_ENUM)
- {
- /* creates workgroup on remote subnet */
- if ((w = find_workgroupstruct(d,sname,True)))
- {
- announce_request(w, d->bcast_ip);
- }
- }
-
- if (w)
- add_server_entry(d,w,sname,stype,lp_max_ttl(),cmnt,False);
- }
- }
- }
-
- if (rparam) free(rparam);
- if (rdata) free(rdata);
-
- return(True);
-}
-
-
-/*******************************************************************
- synchronise browse lists with another browse server.
-
- log in on the remote server's SMB port to their IPC$ service,
- do a NetServerEnum and update our server and workgroup databases.
- ******************************************************************/
-void sync_browse_lists(struct subnet_record *d, struct work_record *work,
- char *name, int nm_type, struct in_addr ip, BOOL local)
-{
- uint32 local_type = local ? SV_TYPE_LOCAL_LIST_ONLY : 0;
-
- if (!d || !work ) return;
-
- if(d != wins_subnet) {
- DEBUG(0,
- ("sync_browse_lists: ERROR sync requested on non-WINS subnet.\n"));
- return;
- }
-
- pid = getpid();
- uid = getuid();
- gid = getgid();
- mid = pid + 100;
- name_type = nm_type;
-
- got_pass = True;
-
- DEBUG(0,("sync_browse_lists: Sync browse lists with %s for %s %s\n",
- name, work->work_group, inet_ntoa(ip)));
-
- strcpy(workgroup,work->work_group);
- fstrcpy(desthost,name);
- dest_ip = ip;
-
- if (zero_ip(dest_ip)) return;
- have_ip = True;
-
- connect_as_ipc = True;
-
- /* connect as server and get domains, then servers */
-
- sprintf(service,"\\\\%s\\IPC$", name);
- strupper(service);
-
- if (cli_open_sockets(SMB_PORT))
- {
- if (cli_send_login(NULL,NULL,True,True))
- {
- add_info(d, work, local_type|SV_TYPE_DOMAIN_ENUM);
- if(local)
- add_info(d, work, SV_TYPE_LOCAL_LIST_ONLY);
- else
- add_info(d, work, SV_TYPE_ALL);
- }
-
- close_sockets();
- }
-}
diff --git a/source/param/loadparm.c b/source/param/loadparm.c
deleted file mode 100644
index edc2d2b65f6..00000000000
--- a/source/param/loadparm.c
+++ /dev/null
@@ -1,2361 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Parameter loading functions
- Copyright (C) Karl Auer 1993,1997
-
- Largely re-written by Andrew Tridgell, September 1994
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- * Load parameters.
- *
- * This module provides suitable callback functions for the params
- * module. It builds the internal table of service details which is
- * then used by the rest of the server.
- *
- * To add a parameter:
- *
- * 1) add it to the global or service structure definition
- * 2) add it to the parm_table
- * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
- * 4) If it's a global then initialise it in init_globals. If a local
- * (ie. service) parameter then initialise it in the sDefault structure
- *
- *
- * Notes:
- * The configuration file is processed sequentially for speed. It is NOT
- * accessed randomly as happens in 'real' Windows. For this reason, there
- * is a fair bit of sequence-dependent code here - ie., code which assumes
- * that certain things happen before others. In particular, the code which
- * happens at the boundary between sections is delicately poised, so be
- * careful!
- *
- */
-
-#include "includes.h"
-
-/* Set default coding system for KANJI if none specified in Makefile. */
-#ifndef KANJI
-#define KANJI "sjis"
-#endif /* KANJI */
-
-BOOL bLoaded = False;
-
-extern int DEBUGLEVEL;
-extern pstring user_socket_options;
-extern pstring myname;
-
-#ifndef GLOBAL_NAME
-#define GLOBAL_NAME "global"
-#endif
-
-#ifndef PRINTCAP_NAME
-#ifdef AIX
-#define PRINTCAP_NAME "/etc/qconfig"
-#else
-#define PRINTCAP_NAME "/etc/printcap"
-#endif
-#endif
-
-#ifndef PRINTERS_NAME
-#define PRINTERS_NAME "printers"
-#endif
-
-#ifndef HOMES_NAME
-#define HOMES_NAME "homes"
-#endif
-
-/* some helpful bits */
-#define pSERVICE(i) ServicePtrs[i]
-#define iSERVICE(i) (*pSERVICE(i))
-#define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
-#define VALID(i) iSERVICE(i).valid
-
-/* these are the types of parameter we have */
-typedef enum
-{
- P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
- P_STRING,P_USTRING,P_GSTRING,P_UGSTRING
-} parm_type;
-
-typedef enum
-{
- P_LOCAL,P_GLOBAL,P_NONE
-} parm_class;
-
-int keepalive=0;
-extern BOOL use_getwd_cache;
-
-extern int extra_time_offset;
-extern int coding_system;
-
-/*
- * This structure describes global (ie., server-wide) parameters.
- */
-typedef struct
-{
- char *szPrintcapname;
- char *szLockDir;
- char *szRootdir;
- char *szDefaultService;
- char *szDfree;
- char *szMsgCommand;
- char *szHostsEquiv;
- char *szServerString;
- char *szAutoServices;
- char *szPasswdProgram;
- char *szPasswdChat;
- char *szLogFile;
- char *szConfigFile;
- char *szSMBPasswdFile;
- char *szPasswordServer;
- char *szSocketOptions;
- char *szValidChars;
- char *szWorkGroup;
- char *szDomainController;
- char *szUsernameMap;
- char *szCharacterSet;
- char *szLogonScript;
- char *szLogonPath;
- char *szSmbrun;
- char *szWINSserver;
- char *szInterfaces;
- char *szRemoteAnnounce;
- char *szSocketAddress;
- char *szNISHomeMapName;
- char *szAnnounceVersion; /* This is initialised in init_globals */
- char *szNetbiosAliases;
- char *szDomainSID;
- int max_log_size;
- int mangled_stack;
- int max_xmit;
- int max_mux;
- int max_packet;
- int pwordlevel;
- int unamelevel;
- int deadtime;
- int maxprotocol;
- int security;
- int printing;
- int maxdisksize;
- int lpqcachetime;
- int syslog;
- int os_level;
- int max_ttl;
- int ReadSize;
- int shmem_size;
- int shmem_hash_size;
- int client_code_page;
- int announce_as; /* This is initialised in init_globals */
- BOOL bDNSproxy;
- BOOL bWINSsupport;
- BOOL bWINSproxy;
- BOOL bLocalMaster;
- BOOL bPreferredMaster;
- BOOL bDomainMaster;
- BOOL bDomainLogons;
- BOOL bEncryptPasswords;
- BOOL bStripDot;
- BOOL bNullPasswords;
- BOOL bLoadPrinters;
- BOOL bUseRhosts;
- BOOL bReadRaw;
- BOOL bWriteRaw;
- BOOL bReadPrediction;
- BOOL bReadbmpx;
- BOOL bSyslogOnly;
- BOOL bBrowseList;
- BOOL bUnixRealname;
- BOOL bNISHomeMap;
- BOOL bTimeServer;
-} global;
-
-static global Globals;
-
-
-
-/*
- * This structure describes a single service.
- */
-typedef struct
-{
- BOOL valid;
- char *szService;
- char *szPath;
- char *szUsername;
- char *szGuestaccount;
- char *szInvalidUsers;
- char *szValidUsers;
- char *szAdminUsers;
- char *szCopy;
- char *szInclude;
- char *szPreExec;
- char *szPostExec;
- char *szRootPreExec;
- char *szRootPostExec;
- char *szPrintcommand;
- char *szLpqcommand;
- char *szLprmcommand;
- char *szLppausecommand;
- char *szLpresumecommand;
- char *szPrintername;
- char *szPrinterDriver;
- char *szDontdescend;
- char *szHostsallow;
- char *szHostsdeny;
- char *szMagicScript;
- char *szMagicOutput;
- char *szMangledMap;
- char *szVetoFiles;
- char *szHideFiles;
- char *comment;
- char *force_user;
- char *force_group;
- char *readlist;
- char *writelist;
- char *volume;
- int iMinPrintSpace;
- int iCreate_mask;
- int iCreate_force_mode;
- int iDir_mask;
- int iDir_force_mode;
- int iMaxConnections;
- int iDefaultCase;
- BOOL bAlternatePerm;
- BOOL bRevalidate;
- BOOL bCaseSensitive;
- BOOL bCasePreserve;
- BOOL bShortCasePreserve;
- BOOL bCaseMangle;
- BOOL status;
- BOOL bHideDotFiles;
- BOOL bBrowseable;
- BOOL bAvailable;
- BOOL bRead_only;
- BOOL bNo_set_dir;
- BOOL bGuest_only;
- BOOL bGuest_ok;
- BOOL bPrint_ok;
- BOOL bPostscript;
- BOOL bMap_system;
- BOOL bMap_hidden;
- BOOL bMap_archive;
- BOOL bLocking;
- BOOL bStrictLocking;
- BOOL bShareModes;
- BOOL bOpLocks;
- BOOL bOnlyUser;
- BOOL bMangledNames;
- BOOL bWidelinks;
- BOOL bSymlinks;
- BOOL bSyncAlways;
- char magic_char;
- BOOL *copymap;
- BOOL bDeleteReadonly;
- BOOL bFakeOplocks;
- BOOL bDeleteVetoFiles;
- char dummy[3]; /* for alignment */
-} service;
-
-
-/* This is a default service used to prime a services structure */
-static service sDefault =
-{
- True, /* valid */
- NULL, /* szService */
- NULL, /* szPath */
- NULL, /* szUsername */
- NULL, /* szGuestAccount - this is set in init_globals() */
- NULL, /* szInvalidUsers */
- NULL, /* szValidUsers */
- NULL, /* szAdminUsers */
- NULL, /* szCopy */
- NULL, /* szInclude */
- NULL, /* szPreExec */
- NULL, /* szPostExec */
- NULL, /* szRootPreExec */
- NULL, /* szRootPostExec */
- NULL, /* szPrintcommand */
- NULL, /* szLpqcommand */
- NULL, /* szLprmcommand */
- NULL, /* szLppausecommand */
- NULL, /* szLpresumecommand */
- NULL, /* szPrintername */
- NULL, /* szPrinterDriver - this is set in init_globals() */
- NULL, /* szDontdescend */
- NULL, /* szHostsallow */
- NULL, /* szHostsdeny */
- NULL, /* szMagicScript */
- NULL, /* szMagicOutput */
- NULL, /* szMangledMap */
- NULL, /* szVetoFiles */
- NULL, /* szHideFiles */
- NULL, /* comment */
- NULL, /* force user */
- NULL, /* force group */
- NULL, /* readlist */
- NULL, /* writelist */
- NULL, /* volume */
- 0, /* iMinPrintSpace */
- 0744, /* iCreate_mask */
- 0000, /* iCreate_force_mode */
- 0755, /* iDir_mask */
- 0000, /* iDir_force_mode */
- 0, /* iMaxConnections */
- CASE_LOWER, /* iDefaultCase */
- False, /* bAlternatePerm */
- False, /* revalidate */
- False, /* case sensitive */
- False, /* case preserve */
- False, /* short case preserve */
- False, /* case mangle */
- True, /* status */
- True, /* bHideDotFiles */
- True, /* bBrowseable */
- True, /* bAvailable */
- True, /* bRead_only */
- True, /* bNo_set_dir */
- False, /* bGuest_only */
- False, /* bGuest_ok */
- False, /* bPrint_ok */
- False, /* bPostscript */
- False, /* bMap_system */
- False, /* bMap_hidden */
- True, /* bMap_archive */
- True, /* bLocking */
- False, /* bStrictLocking */
- True, /* bShareModes */
- True, /* bOpLocks */
- False, /* bOnlyUser */
- True, /* bMangledNames */
- True, /* bWidelinks */
- True, /* bSymlinks */
- False, /* bSyncAlways */
- '~', /* magic char */
- NULL, /* copymap */
- False, /* bDeleteReadonly */
- False, /* bFakeOplocks */
- False, /* bDeleteVetoFiles */
- "" /* dummy */
-};
-
-
-
-/* local variables */
-static service **ServicePtrs = NULL;
-static int iNumServices = 0;
-static int iServiceIndex = 0;
-static BOOL bInGlobalSection = True;
-static BOOL bGlobalOnly = False;
-static int default_server_announce;
-
-#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
-
-/* prototypes for the special type handlers */
-static BOOL handle_valid_chars(char *pszParmValue, char **ptr);
-static BOOL handle_include(char *pszParmValue, char **ptr);
-static BOOL handle_copy(char *pszParmValue, char **ptr);
-static BOOL handle_protocol(char *pszParmValue,int *val);
-static BOOL handle_security(char *pszParmValue,int *val);
-static BOOL handle_case(char *pszParmValue,int *val);
-static BOOL handle_printing(char *pszParmValue,int *val);
-static BOOL handle_character_set(char *pszParmValue,int *val);
-static BOOL handle_announce_as(char *pszParmValue, int *val);
-static BOOL handle_coding_system(char *pszParmValue,int *val);
-
-static void set_default_server_announce_type(void);
-
-struct parm_struct
-{
- char *label;
- parm_type type;
- parm_class class;
- void *ptr;
- BOOL (*special)();
-} parm_table[] =
-{
- {"debuglevel", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL},
- {"log level", P_INTEGER, P_GLOBAL, &DEBUGLEVEL, NULL},
- {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL},
- {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL},
- {"protocol", P_INTEGER, P_GLOBAL, &Globals.maxprotocol,handle_protocol},
- {"security", P_INTEGER, P_GLOBAL, &Globals.security,handle_security},
- {"printing", P_INTEGER, P_GLOBAL, &Globals.printing,handle_printing},
- {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL},
- {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL},
- {"announce as", P_INTEGER, P_GLOBAL, &Globals.announce_as, handle_announce_as},
- {"encrypt passwords",P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL},
- {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL},
- {"read prediction", P_BOOL, P_GLOBAL, &Globals.bReadPrediction, NULL},
- {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL},
- {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL},
- {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL},
- {"use rhosts", P_BOOL, P_GLOBAL, &Globals.bUseRhosts, NULL},
- {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL},
- {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL},
- {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL},
- {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL},
- {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL},
- {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL},
- {"netbios name", P_UGSTRING,P_GLOBAL, myname, NULL},
- {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL},
- {"smbrun", P_STRING, P_GLOBAL, &Globals.szSmbrun, NULL},
- {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL},
- {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL},
- {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL},
- {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL},
- {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL},
- {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL},
- {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL},
- {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL},
- {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL},
- {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL},
- {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL},
- {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL},
- {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL},
- {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL},
- {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL},
- {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL},
- {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL},
- {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL},
- {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL},
- {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL},
- {"valid chars", P_STRING, P_GLOBAL, &Globals.szValidChars, handle_valid_chars},
- {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL},
- {"domain sid", P_USTRING, P_GLOBAL, &Globals.szDomainSID, NULL},
- {"domain controller",P_STRING, P_GLOBAL, &Globals.szDomainController,NULL},
- {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL},
- {"character set", P_STRING, P_GLOBAL, &Globals.szCharacterSet, handle_character_set},
- {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL},
- {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL},
- {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL},
- {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL},
- {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL},
- {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL},
- {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL},
- {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL},
- {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL},
- {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL},
- {"max packet", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL},
- {"packet size", P_INTEGER, P_GLOBAL, &Globals.max_packet, NULL},
- {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL},
- {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL},
- {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL},
- {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL},
- {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL},
- {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL},
- {"shared mem size", P_INTEGER, P_GLOBAL, &Globals.shmem_size, NULL},
- {"shared file entries", P_INTEGER, P_GLOBAL, &Globals.shmem_hash_size, NULL},
- {"coding system", P_INTEGER, P_GLOBAL, &coding_system, handle_coding_system},
- {"client code page", P_INTEGER, P_GLOBAL, &Globals.client_code_page, NULL},
- {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL},
- {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL},
- {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL},
- {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL},
- {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL},
- {"wins server", P_STRING, P_GLOBAL, &Globals.szWINSserver, NULL},
- {"preferred master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL},
- {"prefered master", P_BOOL, P_GLOBAL, &Globals.bPreferredMaster, NULL},
- {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL},
- {"domain master", P_BOOL, P_GLOBAL, &Globals.bDomainMaster, NULL},
- {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL},
- {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL},
- {"unix realname", P_BOOL, P_GLOBAL, &Globals.bUnixRealname, NULL},
- {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL},
- {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL},
- {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL},
- {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL},
- {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy},
- {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include},
- {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL},
- {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL},
- {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL},
- {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL},
- {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL},
- {"alternate permissions",P_BOOL,P_LOCAL, &sDefault.bAlternatePerm, NULL},
- {"revalidate", P_BOOL, P_LOCAL, &sDefault.bRevalidate, NULL},
- {"default case", P_INTEGER, P_LOCAL, &sDefault.iDefaultCase, handle_case},
- {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL},
- {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL},
- {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL},
- {"short preserve case",P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve,NULL},
- {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL},
- {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL},
- {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL},
- {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL},
- {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL},
- {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL},
- {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL},
- {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL},
- {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL},
- {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL},
- {"guest account", P_STRING, P_LOCAL, &sDefault.szGuestaccount, NULL},
- {"invalid users", P_STRING, P_LOCAL, &sDefault.szInvalidUsers, NULL},
- {"valid users", P_STRING, P_LOCAL, &sDefault.szValidUsers, NULL},
- {"admin users", P_STRING, P_LOCAL, &sDefault.szAdminUsers, NULL},
- {"read list", P_STRING, P_LOCAL, &sDefault.readlist, NULL},
- {"write list", P_STRING, P_LOCAL, &sDefault.writelist, NULL},
- {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL},
- {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL},
- {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL},
- {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL},
- {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL},
- {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL},
- {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL},
- {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL},
- {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL},
- {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL},
- {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL},
- {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL},
- {"force create mode",P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL},
- {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL},
- {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL},
- {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL},
- {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL},
- {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL},
- {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL},
- {"delete veto files",P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL},
- {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL},
- {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL},
- {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL},
- {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL},
- {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL},
- {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL},
- {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL},
- {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL},
- {"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL},
- {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL},
- {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL},
- {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL},
- {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL},
- {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL},
- {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL},
- {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL},
- {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL},
- {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL},
- {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL},
- {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL},
- {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL},
- {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL},
- {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL},
- {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL},
- {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL},
- {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL},
- {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand,NULL},
- {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL},
- {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL},
- {"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL},
- {"hosts allow", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL},
- {"allow hosts", P_STRING, P_LOCAL, &sDefault.szHostsallow, NULL},
- {"hosts deny", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL},
- {"deny hosts", P_STRING, P_LOCAL, &sDefault.szHostsdeny, NULL},
- {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL},
- {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL},
- {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL},
- {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL},
- {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL},
-
- {NULL, P_BOOL, P_NONE, NULL, NULL}
-};
-
-
-
-/***************************************************************************
-Initialise the global parameter structure.
-***************************************************************************/
-static void init_globals(void)
-{
- static BOOL done_init = False;
- pstring s;
-
- if (!done_init)
- {
- int i;
- bzero((void *)&Globals,sizeof(Globals));
-
- for (i = 0; parm_table[i].label; i++)
- if ((parm_table[i].type == P_STRING ||
- parm_table[i].type == P_USTRING) &&
- parm_table[i].ptr)
- string_init(parm_table[i].ptr,"");
-
- string_set(&sDefault.szGuestaccount, GUEST_ACCOUNT);
- string_set(&sDefault.szPrinterDriver, "NULL");
-
- done_init = True;
- }
-
-
- DEBUG(3,("Initialising global parameters\n"));
-
-#ifdef SMB_PASSWD_FILE
- string_set(&Globals.szSMBPasswdFile, SMB_PASSWD_FILE);
-#endif
- string_set(&Globals.szPasswdChat,"*old*password* %o\\n *new*password* %n\\n *new*password* %n\\n *changed*");
- string_set(&Globals.szWorkGroup, WORKGROUP);
- string_set(&Globals.szPasswdProgram, SMB_PASSWD);
- string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
- string_set(&Globals.szLockDir, LOCKDIR);
- string_set(&Globals.szRootdir, "/");
- string_set(&Globals.szSmbrun, SMBRUN);
- string_set(&Globals.szSocketAddress, "0.0.0.0");
- sprintf(s,"Samba %s",VERSION);
- string_set(&Globals.szServerString,s);
- sprintf(s,"%d.%d", DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
- string_set(&Globals.szAnnounceVersion,s);
- Globals.bLoadPrinters = True;
- Globals.bUseRhosts = False;
- Globals.max_packet = 65535;
- Globals.mangled_stack = 50;
- Globals.max_xmit = 65535;
- Globals.max_mux = 50; /* This is *needed* for profile support. */
- Globals.lpqcachetime = 10;
- Globals.pwordlevel = 0;
- Globals.unamelevel = 0;
- Globals.deadtime = 0;
- Globals.max_log_size = 5000;
- Globals.maxprotocol = PROTOCOL_NT1;
- Globals.security = SEC_SHARE;
- Globals.bEncryptPasswords = False;
- Globals.printing = DEFAULT_PRINTING;
- Globals.bReadRaw = True;
- Globals.bWriteRaw = True;
- Globals.bReadPrediction = False;
- Globals.bReadbmpx = True;
- Globals.bNullPasswords = False;
- Globals.bStripDot = False;
- Globals.syslog = 1;
- Globals.bSyslogOnly = False;
- Globals.os_level = 0;
- Globals.max_ttl = 60*60*4; /* 2 hours default */
- Globals.ReadSize = 16*1024;
- Globals.shmem_size = SHMEM_SIZE;
- Globals.shmem_hash_size = SHMEM_HASH_SIZE;
- Globals.announce_as = ANNOUNCE_AS_NT;
- Globals.bUnixRealname = False;
-#if (defined(NETGROUP) && defined(AUTOMOUNT))
- Globals.bNISHomeMap = False;
- string_set(&Globals.szNISHomeMapName, "auto.home");
-#endif
- coding_system = interpret_coding_system (KANJI, SJIS_CODE);
- Globals.client_code_page = DEFAULT_CLIENT_CODE_PAGE;
- Globals.bTimeServer = False;
-
-/* these parameters are set to defaults that are more appropriate
- for the increasing samba install base:
-
- as a member of the workgroup, that will possibly become a
- _local_ master browser (lm = True). this is opposed to a forced
- local master browser startup (pm = True).
-
- doesn't provide WINS server service by default (wsupp = False),
- and doesn't provide domain master browser services by default, either.
-
-*/
-
- Globals.bPreferredMaster = False;
- Globals.bLocalMaster = True;
- Globals.bDomainMaster = False;
- Globals.bDomainLogons = False;
- Globals.bBrowseList = True;
- Globals.bWINSsupport = False;
- Globals.bWINSproxy = False;
-
-/* this parameter is currently set to the default functionality
- in samba. given that w95 and NT is starting to use DNS for
- server resolution, i expect that at some point it would be
- sensible to default this to False.
-
- this parameter is added because nmbd is a single process, and
- gethostbyname is a blocking call, which can take out nmbd for
- several seconds while a dns lookup is performed.
-
- */
-
- Globals.bDNSproxy = True;
-}
-
-/***************************************************************************
-check if a string is initialised and if not then initialise it
-***************************************************************************/
-static void string_initial(char **s,char *v)
-{
- if (!*s || !**s)
- string_init(s,v);
-}
-
-
-/***************************************************************************
-Initialise the sDefault parameter structure.
-***************************************************************************/
-static void init_locals(void)
-{
- /* choose defaults depending on the type of printing */
- switch (Globals.printing)
- {
- case PRINT_BSD:
- case PRINT_AIX:
- case PRINT_LPRNG:
- case PRINT_PLP:
- string_initial(&sDefault.szLpqcommand,"lpq -P%p");
- string_initial(&sDefault.szLprmcommand,"lprm -P%p %j");
- string_initial(&sDefault.szPrintcommand,"lpr -r -P%p %s");
- break;
-
- case PRINT_SYSV:
- case PRINT_HPUX:
- string_initial(&sDefault.szLpqcommand,"lpstat -o%p");
- string_initial(&sDefault.szLprmcommand,"cancel %p-%j");
- string_initial(&sDefault.szPrintcommand,"lp -c -d%p %s; rm %s");
-#ifdef SVR4
- string_initial(&sDefault.szLppausecommand,"lp -i %p-%j -H hold");
- string_initial(&sDefault.szLpresumecommand,"lp -i %p-%j -H resume");
-#endif
- break;
-
- case PRINT_QNX:
- string_initial(&sDefault.szLpqcommand,"lpq -P%p");
- string_initial(&sDefault.szLprmcommand,"lprm -P%p %j");
- string_initial(&sDefault.szPrintcommand,"lp -r -P%p %s");
- break;
-
-
- }
-}
-
-
-/******************************************************************* a
-convenience routine to grab string parameters into a rotating buffer,
-and run standard_sub_basic on them. The buffers can be written to by
-callers without affecting the source string.
-********************************************************************/
-char *lp_string(char *s)
-{
- static char *bufs[10];
- static int buflen[10];
- static int next = -1;
- char *ret;
- int i;
- int len = s?strlen(s):0;
-
- if (next == -1) {
- /* initialisation */
- for (i=0;i<10;i++) {
- bufs[i] = NULL;
- buflen[i] = 0;
- }
- next = 0;
- }
-
- len = MAX(len+100,sizeof(pstring)); /* the +100 is for some
- substitution room */
-
- if (buflen[next] != len) {
- buflen[next] = len;
- if (bufs[next]) free(bufs[next]);
- bufs[next] = (char *)malloc(len);
- if (!bufs[next]) {
- DEBUG(0,("out of memory in lp_string()"));
- exit(1);
- }
- }
-
- ret = &bufs[next][0];
- next = (next+1)%10;
-
- if (!s)
- *ret = 0;
- else
- StrCpy(ret,s);
-
- standard_sub_basic(ret);
- return(ret);
-}
-
-
-/*
- In this section all the functions that are used to access the
- parameters from the rest of the program are defined
-*/
-
-#define FN_GLOBAL_STRING(fn_name,ptr) \
- char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
-#define FN_GLOBAL_BOOL(fn_name,ptr) \
- BOOL fn_name(void) {return(*(BOOL *)(ptr));}
-#define FN_GLOBAL_CHAR(fn_name,ptr) \
- char fn_name(void) {return(*(char *)(ptr));}
-#define FN_GLOBAL_INTEGER(fn_name,ptr) \
- int fn_name(void) {return(*(int *)(ptr));}
-
-#define FN_LOCAL_STRING(fn_name,val) \
- char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
-#define FN_LOCAL_BOOL(fn_name,val) \
- BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
-#define FN_LOCAL_CHAR(fn_name,val) \
- char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
-#define FN_LOCAL_INTEGER(fn_name,val) \
- int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
-
-FN_GLOBAL_STRING(lp_logfile,&Globals.szLogFile)
-FN_GLOBAL_STRING(lp_smbrun,&Globals.szSmbrun)
-FN_GLOBAL_STRING(lp_configfile,&Globals.szConfigFile)
-FN_GLOBAL_STRING(lp_smb_passwd_file,&Globals.szSMBPasswdFile)
-FN_GLOBAL_STRING(lp_serverstring,&Globals.szServerString)
-FN_GLOBAL_STRING(lp_printcapname,&Globals.szPrintcapname)
-FN_GLOBAL_STRING(lp_lockdir,&Globals.szLockDir)
-FN_GLOBAL_STRING(lp_rootdir,&Globals.szRootdir)
-FN_GLOBAL_STRING(lp_defaultservice,&Globals.szDefaultService)
-FN_GLOBAL_STRING(lp_msg_command,&Globals.szMsgCommand)
-FN_GLOBAL_STRING(lp_dfree_command,&Globals.szDfree)
-FN_GLOBAL_STRING(lp_hosts_equiv,&Globals.szHostsEquiv)
-FN_GLOBAL_STRING(lp_auto_services,&Globals.szAutoServices)
-FN_GLOBAL_STRING(lp_passwd_program,&Globals.szPasswdProgram)
-FN_GLOBAL_STRING(lp_passwd_chat,&Globals.szPasswdChat)
-FN_GLOBAL_STRING(lp_passwordserver,&Globals.szPasswordServer)
-FN_GLOBAL_STRING(lp_workgroup,&Globals.szWorkGroup)
-FN_GLOBAL_STRING(lp_domain_controller,&Globals.szDomainController)
-FN_GLOBAL_STRING(lp_username_map,&Globals.szUsernameMap)
-FN_GLOBAL_STRING(lp_character_set,&Globals.szCharacterSet)
-FN_GLOBAL_STRING(lp_logon_script,&Globals.szLogonScript)
-FN_GLOBAL_STRING(lp_logon_path,&Globals.szLogonPath)
-FN_GLOBAL_STRING(lp_remote_announce,&Globals.szRemoteAnnounce)
-FN_GLOBAL_STRING(lp_wins_server,&Globals.szWINSserver)
-FN_GLOBAL_STRING(lp_interfaces,&Globals.szInterfaces)
-FN_GLOBAL_STRING(lp_socket_address,&Globals.szSocketAddress)
-FN_GLOBAL_STRING(lp_nis_home_map_name,&Globals.szNISHomeMapName)
-FN_GLOBAL_STRING(lp_announce_version,&Globals.szAnnounceVersion)
-FN_GLOBAL_STRING(lp_netbios_aliases,&Globals.szNetbiosAliases)
-
-FN_GLOBAL_STRING(lp_domainsid,&Globals.szDomainSID)
-
-FN_GLOBAL_BOOL(lp_dns_proxy,&Globals.bDNSproxy)
-FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport)
-FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy)
-FN_GLOBAL_BOOL(lp_local_master,&Globals.bLocalMaster)
-FN_GLOBAL_BOOL(lp_domain_master,&Globals.bDomainMaster)
-FN_GLOBAL_BOOL(lp_domain_logons,&Globals.bDomainLogons)
-FN_GLOBAL_BOOL(lp_preferred_master,&Globals.bPreferredMaster)
-FN_GLOBAL_BOOL(lp_load_printers,&Globals.bLoadPrinters)
-FN_GLOBAL_BOOL(lp_use_rhosts,&Globals.bUseRhosts)
-FN_GLOBAL_BOOL(lp_getwdcache,&use_getwd_cache)
-FN_GLOBAL_BOOL(lp_readprediction,&Globals.bReadPrediction)
-FN_GLOBAL_BOOL(lp_readbmpx,&Globals.bReadbmpx)
-FN_GLOBAL_BOOL(lp_readraw,&Globals.bReadRaw)
-FN_GLOBAL_BOOL(lp_writeraw,&Globals.bWriteRaw)
-FN_GLOBAL_BOOL(lp_null_passwords,&Globals.bNullPasswords)
-FN_GLOBAL_BOOL(lp_strip_dot,&Globals.bStripDot)
-FN_GLOBAL_BOOL(lp_encrypted_passwords,&Globals.bEncryptPasswords)
-FN_GLOBAL_BOOL(lp_syslog_only,&Globals.bSyslogOnly)
-FN_GLOBAL_BOOL(lp_browse_list,&Globals.bBrowseList)
-FN_GLOBAL_BOOL(lp_unix_realname,&Globals.bUnixRealname)
-FN_GLOBAL_BOOL(lp_nis_home_map,&Globals.bNISHomeMap)
-FN_GLOBAL_BOOL(lp_time_server,&Globals.bTimeServer)
-
-FN_GLOBAL_INTEGER(lp_os_level,&Globals.os_level)
-FN_GLOBAL_INTEGER(lp_max_ttl,&Globals.max_ttl)
-FN_GLOBAL_INTEGER(lp_max_log_size,&Globals.max_log_size)
-FN_GLOBAL_INTEGER(lp_mangledstack,&Globals.mangled_stack)
-FN_GLOBAL_INTEGER(lp_maxxmit,&Globals.max_xmit)
-FN_GLOBAL_INTEGER(lp_maxmux,&Globals.max_mux)
-FN_GLOBAL_INTEGER(lp_maxpacket,&Globals.max_packet)
-FN_GLOBAL_INTEGER(lp_keepalive,&keepalive)
-FN_GLOBAL_INTEGER(lp_passwordlevel,&Globals.pwordlevel)
-FN_GLOBAL_INTEGER(lp_usernamelevel,&Globals.unamelevel)
-FN_GLOBAL_INTEGER(lp_readsize,&Globals.ReadSize)
-FN_GLOBAL_INTEGER(lp_shmem_size,&Globals.shmem_size)
-FN_GLOBAL_INTEGER(lp_shmem_hash_size,&Globals.shmem_hash_size)
-FN_GLOBAL_INTEGER(lp_deadtime,&Globals.deadtime)
-FN_GLOBAL_INTEGER(lp_maxprotocol,&Globals.maxprotocol)
-FN_GLOBAL_INTEGER(lp_security,&Globals.security)
-FN_GLOBAL_INTEGER(lp_printing,&Globals.printing)
-FN_GLOBAL_INTEGER(lp_maxdisksize,&Globals.maxdisksize)
-FN_GLOBAL_INTEGER(lp_lpqcachetime,&Globals.lpqcachetime)
-FN_GLOBAL_INTEGER(lp_syslog,&Globals.syslog)
-FN_GLOBAL_INTEGER(lp_client_code_page,&Globals.client_code_page)
-FN_GLOBAL_INTEGER(lp_announce_as,&Globals.announce_as)
-
-FN_LOCAL_STRING(lp_preexec,szPreExec)
-FN_LOCAL_STRING(lp_postexec,szPostExec)
-FN_LOCAL_STRING(lp_rootpreexec,szRootPreExec)
-FN_LOCAL_STRING(lp_rootpostexec,szRootPostExec)
-FN_LOCAL_STRING(lp_servicename,szService)
-FN_LOCAL_STRING(lp_pathname,szPath)
-FN_LOCAL_STRING(lp_dontdescend,szDontdescend)
-FN_LOCAL_STRING(lp_username,szUsername)
-FN_LOCAL_STRING(lp_guestaccount,szGuestaccount)
-FN_LOCAL_STRING(lp_invalid_users,szInvalidUsers)
-FN_LOCAL_STRING(lp_valid_users,szValidUsers)
-FN_LOCAL_STRING(lp_admin_users,szAdminUsers)
-FN_LOCAL_STRING(lp_printcommand,szPrintcommand)
-FN_LOCAL_STRING(lp_lpqcommand,szLpqcommand)
-FN_LOCAL_STRING(lp_lprmcommand,szLprmcommand)
-FN_LOCAL_STRING(lp_lppausecommand,szLppausecommand)
-FN_LOCAL_STRING(lp_lpresumecommand,szLpresumecommand)
-FN_LOCAL_STRING(lp_printername,szPrintername)
-FN_LOCAL_STRING(lp_printerdriver,szPrinterDriver)
-FN_LOCAL_STRING(lp_hostsallow,szHostsallow)
-FN_LOCAL_STRING(lp_hostsdeny,szHostsdeny)
-FN_LOCAL_STRING(lp_magicscript,szMagicScript)
-FN_LOCAL_STRING(lp_magicoutput,szMagicOutput)
-FN_LOCAL_STRING(lp_comment,comment)
-FN_LOCAL_STRING(lp_force_user,force_user)
-FN_LOCAL_STRING(lp_force_group,force_group)
-FN_LOCAL_STRING(lp_readlist,readlist)
-FN_LOCAL_STRING(lp_writelist,writelist)
-FN_LOCAL_STRING(lp_volume,volume)
-FN_LOCAL_STRING(lp_mangled_map,szMangledMap)
-FN_LOCAL_STRING(lp_veto_files,szVetoFiles)
-FN_LOCAL_STRING(lp_hide_files,szHideFiles)
-
-FN_LOCAL_BOOL(lp_alternate_permissions,bAlternatePerm)
-FN_LOCAL_BOOL(lp_revalidate,bRevalidate)
-FN_LOCAL_BOOL(lp_casesensitive,bCaseSensitive)
-FN_LOCAL_BOOL(lp_preservecase,bCasePreserve)
-FN_LOCAL_BOOL(lp_shortpreservecase,bShortCasePreserve)
-FN_LOCAL_BOOL(lp_casemangle,bCaseMangle)
-FN_LOCAL_BOOL(lp_status,status)
-FN_LOCAL_BOOL(lp_hide_dot_files,bHideDotFiles)
-FN_LOCAL_BOOL(lp_browseable,bBrowseable)
-FN_LOCAL_BOOL(lp_readonly,bRead_only)
-FN_LOCAL_BOOL(lp_no_set_dir,bNo_set_dir)
-FN_LOCAL_BOOL(lp_guest_ok,bGuest_ok)
-FN_LOCAL_BOOL(lp_guest_only,bGuest_only)
-FN_LOCAL_BOOL(lp_print_ok,bPrint_ok)
-FN_LOCAL_BOOL(lp_postscript,bPostscript)
-FN_LOCAL_BOOL(lp_map_hidden,bMap_hidden)
-FN_LOCAL_BOOL(lp_map_archive,bMap_archive)
-FN_LOCAL_BOOL(lp_locking,bLocking)
-FN_LOCAL_BOOL(lp_strict_locking,bStrictLocking)
-FN_LOCAL_BOOL(lp_share_modes,bShareModes)
-FN_LOCAL_BOOL(lp_oplocks,bOpLocks)
-FN_LOCAL_BOOL(lp_onlyuser,bOnlyUser)
-FN_LOCAL_BOOL(lp_manglednames,bMangledNames)
-FN_LOCAL_BOOL(lp_widelinks,bWidelinks)
-FN_LOCAL_BOOL(lp_symlinks,bSymlinks)
-FN_LOCAL_BOOL(lp_syncalways,bSyncAlways)
-FN_LOCAL_BOOL(lp_map_system,bMap_system)
-FN_LOCAL_BOOL(lp_delete_readonly,bDeleteReadonly)
-FN_LOCAL_BOOL(lp_fake_oplocks,bFakeOplocks)
-FN_LOCAL_BOOL(lp_recursive_veto_delete,bDeleteVetoFiles)
-
-FN_LOCAL_INTEGER(lp_create_mode,iCreate_mask)
-FN_LOCAL_INTEGER(lp_force_create_mode,iCreate_force_mode)
-FN_LOCAL_INTEGER(lp_dir_mode,iDir_mask)
-FN_LOCAL_INTEGER(lp_force_dir_mode,iDir_force_mode)
-FN_LOCAL_INTEGER(lp_max_connections,iMaxConnections)
-FN_LOCAL_INTEGER(lp_defaultcase,iDefaultCase)
-FN_LOCAL_INTEGER(lp_minprintspace,iMinPrintSpace)
-
-FN_LOCAL_CHAR(lp_magicchar,magic_char)
-
-
-
-/* local prototypes */
-static int strwicmp( char *psz1, char *psz2 );
-static int map_parameter( char *pszParmName);
-static BOOL set_boolean( BOOL *pb, char *pszParmValue );
-static int getservicebyname(char *pszServiceName, service *pserviceDest);
-static void copy_service( service *pserviceDest,
- service *pserviceSource,
- BOOL *pcopymapDest );
-static BOOL service_ok(int iService);
-static BOOL do_parameter(char *pszParmName, char *pszParmValue);
-static BOOL do_section(char *pszSectionName);
-static void init_copymap(service *pservice);
-
-
-/***************************************************************************
-initialise a service to the defaults
-***************************************************************************/
-static void init_service(service *pservice)
-{
- bzero((char *)pservice,sizeof(service));
- copy_service(pservice,&sDefault,NULL);
-}
-
-
-/***************************************************************************
-free the dynamically allocated parts of a service struct
-***************************************************************************/
-static void free_service(service *pservice)
-{
- int i;
- if (!pservice)
- return;
-
- for (i=0;parm_table[i].label;i++)
- if ((parm_table[i].type == P_STRING ||
- parm_table[i].type == P_STRING) &&
- parm_table[i].class == P_LOCAL)
- string_free((char **)(((char *)pservice) + PTR_DIFF(parm_table[i].ptr,&sDefault)));
-}
-
-/***************************************************************************
-add a new service to the services array initialising it with the given
-service
-***************************************************************************/
-static int add_a_service(service *pservice, char *name)
-{
- int i;
- service tservice;
- int num_to_alloc = iNumServices+1;
-
- tservice = *pservice;
-
- /* it might already exist */
- if (name)
- {
- i = getservicebyname(name,NULL);
- if (i >= 0)
- return(i);
- }
-
- /* find an invalid one */
- for (i=0;i<iNumServices;i++)
- if (!pSERVICE(i)->valid)
- break;
-
- /* if not, then create one */
- if (i == iNumServices)
- {
- ServicePtrs = (service **)Realloc(ServicePtrs,sizeof(service *)*num_to_alloc);
- if (ServicePtrs)
- pSERVICE(iNumServices) = (service *)malloc(sizeof(service));
-
- if (!ServicePtrs || !pSERVICE(iNumServices))
- return(-1);
-
- iNumServices++;
- }
- else
- free_service(pSERVICE(i));
-
- pSERVICE(i)->valid = True;
-
- init_service(pSERVICE(i));
- copy_service(pSERVICE(i),&tservice,NULL);
- if (name)
- string_set(&iSERVICE(i).szService,name);
-
- return(i);
-}
-
-/***************************************************************************
-add a new home service, with the specified home directory, defaults coming
-from service ifrom
-***************************************************************************/
-BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
-{
- int i = add_a_service(pSERVICE(iDefaultService),pszHomename);
-
- if (i < 0)
- return(False);
-
- if (!(*(iSERVICE(i).szPath)) || strequal(iSERVICE(i).szPath,lp_pathname(-1)))
- string_set(&iSERVICE(i).szPath,pszHomedir);
- if (!(*(iSERVICE(i).comment)))
- {
- pstring comment;
- sprintf(comment,"Home directory of %s",pszHomename);
- string_set(&iSERVICE(i).comment,comment);
- }
- iSERVICE(i).bAvailable = sDefault.bAvailable;
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
-
- DEBUG(3,("adding home directory %s at %s\n", pszHomename, pszHomedir));
-
- return(True);
-}
-
-/***************************************************************************
-add a new service, based on an old one
-***************************************************************************/
-int lp_add_service(char *pszService, int iDefaultService)
-{
- return(add_a_service(pSERVICE(iDefaultService),pszService));
-}
-
-
-/***************************************************************************
-add the IPC service
-***************************************************************************/
-static BOOL lp_add_ipc(void)
-{
- pstring comment;
- int i = add_a_service(&sDefault,"IPC$");
-
- if (i < 0)
- return(False);
-
- sprintf(comment,"IPC Service (%s)",lp_serverstring());
-
- string_set(&iSERVICE(i).szPath,tmpdir());
- string_set(&iSERVICE(i).szUsername,"");
- string_set(&iSERVICE(i).comment,comment);
- iSERVICE(i).status = False;
- iSERVICE(i).iMaxConnections = 0;
- iSERVICE(i).bAvailable = True;
- iSERVICE(i).bRead_only = True;
- iSERVICE(i).bGuest_only = False;
- iSERVICE(i).bGuest_ok = True;
- iSERVICE(i).bPrint_ok = False;
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
-
- DEBUG(3,("adding IPC service\n"));
-
- return(True);
-}
-
-
-/***************************************************************************
-add a new printer service, with defaults coming from service iFrom
-***************************************************************************/
-BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
-{
- char *comment = "From Printcap";
- int i = add_a_service(pSERVICE(iDefaultService),pszPrintername);
-
- if (i < 0)
- return(False);
-
- /* note that we do NOT default the availability flag to True - */
- /* we take it from the default service passed. This allows all */
- /* dynamic printers to be disabled by disabling the [printers] */
- /* entry (if/when the 'available' keyword is implemented!). */
-
- /* the printer name is set to the service name. */
- string_set(&iSERVICE(i).szPrintername,pszPrintername);
- string_set(&iSERVICE(i).comment,comment);
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
- /* Printers cannot be read_only. */
- iSERVICE(i).bRead_only = False;
- /* No share modes on printer services. */
- iSERVICE(i).bShareModes = False;
- /* No oplocks on printer services. */
- iSERVICE(i).bOpLocks = False;
- /* Printer services must be printable. */
- iSERVICE(i).bPrint_ok = True;
-
- DEBUG(3,("adding printer service %s\n",pszPrintername));
-
- return(True);
-}
-
-
-/***************************************************************************
-Do a case-insensitive, whitespace-ignoring string compare.
-***************************************************************************/
-static int strwicmp(char *psz1, char *psz2)
-{
- /* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
- /* appropriate value. */
- if (psz1 == psz2)
- return (0);
- else
- if (psz1 == NULL)
- return (-1);
- else
- if (psz2 == NULL)
- return (1);
-
- /* sync the strings on first non-whitespace */
- while (1)
- {
- while (isspace(*psz1))
- psz1++;
- while (isspace(*psz2))
- psz2++;
- if (toupper(*psz1) != toupper(*psz2) || *psz1 == '\0' || *psz2 == '\0')
- break;
- psz1++;
- psz2++;
- }
- return (*psz1 - *psz2);
-}
-
-/***************************************************************************
-Map a parameter's string representation to something we can use.
-Returns False if the parameter string is not recognised, else TRUE.
-***************************************************************************/
-static int map_parameter(char *pszParmName)
-{
- int iIndex;
-
- if (*pszParmName == '-')
- return(-1);
-
- for (iIndex = 0; parm_table[iIndex].label; iIndex++)
- if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
- return(iIndex);
-
- DEBUG(0,( "Unknown parameter encountered: \"%s\"\n", pszParmName));
- return(-1);
-}
-
-
-/***************************************************************************
-Set a boolean variable from the text value stored in the passed string.
-Returns True in success, False if the passed string does not correctly
-represent a boolean.
-***************************************************************************/
-static BOOL set_boolean(BOOL *pb, char *pszParmValue)
-{
- BOOL bRetval;
-
- bRetval = True;
- if (strwicmp(pszParmValue, "yes") == 0 ||
- strwicmp(pszParmValue, "true") == 0 ||
- strwicmp(pszParmValue, "1") == 0)
- *pb = True;
- else
- if (strwicmp(pszParmValue, "no") == 0 ||
- strwicmp(pszParmValue, "False") == 0 ||
- strwicmp(pszParmValue, "0") == 0)
- *pb = False;
- else
- {
- DEBUG(0,( "Badly formed boolean in configuration file: \"%s\".\n",
- pszParmValue));
- bRetval = False;
- }
- return (bRetval);
-}
-
-/***************************************************************************
-Find a service by name. Otherwise works like get_service.
-***************************************************************************/
-static int getservicebyname(char *pszServiceName, service *pserviceDest)
-{
- int iService;
-
- for (iService = iNumServices - 1; iService >= 0; iService--)
- if (VALID(iService) &&
- strwicmp(iSERVICE(iService).szService, pszServiceName) == 0)
- {
- if (pserviceDest != NULL)
- copy_service(pserviceDest, pSERVICE(iService), NULL);
- break;
- }
-
- return (iService);
-}
-
-
-
-/***************************************************************************
-Copy a service structure to another
-
-If pcopymapDest is NULL then copy all fields
-***************************************************************************/
-static void copy_service(service *pserviceDest,
- service *pserviceSource,
- BOOL *pcopymapDest)
-{
- int i;
- BOOL bcopyall = (pcopymapDest == NULL);
-
- for (i=0;parm_table[i].label;i++)
- if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
- (bcopyall || pcopymapDest[i]))
- {
- void *def_ptr = parm_table[i].ptr;
- void *src_ptr =
- ((char *)pserviceSource) + PTR_DIFF(def_ptr,&sDefault);
- void *dest_ptr =
- ((char *)pserviceDest) + PTR_DIFF(def_ptr,&sDefault);
-
- switch (parm_table[i].type)
- {
- case P_BOOL:
- case P_BOOLREV:
- *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
- break;
-
- case P_INTEGER:
- case P_OCTAL:
- *(int *)dest_ptr = *(int *)src_ptr;
- break;
-
- case P_CHAR:
- *(char *)dest_ptr = *(char *)src_ptr;
- break;
-
- case P_STRING:
- string_set(dest_ptr,*(char **)src_ptr);
- break;
-
- case P_USTRING:
- string_set(dest_ptr,*(char **)src_ptr);
- strupper(*(char **)dest_ptr);
- break;
- default:
- break;
- }
- }
-
- if (bcopyall)
- {
- init_copymap(pserviceDest);
- if (pserviceSource->copymap)
- memcpy((void *)pserviceDest->copymap,
- (void *)pserviceSource->copymap,sizeof(BOOL)*NUMPARAMETERS);
- }
-}
-
-/***************************************************************************
-Check a service for consistency. Return False if the service is in any way
-incomplete or faulty, else True.
-***************************************************************************/
-static BOOL service_ok(int iService)
-{
- BOOL bRetval;
-
- bRetval = True;
- if (iSERVICE(iService).szService[0] == '\0')
- {
- DEBUG(0,( "The following message indicates an internal error:\n"));
- DEBUG(0,( "No service name in service entry.\n"));
- bRetval = False;
- }
-
- /* The [printers] entry MUST be printable. I'm all for flexibility, but */
- /* I can't see why you'd want a non-printable printer service... */
- if (strwicmp(iSERVICE(iService).szService,PRINTERS_NAME) == 0)
- if (!iSERVICE(iService).bPrint_ok)
- {
- DEBUG(0,( "WARNING: [%s] service MUST be printable!\n",
- iSERVICE(iService).szService));
- iSERVICE(iService).bPrint_ok = True;
- }
-
- if (iSERVICE(iService).szPath[0] == '\0' &&
- strwicmp(iSERVICE(iService).szService,HOMES_NAME) != 0)
- {
- DEBUG(0,("No path in service %s - using %s\n",iSERVICE(iService).szService,tmpdir()));
- string_set(&iSERVICE(iService).szPath,tmpdir());
- }
-
- /* If a service is flagged unavailable, log the fact at level 0. */
- if (!iSERVICE(iService).bAvailable)
- DEBUG(1,( "NOTE: Service %s is flagged unavailable.\n",
- iSERVICE(iService).szService));
-
- return (bRetval);
-}
-
-static struct file_lists {
- struct file_lists *next;
- char *name;
- time_t modtime;
-} *file_lists = NULL;
-
-/*******************************************************************
-keep a linked list of all config files so we know when one has changed
-it's date and needs to be reloaded
-********************************************************************/
-static void add_to_file_list(char *fname)
-{
- struct file_lists *f=file_lists;
-
- while (f) {
- if (f->name && !strcmp(f->name,fname)) break;
- f = f->next;
- }
-
- if (!f) {
- f = (struct file_lists *)malloc(sizeof(file_lists[0]));
- if (!f) return;
- f->next = file_lists;
- f->name = strdup(fname);
- if (!f->name) {
- free(f);
- return;
- }
- file_lists = f;
- }
-
- {
- pstring n2;
- pstrcpy(n2,fname);
- standard_sub_basic(n2);
- f->modtime = file_modtime(n2);
- }
-
-}
-
-/*******************************************************************
-check if a config file has changed date
-********************************************************************/
-BOOL lp_file_list_changed(void)
-{
- struct file_lists *f = file_lists;
- DEBUG(6,("lp_file_list_changed()\n"));
-
- while (f)
- {
- pstring n2;
- time_t mod_time;
-
- pstrcpy(n2,f->name);
- standard_sub_basic(n2);
-
- DEBUG(6,("file %s -> %s last mod_time: %s\n",
- f->name, n2, ctime(&f->modtime)));
-
- mod_time = file_modtime(n2);
-
- if (f->modtime != mod_time)
- {
- DEBUG(6,("file %s modified: %s\n", n2, ctime(&mod_time)));
- return(True);
- }
- f = f->next;
- }
- return(False);
-}
-
-/***************************************************************************
- handle the interpretation of the coding system parameter
- *************************************************************************/
-static BOOL handle_coding_system(char *pszParmValue,int *val)
-{
- *val = interpret_coding_system(pszParmValue,*val);
- return(True);
-}
-
-/***************************************************************************
-handle the interpretation of the character set system parameter
-***************************************************************************/
-static BOOL handle_character_set(char *pszParmValue,int *val)
-{
- string_set(&Globals.szCharacterSet,pszParmValue);
- *val = interpret_character_set(pszParmValue,*val);
- return(True);
-}
-
-
-/***************************************************************************
-handle the interpretation of the protocol parameter
-***************************************************************************/
-static BOOL handle_protocol(char *pszParmValue,int *val)
-{
- *val = interpret_protocol(pszParmValue,*val);
- return(True);
-}
-
-/***************************************************************************
-handle the interpretation of the security parameter
-***************************************************************************/
-static BOOL handle_security(char *pszParmValue,int *val)
-{
- *val = interpret_security(pszParmValue,*val);
- return(True);
-}
-
-/***************************************************************************
-handle the interpretation of the default case
-***************************************************************************/
-static BOOL handle_case(char *pszParmValue,int *val)
-{
- if (strnequal(pszParmValue,"LOWER", 5))
- *val = CASE_LOWER;
- else if (strnequal(pszParmValue,"UPPER", 5))
- *val = CASE_UPPER;
- return(True);
-}
-
-/***************************************************************************
-handle the interpretation of the printing system
-***************************************************************************/
-static BOOL handle_printing(char *pszParmValue,int *val)
-{
- if (strnequal(pszParmValue,"sysv", 4))
- *val = PRINT_SYSV;
- else if (strnequal(pszParmValue,"aix", 3))
- *val = PRINT_AIX;
- else if (strnequal(pszParmValue,"hpux", 4))
- *val = PRINT_HPUX;
- else if (strnequal(pszParmValue,"bsd", 3))
- *val = PRINT_BSD;
- else if (strnequal(pszParmValue,"qnx",3))
- *val = PRINT_QNX;
- else if (strnequal(pszParmValue,"plp", 3))
- *val = PRINT_PLP;
- else if (strnequal(pszParmValue,"lprng", 5))
- *val = PRINT_LPRNG;
- return(True);
-}
-
-/***************************************************************************
-handle the announce as parameter
-***************************************************************************/
-static BOOL handle_announce_as(char *pszParmValue,int *val)
-{
- if (strnequal(pszParmValue,"NT", 2))
- *val = ANNOUNCE_AS_NT;
- else if (strnequal(pszParmValue,"win95", 5))
- *val = ANNOUNCE_AS_WIN95;
- else if (strnequal(pszParmValue,"WfW", 3))
- *val = ANNOUNCE_AS_WFW;
- return True;
-}
-
-/***************************************************************************
-handle the valid chars lines
-***************************************************************************/
-static BOOL handle_valid_chars(char *pszParmValue,char **ptr)
-{
- string_set(ptr,pszParmValue);
-
- /* A dependency here is that the parameter client code page must be
- set before this is called - as calling codepage_initialise()
- would overwrite the valid char lines.
- */
- codepage_initialise(lp_client_code_page());
-
- add_char_string(pszParmValue);
- return(True);
-}
-
-
-/***************************************************************************
-handle the include operation
-***************************************************************************/
-static BOOL handle_include(char *pszParmValue,char **ptr)
-{
- pstring fname;
- pstrcpy(fname,pszParmValue);
-
- add_to_file_list(fname);
-
- standard_sub_basic(fname);
-
- string_set(ptr,fname);
-
- if (file_exist(fname,NULL))
- return(pm_process(fname, do_section, do_parameter));
-
- DEBUG(2,("Can't find include file %s\n",fname));
-
- return(False);
-}
-
-
-/***************************************************************************
-handle the interpretation of the copy parameter
-***************************************************************************/
-static BOOL handle_copy(char *pszParmValue,char **ptr)
-{
- BOOL bRetval;
- int iTemp;
- service serviceTemp;
-
- string_set(ptr,pszParmValue);
-
- init_service(&serviceTemp);
-
- bRetval = False;
-
- DEBUG(3,("Copying service from service %s\n",pszParmValue));
-
- if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
- {
- if (iTemp == iServiceIndex)
- {
- DEBUG(0,("Can't copy service %s - unable to copy self!\n",
- pszParmValue));
- }
- else
- {
- copy_service(pSERVICE(iServiceIndex),
- &serviceTemp,
- iSERVICE(iServiceIndex).copymap);
- bRetval = True;
- }
- }
- else
- {
- DEBUG(0,( "Unable to copy service - source not found: %s\n",
- pszParmValue));
- bRetval = False;
- }
-
- free_service(&serviceTemp);
- return (bRetval);
-}
-
-
-/***************************************************************************
-initialise a copymap
-***************************************************************************/
-static void init_copymap(service *pservice)
-{
- int i;
- if (pservice->copymap) free(pservice->copymap);
- pservice->copymap = (BOOL *)malloc(sizeof(BOOL)*NUMPARAMETERS);
- if (!pservice->copymap)
- DEBUG(0,("Couldn't allocate copymap!! (size %d)\n",NUMPARAMETERS));
-
- for (i=0;i<NUMPARAMETERS;i++)
- pservice->copymap[i] = True;
-}
-
-
-/***************************************************************************
-Process a parameter for a particular service number. If snum < 0
-then assume we are in the globals
-***************************************************************************/
-BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
-{
- int parmnum;
- void *parm_ptr=NULL; /* where we are going to store the result */
- void *def_ptr=NULL;
-
- parmnum = map_parameter(pszParmName);
-
- if (parmnum < 0)
- {
- DEBUG(0,( "Ignoring unknown parameter \"%s\"\n", pszParmName));
- return(True);
- }
-
- def_ptr = parm_table[parmnum].ptr;
-
- /* we might point at a service, the default service or a global */
- if (snum < 0) {
- parm_ptr = def_ptr;
- } else {
- if (parm_table[parmnum].class == P_GLOBAL) {
- DEBUG(0,( "Global parameter %s found in service section!\n",pszParmName));
- return(True);
- }
- parm_ptr = ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,&sDefault);
- }
-
- if (snum >= 0) {
- int i;
- if (!iSERVICE(snum).copymap)
- init_copymap(pSERVICE(snum));
-
- /* this handles the aliases - set the copymap for other entries with
- the same data pointer */
- for (i=0;parm_table[i].label;i++)
- if (parm_table[i].ptr == parm_table[parmnum].ptr)
- iSERVICE(snum).copymap[i] = False;
- }
-
- /* if it is a special case then go ahead */
- if (parm_table[parmnum].special) {
- parm_table[parmnum].special(pszParmValue,parm_ptr);
- return(True);
- }
-
- /* now switch on the type of variable it is */
- switch (parm_table[parmnum].type)
- {
- case P_BOOL:
- set_boolean(parm_ptr,pszParmValue);
- break;
-
- case P_BOOLREV:
- set_boolean(parm_ptr,pszParmValue);
- *(BOOL *)parm_ptr = ! *(BOOL *)parm_ptr;
- break;
-
- case P_INTEGER:
- *(int *)parm_ptr = atoi(pszParmValue);
- break;
-
- case P_CHAR:
- *(char *)parm_ptr = *pszParmValue;
- break;
-
- case P_OCTAL:
- sscanf(pszParmValue,"%o",(int *)parm_ptr);
- break;
-
- case P_STRING:
- string_set(parm_ptr,pszParmValue);
- break;
-
- case P_USTRING:
- string_set(parm_ptr,pszParmValue);
- strupper(*(char **)parm_ptr);
- break;
-
- case P_GSTRING:
- strcpy((char *)parm_ptr,pszParmValue);
- break;
-
- case P_UGSTRING:
- strcpy((char *)parm_ptr,pszParmValue);
- strupper((char *)parm_ptr);
- break;
- }
-
- return(True);
-}
-
-/***************************************************************************
-Process a parameter.
-***************************************************************************/
-static BOOL do_parameter(char *pszParmName, char *pszParmValue)
-{
- if (!bInGlobalSection && bGlobalOnly) return(True);
-
- DEBUG(3,("doing parameter %s = %s\n",pszParmName,pszParmValue));
-
- return lp_do_parameter(bInGlobalSection?-2:iServiceIndex, pszParmName, pszParmValue);
-}
-
-
-/***************************************************************************
-print a parameter of the specified type
-***************************************************************************/
-static void print_parameter(parm_type type,void *ptr, FILE *f)
-{
- switch (type)
- {
- case P_BOOL:
- fprintf(f,"%s",BOOLSTR(*(BOOL *)ptr));
- break;
-
- case P_BOOLREV:
- fprintf(f,"%s",BOOLSTR(! *(BOOL *)ptr));
- break;
-
- case P_INTEGER:
- fprintf(f,"%d",*(int *)ptr);
- break;
-
- case P_CHAR:
- fprintf(f,"%c",*(char *)ptr);
- break;
-
- case P_OCTAL:
- fprintf(f,"0%o",*(int *)ptr);
- break;
-
- case P_GSTRING:
- case P_UGSTRING:
- if ((char *)ptr)
- fprintf(f,"%s",(char *)ptr);
- break;
-
- case P_STRING:
- case P_USTRING:
- if (*(char **)ptr)
- fprintf(f,"%s",*(char **)ptr);
- break;
- }
-}
-
-
-/***************************************************************************
-print a parameter of the specified type
-***************************************************************************/
-static void parameter_string(parm_type type,void *ptr,char *s)
-{
- s[0] = 0;
-
- switch (type)
- {
- case P_BOOL:
- sprintf(s, "%s",BOOLSTR(*(BOOL *)ptr));
- break;
-
- case P_BOOLREV:
- sprintf(s, "%s",BOOLSTR(! *(BOOL *)ptr));
- break;
-
- case P_INTEGER:
- sprintf(s, "%d",*(int *)ptr);
- break;
-
- case P_CHAR:
- sprintf(s, "%c",*(char *)ptr);
- break;
-
- case P_OCTAL:
- sprintf(s, "0%o",*(int *)ptr);
- break;
-
- case P_GSTRING:
- case P_UGSTRING:
- if ((char *)ptr)
- sprintf(s, "%s",(char *)ptr);
- break;
-
- case P_STRING:
- case P_USTRING:
- if (*(char **)ptr)
- sprintf(s, "%s",*(char **)ptr);
- break;
- }
-}
-
-
-/***************************************************************************
-check if two parameters are equal
-***************************************************************************/
-static BOOL equal_parameter(parm_type type,void *ptr1,void *ptr2)
-{
- switch (type)
- {
- case P_BOOL:
- case P_BOOLREV:
- return(*((BOOL *)ptr1) == *((BOOL *)ptr2));
-
- case P_INTEGER:
- case P_OCTAL:
- return(*((int *)ptr1) == *((int *)ptr2));
-
- case P_CHAR:
- return(*((char *)ptr1) == *((char *)ptr2));
-
- case P_GSTRING:
- case P_UGSTRING:
- {
- char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
- if (p1 && !*p1) p1 = NULL;
- if (p2 && !*p2) p2 = NULL;
- return(p1==p2 || strequal(p1,p2));
- }
- case P_STRING:
- case P_USTRING:
- {
- char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
- if (p1 && !*p1) p1 = NULL;
- if (p2 && !*p2) p2 = NULL;
- return(p1==p2 || strequal(p1,p2));
- }
- }
- return(False);
-}
-
-/***************************************************************************
-Process a new section (service). At this stage all sections are services.
-Later we'll have special sections that permit server parameters to be set.
-Returns True on success, False on failure.
-***************************************************************************/
-static BOOL do_section(char *pszSectionName)
-{
- BOOL bRetval;
- BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
- (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
- bRetval = False;
-
- /* if we were in a global section then do the local inits */
- if (bInGlobalSection && !isglobal)
- init_locals();
-
- /* if we've just struck a global section, note the fact. */
- bInGlobalSection = isglobal;
-
- /* check for multiple global sections */
- if (bInGlobalSection)
- {
- DEBUG(3,( "Processing section \"[%s]\"\n", pszSectionName));
- return(True);
- }
-
- if (!bInGlobalSection && bGlobalOnly) return(True);
-
- /* if we have a current service, tidy it up before moving on */
- bRetval = True;
-
- if (iServiceIndex >= 0)
- bRetval = service_ok(iServiceIndex);
-
- /* if all is still well, move to the next record in the services array */
- if (bRetval)
- {
- /* We put this here to avoid an odd message order if messages are */
- /* issued by the post-processing of a previous section. */
- DEBUG(2,( "Processing section \"[%s]\"\n", pszSectionName));
-
- if ((iServiceIndex=add_a_service(&sDefault,pszSectionName)) < 0)
- {
- DEBUG(0,("Failed to add a new service\n"));
- return(False);
- }
- }
-
- return (bRetval);
-}
-
-/***************************************************************************
-Display the contents of the global structure.
-***************************************************************************/
-static void dump_globals(FILE *f)
-{
- int i;
- fprintf(f, "# Global parameters\n");
-
- for (i=0;parm_table[i].label;i++)
- if (parm_table[i].class == P_GLOBAL &&
- parm_table[i].ptr &&
- (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr)))
- {
- fprintf(f,"\t%s = ",parm_table[i].label);
- print_parameter(parm_table[i].type,parm_table[i].ptr, f);
- fprintf(f,"\n");
- }
-}
-
-/***************************************************************************
-Display the contents of a single services record.
-***************************************************************************/
-static void dump_a_service(service *pService, FILE *f)
-{
- int i;
- if (pService == &sDefault)
- fprintf(f,"\n\n# Default service parameters\n");
- else
- fprintf(f,"\n[%s]\n",pService->szService);
-
- for (i=0;parm_table[i].label;i++)
- if (parm_table[i].class == P_LOCAL &&
- parm_table[i].ptr &&
- (*parm_table[i].label != '-') &&
- (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr)))
- {
- int pdiff = PTR_DIFF(parm_table[i].ptr,&sDefault);
-
- if (pService == &sDefault || !equal_parameter(parm_table[i].type,
- ((char *)pService) + pdiff,
- ((char *)&sDefault) + pdiff))
- {
- fprintf(f,"\t%s = ",parm_table[i].label);
- print_parameter(parm_table[i].type,
- ((char *)pService) + pdiff, f);
- fprintf(f,"\n");
- }
- }
-}
-
-
-/***************************************************************************
-return info about the next service in a service. snum==-1 gives the default
-serice and snum==-2 gives the globals
-
-return 0 when out of parameters
-***************************************************************************/
-int lp_next_parameter(int snum, int *i, char *label,
- char *value, int allparameters)
-{
- if (snum == -2) {
- /* do the globals */
- for (;parm_table[*i].label;(*i)++)
- if (parm_table[*i].class == P_GLOBAL &&
- parm_table[*i].ptr &&
- (*parm_table[*i].label != '-') &&
- ((*i) == 0 ||
- (parm_table[*i].ptr != parm_table[(*i)-1].ptr))) {
- strcpy(label, parm_table[*i].label);
- parameter_string(parm_table[*i].type,
- parm_table[*i].ptr,
- value);
- (*i)++;
- return 1;
- }
- return 0;
- } else {
- service *pService = (snum==-1?&sDefault:pSERVICE(snum));
-
- for (;parm_table[*i].label;(*i)++)
- if (parm_table[*i].class == P_LOCAL &&
- parm_table[*i].ptr &&
- (*parm_table[*i].label != '-') &&
- ((*i) == 0 ||
- (parm_table[*i].ptr != parm_table[(*i)-1].ptr))) {
- int pdiff = PTR_DIFF(parm_table[*i].ptr,&sDefault);
-
- if (snum == -1 || allparameters ||
- !equal_parameter(parm_table[*i].type,
- ((char *)pService) + pdiff,
- ((char *)&sDefault) + pdiff)) {
- strcpy(label, parm_table[*i].label);
- parameter_string(parm_table[*i].type,
- ((char *)pService) + pdiff,
- value);
- (*i)++;
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-
-#if 0
-/***************************************************************************
-Display the contents of a single copy structure.
-***************************************************************************/
-static void dump_copy_map(BOOL *pcopymap)
-{
- int i;
- if (!pcopymap) return;
-
- printf("\n\tNon-Copied parameters:\n");
-
- for (i=0;parm_table[i].label;i++)
- if (parm_table[i].class == P_LOCAL &&
- parm_table[i].ptr && !pcopymap[i] &&
- (i == 0 || (parm_table[i].ptr != parm_table[i-1].ptr)))
- {
- printf("\t\t%s\n",parm_table[i].label);
- }
-}
-#endif
-
-/***************************************************************************
-Return TRUE if the passed service number is within range.
-***************************************************************************/
-BOOL lp_snum_ok(int iService)
-{
- return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
-}
-
-
-/***************************************************************************
-auto-load some homes and printer services
-***************************************************************************/
-static void lp_add_auto_services(char *str)
-{
- char *s;
- char *p;
- int homes = lp_servicenumber(HOMES_NAME);
- int printers = lp_servicenumber(PRINTERS_NAME);
-
- if (!str)
- return;
-
- s = strdup(str);
- if (!s) return;
-
- for (p=strtok(s,LIST_SEP);p;p=strtok(NULL,LIST_SEP))
- {
- char *home = get_home_dir(p);
-
- if (lp_servicenumber(p) >= 0) continue;
-
- if (home && homes >= 0)
- {
- lp_add_home(p,homes,home);
- continue;
- }
-
- if (printers >= 0 && pcap_printername_ok(p,NULL))
- lp_add_printer(p,printers);
- }
- free(s);
-}
-
-/***************************************************************************
-auto-load one printer
-***************************************************************************/
-static void lp_add_one_printer(char *name,char *comment)
-{
- int printers = lp_servicenumber(PRINTERS_NAME);
- int i;
-
- if (lp_servicenumber(name) < 0)
- {
- lp_add_printer(name,printers);
- if ((i=lp_servicenumber(name)) >= 0)
- string_set(&iSERVICE(i).comment,comment);
- }
-}
-
-
-/***************************************************************************
-auto-load printer services
-***************************************************************************/
-static void lp_add_all_printers(void)
-{
- int printers = lp_servicenumber(PRINTERS_NAME);
-
- if (printers < 0) return;
-
- pcap_printer_fn(lp_add_one_printer);
-}
-
-/***************************************************************************
-have we loaded a services file yet?
-***************************************************************************/
-BOOL lp_loaded(void)
-{
- return(bLoaded);
-}
-
-/***************************************************************************
-unload unused services
-***************************************************************************/
-void lp_killunused(BOOL (*snumused)(int ))
-{
- int i;
- for (i=0;i<iNumServices;i++)
- if (VALID(i) && (!snumused || !snumused(i)))
- {
- iSERVICE(i).valid = False;
- free_service(pSERVICE(i));
- }
-}
-
-/***************************************************************************
-Load the services array from the services file. Return True on success,
-False on failure.
-***************************************************************************/
-BOOL lp_load(char *pszFname,BOOL global_only)
-{
- pstring n2;
- BOOL bRetval;
-
- add_to_file_list(pszFname);
-
- bRetval = False;
-
- bInGlobalSection = True;
- bGlobalOnly = global_only;
-
- init_globals();
-
- pstrcpy(n2,pszFname);
- standard_sub_basic(n2);
-
- /* We get sections first, so have to start 'behind' to make up */
- iServiceIndex = -1;
- bRetval = pm_process(n2, do_section, do_parameter);
-
- /* finish up the last section */
- DEBUG(3,("pm_process() returned %s\n", BOOLSTR(bRetval)));
- if (bRetval)
- if (iServiceIndex >= 0)
- bRetval = service_ok(iServiceIndex);
-
- lp_add_auto_services(lp_auto_services());
- if (lp_load_printers())
- lp_add_all_printers();
-
- lp_add_ipc();
-
- set_default_server_announce_type();
-
- bLoaded = True;
-
- return (bRetval);
-}
-
-
-/***************************************************************************
-return the max number of services
-***************************************************************************/
-int lp_numservices(void)
-{
- return(iNumServices);
-}
-
-/***************************************************************************
-Display the contents of the services array in human-readable form.
-***************************************************************************/
-void lp_dump(FILE *f)
-{
- int iService;
-
- dump_globals(f);
-
- dump_a_service(&sDefault, f);
-
- for (iService = 0; iService < iNumServices; iService++)
- {
- if (VALID(iService))
- {
- if (iSERVICE(iService).szService[0] == '\0')
- break;
- dump_a_service(pSERVICE(iService), f);
- }
- }
-}
-
-
-/***************************************************************************
-Return the number of the service with the given name, or -1 if it doesn't
-exist. Note that this is a DIFFERENT ANIMAL from the internal function
-getservicebyname()! This works ONLY if all services have been loaded, and
-does not copy the found service.
-***************************************************************************/
-int lp_servicenumber(char *pszServiceName)
-{
- int iService;
-
- for (iService = iNumServices - 1; iService >= 0; iService--)
- if (VALID(iService) &&
- strwicmp(iSERVICE(iService).szService, pszServiceName) == 0)
- break;
-
- if (iService < 0)
- DEBUG(7,("lp_servicenumber: couldn't find %s\n",pszServiceName));
-
- return (iService);
-}
-
-/*******************************************************************
- a useful volume label function
- ******************************************************************/
-char *volume_label(int snum)
-{
- char *ret = lp_volume(snum);
- if (!*ret) return(lp_servicename(snum));
- return(ret);
-}
-
-#if 0
-/*
- * nmbd only loads the global section. There seems to be no way to
- * determine exactly is a service is printable by only looking at the
- * [global] section so for now always announce as a print server. This
- * will need looking at in the future. Jeremy (jallison@whistle.com).
- */
-/*******************************************************************
- Return true if any printer services are defined.
- ******************************************************************/
-static BOOL lp_printer_services(void)
-{
- int iService;
-
- for (iService = iNumServices - 1; iService >= 0; iService--)
- if (VALID(iService) && iSERVICE(iService).bPrint_ok)
- return True;
- return False;
-}
-#endif
-
-/*******************************************************************
- Set the server type we will announce as via nmbd.
-********************************************************************/
-static void set_default_server_announce_type()
-{
- default_server_announce = (SV_TYPE_WORKSTATION | SV_TYPE_SERVER |
- SV_TYPE_SERVER_UNIX | SV_TYPE_PRINTQ_SERVER);
- if(lp_announce_as() == ANNOUNCE_AS_NT)
- default_server_announce |= (SV_TYPE_SERVER_NT | SV_TYPE_NT);
- else if(lp_announce_as() == ANNOUNCE_AS_WIN95)
- default_server_announce |= SV_TYPE_WIN95_PLUS;
- else if(lp_announce_as() == ANNOUNCE_AS_WFW)
- default_server_announce |= SV_TYPE_WFW;
- default_server_announce |= (lp_time_server() ? SV_TYPE_TIME_SOURCE : 0);
-/*
- * nmbd only loads the [global] section. There seems to be no way to
- * determine exactly if any service is printable by only looking at the
- * [global] section so for now always announce as a print server. This
- * will need looking at in the future. Jeremy (jallison@whistle.com).
- */
-#if 0
- default_server_announce |= (lp_printer_services() ? SV_TYPE_PRINTQ_SERVER : 0);
-#endif
-}
-
-
-/*******************************************************************
-rename a service
-********************************************************************/
-void lp_rename_service(int snum, char *new_name)
-{
- string_set(&pSERVICE(snum)->szService, new_name);
-}
-
-/*******************************************************************
-remove a service
-********************************************************************/
-void lp_remove_service(int snum)
-{
- pSERVICE(snum)->valid = False;
-}
-
-/*******************************************************************
-copy a service
-********************************************************************/
-void lp_copy_service(int snum, char *new_name)
-{
- char *oldname = lp_servicename(snum);
- do_section(new_name);
- if (snum >= 0) {
- snum = lp_servicenumber(new_name);
- if (snum >= 0)
- lp_do_parameter(snum, "copy", oldname);
- }
-}
-
-
-/*******************************************************************
- Get the default server type we will announce as via nmbd.
-********************************************************************/
-int lp_default_server_announce(void)
-{
- return default_server_announce;
-}
-
-/*******************************************************************
- Split the announce version into major and minor numbers.
-********************************************************************/
-int lp_major_announce_version(void)
-{
- static BOOL got_major = False;
- static int major_version = DEFAULT_MAJOR_VERSION;
- char *vers;
- char *p;
-
- if(got_major)
- return major_version;
-
- got_major = True;
- if((vers = lp_announce_version()) == NULL)
- return major_version;
-
- if((p = strchr(vers, '.')) == 0)
- return major_version;
-
- *p = '\0';
- major_version = atoi(vers);
- return major_version;
-}
-
-int lp_minor_announce_version(void)
-{
- static BOOL got_minor = False;
- static int minor_version = DEFAULT_MINOR_VERSION;
- char *vers;
- char *p;
-
- if(got_minor)
- return minor_version;
-
- got_minor = True;
- if((vers = lp_announce_version()) == NULL)
- return minor_version;
-
- if((p = strchr(vers, '.')) == 0)
- return minor_version;
-
- p++;
- minor_version = atoi(p);
- return minor_version;
-}
-
diff --git a/source/param/params.c b/source/param/params.c
deleted file mode 100644
index 4d1c191b479..00000000000
--- a/source/param/params.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/* -------------------------------------------------------------------------- **
- * Microsoft Network Services for Unix, AKA., Andrew Tridgell's SAMBA.
- *
- * This module Copyright (C) 1990, 1991, 1992, 1993, 1994 Karl Auer
- *
- * Rewritten almost completely by Christopher R. Hertel
- * at the University of Minnesota, September, 1997.
- * This module Copyright (C) 1997 by the University of Minnesota
- * -------------------------------------------------------------------------- **
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * -------------------------------------------------------------------------- **
- *
- * Module name: params
- *
- * -------------------------------------------------------------------------- **
- *
- * This module performs lexical analysis and initial parsing of a
- * Windows-like parameter file. It recognizes and handles four token
- * types: section-name, parameter-name, parameter-value, and
- * end-of-file. Comments and line continuation are handled
- * internally.
- *
- * The entry point to the module is function pm_process(). This
- * function opens the source file, calls the Parse() function to parse
- * the input, and then closes the file when either the EOF is reached
- * or a fatal error is encountered.
- *
- * A sample parameter file might look like this:
- *
- * [section one]
- * parameter one = value string
- * parameter two = another value
- * [section two]
- * new parameter = some value or t'other
- *
- * The parameter file is divided into sections by section headers:
- * section names enclosed in square brackets (eg. [section one]).
- * Each section contains parameter lines, each of which consist of a
- * parameter name and value delimited by an equal sign. Roughly, the
- * syntax is:
- *
- * <file> :== { <section> } EOF
- *
- * <section> :== <section header> { <parameter line> }
- *
- * <section header> :== '[' NAME ']'
- *
- * <parameter line> :== NAME '=' VALUE '\n'
- *
- * Blank lines and comment lines are ignored. Comment lines are lines
- * beginning with either a semicolon (';') or a pound sign ('#').
- *
- * All whitespace in section names and parameter names is compressed
- * to single spaces. Leading and trailing whitespace is stipped from
- * both names and values.
- *
- * Only the first equals sign in a parameter line is significant.
- * Parameter values may contain equals signs, square brackets and
- * semicolons. Internal whitespace is retained in parameter values,
- * with the exception of the '\r' character, which is stripped for
- * historic reasons. Parameter names may not start with a left square
- * bracket, an equal sign, a pound sign, or a semicolon, because these
- * are used to identify other tokens.
- *
- * -------------------------------------------------------------------------- **
- */
-
-#include "includes.h"
-
-/* -------------------------------------------------------------------------- **
- * Constants...
- */
-
-#define BUFR_INC 1024
-
-
-/* -------------------------------------------------------------------------- **
- * Variables...
- *
- * DEBUGLEVEL - The ubiquitous DEBUGLEVEL. This determines which DEBUG()
- * messages will be produced.
- * bufr - pointer to a global buffer. This is probably a kludge,
- * but it was the nicest kludge I could think of (for now).
- * bSize - The size of the global buffer <bufr>.
- */
-
-extern int DEBUGLEVEL;
-
-static char *bufr = NULL;
-static int bSize = 0;
-
-/* -------------------------------------------------------------------------- **
- * Functions...
- */
-
-static int EatWhitespace( FILE *InFile )
- /* ------------------------------------------------------------------------ **
- * Scan past whitespace (see ctype(3C)) and return the first non-whitespace
- * character, or newline, or EOF.
- *
- * Input: InFile - Input source.
- *
- * Output: The next non-whitespace character in the input stream.
- *
- * Notes: Because the config files use a line-oriented grammar, we
- * explicitly exclude the newline character from the list of
- * whitespace characters.
- * - Note that both EOF (-1) and the nul character ('\0') are
- * considered end-of-file markers.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int c;
-
- for( c = getc( InFile ); isspace( c ) && ('\n' != c); c = getc( InFile ) )
- ;
- return( c );
- } /* EatWhitespace */
-
-static int EatComment( FILE *InFile )
- /* ------------------------------------------------------------------------ **
- * Scan to the end of a comment.
- *
- * Input: InFile - Input source.
- *
- * Output: The character that marks the end of the comment. Normally,
- * this will be a newline, but it *might* be an EOF.
- *
- * Notes: Because the config files use a line-oriented grammar, we
- * explicitly exclude the newline character from the list of
- * whitespace characters.
- * - Note that both EOF (-1) and the nul character ('\0') are
- * considered end-of-file markers.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int c;
-
- for( c = getc( InFile ); ('\n'!=c) && (EOF!=c) && (c>0); c = getc( InFile ) )
- ;
- return( c );
- } /* EatComment */
-
-static int Continuation( char *line, int pos )
- /* ------------------------------------------------------------------------ **
- * Scan backards within a string to discover if the last non-whitespace
- * character is a line-continuation character ('\\').
- *
- * Input: line - A pointer to a buffer containing the string to be
- * scanned.
- * pos - This is taken to be the offset of the end of the
- * string. This position is *not* scanned.
- *
- * Output: The offset of the '\\' character if it was found, or -1 to
- * indicate that it was not.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- pos--;
- while( (pos >= 0) && isspace(line[pos]) )
- pos--;
-
- return( ((pos >= 0) && ('\\' == line[pos])) ? pos : -1 );
- } /* Continuation */
-
-
-static BOOL Section( FILE *InFile, BOOL (*sfunc)(char *) )
- /* ------------------------------------------------------------------------ **
- * Scan a section name, and pass the name to function sfunc().
- *
- * Input: InFile - Input source.
- * sfunc - Pointer to the function to be called if the section
- * name is successfully read.
- *
- * Output: True if the section name was read and True was returned from
- * <sfunc>. False if <sfunc> failed or if a lexical error was
- * encountered.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int c;
- int i;
- int end;
- char *func = "params.c:Section() -";
-
- i = 0; /* <i> is the offset of the next free byte in bufr[] and */
- end = 0; /* <end> is the current "end of string" offset. In most */
- /* cases these will be the same, but if the last */
- /* character written to bufr[] is a space, then <end> */
- /* will be one less than <i>. */
-
- c = EatWhitespace( InFile ); /* We've already got the '['. Scan */
- /* past initial white space. */
-
- while( (EOF != c) && (c > 0) )
- {
-
- /* Check that the buffer is big enough for the next character. */
- if( i > (bSize - 2) )
- {
- bSize += BUFR_INC;
- bufr = Realloc( bufr, bSize );
- if( NULL == bufr )
- {
- DEBUG(0, ("%s Memory re-allocation failure.", func) );
- return( False );
- }
- }
-
- /* Handle a single character. */
- switch( c )
- {
- case ']': /* Found the closing bracket. */
- bufr[end] = '\0';
- if( 0 == end ) /* Don't allow an empty name. */
- {
- DEBUG(0, ("%s Empty section name in configuration file.\n", func ));
- return( False );
- }
- if( !sfunc( bufr ) ) /* Got a valid name. Deal with it. */
- return( False );
- (void)EatComment( InFile ); /* Finish off the line. */
- return( True );
-
- case '\n': /* Got newline before closing ']'. */
- i = Continuation( bufr, i ); /* Check for line continuation. */
- if( i < 0 )
- {
- bufr[end] = '\0';
- DEBUG(0, ("%s Badly formed line in configuration file: %s\n",
- func, bufr ));
- return( False );
- }
- end = ( (i > 0) && (' ' == bufr[i - 1]) ) ? (i - 1) : (i);
- c = getc( InFile ); /* Continue with next line. */
- break;
-
- default: /* All else are a valid name chars. */
- if( isspace( c ) ) /* One space per whitespace region. */
- {
- bufr[end] = ' ';
- i = end + 1;
- c = EatWhitespace( InFile );
- }
- else /* All others copy verbatim. */
- {
- bufr[i++] = c;
- end = i;
- c = getc( InFile );
- }
- }
- }
-
- /* We arrive here if we've met the EOF before the closing bracket. */
- DEBUG(0, ("%s Unexpected EOF in the configuration file: %s\n", func, bufr ));
- return( False );
- } /* Section */
-
-static BOOL Parameter( FILE *InFile, BOOL (*pfunc)(char *, char *), int c )
- /* ------------------------------------------------------------------------ **
- * Scan a parameter name and value, and pass these two fields to pfunc().
- *
- * Input: InFile - The input source.
- * pfunc - A pointer to the function that will be called to
- * process the parameter, once it has been scanned.
- * c - The first character of the parameter name, which
- * would have been read by Parse(). Unlike a comment
- * line or a section header, there is no lead-in
- * character that can be discarded.
- *
- * Output: True if the parameter name and value were scanned and processed
- * successfully, else False.
- *
- * Notes: This function is in two parts. The first loop scans the
- * parameter name. Internal whitespace is compressed, and an
- * equal sign (=) terminates the token. Leading and trailing
- * whitespace is discarded. The second loop scans the parameter
- * value. When both have been successfully identified, they are
- * passed to pfunc() for processing.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int i = 0; /* Position within bufr. */
- int end = 0; /* bufr[end] is current end-of-string. */
- int vstart = 0; /* Starting position of the parameter value. */
- char *func = "params.c:Parameter() -";
-
- /* Read the parameter name. */
- while( 0 == vstart ) /* Loop until we've found the start of the value. */
- {
-
- if( i > (bSize - 2) ) /* Ensure there's space for next char. */
- {
- bSize += BUFR_INC;
- bufr = Realloc( bufr, bSize );
- if( NULL == bufr )
- {
- DEBUG(0, ("%s Memory re-allocation failure.", func) );
- return( False );
- }
- }
-
- switch( c )
- {
- case '=': /* Equal sign marks end of param name. */
- if( 0 == end ) /* Don't allow an empty name. */
- {
- DEBUG(0, ("%s Invalid parameter name in config. file.\n", func ));
- return( False );
- }
- bufr[end++] = '\0'; /* Mark end of string & advance. */
- i = end; /* New string starts here. */
- vstart = end; /* New string is parameter value. */
- bufr[i] = '\0'; /* New string is nul, for now. */
- break;
-
- case '\n': /* Find continuation char, else error. */
- i = Continuation( bufr, i );
- if( i < 0 )
- {
- bufr[end] = '\0';
- DEBUG(1,("%s Ignoring badly formed line in configuration file: %s\n",
- func, bufr ));
- return( True );
- }
- end = ( (i > 0) && (' ' == bufr[i - 1]) ) ? (i - 1) : (i);
- c = getc( InFile ); /* Read past eoln. */
- break;
-
- case '\0': /* Shouldn't have EOF within param name. */
- case EOF:
- bufr[i] = '\0';
- DEBUG(1,("%s Unexpected end-of-file at: %s\n", func, bufr ));
- return( True );
-
- default:
- if( isspace( c ) ) /* One ' ' per whitespace region. */
- {
- bufr[end] = ' ';
- i = end + 1;
- c = EatWhitespace( InFile );
- }
- else /* All others verbatim. */
- {
- bufr[i++] = c;
- end = i;
- c = getc( InFile );
- }
- }
- }
-
- /* Now parse the value. */
- c = EatWhitespace( InFile ); /* Again, trim leading whitespace. */
- while( (EOF !=c) && (c > 0) )
- {
-
- if( i > (bSize - 2) ) /* Make sure there's enough room. */
- {
- bSize += BUFR_INC;
- bufr = Realloc( bufr, bSize );
- if( NULL == bufr )
- {
- DEBUG(0, ("%s Memory re-allocation failure.", func) );
- return( False );
- }
- }
-
- switch( c )
- {
- case '\r': /* Explicitly remove '\r' because the older */
- c = getc( InFile ); /* version called fgets_slash() which also */
- break; /* removes them. */
-
- case '\n': /* Marks end of value unless there's a '\'. */
- i = Continuation( bufr, i );
- if( i < 0 )
- c = 0;
- else
- {
- for( end = i; (end >= 0) && isspace(bufr[end]); end-- )
- ;
- c = getc( InFile );
- }
- break;
-
- default: /* All others verbatim. Note that spaces do */
- bufr[i++] = c; /* not advance <end>. This allows trimming */
- if( !isspace( c ) ) /* of whitespace at the end of the line. */
- end = i;
- c = getc( InFile );
- break;
- }
- }
- bufr[end] = '\0'; /* End of value. */
-
- return( pfunc( bufr, &bufr[vstart] ) ); /* Pass name & value to pfunc(). */
- } /* Parameter */
-
-static BOOL Parse( FILE *InFile,
- BOOL (*sfunc)(char *),
- BOOL (*pfunc)(char *, char *) )
- /* ------------------------------------------------------------------------ **
- * Scan & parse the input.
- *
- * Input: InFile - Input source.
- * sfunc - Function to be called when a section name is scanned.
- * See Section().
- * pfunc - Function to be called when a parameter is scanned.
- * See Parameter().
- *
- * Output: True if the file was successfully scanned, else False.
- *
- * Notes: The input can be viewed in terms of 'lines'. There are four
- * types of lines:
- * Blank - May contain whitespace, otherwise empty.
- * Comment - First non-whitespace character is a ';' or '#'.
- * The remainder of the line is ignored.
- * Section - First non-whitespace character is a '['.
- * Parameter - The default case.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int c;
-
- c = EatWhitespace( InFile );
- while( (EOF != c) && (c > 0) )
- {
- switch( c )
- {
- case '\n': /* Blank line. */
- c = EatWhitespace( InFile );
- break;
-
- case ';': /* Comment line. */
- case '#':
- c = EatComment( InFile );
- break;
-
- case '[': /* Section Header. */
- if( !Section( InFile, sfunc ) )
- return( False );
- c = EatWhitespace( InFile );
- break;
-
- case '\\': /* Bogus backslash. */
- c = EatWhitespace( InFile );
- break;
-
- default: /* Parameter line. */
- if( !Parameter( InFile, pfunc, c ) )
- return( False );
- c = EatWhitespace( InFile );
- break;
- }
- }
- return( True );
- } /* Parse */
-
-static FILE *OpenConfFile( char *FileName )
- /* ------------------------------------------------------------------------ **
- * Open a configuration file.
- *
- * Input: FileName - The pathname of the config file to be opened.
- *
- * Output: A pointer of type (FILE *) to the opened file, or NULL if the
- * file could not be opened.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- FILE *OpenedFile;
- char *func = "params.c:OpenConfFile() -";
-
- if( NULL == FileName || 0 == *FileName )
- {
- DEBUG( 0, ("%s No configuration filename specified.\n", func) );
- return( NULL );
- }
-
- OpenedFile = fopen( FileName, "r" );
- if( NULL == OpenedFile )
- {
- DEBUG( 0,
- ("%s Unable to open configuration file \"%s\":\n\t%s\n",
- func, FileName, strerror(errno)) );
- }
-
- return( OpenedFile );
- } /* OpenConfFile */
-
-BOOL pm_process( char *FileName,
- BOOL (*sfunc)(char *),
- BOOL (*pfunc)(char *, char *) )
- /* ------------------------------------------------------------------------ **
- * Process the named parameter file.
- *
- * Input: FileName - The pathname of the parameter file to be opened.
- * sfunc - A pointer to a function that will be called when
- * a section name is discovered.
- * pfunc - A pointer to a function that will be called when
- * a parameter name and value are discovered.
- *
- * Output: TRUE if the file was successfully parsed, else FALSE.
- *
- * ------------------------------------------------------------------------ **
- */
- {
- int result;
- FILE *InFile;
- char *func = "params.c:pm_process() -";
-
- InFile = OpenConfFile( FileName ); /* Open the config file. */
- if( NULL == InFile )
- return( False );
-
- DEBUG( 3, ("%s Processing configuration file \"%s\"\n", func, FileName) );
-
- if( NULL != bufr ) /* If we already have a buffer */
- result = Parse( InFile, sfunc, pfunc ); /* (recursive call), then just */
- /* use it. */
-
- else /* If we don't have a buffer */
- { /* allocate one, then parse, */
- bSize = BUFR_INC; /* then free. */
- bufr = (char *)malloc( bSize );
- if( NULL == bufr )
- {
- DEBUG(0,("%s memory allocation failure.\n", func));
- return( False );
- }
- result = Parse( InFile, sfunc, pfunc );
- free( bufr );
- bufr = NULL;
- bSize = 0;
- }
-
- if( !result ) /* Generic failure. */
- {
- DEBUG(0,("%s Failed. Error returned from params.c:parse().\n", func));
- return( False );
- }
-
- return( True ); /* Generic success. */
- } /* pm_process */
-
-/* -------------------------------------------------------------------------- */
diff --git a/source/passdb/smbpass.c b/source/passdb/smbpass.c
deleted file mode 100644
index 441ab94ffbb..00000000000
--- a/source/passdb/smbpass.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup
- * Copyright (C) Andrew Tridgell 1992-1997 Modified by Jeremy Allison 1995.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 675
- * Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-int gotalarm;
-
-void
-gotalarm_sig()
-{
- gotalarm = 1;
-}
-
-int
-do_pw_lock(int fd, int waitsecs, int type)
-{
- struct flock lock;
- int ret;
-
- gotalarm = 0;
- signal(SIGALRM, SIGNAL_CAST gotalarm_sig);
-
- lock.l_type = type;
- lock.l_whence = SEEK_SET;
- lock.l_start = 0;
- lock.l_len = 1;
- lock.l_pid = 0;
-
- alarm(5);
- ret = fcntl(fd, F_SETLKW, &lock);
- alarm(0);
- signal(SIGALRM, SIGNAL_CAST SIG_DFL);
-
- if (gotalarm) {
- DEBUG(0, ("do_pw_lock: failed to %s SMB passwd file.\n",
- type == F_UNLCK ? "unlock" : "lock"));
- return -1;
- }
- return ret;
-}
-
-int pw_file_lock(char *name, int type, int secs)
-{
- int fd = open(name, O_RDWR | O_CREAT, 0600);
- if (fd < 0)
- return (-1);
- if (do_pw_lock(fd, secs, type)) {
- close(fd);
- return -1;
- }
- return fd;
-}
-
-int pw_file_unlock(int fd)
-{
- do_pw_lock(fd, 5, F_UNLCK);
- return close(fd);
-}
-
-/*
- * Routine to get the next 32 hex characters and turn them
- * into a 16 byte array.
- */
-
-static int gethexpwd(char *p, char *pwd)
-{
- int i;
- unsigned char lonybble, hinybble;
- char *hexchars = "0123456789ABCDEF";
- char *p1, *p2;
-
- for (i = 0; i < 32; i += 2) {
- hinybble = toupper(p[i]);
- lonybble = toupper(p[i + 1]);
-
- p1 = strchr(hexchars, hinybble);
- p2 = strchr(hexchars, lonybble);
- if (!p1 || !p2)
- return (False);
- hinybble = PTR_DIFF(p1, hexchars);
- lonybble = PTR_DIFF(p2, hexchars);
-
- pwd[i / 2] = (hinybble << 4) | lonybble;
- }
- return (True);
-}
-
-/*
- * Routine to search the smbpasswd file for an entry matching the username.
- */
-struct smb_passwd *get_smbpwnam(char *name)
-{
- /* Static buffers we will return. */
- static struct smb_passwd pw_buf;
- static pstring user_name;
- static unsigned char smbpwd[16];
- static unsigned char smbntpwd[16];
- char linebuf[256];
- char readbuf[16 * 1024];
- unsigned char c;
- unsigned char *p;
- long uidval;
- long linebuf_len;
- FILE *fp;
- int lockfd;
- char *pfile = lp_smb_passwd_file();
-
- if (!*pfile) {
- DEBUG(0, ("No SMB password file set\n"));
- return (NULL);
- }
- DEBUG(10, ("get_smbpwnam: opening file %s\n", pfile));
-
- fp = fopen(pfile, "r");
-
- if (fp == NULL) {
- DEBUG(0, ("get_smbpwnam: unable to open file %s\n", pfile));
- return NULL;
- }
- /* Set a 16k buffer to do more efficient reads */
- setvbuf(fp, readbuf, _IOFBF, sizeof(readbuf));
-
- if ((lockfd = pw_file_lock(pfile, F_RDLCK, 5)) < 0) {
- DEBUG(0, ("get_smbpwnam: unable to lock file %s\n", pfile));
- fclose(fp);
- return NULL;
- }
- /* make sure it is only rw by the owner */
- chmod(pfile, 0600);
-
- /* We have a read lock on the file. */
- /*
- * Scan the file, a line at a time and check if the name matches.
- */
- while (!feof(fp)) {
- linebuf[0] = '\0';
-
- fgets(linebuf, 256, fp);
- if (ferror(fp)) {
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- /*
- * Check if the string is terminated with a newline - if not
- * then we must keep reading and discard until we get one.
- */
- linebuf_len = strlen(linebuf);
- if (linebuf[linebuf_len - 1] != '\n') {
- c = '\0';
- while (!ferror(fp) && !feof(fp)) {
- c = fgetc(fp);
- if (c == '\n')
- break;
- }
- } else
- linebuf[linebuf_len - 1] = '\0';
-
-#ifdef DEBUG_PASSWORD
- DEBUG(100, ("get_smbpwnam: got line |%s|\n", linebuf));
-#endif
- if ((linebuf[0] == 0) && feof(fp)) {
- DEBUG(4, ("get_smbpwnam: end of file reached\n"));
- break;
- }
- /*
- * The line we have should be of the form :-
- *
- * username:uid:[32hex bytes]:....other flags presently
- * ignored....
- *
- * or,
- *
- * username:uid:[32hex bytes]:[32hex bytes]:....ignored....
- *
- * if Windows NT compatible passwords are also present.
- */
-
- if (linebuf[0] == '#' || linebuf[0] == '\0') {
- DEBUG(6, ("get_smbpwnam: skipping comment or blank line\n"));
- continue;
- }
- p = (unsigned char *) strchr(linebuf, ':');
- if (p == NULL) {
- DEBUG(0, ("get_smbpwnam: malformed password entry (no :)\n"));
- continue;
- }
- /*
- * As 256 is shorter than a pstring we don't need to check
- * length here - if this ever changes....
- */
- strncpy(user_name, linebuf, PTR_DIFF(p, linebuf));
- user_name[PTR_DIFF(p, linebuf)] = '\0';
- if (!strequal(user_name, name))
- continue;
-
- /* User name matches - get uid and password */
- p++; /* Go past ':' */
- if (!isdigit(*p)) {
- DEBUG(0, ("get_smbpwnam: malformed password entry (uid not number)\n"));
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- uidval = atoi((char *) p);
- while (*p && isdigit(*p))
- p++;
- if (*p != ':') {
- DEBUG(0, ("get_smbpwnam: malformed password entry (no : after uid)\n"));
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- /*
- * Now get the password value - this should be 32 hex digits
- * which are the ascii representations of a 16 byte string.
- * Get two at a time and put them into the password.
- */
- p++;
- if (*p == '*' || *p == 'X') {
- /* Password deliberately invalid - end here. */
- DEBUG(10, ("get_smbpwnam: entry invalidated for user %s\n", user_name));
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- if (linebuf_len < (PTR_DIFF(p, linebuf) + 33)) {
- DEBUG(0, ("get_smbpwnam: malformed password entry (passwd too short)\n"));
- fclose(fp);
- pw_file_unlock(lockfd);
- return (False);
- }
- if (p[32] != ':') {
- DEBUG(0, ("get_smbpwnam: malformed password entry (no terminating :)\n"));
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- if (!strncasecmp((char *) p, "NO PASSWORD", 11)) {
- pw_buf.smb_passwd = NULL;
- } else {
- if(!gethexpwd((char *)p,(char *)smbpwd)) {
- DEBUG(0, ("Malformed Lanman password entry (non hex chars)\n"));
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
- }
- pw_buf.smb_passwd = smbpwd;
- }
- pw_buf.smb_name = user_name;
- pw_buf.smb_userid = uidval;
- pw_buf.smb_nt_passwd = NULL;
-
- /* Now check if the NT compatible password is
- available. */
- p += 33; /* Move to the first character of the line after
- the lanman password. */
- if ((linebuf_len >= (PTR_DIFF(p, linebuf) + 33)) && (p[32] == ':')) {
- if (*p != '*' && *p != 'X') {
- if(gethexpwd((char *)p,(char *)smbntpwd))
- pw_buf.smb_nt_passwd = smbntpwd;
- }
- }
-
- fclose(fp);
- pw_file_unlock(lockfd);
- DEBUG(5, ("get_smbpwname: returning passwd entry for user %s, uid %d\n",
- user_name, uidval));
- return &pw_buf;
- }
-
- fclose(fp);
- pw_file_unlock(lockfd);
- return NULL;
-}
diff --git a/source/printing/pcap.c b/source/printing/pcap.c
deleted file mode 100644
index 65195ab1af6..00000000000
--- a/source/printing/pcap.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- printcap parsing
- Copyright (C) Karl Auer 1993-1997
-
- Re-working by Martin Kiff, 1994
-
- Re-written again by Andrew Tridgell
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- * Parse printcap file.
- *
- * This module does exactly one thing - it looks into the printcap file
- * and tells callers if a specified string appears as a printer name.
- *
- * The way this module looks at the printcap file is very simplistic.
- * Only the local printcap file is inspected (no searching of NIS
- * databases etc).
- *
- * There are assumed to be one or more printer names per record, held
- * as a set of sub-fields separated by vertical bar symbols ('|') in the
- * first field of the record. The field separator is assumed to be a colon
- * ':' and the record separator a newline.
- *
- * Lines ending with a backspace '\' are assumed to flag that the following
- * line is a continuation line so that a set of lines can be read as one
- * printcap entry.
- *
- * A line stating with a hash '#' is assumed to be a comment and is ignored
- * Comments are discarded before the record is strung together from the
- * set of continuation lines.
- *
- * Opening a pipe for "lpc status" and reading that would probably
- * be pretty effective. Code to do this already exists in the freely
- * distributable PCNFS server code.
- */
-
-#include "includes.h"
-
-#include "smb.h"
-
-extern int DEBUGLEVEL;
-
-#ifdef AIX
-/* ******************************************
- Extend for AIX system and qconfig file
- from 'boulard@univ-rennes1.fr
- ****************************************** */
-static int strlocate(char *xpLine,char *xpS)
-{
- int iS,iL,i,iRet;
- char *p;
- iS = strlen(xpS);
- iL = strlen(xpLine);
-
- iRet = 0;
- p = xpLine;
- while (iL >= iS)
- {
- if (strncmp(p,xpS,iS) == 0) {iRet =1;break;};
- p++;
- iL--;
- }
- /*DEBUG(3,(" strlocate %s in line '%s',ret=%d\n",xpS,xpLine,iRet));*/
-
- return(iRet);
-}
-
-
-/* ******************************************************************* */
-/* * Scan qconfig and search all virtual printer (device printer) * */
-/* ******************************************************************* */
-static void ScanQconfig_fn(char *psz,void (*fn)())
-{
- int iLg,iEtat;
- FILE *pfile;
- char *line,*p;
- pstring name,comment;
- line = NULL;
- *name = 0;
- *comment = 0;
-
- if ((pfile = fopen(psz, "r")) == NULL)
- {
- DEBUG(0,( "Unable to open qconfig file %s for read!\n", psz));
- return;
- }
-
- iEtat = 0;
- /* scan qconfig file for searching <printername>: */
- for (;(line = fgets_slash(NULL,sizeof(pstring),pfile)); free(line))
- {
- if (*line == '*' || *line == 0)
- continue;
- switch (iEtat)
- {
- case 0: /* locate an entry */
- if (*line == '\t' || *line == ' ') continue;
- if ((p=strchr(line,':')))
- {
- *p = '\0';
- p = strtok(line,":");
- if (strcmp(p,"bsh")!=0)
- {
- strcpy(name,p);
- iEtat = 1;
- continue;
- }
- }
- break;
- case 1: /* scanning device stanza */
- if (*line == '*' || *line == 0) continue;
- if (*line != '\t' && *line != ' ')
- {
- /* name is found without stanza device */
- /* probably a good printer ??? */
- fn(name,comment);
- iEtat = 0;
- continue;
- }
-
- if (strlocate(line,"backend"))
- {
- /* it's a device, not a virtual printer*/
- iEtat = 0;
- }
- else if (strlocate(line,"device"))
- {
- /* it's a good virtual printer */
- fn(name,comment);
- iEtat = 0;
- continue;
- }
- break;
- }
- }
- fclose(pfile);
-}
-
-/* Scan qconfig file and locate de printername */
-
-static BOOL ScanQconfig(char *psz,char *pszPrintername)
-{
- int iLg,iEtat;
- FILE *pfile;
- char *pName;
- char *line;
-
- pName = NULL;
- line = NULL;
- if ((pszPrintername!= NULL) && ((iLg = strlen(pszPrintername)) > 0))
- pName = malloc(iLg+10);
- if (pName == NULL)
- {
- DEBUG(0,(" Unable to allocate memory for printer %s\n",pszPrintername));
- return(False);
- }
- if ((pfile = fopen(psz, "r")) == NULL)
- {
- DEBUG(0,( "Unable to open qconfig file %s for read!\n", psz));
- free(pName);
- return(False);
- }
- sprintf(pName,"%s:",pszPrintername);
- iLg = strlen(pName);
- /*DEBUG(3,( " Looking for entry %s\n",pName));*/
- iEtat = 0;
- /* scan qconfig file for searching <printername>: */
- for (;(line = fgets_slash(NULL,sizeof(pstring),pfile)); free(line))
- {
- if (*line == '*' || *line == 0)
- continue;
- switch (iEtat)
- {
- case 0: /* scanning entry */
- if (strncmp(line,pName,iLg) == 0)
- {
- iEtat = 1;
- continue;
- }
- break;
- case 1: /* scanning device stanza */
- if (*line == '*' || *line == 0) continue;
- if (*line != '\t' && *line != ' ')
- {
- /* name is found without stanza device */
- /* probably a good printer ??? */
- free (line);
- free(pName);
- fclose(pfile);
- return(True);
- }
-
- if (strlocate(line,"backend"))
- {
- /* it's a device, not a virtual printer*/
- iEtat = 0;
- }
- else if (strlocate(line,"device"))
- {
- /* it's a good virtual printer */
- free (line);
- free(pName);
- fclose(pfile);
- return(True);
- }
- break;
- }
- }
- free (pName);
- fclose(pfile);
- return(False);
-}
-
-#endif
-/***************************************************************************
-Scan printcap file pszPrintcapname for a printer called pszPrintername.
-Return True if found, else False. Returns False on error, too, after logging
-the error at level 0. For generality, the printcap name may be passed - if
-passed as NULL, the configuration will be queried for the name.
-***************************************************************************/
-BOOL pcap_printername_ok(char *pszPrintername, char *pszPrintcapname)
-{
- char *line=NULL;
- char *psz;
- char *p,*q;
- FILE *pfile;
-
- if (pszPrintername == NULL || pszPrintername[0] == '\0')
- {
- DEBUG(0,( "Attempt to locate null printername! Internal error?\n"));
- return(False);
- }
-
- /* only go looking if no printcap name supplied */
- if ((psz = pszPrintcapname) == NULL || psz[0] == '\0')
- if (((psz = lp_printcapname()) == NULL) || (psz[0] == '\0'))
- {
- DEBUG(0,( "No printcap file name configured!\n"));
- return(False);
- }
-#ifdef AIX
- if (strlocate(psz,"/qconfig") != NULL)
- return(ScanQconfig(psz,pszPrintername));
-#endif
- if ((pfile = fopen(psz, "r")) == NULL)
- {
- DEBUG(0,( "Unable to open printcap file %s for read!\n", psz));
- return(False);
- }
-
- for (;(line = fgets_slash(NULL,sizeof(pstring),pfile)); free(line))
- {
- if (*line == '#' || *line == 0)
- continue;
-
- /* now we have a real printer line - cut it off at the first : */
- p = strchr(line,':');
- if (p) *p = 0;
-
- /* now just check if the name is in the list */
- /* NOTE: I avoid strtok as the fn calling this one may be using it */
- for (p=line; p; p=q)
- {
- if ((q = strchr(p,'|'))) *q++ = 0;
-
- if (strequal(p,pszPrintername))
- {
- /* normalise the case */
- strcpy(pszPrintername,p);
- free(line);
- fclose(pfile);
- return(True);
- }
- p = q;
- }
- }
-
-
- fclose(pfile);
- return(False);
-}
-
-
-/***************************************************************************
-run a function on each printer name in the printcap file. The function is
-passed the primary name and the comment (if possible)
-***************************************************************************/
-void pcap_printer_fn(void (*fn)())
-{
- pstring name,comment;
- char *line;
- char *psz;
- char *p,*q;
- FILE *pfile;
-
- /* only go looking if no printcap name supplied */
- if (((psz = lp_printcapname()) == NULL) || (psz[0] == '\0'))
- {
- DEBUG(0,( "No printcap file name configured!\n"));
- return;
- }
-
-#ifdef AIX
- if (strlocate(psz,"/qconfig") != NULL)
- {
- ScanQconfig_fn(psz,fn);
- return;
- }
-#endif
- if ((pfile = fopen(psz, "r")) == NULL)
- {
- DEBUG(0,( "Unable to open printcap file %s for read!\n", psz));
- return;
- }
-
- for (;(line = fgets_slash(NULL,sizeof(pstring),pfile)); free(line))
- {
- if (*line == '#' || *line == 0)
- continue;
-
- /* now we have a real printer line - cut it off at the first : */
- p = strchr(line,':');
- if (p) *p = 0;
-
- /* now find the most likely printer name and comment
- this is pure guesswork, but it's better than nothing */
- *name = 0;
- *comment = 0;
- for (p=line; p; p=q)
- {
- BOOL has_punctuation;
- if ((q = strchr(p,'|'))) *q++ = 0;
-
- has_punctuation = (strchr(p,' ') || strchr(p,'(') || strchr(p,')'));
-
- if (strlen(p)>strlen(comment) && has_punctuation)
- {
- StrnCpy(comment,p,sizeof(comment)-1);
- continue;
- }
-
- if (strlen(p) <= 8 && strlen(p)>strlen(name) && !has_punctuation)
- {
- if (!*comment) pstrcpy(comment,name);
- pstrcpy(name,p);
- continue;
- }
-
- if (!strchr(comment,' ') &&
- strlen(p) > strlen(comment))
- {
- StrnCpy(comment,p,sizeof(comment)-1);
- continue;
- }
- }
-
- comment[60] = 0;
- name[8] = 0;
-
- if (*name)
- fn(name,comment);
- }
- fclose(pfile);
-}
diff --git a/source/printing/printing.c b/source/printing/printing.c
deleted file mode 100644
index 51fd3a992eb..00000000000
--- a/source/printing/printing.c
+++ /dev/null
@@ -1,1102 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- printing routines
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-extern int DEBUGLEVEL;
-extern connection_struct Connections[];
-extern files_struct Files[];
-
-static BOOL * lpq_cache_reset=NULL;
-
-static int check_lpq_cache(int snum) {
- static int lpq_caches=0;
-
- if (lpq_caches <= snum) {
- BOOL * p;
- p = (BOOL *) Realloc(lpq_cache_reset,(snum+1)*sizeof(BOOL));
- if (p) {
- lpq_cache_reset=p;
- lpq_caches = snum+1;
- }
- }
- return lpq_caches;
-}
-
-void lpq_reset(int snum)
-{
- if (check_lpq_cache(snum) > snum) lpq_cache_reset[snum]=True;
-}
-
-
-/****************************************************************************
-Build the print command in the supplied buffer. This means getting the
-print command for the service and inserting the printer name and the
-print file name. Return NULL on error, else the passed buffer pointer.
-****************************************************************************/
-static char *build_print_command(int cnum, char *command, char *syscmd, char *filename1)
-{
- int snum = SNUM(cnum);
- char *tstr;
- pstring filename;
-
- /* get the print command for the service. */
- tstr = command;
- if (!syscmd || !tstr) {
- DEBUG(0,("No print command for service `%s'\n", SERVICE(snum)));
- return (NULL);
- }
-
- /* copy the command into the buffer for extensive meddling. */
- StrnCpy(syscmd, tstr, sizeof(pstring) - 1);
-
- /* look for "%s" in the string. If there is no %s, we cannot print. */
- if (!strstr(syscmd, "%s") && !strstr(syscmd, "%f")) {
- DEBUG(2,("WARNING! No placeholder for the filename in the print command for service %s!\n", SERVICE(snum)));
- }
-
- if (strstr(syscmd,"%s")) {
- int iOffset = PTR_DIFF(strstr(syscmd, "%s"),syscmd);
-
- /* construct the full path for the filename, shouldn't be necessary unless
- the subshell causes a "cd" to be executed.
- Only use the full path if there isn't a / preceding the %s */
- if (iOffset==0 || syscmd[iOffset-1] != '/') {
- StrnCpy(filename,Connections[cnum].connectpath,sizeof(filename)-1);
- trim_string(filename,"","/");
- strcat(filename,"/");
- strcat(filename,filename1);
- }
- else
- pstrcpy(filename,filename1);
-
- string_sub(syscmd, "%s", filename);
- }
-
- string_sub(syscmd, "%f", filename1);
-
- /* Does the service have a printername? If not, make a fake and empty */
- /* printer name. That way a %p is treated sanely if no printer */
- /* name was specified to replace it. This eventuality is logged. */
- tstr = PRINTERNAME(snum);
- if (tstr == NULL || tstr[0] == '\0') {
- DEBUG(3,( "No printer name - using %s.\n", SERVICE(snum)));
- tstr = SERVICE(snum);
- }
-
- string_sub(syscmd, "%p", tstr);
-
- standard_sub(cnum,syscmd);
-
- return (syscmd);
-}
-
-
-/****************************************************************************
-print a file - called on closing the file
-****************************************************************************/
-void print_file(int fnum)
-{
- pstring syscmd;
- int cnum = Files[fnum].cnum;
- int snum=SNUM(cnum);
- char *tempstr;
-
- *syscmd = 0;
-
- if (file_size(Files[fnum].name) <= 0) {
- DEBUG(3,("Discarding null print job %s\n",Files[fnum].name));
- sys_unlink(Files[fnum].name);
- return;
- }
-
- tempstr = build_print_command(cnum, PRINTCOMMAND(snum), syscmd, Files[fnum].name);
- if (tempstr != NULL)
- {
- int ret = smbrun(syscmd,NULL,False);
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
- }
- else
- DEBUG(0,("Null print command?\n"));
-
- lpq_reset(snum);
-}
-
-static char *Months[13] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Err"};
-
-
-/*******************************************************************
-process time fields
-********************************************************************/
-static time_t EntryTime(string tok[], int ptr, int count, int minimum)
-{
- time_t jobtime,jobtime1;
-
- jobtime = time(NULL); /* default case: take current time */
- if (count >= minimum) {
- struct tm *t;
- int i, day, hour, min, sec;
- char *c;
-
- for (i=0; i<13; i++) if (!strncmp(tok[ptr], Months[i],3)) break; /* Find month */
- if (i<12) {
- t = localtime(&jobtime);
- day = atoi(tok[ptr+1]);
- c=(char *)(tok[ptr+2]);
- *(c+2)=0;
- hour = atoi(c);
- *(c+5)=0;
- min = atoi(c+3);
- if(*(c+6) != 0)sec = atoi(c+6);
- else sec=0;
-
- if ((t->tm_mon < i)||
- ((t->tm_mon == i)&&
- ((t->tm_mday < day)||
- ((t->tm_mday == day)&&
- (t->tm_hour*60+t->tm_min < hour*60+min)))))
- t->tm_year--; /* last year's print job */
-
- t->tm_mon = i;
- t->tm_mday = day;
- t->tm_hour = hour;
- t->tm_min = min;
- t->tm_sec = sec;
- jobtime1 = mktime(t);
- if (jobtime1 != (time_t)-1)
- jobtime = jobtime1;
- }
- }
- return jobtime;
-}
-
-
-/****************************************************************************
-parse a lpq line
-
-here is an example of lpq output under bsd
-
-Warning: no daemon present
-Rank Owner Job Files Total Size
-1st tridge 148 README 8096 bytes
-
-here is an example of lpq output under osf/1
-
-Warning: no daemon present
-Rank Pri Owner Job Files Total Size
-1st 0 tridge 148 README 8096 bytes
-****************************************************************************/
-static BOOL parse_lpq_bsd(char *line,print_queue_struct *buf,BOOL first)
-{
-#ifdef OSF1
-#define RANKTOK 0
-#define PRIOTOK 1
-#define USERTOK 2
-#define JOBTOK 3
-#define FILETOK 4
-#define TOTALTOK 5
-#define NTOK 6
-#else /* OSF1 */
-#define RANKTOK 0
-#define USERTOK 1
-#define JOBTOK 2
-#define FILETOK 3
-#define TOTALTOK 4
-#define NTOK 5
-#endif /* OSF1 */
-
- string tok[NTOK];
- int count=0;
-
-#ifdef OSF1
- int length;
- length = strlen(line);
- if (line[length-3] == ':')
- return(False);
-#endif /* OSF1 */
-
- /* handle the case of "(standard input)" as a filename */
- string_sub(line,"standard input","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0; count<NTOK && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get NTOK tokens */
- if (count < NTOK)
- return(False);
-
- /* the Job and Total columns must be integer */
- if (!isdigit(*tok[JOBTOK]) || !isdigit(*tok[TOTALTOK])) return(False);
-
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[FILETOK],' '))
- strcpy(tok[FILETOK],"STDIN");
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[FILETOK],'/');
- if (p)
- {
- strcpy(tmp,p+1);
- fstrcpy(tok[FILETOK],tmp);
- }
- }
-
-
- buf->job = atoi(tok[JOBTOK]);
- buf->size = atoi(tok[TOTALTOK]);
- buf->status = strequal(tok[RANKTOK],"active")?LPQ_PRINTING:LPQ_QUEUED;
- buf->time = time(NULL);
- StrnCpy(buf->user,tok[USERTOK],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[FILETOK],sizeof(buf->file)-1);
-#ifdef PRIOTOK
- buf->priority = atoi(tok[PRIOTOK]);
-#else
- buf->priority = 1;
-#endif
- return(True);
-}
-
-/*
-<magnus@hum.auc.dk>
-LPRng_time modifies the current date by inserting the hour and minute from
-the lpq output. The lpq time looks like "23:15:07"
-*/
-static time_t LPRng_time(string tok[],int pos)
-{
- time_t jobtime;
- struct tm *t;
- char tmp_time[9];
-
- jobtime = time(NULL); /* default case: take current time */
- t = localtime(&jobtime);
- t->tm_hour = atoi(tok[pos]);
- StrnCpy(tmp_time,tok[pos],sizeof(tmp_time));
- t->tm_min = atoi(tmp_time+3);
- t->tm_sec = atoi(tmp_time+6);
- jobtime = mktime(t);
-
- return jobtime;
-}
-
-
-/****************************************************************************
- parse a lpq line
- <magnus@hum.auc.dk>
- Most of the code is directly reused from parse_lpq_bsd()
-
-here are two examples of lpq output under lprng (LPRng-2.3.0)
-
-Printer: humprn@hum-fak
- Queue: 1 printable job
- Server: pid 4840 active, Unspooler: pid 4841 active
- Status: job 'cfA659hum-fak', closing device at Fri Jun 21 10:10:21 1996
- Rank Owner Class Job Files Size Time
-active magnus@hum-fak A 659 /var/spool/smb/Notesblok-ikke-na4024 10:03:31
-
-Printer: humprn@hum-fak (printing disabled)
- Queue: 1 printable job
- Warning: no server present
- Status: finished operations at Fri Jun 21 10:10:32 1996
- Rank Owner Class Job Files Size Time
-1 magnus@hum-fak A 387 /var/spool/smb/netbudget.xls 21230 10:50:53
-
-****************************************************************************/
-static BOOL parse_lpq_lprng(char *line,print_queue_struct *buf,BOOL first)
-{
-#define LPRNG_RANKTOK 0
-#define LPRNG_USERTOK 1
-#define LPRNG_PRIOTOK 2
-#define LPRNG_JOBTOK 3
-#define LPRNG_FILETOK 4
-#define LPRNG_TOTALTOK 5
-#define LPRNG_TIMETOK 6
-#define LPRNG_NTOK 7
-
-/****************************************************************************
-From lpd_status.c in LPRng source.
-0 1 2 3 4 5 6 7
-12345678901234567890123456789012345678901234567890123456789012345678901234
-" Rank Owner Class Job Files Size Time"
- plp_snprintf( msg, sizeof(msg), "%-6s %-19s %c %03d %-32s",
- number, line, priority, cfp->number, error );
- plp_snprintf( msg + len, sizeof(msg)-len, "%4d",
- cfp->jobsize );
- plp_snprintf( msg+len, sizeof(msg)-len, " %s",
- Time_str( 1, cfp->statb.st_ctime ) );
-****************************************************************************/
- /* The following define's are to be able to adjust the values if the
-LPRng source changes. This is from version 2.3.0. Magnus */
-#define SPACE_W 1
-#define RANK_W 6
-#define OWNER_W 19
-#define CLASS_W 1
-#define JOB_W 3
-#define FILE_W 32
-/* The JOBSIZE_W is too small for big jobs, so time is pushed to the right */
-#define JOBSIZE_W 4
-
-#define RANK_POS 0
-#define OWNER_POS RANK_POS+RANK_W+SPACE_W
-#define CLASS_POS OWNER_POS+OWNER_W+SPACE_W
-#define JOB_POS CLASS_POS+CLASS_W+SPACE_W
-#define FILE_POS JOB_POS+JOB_W+SPACE_W
-#define JOBSIZE_POS FILE_POS+FILE_W
-
-
- string tok[LPRNG_NTOK];
- int count=0;
-
-/*
-Need to insert one space in front of the size, to be able to use
-next_token() unchanged. I would have liked to be able to insert a
-space instead, to prevent losing that one char, but perl has spoiled
-me :-\ So I did it the easiest way.
-
-HINT: Use as short a path as possible for the samba spool directory.
-A long spool-path will just waste significant chars of the file name.
-*/
-
- line[JOBSIZE_POS-1]=' ';
-
- /* handle the case of "(stdin)" as a filename */
- string_sub(line,"stdin","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0; count<LPRNG_NTOK && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get LPRNG_NTOK tokens */
- if (count < LPRNG_NTOK)
- return(False);
-
- /* the Job and Total columns must be integer */
- if (!isdigit(*tok[LPRNG_JOBTOK]) || !isdigit(*tok[LPRNG_TOTALTOK])) return(False);
-
- /* if the fname contains a space then use STDIN */
- /* I do not understand how this would be possible. Magnus. */
- if (strchr(tok[LPRNG_FILETOK],' '))
- strcpy(tok[LPRNG_FILETOK],"STDIN");
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[LPRNG_FILETOK],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[LPRNG_FILETOK],tmp);
- }
- }
-
-
- buf->job = atoi(tok[LPRNG_JOBTOK]);
- buf->size = atoi(tok[LPRNG_TOTALTOK]);
- buf->status = strequal(tok[LPRNG_RANKTOK],"active")?LPQ_PRINTING:LPQ_QUEUED;
- /* buf->time = time(NULL); */
- buf->time = LPRng_time(tok,LPRNG_TIMETOK);
-DEBUG(3,("Time reported for job %d is %s", buf->job, ctime(&buf->time)));
- StrnCpy(buf->user,tok[LPRNG_USERTOK],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[LPRNG_FILETOK],sizeof(buf->file)-1);
-#ifdef LPRNG_PRIOTOK
- /* Here I try to map the CLASS char to a number, but the number
- is never shown in Print Manager under NT anyway... Magnus. */
- buf->priority = atoi(tok[LPRNG_PRIOTOK]-('A'-1));
-#else
- buf->priority = 1;
-#endif
- return(True);
-}
-
-
-
-/*******************************************************************
-parse lpq on an aix system
-
-Queue Dev Status Job Files User PP % Blks Cp Rnk
-------- ----- --------- --- ------------------ ---------- ---- -- ----- --- ---
-lazer lazer READY
-lazer lazer RUNNING 537 6297doc.A kvintus@IE 0 10 2445 1 1
- QUEUED 538 C.ps root@IEDVB 124 1 2
- QUEUED 539 E.ps root@IEDVB 28 1 3
- QUEUED 540 L.ps root@IEDVB 172 1 4
- QUEUED 541 P.ps root@IEDVB 22 1 5
-********************************************************************/
-static BOOL parse_lpq_aix(char *line,print_queue_struct *buf,BOOL first)
-{
- string tok[11];
- int count=0;
-
- /* handle the case of "(standard input)" as a filename */
- string_sub(line,"standard input","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0; count<10 && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get 6 tokens */
- if (count < 10)
- {
- if ((count == 7) && (strcmp(tok[0],"QUEUED") == 0))
- {
- /* the 2nd and 5th columns must be integer */
- if (!isdigit(*tok[1]) || !isdigit(*tok[4])) return(False);
- buf->size = atoi(tok[4]) * 1024;
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[2],' '))
- strcpy(tok[2],"STDIN");
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[2],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[2],tmp);
- }
- }
-
-
- buf->job = atoi(tok[1]);
- buf->status = LPQ_QUEUED;
- buf->priority = 0;
- buf->time = time(NULL);
- StrnCpy(buf->user,tok[3],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[2],sizeof(buf->file)-1);
- }
- else
- {
- DEBUG(6,("parse_lpq_aix count=%d\n", count));
- return(False);
- }
- }
- else
- {
- /* the 4th and 9th columns must be integer */
- if (!isdigit(*tok[3]) || !isdigit(*tok[8])) return(False);
- buf->size = atoi(tok[8]) * 1024;
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[4],' '))
- strcpy(tok[4],"STDIN");
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[4],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[4],tmp);
- }
- }
-
-
- buf->job = atoi(tok[3]);
- buf->status = strequal(tok[2],"RUNNING")?LPQ_PRINTING:LPQ_QUEUED;
- buf->priority = 0;
- buf->time = time(NULL);
- StrnCpy(buf->user,tok[5],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[4],sizeof(buf->file)-1);
- }
-
-
- return(True);
-}
-
-
-/****************************************************************************
-parse a lpq line
-here is an example of lpq output under hpux; note there's no space after -o !
-$> lpstat -oljplus
-ljplus-2153 user priority 0 Jan 19 08:14 on ljplus
- util.c 125697 bytes
- server.c 110712 bytes
-ljplus-2154 user priority 0 Jan 19 08:14 from client
- (standard input) 7551 bytes
-****************************************************************************/
-static BOOL parse_lpq_hpux(char * line, print_queue_struct *buf, BOOL first)
-{
- /* must read two lines to process, therefore keep some values static */
- static BOOL header_line_ok=False, base_prio_reset=False;
- static string jobuser;
- static int jobid;
- static int jobprio;
- static time_t jobtime;
- static int jobstat=LPQ_QUEUED;
- /* to store minimum priority to print, lpstat command should be invoked
- with -p option first, to work */
- static int base_prio;
-
- int count;
- char TAB = '\011';
- string tok[12];
-
- /* If a line begins with a horizontal TAB, it is a subline type */
-
- if (line[0] == TAB) { /* subline */
- /* check if it contains the base priority */
- if (!strncmp(line,"\tfence priority : ",18)) {
- base_prio=atoi(&line[18]);
- DEBUG(4, ("fence priority set at %d\n", base_prio));
- }
- if (!header_line_ok) return (False); /* incorrect header line */
- /* handle the case of "(standard input)" as a filename */
- string_sub(line,"standard input","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0; count<2 && next_token(&line,tok[count],NULL); count++) ;
- /* we must get 2 tokens */
- if (count < 2) return(False);
-
- /* the 2nd column must be integer */
- if (!isdigit(*tok[1])) return(False);
-
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[0],' '))
- strcpy(tok[0],"STDIN");
-
- buf->size = atoi(tok[1]);
- StrnCpy(buf->file,tok[0],sizeof(buf->file)-1);
-
- /* fill things from header line */
- buf->time = jobtime;
- buf->job = jobid;
- buf->status = jobstat;
- buf->priority = jobprio;
- StrnCpy(buf->user,jobuser,sizeof(buf->user)-1);
-
- return(True);
- }
- else { /* header line */
- header_line_ok=False; /* reset it */
- if (first) {
- if (!base_prio_reset) {
- base_prio=0; /* reset it */
- base_prio_reset=True;
- }
- }
- else if (base_prio) base_prio_reset=False;
-
- /* handle the dash in the job id */
- string_sub(line,"-"," ");
-
- for (count=0; count<12 && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get 8 tokens */
- if (count < 8) return(False);
-
- /* first token must be printer name (cannot check ?) */
- /* the 2nd, 5th & 7th column must be integer */
- if (!isdigit(*tok[1]) || !isdigit(*tok[4]) || !isdigit(*tok[6])) return(False);
- jobid = atoi(tok[1]);
- StrnCpy(jobuser,tok[2],sizeof(buf->user)-1);
- jobprio = atoi(tok[4]);
-
- /* process time */
- jobtime=EntryTime(tok, 5, count, 8);
- if (jobprio < base_prio) {
- jobstat = LPQ_PAUSED;
- DEBUG (4, ("job %d is paused: prio %d < %d; jobstat=%d\n", jobid, jobprio, base_prio, jobstat));
- }
- else {
- jobstat = LPQ_QUEUED;
- if ((count >8) && (((strequal(tok[8],"on")) ||
- ((strequal(tok[8],"from")) &&
- ((count > 10)&&(strequal(tok[10],"on")))))))
- jobstat = LPQ_PRINTING;
- }
-
- header_line_ok=True; /* information is correct */
- return(False); /* need subline info to include into queuelist */
- }
-}
-
-
-/****************************************************************************
-parse a lpq line
-
-here is an example of "lpstat -o dcslw" output under sysv
-
-dcslw-896 tridge 4712 Dec 20 10:30:30 on dcslw
-dcslw-897 tridge 4712 Dec 20 10:30:30 being held
-
-****************************************************************************/
-static BOOL parse_lpq_sysv(char *line,print_queue_struct *buf,BOOL first)
-{
- string tok[9];
- int count=0;
- char *p;
-
- /* handle the dash in the job id */
- string_sub(line,"-"," ");
-
- for (count=0; count<9 && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get 7 tokens */
- if (count < 7)
- return(False);
-
- /* the 2nd and 4th, 6th columns must be integer */
- if (!isdigit(*tok[1]) || !isdigit(*tok[3])) return(False);
- if (!isdigit(*tok[5])) return(False);
-
- /* if the user contains a ! then trim the first part of it */
- if ((p=strchr(tok[2],'!')))
- {
- string tmp;
- fstrcpy(tmp,p+1);
- fstrcpy(tok[2],tmp);
- }
-
-
- buf->job = atoi(tok[1]);
- buf->size = atoi(tok[3]);
- if (count > 7 && strequal(tok[7],"on"))
- buf->status = LPQ_PRINTING;
- else if (count > 8 && strequal(tok[7],"being") && strequal(tok[8],"held"))
- buf->status = LPQ_PAUSED;
- else
- buf->status = LPQ_QUEUED;
- buf->priority = 0;
- buf->time = EntryTime(tok, 4, count, 7);
- StrnCpy(buf->user,tok[2],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[2],sizeof(buf->file)-1);
- return(True);
-}
-
-/****************************************************************************
-parse a lpq line
-
-here is an example of lpq output under qnx
-Spooler: /qnx/spooler, on node 1
-Printer: txt (ready)
-0000: root [job #1 ] active 1146 bytes /etc/profile
-0001: root [job #2 ] ready 2378 bytes /etc/install
-0002: root [job #3 ] ready 1146 bytes -- standard input --
-****************************************************************************/
-static BOOL parse_lpq_qnx(char *line,print_queue_struct *buf,BOOL first)
-{
- string tok[7];
- int count=0;
-
- DEBUG(0,("antes [%s]\n", line));
-
- /* handle the case of "-- standard input --" as a filename */
- string_sub(line,"standard input","STDIN");
- DEBUG(0,("despues [%s]\n", line));
- string_sub(line,"-- ","\"");
- string_sub(line," --","\"");
- DEBUG(0,("despues 1 [%s]\n", line));
-
- string_sub(line,"[job #","");
- string_sub(line,"]","");
- DEBUG(0,("despues 2 [%s]\n", line));
-
-
-
- for (count=0; count<7 && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get 7 tokens */
- if (count < 7)
- return(False);
-
- /* the 3rd and 5th columns must be integer */
- if (!isdigit(*tok[2]) || !isdigit(*tok[4])) return(False);
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[6],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[6],tmp);
- }
- }
-
-
- buf->job = atoi(tok[2]);
- buf->size = atoi(tok[4]);
- buf->status = strequal(tok[3],"active")?LPQ_PRINTING:LPQ_QUEUED;
- buf->priority = 0;
- buf->time = time(NULL);
- StrnCpy(buf->user,tok[1],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[6],sizeof(buf->file)-1);
- return(True);
-}
-
-
-/****************************************************************************
- parse a lpq line for the plp printing system
- Bertrand Wallrich <Bertrand.Wallrich@loria.fr>
-
-redone by tridge. Here is a sample queue:
-
-Local Printer 'lp2' (fjall):
- Printing (started at Jun 15 13:33:58, attempt 1).
- Rank Owner Pr Opt Job Host Files Size Date
- active tridge X - 6 fjall /etc/hosts 739 Jun 15 13:33
- 3rd tridge X - 7 fjall /etc/hosts 739 Jun 15 13:33
-
-****************************************************************************/
-static BOOL parse_lpq_plp(char *line,print_queue_struct *buf,BOOL first)
-{
- string tok[11];
- int count=0;
-
- /* handle the case of "(standard input)" as a filename */
- string_sub(line,"stdin","STDIN");
- string_sub(line,"(","\"");
- string_sub(line,")","\"");
-
- for (count=0; count<11 && next_token(&line,tok[count],NULL); count++) ;
-
- /* we must get 11 tokens */
- if (count < 11)
- return(False);
-
- /* the first must be "active" or begin with an integer */
- if (strcmp(tok[0],"active") && !isdigit(tok[0][0]))
- return(False);
-
- /* the 5th and 8th must be integer */
- if (!isdigit(*tok[4]) || !isdigit(*tok[7]))
- return(False);
-
- /* if the fname contains a space then use STDIN */
- if (strchr(tok[6],' '))
- strcpy(tok[6],"STDIN");
-
- /* only take the last part of the filename */
- {
- string tmp;
- char *p = strrchr(tok[6],'/');
- if (p)
- {
- fstrcpy(tmp,p+1);
- fstrcpy(tok[6],tmp);
- }
- }
-
-
- buf->job = atoi(tok[4]);
-
- buf->size = atoi(tok[7]);
- if (strchr(tok[7],'K'))
- buf->size *= 1024;
- if (strchr(tok[7],'M'))
- buf->size *= 1024*1024;
-
- buf->status = strequal(tok[0],"active")?LPQ_PRINTING:LPQ_QUEUED;
- buf->priority = 0;
- buf->time = time(NULL);
- StrnCpy(buf->user,tok[1],sizeof(buf->user)-1);
- StrnCpy(buf->file,tok[6],sizeof(buf->file)-1);
- return(True);
-}
-
-
-
-char *stat0_strings[] = { "enabled", "online", "idle", "no entries", "free", "ready", NULL };
-char *stat1_strings[] = { "offline", "disabled", "down", "off", "waiting", "no daemon", NULL };
-char *stat2_strings[] = { "jam", "paper", "error", "responding", "not accepting", "not running", "turned off", NULL };
-
-/****************************************************************************
-parse a lpq line. Choose printing style
-****************************************************************************/
-static BOOL parse_lpq_entry(int snum,char *line,
- print_queue_struct *buf,
- print_status_struct *status,BOOL first)
-{
- BOOL ret;
-
- switch (lp_printing())
- {
- case PRINT_SYSV:
- ret = parse_lpq_sysv(line,buf,first);
- break;
- case PRINT_AIX:
- ret = parse_lpq_aix(line,buf,first);
- break;
- case PRINT_HPUX:
- ret = parse_lpq_hpux(line,buf,first);
- break;
- case PRINT_QNX:
- ret = parse_lpq_qnx(line,buf,first);
- break;
- case PRINT_LPRNG:
- ret = parse_lpq_lprng(line,buf,first);
- break;
- case PRINT_PLP:
- ret = parse_lpq_plp(line,buf,first);
- break;
- default:
- ret = parse_lpq_bsd(line,buf,first);
- break;
- }
-
-#ifdef LPQ_GUEST_TO_USER
- if (ret) {
- extern pstring sesssetup_user;
- /* change guest entries to the current logged in user to make
- them appear deletable to windows */
- if (sesssetup_user[0] && strequal(buf->user,lp_guestaccount(snum)))
- pstrcpy(buf->user,sesssetup_user);
- }
-#endif
-
- /* We don't want the newline in the status message. */
- {
- char *p = strchr(line,'\n');
- if (p) *p = 0;
- }
-
- if (status && !ret)
- {
- /* a few simple checks to see if the line might be a
- printer status line:
- handle them so that most severe condition is shown */
- int i;
- strlower(line);
-
- switch (status->status) {
- case LPSTAT_OK:
- for (i=0; stat0_strings[i]; i++)
- if (strstr(line,stat0_strings[i])) {
- StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_OK;
- }
- case LPSTAT_STOPPED:
- for (i=0; stat1_strings[i]; i++)
- if (strstr(line,stat1_strings[i])) {
- StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_STOPPED;
- }
- case LPSTAT_ERROR:
- for (i=0; stat2_strings[i]; i++)
- if (strstr(line,stat2_strings[i])) {
- StrnCpy(status->message,line,sizeof(status->message)-1);
- status->status=LPSTAT_ERROR;
- }
- break;
- }
- }
-
- return(ret);
-}
-
-/****************************************************************************
-get a printer queue
-****************************************************************************/
-int get_printqueue(int snum,int cnum,print_queue_struct **queue,
- print_status_struct *status)
-{
- char *lpq_command = lp_lpqcommand(snum);
- char *printername = PRINTERNAME(snum);
- int ret=0,count=0;
- pstring syscmd;
- fstring outfile;
- pstring line;
- FILE *f;
- struct stat sbuf;
- BOOL dorun=True;
- int cachetime = lp_lpqcachetime();
-
- *line = 0;
- check_lpq_cache(snum);
-
- if (!printername || !*printername)
- {
- DEBUG(6,("xx replacing printer name with service (snum=(%s,%d))\n",
- lp_servicename(snum),snum));
- printername = lp_servicename(snum);
- }
-
- if (!lpq_command || !(*lpq_command))
- {
- DEBUG(5,("No lpq command\n"));
- return(0);
- }
-
- pstrcpy(syscmd,lpq_command);
- string_sub(syscmd,"%p",printername);
-
- standard_sub(cnum,syscmd);
-
- sprintf(outfile,"%s/lpq.%08x",tmpdir(),str_checksum(syscmd));
-
- if (!lpq_cache_reset[snum] && cachetime && !stat(outfile,&sbuf))
- {
- if (time(NULL) - sbuf.st_mtime < cachetime) {
- DEBUG(3,("Using cached lpq output\n"));
- dorun = False;
- }
- }
-
- if (dorun) {
- ret = smbrun(syscmd,outfile,True);
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
- }
-
- lpq_cache_reset[snum] = False;
-
- f = fopen(outfile,"r");
- if (!f) {
- return(0);
- }
-
- if (status) {
- strcpy(status->message,"");
- status->status = LPSTAT_OK;
- }
-
- while (fgets(line,sizeof(pstring),f))
- {
- DEBUG(6,("QUEUE2: %s\n",line));
-
- *queue = Realloc(*queue,sizeof(print_queue_struct)*(count+1));
- if (! *queue)
- {
- count = 0;
- break;
- }
-
- bzero((char *)&(*queue)[count],sizeof(**queue));
-
- /* parse it */
- if (!parse_lpq_entry(snum,line,&(*queue)[count],status,count==0))
- continue;
-
- count++;
- }
-
- fclose(f);
-
- if (!cachetime) {
- unlink(outfile);
- } else {
- /* we only expect this to succeed on trapdoor systems, on normal systems
- the file is owned by root */
- chmod(outfile,0666);
- }
- return(count);
-}
-
-
-/****************************************************************************
-delete a printer queue entry
-****************************************************************************/
-void del_printqueue(int cnum,int snum,int jobid)
-{
- char *lprm_command = lp_lprmcommand(snum);
- char *printername = PRINTERNAME(snum);
- pstring syscmd;
- char jobstr[20];
- int ret;
-
- if (!printername || !*printername)
- {
- DEBUG(6,("replacing printer name with service (snum=(%s,%d))\n",
- lp_servicename(snum),snum));
- printername = lp_servicename(snum);
- }
-
- if (!lprm_command || !(*lprm_command))
- {
- DEBUG(5,("No lprm command\n"));
- return;
- }
-
- sprintf(jobstr,"%d",jobid);
-
- pstrcpy(syscmd,lprm_command);
- string_sub(syscmd,"%p",printername);
- string_sub(syscmd,"%j",jobstr);
- standard_sub(cnum,syscmd);
-
- ret = smbrun(syscmd,NULL,False);
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
- lpq_reset(snum); /* queue has changed */
-}
-
-/****************************************************************************
-change status of a printer queue entry
-****************************************************************************/
-void status_printjob(int cnum,int snum,int jobid,int status)
-{
- char *lpstatus_command =
- (status==LPQ_PAUSED?lp_lppausecommand(snum):lp_lpresumecommand(snum));
- char *printername = PRINTERNAME(snum);
- pstring syscmd;
- char jobstr[20];
- int ret;
-
- if (!printername || !*printername)
- {
- DEBUG(6,("replacing printer name with service (snum=(%s,%d))\n",
- lp_servicename(snum),snum));
- printername = lp_servicename(snum);
- }
-
- if (!lpstatus_command || !(*lpstatus_command))
- {
- DEBUG(5,("No lpstatus command to %s job\n",
- (status==LPQ_PAUSED?"pause":"resume")));
- return;
- }
-
- sprintf(jobstr,"%d",jobid);
-
- pstrcpy(syscmd,lpstatus_command);
- string_sub(syscmd,"%p",printername);
- string_sub(syscmd,"%j",jobstr);
- standard_sub(cnum,syscmd);
-
- ret = smbrun(syscmd,NULL,False);
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
- lpq_reset(snum); /* queue has changed */
-}
-
-
-
-/****************************************************************************
-we encode print job numbers over the wire so that when we get them back we can
-tell not only what print job they are but also what service it belongs to,
-this is to overcome the problem that windows clients tend to send the wrong
-service number when doing print queue manipulation!
-****************************************************************************/
-int printjob_encode(int snum, int job)
-{
- return ((snum&0xFF)<<8) | (job & 0xFF);
-}
-
-/****************************************************************************
-and now decode them again ...
-****************************************************************************/
-void printjob_decode(int jobid, int *snum, int *job)
-{
- (*snum) = (jobid >> 8) & 0xFF;
- (*job) = jobid & 0xFF;
-}
diff --git a/source/script/addtosmbpass b/source/script/addtosmbpass
deleted file mode 100644
index 42af518397c..00000000000
--- a/source/script/addtosmbpass
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/awk -f
-# edit the line above to point to your real location of awk interpreter
-
-# awk program for adding new entries in smbpasswd files
-# arguments are account names to add; feed it an existent Samba password
-# file on stdin, results will be written on stdout
-#
-# Michal Jaegermann, michal@ellpspace.math.ualberta.ca, 1995-11-09
-
-BEGIN {
- me = "addtosmbpass";
- count = ARGC;
- FS = ":";
-
- if (count == 1) {
- print "Usage:", me,
- "name1 [name2 ....] < smbpasswd.in > smbpasswd.out";
- ARGV[1] = "/dev/null";
- ARGC = 2;
- exit;
- }
-
- for(i = 1; i < count; i++) {
- names[ARGV[i]] = " ";
- delete ARGV[i];
- }
-# sane awk should work simply with 'ARGC = 1', but not every awk
-# implementation is sane - big sigh!!
- ARGV[1] = "-";
- ARGC = 2;
-#
-# If you have ypmatch but is not RPC registered (some Linux systems
-# for example) comment out the next line.
-# "which ypmatch" | getline ypmatch;
- if (1 != match(ypmatch, /^\//)) {
- ypmatch = "";
- }
- pwdf = "/etc/passwd";
-}
-#check for names already present in input
-{
- print $0;
- for(name in names) {
- if($1 ~ name) {
- delete names[name];
- }
- }
-}
-END {
- fmt = "%s:%s:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:";
- fmt = fmt "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:%s:%s:%s\n";
- for(name in names) {
- while ((getline < pwdf) > 0) {
- if ($1 == name) {
- printf(fmt, $1, $3, $5, $6, $7);
- close(pwdf);
- notfound = "";
- break;
- }
- notfound = "n";
- }
- $0 = "";
- if (notfound && ypmatch) {
-# try to find in NIS databases
- command = ypmatch " " name " passwd";
- command | getline;
- if (NF > 0) {
- printf(fmt, $1, $3, $5, $6, $7);
- }
- close(command);
- }
- }
-}
-
diff --git a/source/script/installbin.sh b/source/script/installbin.sh
deleted file mode 100755
index b976a3e5ea8..00000000000
--- a/source/script/installbin.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-INSTALLPERMS=$1
-BASEDIR=$2
-BINDIR=$3
-LIBDIR=$4
-VARDIR=$5
-shift
-shift
-shift
-shift
-shift
-
-for d in $BASEDIR $BINDIR $LIBDIR $VARDIR; do
-if [ ! -d $d ]; then
-mkdir $d
-if [ ! -d $d ]; then
- echo Failed to make directory $d
- exit 1
-fi
-fi
-done
-
-
-for p in $*; do
- echo Installing $p as $BINDIR/$p
- if [ -f $BINDIR/$p ]; then
- mv $BINDIR/$p $BINDIR/$p.old
- fi
- cp $p $BINDIR/$p
- chmod $INSTALLPERMS $BINDIR/$p
-done
-
-
-cat << EOF
-======================================================================
-The binaries are installed. You may restore the old binaries (if there
-were any) using the command "make revert". You may uninstall the binaries
-using the command "make uninstallbin" or "make uninstall" to uninstall
-binaries, man pages and shell scripts.
-======================================================================
-EOF
-
-exit 0
-
diff --git a/source/script/installcp.sh b/source/script/installcp.sh
deleted file mode 100755
index bafd84146d7..00000000000
--- a/source/script/installcp.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-LIBDIR=$1
-CODEPAGEDIR=$2
-BINDIR=$3
-
-shift
-shift
-shift
-
-echo Installing codepage files in $CODEPAGEDIR
-for d in $LIBDIR $CODEPAGEDIR; do
-if [ ! -d $d ]; then
-mkdir $d
-if [ ! -d $d ]; then
- echo Failed to make directory $d
- exit 1
-fi
-fi
-done
-
-for p in $*; do
- echo Creating codepage file $CODEPAGEDIR/codepage.$p from codepage_def.$p
- $BINDIR/make_smbcodepage c $p codepage_def.$p $CODEPAGEDIR/codepage.$p
-done
-
-
-cat << EOF
-======================================================================
-The code pages have been installed. You may uninstall them using the command
-the command "make uninstallcp" or make "uninstall" to uninstall binaries,
-man pages, shell scripts and code pages.
-======================================================================
-EOF
-
-exit 0
-
diff --git a/source/script/installman.sh b/source/script/installman.sh
deleted file mode 100755
index 3c8fc718654..00000000000
--- a/source/script/installman.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#5 July 96 Dan.Shearer@unisa.edu.au removed hardcoded values
-
-MANDIR=$1
-SRCDIR=$2
-
-echo Installing man pages in $MANDIR
-
-for d in $MANDIR $MANDIR/man1 $MANDIR/man5 $MANDIR/man7 $MANDIR/man8; do
-if [ ! -d $d ]; then
-mkdir $d
-if [ ! -d $d ]; then
- echo Failed to make directory $d, does $USER have privileges?
- exit 1
-fi
-fi
-done
-
-for sect in 1 5 7 8 ; do
- for m in $MANDIR/man$sect ; do
- for s in $SRCDIR../docs/*$sect; do
- FNAME=$m/`basename $s`
- cp $s $m || echo Cannot create $FNAME... does $USER have privileges?
- chmod 0644 $FNAME
- done
- done
-done
-
-cat << EOF
-======================================================================
-The man pages have been installed. You may uninstall them using the command
-the command "make uninstallman" or make "uninstall" to uninstall binaries,
-man pages and shell scripts.
-======================================================================
-EOF
-
-exit 0
-
diff --git a/source/script/installscripts.sh b/source/script/installscripts.sh
deleted file mode 100755
index 1a230c8cfa2..00000000000
--- a/source/script/installscripts.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-# this script courtesy of James_K._Foote.PARC@xerox.com
-# 5 July 96 Dan.Shearer@UniSA.Edu.Au Don't hardcode script names, get from Make
-
-INSTALLPERMS=$1
-BINDIR=$2
-
-shift
-shift
-
-echo Installing scripts in $BINDIR
-
-for d in $BINDIR; do
- if [ ! -d $d ]; then
- mkdir $d
- if [ ! -d $d ]; then
- echo Failed to make directory $d
- echo Have you run installbin first?
- exit 1
- fi
- fi
-done
-
-for p in $*; do
- echo Installing $BINDIR/$p
- cp $p $BINDIR/$p
- if [ ! -f $BINDIR/$p ]; then
- echo Cannot copy $p... does $USER have privileges?
- fi
- echo Setting permissions on $BINDIR/$p
- chmod $INSTALLPERMS $BINDIR/$p
-done
-
-cat << EOF
-======================================================================
-The scripts have been installed. You may uninstall them using
-the command "make uninstallscripts" or "make install" to install binaries,
-man pages and shell scripts. You may recover the previous version (if any
-by "make revert".
-======================================================================
-EOF
-
-exit 0
diff --git a/source/script/mkproto.awk b/source/script/mkproto.awk
deleted file mode 100644
index 1ccf2fb2b0a..00000000000
--- a/source/script/mkproto.awk
+++ /dev/null
@@ -1,82 +0,0 @@
-BEGIN {
- inheader=0;
- current_file="";
- print "/* This file is automatically generated with \"make proto\". DO NOT EDIT */"
- print ""
-}
-
-{
- if (FILENAME!=current_file) {
- print ""
- print "/*The following definitions come from ",FILENAME," */"
- print ""
- current_file=FILENAME
- }
- if (inheader) {
- if (match($0,"[)][ \t]*$")) {
- inheader = 0;
- printf "%s;\n",$0;
- } else {
- printf "%s\n",$0;
- }
- next;
- }
-}
-
-# we handle the loadparm.c fns separately
-
-/^FN_LOCAL_BOOL/ {
- split($0,a,"[,()]")
- printf "BOOL %s(int );\n", a[2]
-}
-
-/^FN_LOCAL_STRING/ {
- split($0,a,"[,()]")
- printf "char *%s(int );\n", a[2]
-}
-
-/^FN_LOCAL_INT/ {
- split($0,a,"[,()]")
- printf "int %s(int );\n", a[2]
-}
-
-/^FN_LOCAL_CHAR/ {
- split($0,a,"[,()]")
- printf "char %s(int );\n", a[2]
-}
-
-/^FN_GLOBAL_BOOL/ {
- split($0,a,"[,()]")
- printf "BOOL %s(void);\n", a[2]
-}
-
-/^FN_GLOBAL_STRING/ {
- split($0,a,"[,()]")
- printf "char *%s(void);\n", a[2]
-}
-
-/^FN_GLOBAL_INT/ {
- split($0,a,"[,()]")
- printf "int %s(void);\n", a[2]
-}
-
-/^static|^extern/ || !/^[a-zA-Z]/ || /[;]/ {
- next;
-}
-
-!/^unsigned|^mode_t|^DIR|^user|^int|^char|^uint|^struct|^BOOL|^void|^time|^smb_shm_offset_t|^shm_offset_t|^enum remote_arch_types|arc4_key/ {
- next;
-}
-
-
-/[(].*[)][ \t]*$/ {
- printf "%s;\n",$0;
- next;
-}
-
-/[(]/ {
- inheader=1;
- printf "%s\n",$0;
- next;
-}
-
diff --git a/source/script/mksmbpasswd.sh b/source/script/mksmbpasswd.sh
deleted file mode 100755
index 6e592acd652..00000000000
--- a/source/script/mksmbpasswd.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-awk 'BEGIN {FS=":"
- printf("#\n# SMB password file.\n#\n")
- }
-{ printf( "%s:%s:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:%s:%s:%s\n", $1, $3, $5, $6, $7) }
-'
diff --git a/source/script/revert.sh b/source/script/revert.sh
deleted file mode 100755
index 68b47bf39d0..00000000000
--- a/source/script/revert.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-BINDIR=$1
-shift
-
-for p in $*; do
- if [ -f $BINDIR/$p.old ]; then
- echo Restoring $BINDIR/$p.old as $BINDIR/$p
- mv $BINDIR/$p $BINDIR/$p.new
- mv $BINDIR/$p.old $BINDIR/$p
- rm -f $BINDIR/$p.new
- fi
-done
-
-exit 0
-
diff --git a/source/script/smbtar b/source/script/smbtar
deleted file mode 100644
index dcf01edb208..00000000000
--- a/source/script/smbtar
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/bin/sh
-#
-# smbtar script - front end to smbclient
-#
-# Authors: Martin.Kraemer <Martin.Kraemer@mch.sni.de>
-# and Ricky Poulten (ricky@logcam.co.uk)
-#
-# (May need to change shell to ksh for HPUX or OSF for better getopts)
-
-case $0 in
- # when called by absolute path, assume smbclient is in the same directory
- /*)
- SMBCLIENT="`dirname $0`/smbclient";;
- *) # you may need to edit this to show where your smbclient is
- SMBCLIENT="smbclient";;
-esac
-
-# These are the default values. You could fill them in if you know what
-# you're doing, but beware: better not store a plain text password!
-server=""
-service="backup" # Default: a service called "backup"
-password=""
-username=$LOGNAME # Default: same user name as in *nix
-verbose="2>/dev/null" # Default: no echo to stdout
-log="-d 2"
-newer=""
-blocksize=""
-tarcmd="c"
-tarargs=""
-cdcmd="\\"
-tapefile=${TAPE-tar.out}
-
-Usage(){
- ex=$1
- shift
-echo >&2 "Usage: `basename $0` [<options>] [<include/exclude files>]
-Function: backup/restore a Windows PC directories to a local tape file
-Options: (Description) (Default)
- -r Restore from tape file to PC Save from PC to tapefile
- -i Incremental mode Full backup mode
- -v Verbose mode: echo command Don't echo anything
- -s <server> Specify PC Server $server
- -p <password> Specify PC Password $password
- -x <share> Specify PC Share $service
- -X Exclude mode Include
- -N <newer> File for date comparison `set -- $newer; echo $2`
- -b <blocksize> Specify tape's blocksize `set -- $blocksize; echo $2`
- -d <dir> Specify a directory in share $cdcmd
- -l <log> Specify a Samba Log Level `set -- $log; echo $2`
- -u <user> Specify User Name $username
- -t <tape> Specify Tape device $tapefile
-"
- echo >&2 "$@"
- exit $ex
-}
-
-while getopts rivl:b:d:N:s:p:x:u:Xt: c; do
- case $c in
- r) # [r]estore to Windows (instead of the default "Save from Windows")
- tarcmd="x"
- ;;
- i) # [i]ncremental
- tarargs=${tarargs}g
- ;;
- l) # specify [l]og file
- log="-d $OPTARG"
- case "$OPTARG" in
- [0-9]*) ;;
- *) echo >&2 "$0: Error, log level not numeric: -l $OPTARG"
- exit 1
- esac
- ;;
- d) # specify [d]irectory to change to in server's share
- cdcmd="$OPTARG"
- ;;
- N) # compare with a file, test if [n]ewer
- if [ -f $OPTARG ]; then
- newer=$OPTARG
- tarargs=${tarargs}N
- else
- echo >&2 $0: Warning, $OPTARG not found
- fi
- ;;
- X) # Add exclude flag
- tarargs=${tarargs}X
- ;;
- s) # specify [s]erver's share to connect to - this MUST be given.
- server="$OPTARG"
- ;;
- b) # specify [b]locksize
- blocksize="$OPTARG"
- case "$OPTARG" in
- [0-9]*) ;;
- *) echo >&2 "$0: Error, block size not numeric: -b $OPTARG"
- exit 1
- esac
- tarargs=${tarargs}b
- ;;
- p) # specify [p]assword to use
- password="$OPTARG"
- ;;
- x) # specify windows [s]hare to use
- service="$OPTARG"
- ;;
- t) # specify [t]apefile on local host
- tapefile="$OPTARG"
- ;;
- u) # specify [u]sername for connection
- username="$OPTARG"
- ;;
- v) # be [v]erbose and display what's going on
- verbose=""
- ;;
- '?') # any other switch
- Usage 2 "Invalid switch specified - abort."
- ;;
- esac
-done
-
-shift `expr $OPTIND - 1`
-
-if [ "$server" = "" ] || [ "$service" = "" ]; then
- Usage 1 "No server or no service specified - abort."
-fi
-
-# if the -v switch is set, the echo the current parameters
-if [ -z "$verbose" ]; then
- echo "server is $server"
-# echo "share is $service"
- echo "share is $service\\$cdcmd"
- echo "tar args is $tarargs"
-# echo "password is $password" # passwords should never be sent to screen
- echo "tape is $tapefile"
- echo "blocksize is $blocksize"
-fi
-
-eval $SMBCLIENT "'\\\\$server\\$service'" "'$password'" -U "'$username'" \
--E -N $log -D "'$cdcmd'" \
--T${tarcmd}${tarargs} $blocksize $newer $tapefile $* $verbose
-
diff --git a/source/script/uninstallbin.sh b/source/script/uninstallbin.sh
deleted file mode 100755
index fab36804a29..00000000000
--- a/source/script/uninstallbin.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-#4 July 96 Dan.Shearer@UniSA.edu.au
-
-INSTALLPERMS=$1
-BASEDIR=$2
-BINDIR=$3
-LIBDIR=$4
-VARDIR=$5
-shift
-shift
-shift
-shift
-shift
-
-if [ ! -d $BINDIR ]; then
- echo Directory $BINDIR does not exist!
- echo Do a "make installbin" or "make install" first.
- exit 1
-fi
-
-for p in $*; do
- if [ ! -f $BINDIR/$p ]; then
- echo $BINDIR/$p does not exist!
- else
- echo Removing $BINDIR/$p
- rm -f $BINDIR/$p
- if [ -f $BINDIR/$p ]; then
- echo Cannot remove $BINDIR/$p... does $USER have privileges?
- fi
- fi
-done
-
-
-cat << EOF
-======================================================================
-The binaries have been uninstalled. You may restore the binaries using
-the command "make installbin" or "make install" to install binaries,
-man pages and shell scripts. You can restore a previous version of the
-binaries (if there were any) using "make revert".
-======================================================================
-EOF
-
-exit 0
diff --git a/source/script/uninstallcp.sh b/source/script/uninstallcp.sh
deleted file mode 100755
index bd7013c358f..00000000000
--- a/source/script/uninstallcp.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-CPDIR=$1
-shift
-
-if [ ! -d $CPDIR ]; then
- echo Directory $CPDIR does not exist!
- echo Do a "make installcp" or "make install" first.
- exit 1
-fi
-
-for p in $*; do
- if [ ! -f $CPDIR/codepage.$p ]; then
- echo $CPDIR/codepage.$p does not exist!
- else
- echo Removing $CPDIR/codepage.$p
- rm -f $CPDIR/codepage.$p
- if [ -f $CPDIR/codepage.$p ]; then
- echo Cannot remove $CPDIR/codepage.$p... does $USER have privileges?
- fi
- fi
-done
-
-cat << EOF
-======================================================================
-The code pages have been uninstalled. You may reinstall them using
-the command "make installcp" or "make install" to install binaries,
-man pages, shell scripts and code pages. You may recover a previous version
-(if any with "make revert").
-======================================================================
-EOF
-
-exit 0
diff --git a/source/script/uninstallman.sh b/source/script/uninstallman.sh
deleted file mode 100755
index b4d4bfc1f92..00000000000
--- a/source/script/uninstallman.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-#4 July 96 Dan.Shearer@UniSA.edu.au
-
-MANDIR=$1
-SRCDIR=$2
-
-echo Uninstalling man pages from $MANDIR
-
-for sect in 1 5 7 8 ; do
- for m in $MANDIR/man$sect ; do
- for s in $SRCDIR../docs/*$sect; do
- FNAME=$m/`basename $s`
- if test -f $FNAME; then
- echo Deleting $FNAME
- rm -f $FNAME
- test -f $FNAME && echo Cannot remove $FNAME... does $USER have privileges?
- else
- echo $FNAME does not exist! Check defines in the Makefile
- fi
- done
- done
-done
-
-cat << EOF
-======================================================================
-The man pages have been uninstalled. You may install them again using
-the command "make installman" or make "install" to install binaries,
-man pages and shell scripts.
-======================================================================
-EOF
-exit 0
diff --git a/source/script/uninstallscripts.sh b/source/script/uninstallscripts.sh
deleted file mode 100755
index ae907546f2e..00000000000
--- a/source/script/uninstallscripts.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-# 5 July 96 Dan.Shearer@UniSA.Edu.Au - almost identical to uninstallbin.sh
-
-INSTALLPERMS=$1
-BINDIR=$2
-
-shift
-shift
-
-if [ ! -d $BINDIR ]; then
- echo Directory $BINDIR does not exist!
- echo Do a "make installscripts" or "make install" first.
- exit 1
-fi
-
-for p in $*; do
- if [ ! -f $BINDIR/$p ]; then
- echo $BINDIR/$p does not exist!
- else
- echo Removing $BINDIR/$p
- rm -f $BINDIR/$p
- if [ -f $BINDIR/$p ]; then
- echo Cannot remove $BINDIR/$p... does $USER have privileges?
- fi
- fi
-done
-
-cat << EOF
-======================================================================
-The scripts have been uninstalled. You may reinstall them using
-the command "make installscripts" or "make install" to install binaries,
-man pages and shell scripts. You may recover a previous version (if any
-with "make revert".
-======================================================================
-EOF
-
-exit 0
diff --git a/source/script/updatesmbpasswd.sh b/source/script/updatesmbpasswd.sh
deleted file mode 100755
index 1d7e0d7332f..00000000000
--- a/source/script/updatesmbpasswd.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-nawk 'BEGIN {FS=":"}
-{
- if( $0 ~ "^#" ) {
- print $0
- } else if( (length($4) == 32) && (($4 ~ "^[0-9A-F]*$") || ($4 ~ "^[X]*$") || ( $4 ~ "^[*]*$"))) {
- print $0
- } else {
- printf( "%s:%s:%s:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:", $1, $2, $3);
- for(i = 4; i <= NF; i++)
- printf("%s:", $i)
- printf("\n")
- }
-}'
diff --git a/source/smbadduser b/source/smbadduser
deleted file mode 100755
index 789cc927eb1..00000000000
--- a/source/smbadduser
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/csh
-#
-# smbadduser - Written by Mike Zakharoff
-#
-unalias *
-set path = ($path /usr/local/samba/bin)
-
-set smbpasswd = /usr/local/samba/private/smbpasswd
-set user_map = /usr/local/samba/lib/users.map
-#
-# Set to site specific passwd command
-#
-#set passwd = "cat /etc/passwd"
-#set passwd = "niscat passwd.org_dir"
-set passwd = "ypcat passwd"
-
-set line = "----------------------------------------------------------"
-if ($#argv == 0) then
- echo $line
- echo "Written: Mike Zakharoff email: michael.j.zakharoff@boeing.com"
- echo ""
- echo " 1) Updates $smbpasswd"
- echo " 2) Updates $user_map"
- echo " 3) Executes smbpasswd for each new user"
- echo ""
- echo "smbadduser unixid:ntid unixid:ntid ..."
- echo ""
- echo "Example: smbadduser zak:zakharoffm johns:smithj"
- echo $line
- exit 1
-endif
-
-touch $smbpasswd $user_map
-set new = ()
-foreach one ($argv)
- echo $one | grep ':' >& /dev/null
- if ($status != 0) then
- echo "ERROR: Must use unixid:ntid like -> zak:zakharoffm"
- continue
- endif
- set unix = `echo $one | awk -F: '{print $1}'`
- set ntid = `echo $one | awk -F: '{print $2}'`
-
- set usr = `eval $passwd | awk -F: '$1==USR {print $1}' USR=$unix`
- if ($#usr != 1) then
- echo "ERROR: $unix Not in passwd database SKIPPING..."
- continue
- endif
- set tmp = `cat $smbpasswd | awk -F: '$1==USR {print $1}' USR=$unix`
- if ($#tmp != 0) then
- echo "ERROR: $unix is already in $smbpasswd SKIPPING..."
- continue
- endif
-
- echo "Adding: $unix to $smbpasswd"
- eval $passwd | \
- awk -F: '$1==USR { \
- printf( "%s:%s:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:%s:%s:%s\n",
-$1, $3, $5, $6, $7) }' USR=$unix >> $smbpasswd
- if ($unix != $ntid) then
- echo "Adding: {$unix = $ntid} to $user_map"
- echo "$unix = $ntid" >> $user_map
- endif
- set new = ($new $unix)
-end
-
-#
-# Enter password for new users
-#
-foreach one ($new)
- echo $line
- echo "ENTER password for $one"
- smbpasswd $one
-end \ No newline at end of file
diff --git a/source/smbd/chgpasswd.c b/source/smbd/chgpasswd.c
deleted file mode 100644
index bed81138b24..00000000000
--- a/source/smbd/chgpasswd.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Samba utility functions
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/* fork a child process to exec passwd and write to its
-* tty to change a users password. This is running as the
-* user who is attempting to change the password.
-*/
-
-/*
- * This code was copied/borrowed and stolen from various sources.
- * The primary source was the poppasswd.c from the authors of POPMail. This software
- * was included as a client to change passwords using the 'passwd' program
- * on the remote machine.
- *
- * This routine is called by set_user_password() in password.c only if ALLOW_PASSWORD_CHANGE
- * is defined in the compiler directives located in the Makefile.
- *
- * This code has been hacked by Bob Nance (nance@niehs.nih.gov) and Evan Patterson
- * (patters2@niehs.nih.gov) at the National Institute of Environmental Health Sciences
- * and rights to modify, distribute or incorporate this change to the CAP suite or
- * using it for any other reason are granted, so long as this disclaimer is left intact.
- */
-
-/*
- This code was hacked considerably for inclusion in Samba, primarily
- by Andrew.Tridgell@anu.edu.au. The biggest change was the addition
- of the "password chat" option, which allows the easy runtime
- specification of the expected sequence of events to change a
- password.
- */
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-#ifdef ALLOW_CHANGE_PASSWORD
-
-#define MINPASSWDLENGTH 5
-#define BUFSIZE 512
-
-static int findpty(char **slave)
-{
- int master;
-#if defined(SVR4) || defined(SUNOS5)
- extern char *ptsname();
-#else /* defined(SVR4) || defined(SUNOS5) */
- static char line[12];
- void *dirp;
- char *dpname;
-#endif /* defined(SVR4) || defined(SUNOS5) */
-
-#if defined(SVR4) || defined(SUNOS5)
- if ((master = open("/dev/ptmx", O_RDWR)) >= 1) {
- grantpt(master);
- unlockpt(master);
- *slave = ptsname(master);
- return (master);
- }
-#else /* defined(SVR4) || defined(SUNOS5) */
- strcpy( line, "/dev/ptyXX" );
-
- dirp = OpenDir(-1, "/dev", True);
- if (!dirp) return(-1);
- while ((dpname = ReadDirName(dirp)) != NULL) {
- if (strncmp(dpname, "pty", 3) == 0 && strlen(dpname) == 5) {
- DEBUG(3,("pty: try to open %s, line was %s\n", dpname, line ) );
- line[8] = dpname[3];
- line[9] = dpname[4];
- if ((master = open(line, O_RDWR)) >= 0) {
- DEBUG(3,("pty: opened %s\n", line ) );
- line[5] = 't';
- *slave = line;
- CloseDir(dirp);
- return (master);
- }
- }
- }
- CloseDir(dirp);
-#endif /* defined(SVR4) || defined(SUNOS5) */
- return (-1);
-}
-
-static int dochild(int master,char *slavedev, char *name, char *passwordprogram)
-{
- int slave;
- struct termios stermios;
- struct passwd *pass = Get_Pwnam(name,True);
- int gid = pass->pw_gid;
- int uid = pass->pw_uid;
-
-#ifdef USE_SETRES
- setresuid(0,0,0);
-#else /* USE_SETRES */
- setuid(0);
-#endif /* USE_SETRES */
-
- /* Start new session - gets rid of controlling terminal. */
- if (setsid() < 0) {
- DEBUG(3,("Weirdness, couldn't let go of controlling terminal\n"));
- return(False);
- }
-
- /* Open slave pty and acquire as new controlling terminal. */
- if ((slave = open(slavedev, O_RDWR)) < 0) {
- DEBUG(3,("More weirdness, could not open %s\n",
- slavedev));
- return(False);
- }
-#if defined(SVR4) || defined(SUNOS5)
- ioctl(slave, I_PUSH, "ptem");
- ioctl(slave, I_PUSH, "ldterm");
-#else /* defined(SVR4) || defined(SUNOS5) */
- if (ioctl(slave,TIOCSCTTY,0) <0) {
- DEBUG(3,("Error in ioctl call for slave pty\n"));
- /* return(False); */
- }
-#endif /* defined(SVR4) || defined(SUNOS5) */
-
- /* Close master. */
- close(master);
-
- /* Make slave stdin/out/err of child. */
-
- if (dup2(slave, STDIN_FILENO) != STDIN_FILENO) {
- DEBUG(3,("Could not re-direct stdin\n"));
- return(False);
- }
- if (dup2(slave, STDOUT_FILENO) != STDOUT_FILENO) {
- DEBUG(3,("Could not re-direct stdout\n"));
- return(False);
- }
- if (dup2(slave, STDERR_FILENO) != STDERR_FILENO) {
- DEBUG(3,("Could not re-direct stderr\n"));
- return(False);
- }
- if (slave > 2) close(slave);
-
- /* Set proper terminal attributes - no echo, canonical input processing,
- no map NL to CR/NL on output. */
-
- if (tcgetattr(0, &stermios) < 0) {
- DEBUG(3,("could not read default terminal attributes on pty\n"));
- return(False);
- }
- stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
- stermios.c_lflag |= ICANON;
- stermios.c_oflag &= ~(ONLCR);
- if (tcsetattr(0, TCSANOW, &stermios) < 0) {
- DEBUG(3,("could not set attributes of pty\n"));
- return(False);
- }
-
- /* make us completely into the right uid */
-#ifdef USE_SETRES
- setresgid(0,0,0);
- setresuid(0,0,0);
- setresgid(gid,gid,gid);
- setresuid(uid,uid,uid);
-#else
- setuid(0);
- seteuid(0);
- setgid(gid);
- setegid(gid);
- setuid(uid);
- seteuid(uid);
-#endif
-
- /* execl() password-change application */
- if (execl("/bin/sh","sh","-c",passwordprogram,NULL) < 0) {
- DEBUG(3,("Bad status returned from %s\n",passwordprogram));
- return(False);
- }
- return(True);
-}
-
-static int expect(int master,char *expected,char *buf)
-{
- int n, m;
-
- n = 0;
- buf[0] = 0;
- while (1) {
- if (n >= BUFSIZE-1) {
- return False;
- }
-
- /* allow 4 seconds for some output to appear */
- m = read_with_timeout(master, buf+n, 1, BUFSIZE-1-n, 4000);
- if (m < 0)
- return False;
-
- n += m;
- buf[n] = 0;
-
- {
- pstring s1,s2;
- pstrcpy(s1,buf);
- pstrcpy(s2,expected);
- if (do_match(s1, s2, False))
- return(True);
- }
- }
-}
-
-static void pwd_sub(char *buf)
-{
- string_sub(buf,"\\n","\n");
- string_sub(buf,"\\r","\r");
- string_sub(buf,"\\s"," ");
- string_sub(buf,"\\t","\t");
-}
-
-static void writestring(int fd,char *s)
-{
- int l;
-
- l = strlen (s);
- write (fd, s, l);
-}
-
-
-static int talktochild(int master, char *chatsequence)
-{
- char buf[BUFSIZE];
- int count=0;
- char *ptr=chatsequence;
- fstring chatbuf;
-
- *buf = 0;
- sleep(1);
-
- while (next_token(&ptr,chatbuf,NULL)) {
- BOOL ok=True;
- count++;
- pwd_sub(chatbuf);
- if (!strequal(chatbuf,"."))
- ok = expect(master,chatbuf,buf);
-
-#if DEBUG_PASSWORD
- DEBUG(100,("chatbuf=[%s] responsebuf=[%s]\n",chatbuf,buf));
-#endif
-
- if (!ok) {
- DEBUG(3,("response %d incorrect\n",count));
- return(False);
- }
-
- if (!next_token(&ptr,chatbuf,NULL)) break;
- pwd_sub(chatbuf);
- if (!strequal(chatbuf,"."))
- writestring(master,chatbuf);
-
-#if DEBUG_PASSWORD
- DEBUG(100,("sendbuf=[%s]\n",chatbuf));
-#endif
- }
-
- if (count<1) return(False);
-
- return (True);
-}
-
-
-BOOL chat_with_program(char *passwordprogram,char *name,char *chatsequence)
-{
- char *slavedev;
- int master;
- pid_t pid, wpid;
- int wstat;
- BOOL chstat;
-
- /* allocate a pseudo-terminal device */
- if ((master = findpty (&slavedev)) < 0) {
- DEBUG(3,("Cannot Allocate pty for password change: %s",name));
- return(False);
- }
-
- if ((pid = fork()) < 0) {
- DEBUG(3,("Cannot fork() child for password change: %s",name));
- return(False);
- }
-
- /* we now have a pty */
- if (pid > 0){ /* This is the parent process */
- if ((chstat = talktochild(master, chatsequence)) == False) {
- DEBUG(3,("Child failed to change password: %s\n",name));
- kill(pid, SIGKILL); /* be sure to end this process */
- return(False);
- }
- if ((wpid = sys_waitpid(pid, &wstat, 0)) < 0) {
- DEBUG(3,("The process is no longer waiting!\n\n"));
- return(False);
- }
- if (pid != wpid) {
- DEBUG(3,("We were waiting for the wrong process ID\n"));
- return(False);
- }
- if (WIFEXITED(wstat) == 0) {
- DEBUG(3,("The process exited while we were waiting\n"));
- return(False);
- }
- if (WEXITSTATUS(wstat) != 0) {
- DEBUG(3,("The status of the process exiting was %d\n", wstat));
- return(False);
- }
-
- } else {
- /* CHILD */
-
- /* make sure it doesn't freeze */
- alarm(20);
-
- DEBUG(3,("Dochild for user %s (uid=%d,gid=%d)\n",name,getuid(),getgid()));
- chstat = dochild(master, slavedev, name, passwordprogram);
- }
- DEBUG(3,("Password change %ssuccessful for user %s\n", (chstat?"":"un"), name));
- return (chstat);
-}
-
-
-BOOL chgpasswd(char *name,char *oldpass,char *newpass)
-{
- pstring passwordprogram;
- pstring chatsequence;
-
- strlower(name);
- DEBUG(3,("Password change for user: %s\n",name));
-
-#if DEBUG_PASSWORD
- DEBUG(100,("Passwords: old=%s new=%s\n",oldpass,newpass));
-#endif
-
- /* Take the passed information and test it for minimum criteria */
- /* Minimum password length */
- if (strlen(newpass) < MINPASSWDLENGTH) /* too short, must be at least MINPASSWDLENGTH */
- {
- DEBUG(2,("Password Change: %s, New password is shorter than MINPASSWDLENGTH\n",name));
- return (False); /* inform the user */
- }
-
- /* Password is same as old password */
- if (strcmp(oldpass,newpass) == 0) /* don't allow same password */
- {
- DEBUG(2,("Password Change: %s, New password is same as old\n",name)); /* log the attempt */
- return (False); /* inform the user */
- }
-
-#if (defined(PASSWD_PROGRAM) && defined(PASSWD_CHAT))
- pstrcpy(passwordprogram,PASSWD_PROGRAM);
- pstrcpy(chatsequence,PASSWD_CHAT);
-#else
- pstrcpy(passwordprogram,lp_passwd_program());
- pstrcpy(chatsequence,lp_passwd_chat());
-#endif
-
- if (!*chatsequence) {
- DEBUG(2,("Null chat sequence - no password changing\n"));
- return(False);
- }
-
- if (!*passwordprogram) {
- DEBUG(2,("Null password program - no password changing\n"));
- return(False);
- }
-
- string_sub(passwordprogram,"%u",name);
- string_sub(passwordprogram,"%o",oldpass);
- string_sub(passwordprogram,"%n",newpass);
-
- string_sub(chatsequence,"%u",name);
- string_sub(chatsequence,"%o",oldpass);
- string_sub(chatsequence,"%n",newpass);
- return(chat_with_program(passwordprogram,name,chatsequence));
-}
-
-#else
-BOOL chgpasswd(char *name,char *oldpass,char *newpass)
-{
- DEBUG(0,("Password changing not compiled in (user=%s)\n",name));
- return(False);
-}
-#endif
diff --git a/source/smbd/dir.c b/source/smbd/dir.c
deleted file mode 100644
index 316b58818fd..00000000000
--- a/source/smbd/dir.c
+++ /dev/null
@@ -1,996 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Directory handling routines
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-extern connection_struct Connections[];
-
-/*
- This module implements directory related functions for Samba.
-*/
-
-
-
-uint32 dircounter = 0;
-
-
-#define NUMDIRPTRS 256
-
-
-static struct dptr_struct
-{
- int pid;
- int cnum;
- uint32 lastused;
- void *ptr;
- BOOL valid;
- BOOL finished;
- BOOL expect_close;
- char *wcard; /* Field only used for lanman2 trans2_findfirst/next searches */
- uint16 attr; /* Field only used for lanman2 trans2_findfirst/next searches */
- char *path;
-}
-dirptrs[NUMDIRPTRS];
-
-
-static int dptrs_open = 0;
-
-/****************************************************************************
-initialise the dir array
-****************************************************************************/
-void init_dptrs(void)
-{
- static BOOL dptrs_init=False;
- int i;
-
- if (dptrs_init) return;
- for (i=0;i<NUMDIRPTRS;i++)
- {
- dirptrs[i].valid = False;
- dirptrs[i].wcard = NULL;
- dirptrs[i].ptr = NULL;
- string_init(&dirptrs[i].path,"");
- }
- dptrs_init = True;
-}
-
-/****************************************************************************
-idle a dptr - the directory is closed but the control info is kept
-****************************************************************************/
-static void dptr_idle(int key)
-{
- if (dirptrs[key].valid && dirptrs[key].ptr) {
- DEBUG(4,("Idling dptr key %d\n",key));
- dptrs_open--;
- CloseDir(dirptrs[key].ptr);
- dirptrs[key].ptr = NULL;
- }
-}
-
-/****************************************************************************
-idle the oldest dptr
-****************************************************************************/
-static void dptr_idleoldest(void)
-{
- int i;
- uint32 old=dircounter+1;
- int oldi= -1;
- for (i=0;i<NUMDIRPTRS;i++)
- if (dirptrs[i].valid && dirptrs[i].ptr && dirptrs[i].lastused < old) {
- old = dirptrs[i].lastused;
- oldi = i;
- }
- if (oldi != -1)
- dptr_idle(oldi);
- else
- DEBUG(0,("No dptrs available to idle??\n"));
-}
-
-/****************************************************************************
-get the dir ptr for a dir index
-****************************************************************************/
-static void *dptr_get(int key,uint32 lastused)
-{
- struct dptr_struct *dp = &dirptrs[key];
-
- if (dp->valid) {
- if (lastused) dp->lastused = lastused;
- if (!dp->ptr) {
- if (dptrs_open >= MAXDIR)
- dptr_idleoldest();
- DEBUG(4,("Reopening dptr key %d\n",key));
- if ((dp->ptr = OpenDir(dp->cnum, dp->path, True)))
- dptrs_open++;
- }
- return(dp->ptr);
- }
- return(NULL);
-}
-
-/****************************************************************************
-get the dir path for a dir index
-****************************************************************************/
-char *dptr_path(int key)
-{
- if (dirptrs[key].valid)
- return(dirptrs[key].path);
- return(NULL);
-}
-
-/****************************************************************************
-get the dir wcard for a dir index (lanman2 specific)
-****************************************************************************/
-char *dptr_wcard(int key)
-{
- if (dirptrs[key].valid)
- return(dirptrs[key].wcard);
- return(NULL);
-}
-
-/****************************************************************************
-set the dir wcard for a dir index (lanman2 specific)
-Returns 0 on ok, 1 on fail.
-****************************************************************************/
-BOOL dptr_set_wcard(int key, char *wcard)
-{
- if (dirptrs[key].valid) {
- dirptrs[key].wcard = wcard;
- return True;
- }
- return False;
-}
-
-/****************************************************************************
-set the dir attrib for a dir index (lanman2 specific)
-Returns 0 on ok, 1 on fail.
-****************************************************************************/
-BOOL dptr_set_attr(int key, uint16 attr)
-{
- if (dirptrs[key].valid) {
- dirptrs[key].attr = attr;
- return True;
- }
- return False;
-}
-
-/****************************************************************************
-get the dir attrib for a dir index (lanman2 specific)
-****************************************************************************/
-uint16 dptr_attr(int key)
-{
- if (dirptrs[key].valid)
- return(dirptrs[key].attr);
- return(0);
-}
-
-/****************************************************************************
-close a dptr
-****************************************************************************/
-void dptr_close(int key)
-{
- /* OS/2 seems to use -1 to indicate "close all directories" */
- if (key == -1) {
- int i;
- for (i=0;i<NUMDIRPTRS;i++)
- dptr_close(i);
- return;
- }
-
- if (key < 0 || key >= NUMDIRPTRS) {
- DEBUG(3,("Invalid key %d given to dptr_close\n",key));
- return;
- }
-
- if (dirptrs[key].valid) {
- DEBUG(4,("closing dptr key %d\n",key));
- if (dirptrs[key].ptr) {
- CloseDir(dirptrs[key].ptr);
- dptrs_open--;
- }
- /* Lanman 2 specific code */
- if (dirptrs[key].wcard)
- free(dirptrs[key].wcard);
- dirptrs[key].valid = False;
- string_set(&dirptrs[key].path,"");
- }
-}
-
-/****************************************************************************
-close all dptrs for a cnum
-****************************************************************************/
-void dptr_closecnum(int cnum)
-{
- int i;
- for (i=0;i<NUMDIRPTRS;i++)
- if (dirptrs[i].valid && dirptrs[i].cnum == cnum)
- dptr_close(i);
-}
-
-/****************************************************************************
-idle all dptrs for a cnum
-****************************************************************************/
-void dptr_idlecnum(int cnum)
-{
- int i;
- for (i=0;i<NUMDIRPTRS;i++)
- if (dirptrs[i].valid && dirptrs[i].cnum == cnum && dirptrs[i].ptr)
- dptr_idle(i);
-}
-
-/****************************************************************************
-close a dptr that matches a given path, only if it matches the pid also
-****************************************************************************/
-void dptr_closepath(char *path,int pid)
-{
- int i;
- for (i=0;i<NUMDIRPTRS;i++)
- if (dirptrs[i].valid && pid == dirptrs[i].pid &&
- strequal(dirptrs[i].path,path))
- dptr_close(i);
-}
-
-/****************************************************************************
- start a directory listing
-****************************************************************************/
-static BOOL start_dir(int cnum,char *directory)
-{
- DEBUG(5,("start_dir cnum=%d dir=%s\n",cnum,directory));
-
- if (!check_name(directory,cnum))
- return(False);
-
- if (! *directory)
- directory = ".";
-
- Connections[cnum].dirptr = OpenDir(cnum, directory, True);
- if (Connections[cnum].dirptr) {
- dptrs_open++;
- string_set(&Connections[cnum].dirpath,directory);
- return(True);
- }
-
- return(False);
-}
-
-
-/****************************************************************************
-create a new dir ptr
-****************************************************************************/
-int dptr_create(int cnum,char *path, BOOL expect_close,int pid)
-{
- int i;
- uint32 old;
- int oldi;
-
- if (!start_dir(cnum,path))
- return(-2); /* Code to say use a unix error return code. */
-
- if (dptrs_open >= MAXDIR)
- dptr_idleoldest();
-
- for (i=0;i<NUMDIRPTRS;i++)
- if (!dirptrs[i].valid)
- break;
- if (i == NUMDIRPTRS) i = -1;
-
-
- /* as a 2nd option, grab the oldest not marked for expect_close */
- if (i == -1) {
- old=dircounter+1;
- oldi= -1;
- for (i=0;i<NUMDIRPTRS;i++)
- if (!dirptrs[i].expect_close && dirptrs[i].lastused < old) {
- old = dirptrs[i].lastused;
- oldi = i;
- }
- i = oldi;
- }
-
- /* a 3rd option - grab the oldest one */
- if (i == -1) {
- old=dircounter+1;
- oldi= -1;
- for (i=0;i<NUMDIRPTRS;i++)
- if (dirptrs[i].lastused < old) {
- old = dirptrs[i].lastused;
- oldi = i;
- }
- i = oldi;
- }
-
- if (i == -1) {
- DEBUG(0,("Error - all dirptrs in use??\n"));
- return(-1);
- }
-
- if (dirptrs[i].valid)
- dptr_close(i);
-
- dirptrs[i].ptr = Connections[cnum].dirptr;
- string_set(&dirptrs[i].path,path);
- dirptrs[i].lastused = dircounter++;
- dirptrs[i].finished = False;
- dirptrs[i].cnum = cnum;
- dirptrs[i].pid = pid;
- dirptrs[i].expect_close = expect_close;
- dirptrs[i].wcard = NULL; /* Only used in lanman2 searches */
- dirptrs[i].attr = 0; /* Only used in lanman2 searches */
- dirptrs[i].valid = True;
-
- DEBUG(3,("creating new dirptr %d for path %s, expect_close = %d\n",
- i,path,expect_close));
-
- return(i);
-}
-
-#define DPTR_MASK ((uint32)(((uint32)1)<<31))
-
-/****************************************************************************
-fill the 5 byte server reserved dptr field
-****************************************************************************/
-BOOL dptr_fill(char *buf1,unsigned int key)
-{
- unsigned char *buf = (unsigned char *)buf1;
- void *p = dptr_get(key,0);
- uint32 offset;
- if (!p) {
- DEBUG(1,("filling null dirptr %d\n",key));
- return(False);
- }
- offset = TellDir(p);
- DEBUG(6,("fill on key %d dirptr 0x%x now at %d\n",key,p,offset));
- buf[0] = key;
- SIVAL(buf,1,offset | DPTR_MASK);
- return(True);
-}
-
-
-/****************************************************************************
-return True is the offset is at zero
-****************************************************************************/
-BOOL dptr_zero(char *buf)
-{
- return((IVAL(buf,1)&~DPTR_MASK) == 0);
-}
-
-/****************************************************************************
-fetch the dir ptr and seek it given the 5 byte server field
-****************************************************************************/
-void *dptr_fetch(char *buf,int *num)
-{
- unsigned int key = *(unsigned char *)buf;
- void *p = dptr_get(key,dircounter++);
- uint32 offset;
- if (!p) {
- DEBUG(3,("fetched null dirptr %d\n",key));
- return(NULL);
- }
- *num = key;
- offset = IVAL(buf,1)&~DPTR_MASK;
- SeekDir(p,offset);
- DEBUG(3,("fetching dirptr %d for path %s at offset %d\n",
- key,dptr_path(key),offset));
- return(p);
-}
-
-/****************************************************************************
-fetch the dir ptr and seek it given the lanman2 parameter block
-****************************************************************************/
-void *dptr_fetch_lanman2(char *params,int dptr_num)
-{
- void *p = dptr_get(dptr_num,dircounter++);
- uint32 resume_key = SVAL(params,6);
- BOOL uses_resume_key = BITSETW(params+10,2);
- BOOL continue_bit = BITSETW(params+10,3);
-
- if (!p) {
- DEBUG(3,("fetched null dirptr %d\n",dptr_num));
- return(NULL);
- }
- if(uses_resume_key && !continue_bit)
- SeekDir(p,resume_key);
- DEBUG(3,("fetching dirptr %d for path %s\n",dptr_num,dptr_path(dptr_num)));
- return(p);
-}
-
-/****************************************************************************
-check a filetype for being valid
-****************************************************************************/
-BOOL dir_check_ftype(int cnum,int mode,struct stat *st,int dirtype)
-{
- if (((mode & ~dirtype) & (aHIDDEN | aSYSTEM | aDIR)) != 0)
- return False;
- return True;
-}
-
-/****************************************************************************
- get a directory entry
-****************************************************************************/
-BOOL get_dir_entry(int cnum,char *mask,int dirtype,char *fname,int *size,int *mode,time_t *date,BOOL check_descend)
-{
- char *dname;
- BOOL found = False;
- struct stat sbuf;
- pstring path;
- pstring pathreal;
- BOOL isrootdir;
- pstring filename;
- BOOL matched;
- BOOL needslash;
-
- *path = *pathreal = *filename = 0;
-
- isrootdir = (strequal(Connections[cnum].dirpath,"./") ||
- strequal(Connections[cnum].dirpath,".") ||
- strequal(Connections[cnum].dirpath,"/"));
-
- needslash =
- ( Connections[cnum].dirpath[strlen(Connections[cnum].dirpath) -1] != '/');
-
- if (!Connections[cnum].dirptr)
- return(False);
-
- while (!found)
- {
- dname = ReadDirName(Connections[cnum].dirptr);
-
- DEBUG(6,("readdir on dirptr 0x%x now at offset %d\n",
- Connections[cnum].dirptr,TellDir(Connections[cnum].dirptr)));
-
- if (dname == NULL)
- return(False);
-
- matched = False;
-
- pstrcpy(filename,dname);
-
- if ((strcmp(filename,mask) == 0) ||
- (name_map_mangle(filename,True,SNUM(cnum)) &&
- mask_match(filename,mask,False,False)))
- {
- if (isrootdir && (strequal(filename,"..") || strequal(filename,".")))
- continue;
-
- pstrcpy(fname,filename);
- *path = 0;
- pstrcpy(path,Connections[cnum].dirpath);
- if(needslash)
- strcat(path,"/");
- pstrcpy(pathreal,path);
- strcat(path,fname);
- strcat(pathreal,dname);
- if (sys_stat(pathreal,&sbuf) != 0)
- {
- DEBUG(5,("Couldn't stat 1 [%s]\n",path));
- continue;
- }
-
- if (check_descend &&
- !strequal(fname,".") && !strequal(fname,".."))
- continue;
-
- *mode = dos_mode(cnum,pathreal,&sbuf);
-
- if (!dir_check_ftype(cnum,*mode,&sbuf,dirtype)) {
- DEBUG(5,("[%s] attribs didn't match %x\n",filename,dirtype));
- continue;
- }
-
- *size = sbuf.st_size;
- *date = sbuf.st_mtime;
-
- DEBUG(5,("get_dir_entry found %s fname=%s\n",pathreal,fname));
-
- found = True;
- }
- }
-
- return(found);
-}
-
-
-
-typedef struct
-{
- int pos;
- int numentries;
- int mallocsize;
- char *data;
- char *current;
-} Dir;
-
-
-/*******************************************************************
-open a directory
-********************************************************************/
-void *OpenDir(int cnum, char *name, BOOL use_veto)
-{
- Dir *dirp;
- char *n;
- void *p = sys_opendir(name);
- int used=0;
-
- if (!p) return(NULL);
- dirp = (Dir *)malloc(sizeof(Dir));
- if (!dirp) {
- closedir(p);
- return(NULL);
- }
- dirp->pos = dirp->numentries = dirp->mallocsize = 0;
- dirp->data = dirp->current = NULL;
-
- while ((n = readdirname(p)))
- {
- int l = strlen(n)+1;
-
- /* If it's a vetoed file, pretend it doesn't even exist */
- if (use_veto && IS_VETO_PATH(cnum, n)) continue;
-
- if (used + l > dirp->mallocsize) {
- int s = MAX(used+l,used+2000);
- char *r;
- r = (char *)Realloc(dirp->data,s);
- if (!r) {
- DEBUG(0,("Out of memory in OpenDir\n"));
- break;
- }
- dirp->data = r;
- dirp->mallocsize = s;
- dirp->current = dirp->data;
- }
- strcpy(dirp->data+used,n);
- used += l;
- dirp->numentries++;
- }
-
- closedir(p);
- return((void *)dirp);
-}
-
-
-/*******************************************************************
-close a directory
-********************************************************************/
-void CloseDir(void *p)
-{
- Dir *dirp = (Dir *)p;
- if (!dirp) return;
- if (dirp->data) free(dirp->data);
- free(dirp);
-}
-
-/*******************************************************************
-read from a directory
-********************************************************************/
-char *ReadDirName(void *p)
-{
- char *ret;
- Dir *dirp = (Dir *)p;
-
- if (!dirp || !dirp->current || dirp->pos >= dirp->numentries) return(NULL);
-
- ret = dirp->current;
- dirp->current = skip_string(dirp->current,1);
- dirp->pos++;
-
- return(ret);
-}
-
-
-/*******************************************************************
-seek a dir
-********************************************************************/
-BOOL SeekDir(void *p,int pos)
-{
- Dir *dirp = (Dir *)p;
-
- if (!dirp) return(False);
-
- if (pos < dirp->pos) {
- dirp->current = dirp->data;
- dirp->pos = 0;
- }
-
- while (dirp->pos < pos && ReadDirName(p)) ;
-
- return(dirp->pos == pos);
-}
-
-/*******************************************************************
-tell a dir position
-********************************************************************/
-int TellDir(void *p)
-{
- Dir *dirp = (Dir *)p;
-
- if (!dirp) return(-1);
-
- return(dirp->pos);
-}
-
-
-static int dir_cache_size = 0;
-static struct dir_cache {
- struct dir_cache *next;
- struct dir_cache *prev;
- char *path;
- char *name;
- char *dname;
- int snum;
-} *dir_cache = NULL;
-
-/*******************************************************************
-add an entry to the directory cache
-********************************************************************/
-void DirCacheAdd(char *path,char *name,char *dname,int snum)
-{
- int count;
- struct dir_cache *entry = (struct dir_cache *)malloc(sizeof(*entry));
- if (!entry) return;
- entry->path = strdup(path);
- entry->name = strdup(name);
- entry->dname = strdup(dname);
- entry->snum = snum;
- if (!entry->path || !entry->name || !entry->dname) return;
-
- entry->next = dir_cache;
- entry->prev = NULL;
- if (entry->next) entry->next->prev = entry;
- dir_cache = entry;
-
- DEBUG(4,("Added dir cache entry %s %s -> %s\n",path,name,dname));
-
- if (dir_cache_size == DIRCACHESIZE) {
- for (entry=dir_cache, count=1;
- entry->next && count < dir_cache_size + 1;
- entry=entry->next, count++) ;
- if (entry->next || count != dir_cache_size + 1) {
- DEBUG(0,("DirCache bug - please report %d %d\n",dir_cache_size,count));
- }
- free(entry->path);
- free(entry->name);
- free(entry->dname);
- if (entry->prev) entry->prev->next = entry->next;
- free(entry);
- } else {
- dir_cache_size++;
- }
-}
-
-
-/*******************************************************************
-check for an entry in the directory cache
-********************************************************************/
-char *DirCacheCheck(char *path,char *name,int snum)
-{
- struct dir_cache *entry;
-
- for (entry=dir_cache; entry; entry=entry->next) {
- if (entry->snum == snum &&
- strcmp(path,entry->path) == 0 &&
- strcmp(name,entry->name) == 0) {
- DEBUG(4,("Got dir cache hit on %s %s -> %s\n",path,name,entry->dname));
- return(entry->dname);
- }
- }
-
- return(NULL);
-}
-
-/*******************************************************************
-flush entries in the dir_cache
-********************************************************************/
-void DirCacheFlush(int snum)
-{
- struct dir_cache *entry,*next;
-
- for (entry=dir_cache; entry; entry=next) {
- if (entry->snum == snum) {
- free(entry->path);
- free(entry->dname);
- free(entry->name);
- next = entry->next;
- if (entry->prev) entry->prev->next = entry->next;
- if (entry->next) entry->next->prev = entry->prev;
- if (dir_cache == entry) dir_cache = entry->next;
- free(entry);
- dir_cache_size--;
- } else {
- next = entry->next;
- }
- }
-}
-
-
-#ifdef REPLACE_GETWD
-/* This is getcwd.c from bash. It is needed in Interactive UNIX. To
- * add support for another OS you need to determine which of the
- * conditional compilation macros you need to define. All the options
- * are defined for Interactive UNIX.
- */
-#ifdef ISC
-#define HAVE_UNISTD_H
-#define USGr3
-#define USG
-#endif
-
-#if defined (HAVE_UNISTD_H)
-# include <unistd.h>
-#endif
-
-#if defined (__STDC__)
-# define CONST const
-# define PTR void *
-#else /* !__STDC__ */
-# define CONST
-# define PTR char *
-#endif /* !__STDC__ */
-
-#if !defined (PATH_MAX)
-# if defined (MAXPATHLEN)
-# define PATH_MAX MAXPATHLEN
-# else /* !MAXPATHLEN */
-# define PATH_MAX 1024
-# endif /* !MAXPATHLEN */
-#endif /* !PATH_MAX */
-
-#if defined (_POSIX_VERSION) || defined (USGr3) || defined (HAVE_DIRENT_H)
-# if !defined (HAVE_DIRENT)
-# define HAVE_DIRENT
-# endif /* !HAVE_DIRENT */
-#endif /* _POSIX_VERSION || USGr3 || HAVE_DIRENT_H */
-
-#if defined (HAVE_DIRENT)
-# define D_NAMLEN(d) (strlen ((d)->d_name))
-#else
-# define D_NAMLEN(d) ((d)->d_namlen)
-#endif /* ! (_POSIX_VERSION || USGr3) */
-
-#if defined (USG) || defined (USGr3)
-# define d_fileno d_ino
-#endif
-
-#if !defined (alloca)
-extern char *alloca ();
-#endif /* alloca */
-
-/* Get the pathname of the current working directory,
- and put it in SIZE bytes of BUF. Returns NULL if the
- directory couldn't be determined or SIZE was too small.
- If successful, returns BUF. In GNU, if BUF is NULL,
- an array is allocated with `malloc'; the array is SIZE
- bytes long, unless SIZE <= 0, in which case it is as
- big as necessary. */
-#if defined (__STDC__)
-char *
-getcwd (char *buf, size_t size)
-#else /* !__STDC__ */
-char *
-getcwd (buf, size)
- char *buf;
- int size;
-#endif /* !__STDC__ */
-{
- static CONST char dots[]
- = "../../../../../../../../../../../../../../../../../../../../../../../\
-../../../../../../../../../../../../../../../../../../../../../../../../../../\
-../../../../../../../../../../../../../../../../../../../../../../../../../..";
- CONST char *dotp, *dotlist;
- size_t dotsize;
- dev_t rootdev, thisdev;
- ino_t rootino, thisino;
- char path[PATH_MAX + 1];
- register char *pathp;
- char *pathbuf;
- size_t pathsize;
- struct stat st;
-
- if (buf != NULL && size == 0)
- {
- errno = EINVAL;
- return ((char *)NULL);
- }
-
- pathsize = sizeof (path);
- pathp = &path[pathsize];
- *--pathp = '\0';
- pathbuf = path;
-
- if (stat (".", &st) < 0)
- return ((char *)NULL);
- thisdev = st.st_dev;
- thisino = st.st_ino;
-
- if (stat ("/", &st) < 0)
- return ((char *)NULL);
- rootdev = st.st_dev;
- rootino = st.st_ino;
-
- dotsize = sizeof (dots) - 1;
- dotp = &dots[sizeof (dots)];
- dotlist = dots;
- while (!(thisdev == rootdev && thisino == rootino))
- {
- register DIR *dirstream;
- register struct dirent *d;
- dev_t dotdev;
- ino_t dotino;
- char mount_point;
- int namlen;
-
- /* Look at the parent directory. */
- if (dotp == dotlist)
- {
- /* My, what a deep directory tree you have, Grandma. */
- char *new;
- if (dotlist == dots)
- {
- new = malloc (dotsize * 2 + 1);
- if (new == NULL)
- goto lose;
- memcpy (new, dots, dotsize);
- }
- else
- {
- new = realloc ((PTR) dotlist, dotsize * 2 + 1);
- if (new == NULL)
- goto lose;
- }
- memcpy (&new[dotsize], new, dotsize);
- dotp = &new[dotsize];
- dotsize *= 2;
- new[dotsize] = '\0';
- dotlist = new;
- }
-
- dotp -= 3;
-
- /* Figure out if this directory is a mount point. */
- if (stat (dotp, &st) < 0)
- goto lose;
- dotdev = st.st_dev;
- dotino = st.st_ino;
- mount_point = dotdev != thisdev;
-
- /* Search for the last directory. */
- dirstream = opendir(dotp);
- if (dirstream == NULL)
- goto lose;
- while ((d = (struct dirent *)readdir(dirstream)) != NULL)
- {
- if (d->d_name[0] == '.' &&
- (d->d_name[1] == '\0' ||
- (d->d_name[1] == '.' && d->d_name[2] == '\0')))
- continue;
- if (mount_point || d->d_fileno == thisino)
- {
- char *name;
-
- namlen = D_NAMLEN(d);
- name = (char *)
- alloca (dotlist + dotsize - dotp + 1 + namlen + 1);
- memcpy (name, dotp, dotlist + dotsize - dotp);
- name[dotlist + dotsize - dotp] = '/';
- memcpy (&name[dotlist + dotsize - dotp + 1],
- d->d_name, namlen + 1);
- if (lstat (name, &st) < 0)
- {
- int save = errno;
- closedir(dirstream);
- errno = save;
- goto lose;
- }
- if (st.st_dev == thisdev && st.st_ino == thisino)
- break;
- }
- }
- if (d == NULL)
- {
- int save = errno;
- closedir(dirstream);
- errno = save;
- goto lose;
- }
- else
- {
- size_t space;
-
- while ((space = pathp - pathbuf) <= namlen)
- {
- char *new;
-
- if (pathbuf == path)
- {
- new = malloc (pathsize * 2);
- if (!new)
- goto lose;
- }
- else
- {
- new = realloc ((PTR) pathbuf, (pathsize * 2));
- if (!new)
- goto lose;
- pathp = new + space;
- }
- (void) memcpy (new + pathsize + space, pathp, pathsize - space);
- pathp = new + pathsize + space;
- pathbuf = new;
- pathsize *= 2;
- }
-
- pathp -= namlen;
- (void) memcpy (pathp, d->d_name, namlen);
- *--pathp = '/';
- closedir(dirstream);
- }
-
- thisdev = dotdev;
- thisino = dotino;
- }
-
- if (pathp == &path[sizeof(path) - 1])
- *--pathp = '/';
-
- if (dotlist != dots)
- free ((PTR) dotlist);
-
- {
- size_t len = pathbuf + pathsize - pathp;
- if (buf == NULL)
- {
- if (len < (size_t) size)
- len = size;
- buf = (char *) malloc (len);
- if (buf == NULL)
- goto lose2;
- }
- else if ((size_t) size < len)
- {
- errno = ERANGE;
- goto lose2;
- }
- (void) memcpy((PTR) buf, (PTR) pathp, len);
- }
-
- if (pathbuf != path)
- free (pathbuf);
-
- return (buf);
-
- lose:
- if ((dotlist != dots) && dotlist)
- {
- int e = errno;
- free ((PTR) dotlist);
- errno = e;
- }
-
- lose2:
- if ((pathbuf != path) && pathbuf)
- {
- int e = errno;
- free ((PTR) pathbuf);
- errno = e;
- }
- return ((char *)NULL);
-}
-#endif
diff --git a/source/smbd/ipc.c b/source/smbd/ipc.c
deleted file mode 100644
index 28cdb22889a..00000000000
--- a/source/smbd/ipc.c
+++ /dev/null
@@ -1,3133 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Inter-process communication and named pipe handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- SMB Version handling
- Copyright (C) John H Terpstra 1995-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- This file handles the named pipe and mailslot calls
- in the SMBtrans protocol
- */
-
-#include "includes.h"
-
-#ifdef CHECK_TYPES
-#undef CHECK_TYPES
-#endif
-#define CHECK_TYPES 0
-
-extern int DEBUGLEVEL;
-extern int max_send;
-extern files_struct Files[];
-extern connection_struct Connections[];
-
-extern fstring local_machine;
-extern fstring myworkgroup;
-
-#define NERR_Success 0
-#define NERR_badpass 86
-#define NERR_notsupported 50
-
-#define NERR_BASE (2100)
-#define NERR_BufTooSmall (NERR_BASE+23)
-#define NERR_JobNotFound (NERR_BASE+51)
-#define NERR_DestNotFound (NERR_BASE+52)
-#define ERROR_INVALID_LEVEL 124
-#define ERROR_MORE_DATA 234
-
-#define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
-
-#define ACCESS_READ 0x01
-#define ACCESS_WRITE 0x02
-#define ACCESS_CREATE 0x04
-
-#define SHPWLEN 8 /* share password length */
-#define NNLEN 12 /* 8.3 net name length */
-#define SNLEN 15 /* service name length */
-#define QNLEN 12 /* queue name maximum length */
-
-extern int Client;
-
-static BOOL api_Unsupported(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len);
-static BOOL api_TooSmall(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len);
-
-
-static int CopyExpanded(int cnum, int snum, char** dst, char* src, int* n)
-{
- pstring buf;
- int l;
-
- if (!src || !dst || !n || !(*dst)) return(0);
-
- StrnCpy(buf,src,sizeof(buf)/2);
- string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
- StrnCpy(*dst,buf,*n);
- l = strlen(*dst) + 1;
- (*dst) += l;
- (*n) -= l;
- return l;
-}
-
-static int CopyAndAdvance(char** dst, char* src, int* n)
-{
- int l;
- if (!src || !dst || !n || !(*dst)) return(0);
- StrnCpy(*dst,src,*n);
- l = strlen(*dst) + 1;
- (*dst) += l;
- (*n) -= l;
- return l;
-}
-
-static int StrlenExpanded(int cnum, int snum, char* s)
-{
- pstring buf;
- if (!s) return(0);
- StrnCpy(buf,s,sizeof(buf)/2);
- string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
- return strlen(buf) + 1;
-}
-
-static char* Expand(int cnum, int snum, char* s)
-{
- static pstring buf;
- if (!s) return(NULL);
- StrnCpy(buf,s,sizeof(buf)/2);
- string_sub(buf,"%S",lp_servicename(snum));
- standard_sub(cnum,buf);
- return &buf[0];
-}
-
-/*******************************************************************
- check a API string for validity when we only need to check the prefix
- ******************************************************************/
-static BOOL prefix_ok(char *str,char *prefix)
-{
- return(strncmp(str,prefix,strlen(prefix)) == 0);
-}
-
-
-/****************************************************************************
- send a trans reply
- ****************************************************************************/
-static void send_trans_reply(char *outbuf,char *data,char *param,uint16 *setup,
- int ldata,int lparam,int lsetup)
-{
- int i;
- int this_ldata,this_lparam;
- int tot_data=0,tot_param=0;
- int align;
-
- this_lparam = MIN(lparam,max_send - (500+lsetup*SIZEOFWORD)); /* hack */
- this_ldata = MIN(ldata,max_send - (500+lsetup*SIZEOFWORD+this_lparam));
-
- align = (this_lparam%4);
-
- set_message(outbuf,10+lsetup,align+this_ldata+this_lparam,True);
- if (this_lparam)
- memcpy(smb_buf(outbuf),param,this_lparam);
- if (this_ldata)
- memcpy(smb_buf(outbuf)+this_lparam+align,data,this_ldata);
-
- SSVAL(outbuf,smb_vwv0,lparam);
- SSVAL(outbuf,smb_vwv1,ldata);
- SSVAL(outbuf,smb_vwv3,this_lparam);
- SSVAL(outbuf,smb_vwv4,smb_offset(smb_buf(outbuf),outbuf));
- SSVAL(outbuf,smb_vwv5,0);
- SSVAL(outbuf,smb_vwv6,this_ldata);
- SSVAL(outbuf,smb_vwv7,smb_offset(smb_buf(outbuf)+this_lparam+align,outbuf));
- SSVAL(outbuf,smb_vwv8,0);
- SSVAL(outbuf,smb_vwv9,lsetup);
- for (i=0;i<lsetup;i++)
- SSVAL(outbuf,smb_vwv10+i*SIZEOFWORD,setup[i]);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- tot_data = this_ldata;
- tot_param = this_lparam;
-
- while (tot_data < ldata || tot_param < lparam)
- {
- this_lparam = MIN(lparam-tot_param,max_send - 500); /* hack */
- this_ldata = MIN(ldata-tot_data,max_send - (500+this_lparam));
-
- align = (this_lparam%4);
-
- set_message(outbuf,10,this_ldata+this_lparam+align,False);
- if (this_lparam)
- memcpy(smb_buf(outbuf),param+tot_param,this_lparam);
- if (this_ldata)
- memcpy(smb_buf(outbuf)+this_lparam+align,data+tot_data,this_ldata);
-
- SSVAL(outbuf,smb_vwv3,this_lparam);
- SSVAL(outbuf,smb_vwv4,smb_offset(smb_buf(outbuf),outbuf));
- SSVAL(outbuf,smb_vwv5,tot_param);
- SSVAL(outbuf,smb_vwv6,this_ldata);
- SSVAL(outbuf,smb_vwv7,smb_offset(smb_buf(outbuf)+this_lparam+align,outbuf));
- SSVAL(outbuf,smb_vwv8,tot_data);
- SSVAL(outbuf,smb_vwv9,0);
-
- show_msg(outbuf);
- send_smb(Client,outbuf);
-
- tot_data += this_ldata;
- tot_param += this_lparam;
- }
-}
-
-struct pack_desc {
- char* format; /* formatstring for structure */
- char* subformat; /* subformat for structure */
- char* base; /* baseaddress of buffer */
- int buflen; /* remaining size for fixed part; on init: length of base */
- int subcount; /* count of substructures */
- char* structbuf; /* pointer into buffer for remaining fixed part */
- int stringlen; /* remaining size for variable part */
- char* stringbuf; /* pointer into buffer for remaining variable part */
- int neededlen; /* total needed size */
- int usedlen; /* total used size (usedlen <= neededlen and usedlen <= buflen) */
- char* curpos; /* current position; pointer into format or subformat */
- int errcode;
-};
-
-static int get_counter(char** p)
-{
- int i, n;
- if (!p || !(*p)) return(1);
- if (!isdigit(**p)) return 1;
- for (n = 0;;) {
- i = **p;
- if (isdigit(i))
- n = 10 * n + (i - '0');
- else
- return n;
- (*p)++;
- }
-}
-
-static int getlen(char* p)
-{
- int n = 0;
- if (!p) return(0);
- while (*p) {
- switch( *p++ ) {
- case 'W': /* word (2 byte) */
- n += 2;
- break;
- case 'N': /* count of substructures (word) at end */
- n += 2;
- break;
- case 'D': /* double word (4 byte) */
- case 'z': /* offset to zero terminated string (4 byte) */
- case 'l': /* offset to user data (4 byte) */
- n += 4;
- break;
- case 'b': /* offset to data (with counter) (4 byte) */
- n += 4;
- get_counter(&p);
- break;
- case 'B': /* byte (with optional counter) */
- n += get_counter(&p);
- break;
- }
- }
- return n;
-}
-
-static BOOL init_package(struct pack_desc* p, int count, int subcount)
-{
- int n = p->buflen;
- int i;
-
- if (!p->format || !p->base) return(False);
-
- i = count * getlen(p->format);
- if (p->subformat) i += subcount * getlen(p->subformat);
- p->structbuf = p->base;
- p->neededlen = 0;
- p->usedlen = 0;
- p->subcount = 0;
- p->curpos = p->format;
- if (i > n) {
- i = n = 0;
- p->errcode = NERR_BufTooSmall;
- }
-
- p->errcode = NERR_Success;
- p->buflen = i;
- n -= i;
- p->stringbuf = p->base + i;
- p->stringlen = n;
- return(p->errcode == NERR_Success);
-}
-
-#ifdef __STDC__
-static int package(struct pack_desc* p, ...)
-{
-#else
-static int package(va_alist)
-va_dcl
-{
- struct pack_desc* p;
-#endif
- va_list args;
- int needed=0, stringneeded;
- char* str=NULL;
- int is_string=0, stringused;
- int32 temp;
-
-#ifdef __STDC__
- va_start(args,p);
-#else
- va_start(args);
- p = va_arg(args,struct pack_desc *);
-#endif
-
- if (!*p->curpos) {
- if (!p->subcount)
- p->curpos = p->format;
- else {
- p->curpos = p->subformat;
- p->subcount--;
- }
- }
-#if CHECK_TYPES
- str = va_arg(args,char*);
- if (strncmp(str,p->curpos,strlen(str)) != 0) {
- DEBUG(2,("type error in package: %s instead of %*s\n",str,
- strlen(str),p->curpos));
- va_end(args);
-#if AJT
- ajt_panic();
-#endif
- return 0;
- }
-#endif
- stringneeded = -1;
-
- if (!p->curpos) return(0);
-
- switch( *p->curpos++ ) {
- case 'W': /* word (2 byte) */
- needed = 2;
- temp = va_arg(args,int);
- if (p->buflen >= needed) SSVAL(p->structbuf,0,temp);
- break;
- case 'N': /* count of substructures (word) at end */
- needed = 2;
- p->subcount = va_arg(args,int);
- if (p->buflen >= needed) SSVAL(p->structbuf,0,p->subcount);
- break;
- case 'D': /* double word (4 byte) */
- needed = 4;
- temp = va_arg(args,int);
- if (p->buflen >= needed) SIVAL(p->structbuf,0,temp);
- break;
- case 'B': /* byte (with optional counter) */
- needed = get_counter(&p->curpos);
- {
- char *s = va_arg(args,char*);
- if (p->buflen >= needed) StrnCpy(p->structbuf,s?s:"",needed);
- }
- break;
- case 'z': /* offset to zero terminated string (4 byte) */
- str = va_arg(args,char*);
- stringneeded = (str ? strlen(str)+1 : 0);
- is_string = 1;
- break;
- case 'l': /* offset to user data (4 byte) */
- str = va_arg(args,char*);
- stringneeded = va_arg(args,int);
- is_string = 0;
- break;
- case 'b': /* offset to data (with counter) (4 byte) */
- str = va_arg(args,char*);
- stringneeded = get_counter(&p->curpos);
- is_string = 0;
- break;
- }
- va_end(args);
- if (stringneeded >= 0) {
- needed = 4;
- if (p->buflen >= needed) {
- stringused = stringneeded;
- if (stringused > p->stringlen) {
- stringused = (is_string ? p->stringlen : 0);
- if (p->errcode == NERR_Success) p->errcode = ERROR_MORE_DATA;
- }
- if (!stringused)
- SIVAL(p->structbuf,0,0);
- else {
- SIVAL(p->structbuf,0,PTR_DIFF(p->stringbuf,p->base));
- memcpy(p->stringbuf,str?str:"",stringused);
- if (is_string) p->stringbuf[stringused-1] = '\0';
- p->stringbuf += stringused;
- p->stringlen -= stringused;
- p->usedlen += stringused;
- }
- }
- p->neededlen += stringneeded;
- }
- p->neededlen += needed;
- if (p->buflen >= needed) {
- p->structbuf += needed;
- p->buflen -= needed;
- p->usedlen += needed;
- }
- else {
- if (p->errcode == NERR_Success) p->errcode = NERR_BufTooSmall;
- }
- return 1;
-}
-
-#if CHECK_TYPES
-#define PACK(desc,t,v) package(desc,t,v,0,0,0,0)
-#define PACKl(desc,t,v,l) package(desc,t,v,l,0,0,0,0)
-#else
-#define PACK(desc,t,v) package(desc,v)
-#define PACKl(desc,t,v,l) package(desc,v,l)
-#endif
-
-static void PACKI(struct pack_desc* desc,char *t,int v)
-{
- PACK(desc,t,v);
-}
-
-static void PACKS(struct pack_desc* desc,char *t,char *v)
-{
- PACK(desc,t,v);
-}
-
-
-/****************************************************************************
- get a print queue
- ****************************************************************************/
-
-static void PackDriverData(struct pack_desc* desc)
-{
- char drivdata[4+4+32];
- SIVAL(drivdata,0,sizeof drivdata); /* cb */
- SIVAL(drivdata,4,1000); /* lVersion */
- memset(drivdata+8,0,32); /* szDeviceName */
- strcpy(drivdata+8,"NULL");
- PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */
-}
-
-static int check_printq_info(struct pack_desc* desc,
- int uLevel, char *id1, char *id2)
-{
- desc->subformat = NULL;
- switch( uLevel ) {
- case 0:
- desc->format = "B13";
- break;
- case 1:
- desc->format = "B13BWWWzzzzzWW";
- break;
- case 2:
- desc->format = "B13BWWWzzzzzWN";
- desc->subformat = "WB21BB16B10zWWzDDz";
- break;
- case 3:
- desc->format = "zWWWWzzzzWWzzl";
- break;
- case 4:
- desc->format = "zWWWWzzzzWNzzl";
- desc->subformat = "WWzWWDDzz";
- break;
- case 5:
- desc->format = "z";
- break;
- default: return False;
- }
- if (strcmp(desc->format,id1) != 0) return False;
- if (desc->subformat && strcmp(desc->subformat,id2) != 0) return False;
- return True;
-}
-
-static void fill_printjob_info(int cnum, int snum, int uLevel,
- struct pack_desc* desc,
- print_queue_struct* queue, int n)
-{
- time_t t = queue->time;
-
- /* the client expects localtime */
- t -= TimeDiff(t);
-
- PACKI(desc,"W",printjob_encode(snum, queue->job)); /* uJobId */
- if (uLevel == 1) {
- PACKS(desc,"B21",queue->user); /* szUserName */
- PACKS(desc,"B",""); /* pad */
- PACKS(desc,"B16",""); /* szNotifyName */
- PACKS(desc,"B10","PM_Q_RAW"); /* szDataType */
- PACKS(desc,"z",""); /* pszParms */
- PACKI(desc,"W",n+1); /* uPosition */
- PACKI(desc,"W",queue->status); /* fsStatus */
- PACKS(desc,"z",""); /* pszStatus */
- PACKI(desc,"D",t); /* ulSubmitted */
- PACKI(desc,"D",queue->size); /* ulSize */
- PACKS(desc,"z",queue->file); /* pszComment */
- }
- if (uLevel == 2 || uLevel == 3) {
- PACKI(desc,"W",queue->priority); /* uPriority */
- PACKS(desc,"z",queue->user); /* pszUserName */
- PACKI(desc,"W",n+1); /* uPosition */
- PACKI(desc,"W",queue->status); /* fsStatus */
- PACKI(desc,"D",t); /* ulSubmitted */
- PACKI(desc,"D",queue->size); /* ulSize */
- PACKS(desc,"z","Samba"); /* pszComment */
- PACKS(desc,"z",queue->file); /* pszDocument */
- if (uLevel == 3) {
- PACKS(desc,"z",""); /* pszNotifyName */
- PACKS(desc,"z","PM_Q_RAW"); /* pszDataType */
- PACKS(desc,"z",""); /* pszParms */
- PACKS(desc,"z",""); /* pszStatus */
- PACKS(desc,"z",SERVICE(snum)); /* pszQueue */
- PACKS(desc,"z","lpd"); /* pszQProcName */
- PACKS(desc,"z",""); /* pszQProcParms */
- PACKS(desc,"z","NULL"); /* pszDriverName */
- PackDriverData(desc); /* pDriverData */
- PACKS(desc,"z",""); /* pszPrinterName */
- }
- }
-}
-
-static void fill_printq_info(int cnum, int snum, int uLevel,
- struct pack_desc* desc,
- int count, print_queue_struct* queue,
- print_status_struct* status)
-{
- if (uLevel < 3) {
- PACKS(desc,"B13",SERVICE(snum));
- } else {
- PACKS(desc,"z",Expand(cnum,snum,SERVICE(snum)));
- }
- if (uLevel == 1 || uLevel == 2) {
- PACKS(desc,"B",""); /* alignment */
- PACKI(desc,"W",5); /* priority */
- PACKI(desc,"W",0); /* start time */
- PACKI(desc,"W",0); /* until time */
- PACKS(desc,"z",""); /* pSepFile */
- PACKS(desc,"z","lpd"); /* pPrProc */
- PACKS(desc,"z",SERVICE(snum)); /* pDestinations */
- PACKS(desc,"z",""); /* pParms */
- if (snum < 0) {
- PACKS(desc,"z","UNKNOWN PRINTER");
- PACKI(desc,"W",LPSTAT_ERROR);
- }
- else if (!status || !status->message[0]) {
- PACKS(desc,"z",Expand(cnum,snum,lp_comment(snum)));
- PACKI(desc,"W",LPSTAT_OK); /* status */
- } else {
- PACKS(desc,"z",status->message);
- PACKI(desc,"W",status->status); /* status */
- }
- PACKI(desc,(uLevel == 1 ? "W" : "N"),count);
- }
- if (uLevel == 3 || uLevel == 4) {
- PACKI(desc,"W",5); /* uPriority */
- PACKI(desc,"W",0); /* uStarttime */
- PACKI(desc,"W",0); /* uUntiltime */
- PACKI(desc,"W",5); /* pad1 */
- PACKS(desc,"z",""); /* pszSepFile */
- PACKS(desc,"z","WinPrint"); /* pszPrProc */
- PACKS(desc,"z",""); /* pszParms */
- if (!status || !status->message[0]) {
- PACKS(desc,"z",Expand(cnum,snum,lp_comment(snum))); /* pszComment */
- PACKI(desc,"W",LPSTAT_OK); /* fsStatus */
- } else {
- PACKS(desc,"z",status->message); /* pszComment */
- PACKI(desc,"W",status->status); /* fsStatus */
- }
- PACKI(desc,(uLevel == 3 ? "W" : "N"),count); /* cJobs */
- PACKS(desc,"z",SERVICE(snum)); /* pszPrinters */
- PACKS(desc,"z",lp_printerdriver(snum)); /* pszDriverName */
- PackDriverData(desc); /* pDriverData */
- }
- if (uLevel == 2 || uLevel == 4) {
- int i;
- for (i=0;i<count;i++)
- fill_printjob_info(cnum,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);
- }
-
- DEBUG(3,("fill_printq_info on <%s> gave %d entries\n",SERVICE(snum),count));
-}
-
-static BOOL api_DosPrintQGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- char *QueueName = p;
- int uLevel,cbBuf;
- int count=0;
- int snum;
- char* str3;
- struct pack_desc desc;
- print_queue_struct *queue=NULL;
- print_status_struct status;
-
- bzero(&status,sizeof(status));
- bzero(&desc,sizeof(desc));
-
- p = skip_string(p,1);
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
- str3 = p + 4;
-
- /* remove any trailing username */
- if ((p = strchr(QueueName,'%'))) *p = 0;
-
- DEBUG(3,("PrintQueue uLevel=%d name=%s\n",uLevel,QueueName));
-
- /* check it's a supported varient */
- if (!prefix_ok(str1,"zWrLh")) return False;
- if (!check_printq_info(&desc,uLevel,str2,str3)) return False;
-
- snum = lp_servicenumber(QueueName);
- if (snum < 0 && pcap_printername_ok(QueueName,NULL)) {
- int pnum = lp_servicenumber(PRINTERS_NAME);
- if (pnum >= 0) {
- lp_add_printer(QueueName,pnum);
- snum = lp_servicenumber(QueueName);
- }
- }
-
- if (snum < 0 || !VALID_SNUM(snum)) return(False);
-
- count = get_printqueue(snum,cnum,&queue,&status);
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- if (init_package(&desc,1,count)) {
- desc.subcount = count;
- fill_printq_info(cnum,snum,uLevel,&desc,count,queue,&status);
- }
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,desc.neededlen);
-
- DEBUG(4,("printqgetinfo: errorcode %d\n",desc.errcode));
-
- if (queue) free(queue);
-
- return(True);
-}
-
-
-/****************************************************************************
- view list of all print jobs on all queues
- ****************************************************************************/
-static BOOL api_DosPrintQEnum(int cnum, uint16 vuid, char* param, char* data,
- int mdrcnt, int mprcnt,
- char **rdata, char** rparam,
- int *rdata_len, int *rparam_len)
-{
- char *param_format = param+2;
- char *output_format1 = skip_string(param_format,1);
- char *p = skip_string(output_format1,1);
- int uLevel = SVAL(p,0);
- char *output_format2 = p + 4;
- int services = lp_numservices();
- int i, n;
- struct pack_desc desc;
- print_queue_struct **queue = NULL;
- print_status_struct *status = NULL;
- int* subcntarr = NULL;
- int queuecnt, subcnt=0, succnt=0;
-
- bzero(&desc,sizeof(desc));
-
- DEBUG(3,("DosPrintQEnum uLevel=%d\n",uLevel));
-
- if (!prefix_ok(param_format,"WrLeh")) return False;
- if (!check_printq_info(&desc,uLevel,output_format1,output_format2))
- return False;
- queuecnt = 0;
- for (i = 0; i < services; i++)
- if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i))
- queuecnt++;
- if (uLevel > 0) {
- queue = (print_queue_struct**)malloc(queuecnt*sizeof(print_queue_struct*));
- memset(queue,0,queuecnt*sizeof(print_queue_struct*));
- status = (print_status_struct*)malloc(queuecnt*sizeof(print_status_struct));
- memset(status,0,queuecnt*sizeof(print_status_struct));
- subcntarr = (int*)malloc(queuecnt*sizeof(int));
- subcnt = 0;
- n = 0;
- for (i = 0; i < services; i++)
- if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
- subcntarr[n] = get_printqueue(i,cnum,&queue[n],&status[n]);
- subcnt += subcntarr[n];
- n++;
- }
- }
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
-
- if (init_package(&desc,queuecnt,subcnt)) {
- n = 0;
- succnt = 0;
- for (i = 0; i < services; i++)
- if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
- fill_printq_info(cnum,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
- n++;
- if (desc.errcode == NERR_Success) succnt = n;
- }
- }
-
- if (subcntarr) free(subcntarr);
-
- *rdata_len = desc.usedlen;
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,queuecnt);
-
- for (i = 0; i < queuecnt; i++) {
- if (queue && queue[i]) free(queue[i]);
- }
-
- if (queue) free(queue);
- if (status) free(status);
-
- return True;
-}
-
-/****************************************************************************
- get info level for a server list query
- ****************************************************************************/
-static BOOL check_server_info(int uLevel, char* id)
-{
- switch( uLevel ) {
- case 0:
- if (strcmp(id,"B16") != 0) return False;
- break;
- case 1:
- if (strcmp(id,"B16BBDz") != 0) return False;
- break;
- default:
- return False;
- }
- return True;
-}
-
-struct srv_info_struct
-{
- fstring name;
- uint32 type;
- fstring comment;
- fstring domain;
- BOOL server_added;
-};
-
-
-/*******************************************************************
- get server info lists from the files saved by nmbd. Return the
- number of entries
- ******************************************************************/
-static int get_server_info(uint32 servertype,
- struct srv_info_struct **servers,
- char *domain)
-{
- FILE *f;
- pstring fname;
- int count=0;
- int alloced=0;
- pstring line;
- BOOL local_list_only;
-
- pstrcpy(fname,lp_lockdir());
- trim_string(fname,NULL,"/");
- strcat(fname,"/");
- strcat(fname,SERVER_LIST);
-
- f = fopen(fname,"r");
-
- if (!f) {
- DEBUG(4,("Can't open %s - %s\n",fname,strerror(errno)));
- return(0);
- }
-
- /* request for everything is code for request all servers */
- if (servertype == SV_TYPE_ALL)
- servertype &= ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY);
-
- local_list_only = (servertype & SV_TYPE_LOCAL_LIST_ONLY);
-
- DEBUG(4,("Servertype search: %8x\n",servertype));
-
- while (!feof(f))
- {
- fstring stype;
- struct srv_info_struct *s;
- char *ptr = line;
- BOOL ok = True;
- *ptr = 0;
-
- fgets(line,sizeof(line)-1,f);
- if (!*line) continue;
-
- if (count == alloced) {
- alloced += 10;
- (*servers) = (struct srv_info_struct *)
- Realloc(*servers,sizeof(**servers)*alloced);
- if (!(*servers)) return(0);
- bzero((char *)((*servers)+count),sizeof(**servers)*(alloced-count));
- }
- s = &(*servers)[count];
-
- if (!next_token(&ptr,s->name , NULL)) continue;
- if (!next_token(&ptr,stype , NULL)) continue;
- if (!next_token(&ptr,s->comment, NULL)) continue;
- if (!next_token(&ptr,s->domain , NULL)) {
- /* this allows us to cope with an old nmbd */
- strcpy(s->domain,myworkgroup);
- }
-
- if (sscanf(stype,"%X",&s->type) != 1) {
- DEBUG(4,("r:host file "));
- ok = False;
- }
-
- /* Filter the servers/domains we return based on what was asked for. */
-
- /* Check to see if we are being asked for a local list only. */
- if(local_list_only && ((s->type & SV_TYPE_LOCAL_LIST_ONLY) == 0)) {
- DEBUG(4,("r: local list only"));
- ok = False;
- }
-
- /* doesn't match up: don't want it */
- if (!(servertype & s->type)) {
- DEBUG(4,("r:serv type "));
- ok = False;
- }
-
- if ((servertype & SV_TYPE_DOMAIN_ENUM) !=
- (s->type & SV_TYPE_DOMAIN_ENUM))
- {
- DEBUG(4,("s: dom mismatch "));
- ok = False;
- }
-
- if (!strequal(domain, s->domain) && !(servertype & SV_TYPE_DOMAIN_ENUM))
- {
- ok = False;
- }
-
- /* We should never return a server type with a SV_TYPE_LOCAL_LIST_ONLY set. */
- s->type &= ~SV_TYPE_LOCAL_LIST_ONLY;
-
- if (ok)
- {
- DEBUG(4,("**SV** %20s %8x %25s %15s\n",
- s->name, s->type, s->comment, s->domain));
-
- s->server_added = True;
- count++;
- }
- else
- {
- DEBUG(4,("%20s %8x %25s %15s\n",
- s->name, s->type, s->comment, s->domain));
- }
- }
-
- fclose(f);
- return(count);
-}
-
-
-/*******************************************************************
- fill in a server info structure
- ******************************************************************/
-static int fill_srv_info(struct srv_info_struct *service,
- int uLevel, char **buf, int *buflen,
- char **stringbuf, int *stringspace, char *baseaddr)
-{
- int struct_len;
- char* p;
- char* p2;
- int l2;
- int len;
-
- switch (uLevel) {
- case 0: struct_len = 16; break;
- case 1: struct_len = 26; break;
- default: return -1;
- }
-
- if (!buf)
- {
- len = 0;
- switch (uLevel)
- {
- case 1:
- len = strlen(service->comment)+1;
- break;
- }
-
- if (buflen) *buflen = struct_len;
- if (stringspace) *stringspace = len;
- return struct_len + len;
- }
-
- len = struct_len;
- p = *buf;
- if (*buflen < struct_len) return -1;
- if (stringbuf)
- {
- p2 = *stringbuf;
- l2 = *stringspace;
- }
- else
- {
- p2 = p + struct_len;
- l2 = *buflen - struct_len;
- }
- if (!baseaddr) baseaddr = p;
-
- switch (uLevel)
- {
- case 0:
- StrnCpy(p,service->name,15);
- break;
-
- case 1:
- StrnCpy(p,service->name,15);
- SIVAL(p,18,service->type);
- SIVAL(p,22,PTR_DIFF(p2,baseaddr));
- len += CopyAndAdvance(&p2,service->comment,&l2);
- break;
- }
-
- if (stringbuf)
- {
- *buf = p + struct_len;
- *buflen -= struct_len;
- *stringbuf = p2;
- *stringspace = l2;
- }
- else
- {
- *buf = p2;
- *buflen -= len;
- }
- return len;
-}
-
-
-static BOOL srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2)
-{
- return(strcmp(s1->name,s2->name));
-}
-
-/****************************************************************************
- view list of servers available (or possibly domains). The info is
- extracted from lists saved by nmbd on the local host
- ****************************************************************************/
-static BOOL api_RNetServerEnum(int cnum, uint16 vuid, char *param, char *data,
- int mdrcnt, int mprcnt, char **rdata,
- char **rparam, int *rdata_len, int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel = SVAL(p,0);
- int buf_len = SVAL(p,2);
- uint32 servertype = IVAL(p,4);
- char *p2;
- int data_len, fixed_len, string_len;
- int f_len, s_len;
- struct srv_info_struct *servers=NULL;
- int counted=0,total=0;
- int i,missed;
- fstring domain;
- BOOL domain_request;
- BOOL local_request;
-
- /* If someone sets all the bits they don't really mean to set
- DOMAIN_ENUM and LOCAL_LIST_ONLY, they just want all the
- known servers. */
-
- if (servertype == SV_TYPE_ALL)
- servertype &= ~(SV_TYPE_DOMAIN_ENUM|SV_TYPE_LOCAL_LIST_ONLY);
-
- /* If someone sets SV_TYPE_LOCAL_LIST_ONLY but hasn't set
- any other bit (they may just set this bit on it's own) they
- want all the locally seen servers. However this bit can be
- set on its own so set the requested servers to be
- ALL - DOMAIN_ENUM. */
-
- if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) && !(servertype & SV_TYPE_DOMAIN_ENUM))
- servertype = SV_TYPE_ALL & ~(SV_TYPE_DOMAIN_ENUM);
-
- domain_request = ((servertype & SV_TYPE_DOMAIN_ENUM) != 0);
- local_request = ((servertype & SV_TYPE_LOCAL_LIST_ONLY) != 0);
-
- p += 8;
-
- if (!prefix_ok(str1,"WrLehD")) return False;
- if (!check_server_info(uLevel,str2)) return False;
-
- DEBUG(4, ("server request level: %s %8x ", str2, servertype));
- DEBUG(4, ("domains_req:%s ", BOOLSTR(domain_request)));
- DEBUG(4, ("local_only:%s\n", BOOLSTR(local_request)));
-
- if (strcmp(str1, "WrLehDz") == 0) {
- StrnCpy(domain, p, sizeof(fstring)-1);
- } else {
- StrnCpy(domain, myworkgroup, sizeof(fstring)-1);
- }
-
- if (lp_browse_list())
- total = get_server_info(servertype,&servers,domain);
-
- data_len = fixed_len = string_len = 0;
- missed = 0;
-
- qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
-
- {
- char *lastname=NULL;
-
- for (i=0;i<total;i++)
- {
- struct srv_info_struct *s = &servers[i];
- if (lastname && strequal(lastname,s->name)) continue;
- lastname = s->name;
- data_len += fill_srv_info(s,uLevel,0,&f_len,0,&s_len,0);
- DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
- s->name, s->type, s->comment, s->domain));
-
- if (data_len <= buf_len) {
- counted++;
- fixed_len += f_len;
- string_len += s_len;
- } else {
- missed++;
- }
- }
- }
-
- *rdata_len = fixed_len + string_len;
- *rdata = REALLOC(*rdata,*rdata_len);
- bzero(*rdata,*rdata_len);
-
- p2 = (*rdata) + fixed_len; /* auxilliary data (strings) will go here */
- p = *rdata;
- f_len = fixed_len;
- s_len = string_len;
-
- {
- char *lastname=NULL;
- int count2 = counted;
- for (i = 0; i < total && count2;i++)
- {
- struct srv_info_struct *s = &servers[i];
- if (lastname && strequal(lastname,s->name)) continue;
- lastname = s->name;
- fill_srv_info(s,uLevel,&p,&f_len,&p2,&s_len,*rdata);
- DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
- s->name, s->type, s->comment, s->domain));
- count2--;
- }
- }
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVAL(*rparam,0,(missed == 0 ? NERR_Success : ERROR_MORE_DATA));
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,counted);
- SSVAL(*rparam,6,counted+missed);
-
- if (servers) free(servers);
-
- DEBUG(3,("NetServerEnum domain = %s uLevel=%d counted=%d total=%d\n",
- domain,uLevel,counted,counted+missed));
-
- return(True);
-}
-
-
-/****************************************************************************
- get info about a share
- ****************************************************************************/
-static BOOL check_share_info(int uLevel, char* id)
-{
- switch( uLevel ) {
- case 0:
- if (strcmp(id,"B13") != 0) return False;
- break;
- case 1:
- if (strcmp(id,"B13BWz") != 0) return False;
- break;
- case 2:
- if (strcmp(id,"B13BWzWWWzB9B") != 0) return False;
- break;
- case 91:
- if (strcmp(id,"B13BWzWWWzB9BB9BWzWWzWW") != 0) return False;
- break;
- default: return False;
- }
- return True;
-}
-
-static int fill_share_info(int cnum, int snum, int uLevel,
- char** buf, int* buflen,
- char** stringbuf, int* stringspace, char* baseaddr)
-{
- int struct_len;
- char* p;
- char* p2;
- int l2;
- int len;
-
- switch( uLevel ) {
- case 0: struct_len = 13; break;
- case 1: struct_len = 20; break;
- case 2: struct_len = 40; break;
- case 91: struct_len = 68; break;
- default: return -1;
- }
-
-
- if (!buf)
- {
- len = 0;
- if (uLevel > 0) len += StrlenExpanded(cnum,snum,lp_comment(snum));
- if (uLevel > 1) len += strlen(lp_pathname(snum)) + 1;
- if (buflen) *buflen = struct_len;
- if (stringspace) *stringspace = len;
- return struct_len + len;
- }
-
- len = struct_len;
- p = *buf;
- if ((*buflen) < struct_len) return -1;
- if (stringbuf)
- {
- p2 = *stringbuf;
- l2 = *stringspace;
- }
- else
- {
- p2 = p + struct_len;
- l2 = (*buflen) - struct_len;
- }
- if (!baseaddr) baseaddr = p;
-
- StrnCpy(p,lp_servicename(snum),13);
-
- if (uLevel > 0)
- {
- int type;
- CVAL(p,13) = 0;
- type = STYPE_DISKTREE;
- if (lp_print_ok(snum)) type = STYPE_PRINTQ;
- if (strequal("IPC$",lp_servicename(snum))) type = STYPE_IPC;
- SSVAL(p,14,type); /* device type */
- SIVAL(p,16,PTR_DIFF(p2,baseaddr));
- len += CopyExpanded(cnum,snum,&p2,lp_comment(snum),&l2);
- }
-
- if (uLevel > 1)
- {
- SSVAL(p,20,ACCESS_READ|ACCESS_WRITE|ACCESS_CREATE); /* permissions */
- SSVALS(p,22,-1); /* max uses */
- SSVAL(p,24,1); /* current uses */
- SIVAL(p,26,PTR_DIFF(p2,baseaddr)); /* local pathname */
- len += CopyAndAdvance(&p2,lp_pathname(snum),&l2);
- memset(p+30,0,SHPWLEN+2); /* passwd (reserved), pad field */
- }
-
- if (uLevel > 2)
- {
- memset(p+40,0,SHPWLEN+2);
- SSVAL(p,50,0);
- SIVAL(p,52,0);
- SSVAL(p,56,0);
- SSVAL(p,58,0);
- SIVAL(p,60,0);
- SSVAL(p,64,0);
- SSVAL(p,66,0);
- }
-
- if (stringbuf)
- {
- (*buf) = p + struct_len;
- (*buflen) -= struct_len;
- (*stringbuf) = p2;
- (*stringspace) = l2;
- }
- else
- {
- (*buf) = p2;
- (*buflen) -= len;
- }
- return len;
-}
-
-static BOOL api_RNetShareGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *netname = skip_string(str2,1);
- char *p = skip_string(netname,1);
- int uLevel = SVAL(p,0);
- int snum = find_service(netname);
-
- if (snum < 0) return False;
-
- /* check it's a supported varient */
- if (!prefix_ok(str1,"zWrLh")) return False;
- if (!check_share_info(uLevel,str2)) return False;
-
- *rdata = REALLOC(*rdata,mdrcnt);
- p = *rdata;
- *rdata_len = fill_share_info(cnum,snum,uLevel,&p,&mdrcnt,0,0,0);
- if (*rdata_len < 0) return False;
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
- SSVAL(*rparam,4,*rdata_len);
-
- return(True);
-}
-
-/****************************************************************************
- view list of shares available
- ****************************************************************************/
-static BOOL api_RNetShareEnum(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel = SVAL(p,0);
- int buf_len = SVAL(p,2);
- char *p2;
- int count=lp_numservices();
- int total=0,counted=0;
- int i;
- int data_len, fixed_len, string_len;
- int f_len, s_len;
-
- if (!prefix_ok(str1,"WrLeh")) return False;
- if (!check_share_info(uLevel,str2)) return False;
-
- data_len = fixed_len = string_len = 0;
- for (i=0;i<count;i++)
- if (lp_browseable(i) && lp_snum_ok(i))
- {
- total++;
- data_len += fill_share_info(cnum,i,uLevel,0,&f_len,0,&s_len,0);
- if (data_len <= buf_len)
- {
- counted++;
- fixed_len += f_len;
- string_len += s_len;
- }
- }
- *rdata_len = fixed_len + string_len;
- *rdata = REALLOC(*rdata,*rdata_len);
- memset(*rdata,0,*rdata_len);
-
- p2 = (*rdata) + fixed_len; /* auxillery data (strings) will go here */
- p = *rdata;
- f_len = fixed_len;
- s_len = string_len;
- for (i = 0; i < count;i++)
- if (lp_browseable(i) && lp_snum_ok(i))
- if (fill_share_info(cnum,i,uLevel,&p,&f_len,&p2,&s_len,*rdata) < 0)
- break;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,counted);
- SSVAL(*rparam,6,total);
-
- DEBUG(3,("RNetShareEnum gave %d entries of %d (%d %d %d %d)\n",
- counted,total,uLevel,
- buf_len,*rdata_len,mdrcnt));
- return(True);
-}
-
-
-
-/****************************************************************************
- get the time of day info
- ****************************************************************************/
-static BOOL api_NetRemoteTOD(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *p;
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 21;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
-
- {
- struct tm *t;
- time_t unixdate = time(NULL);
-
- put_dos_date3(p,0,unixdate); /* this is the time that is looked at
- by NT in a "net time" operation,
- it seems to ignore the one below */
-
- /* the client expects to get localtime, not GMT, in this bit
- (I think, this needs testing) */
- t = LocalTime(&unixdate);
-
- SIVAL(p,4,0); /* msecs ? */
- CVAL(p,8) = t->tm_hour;
- CVAL(p,9) = t->tm_min;
- CVAL(p,10) = t->tm_sec;
- CVAL(p,11) = 0; /* hundredths of seconds */
- SSVALS(p,12,TimeDiff(unixdate)/60); /* timezone in minutes from GMT */
- SSVAL(p,14,10000); /* timer interval in 0.0001 of sec */
- CVAL(p,16) = t->tm_mday;
- CVAL(p,17) = t->tm_mon + 1;
- SSVAL(p,18,1900+t->tm_year);
- CVAL(p,20) = t->tm_wday;
- }
-
-
- return(True);
-}
-
-/****************************************************************************
- set the user password
- ****************************************************************************/
-static BOOL api_SetUserPassword(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *p = skip_string(param+2,2);
- fstring user;
- fstring pass1,pass2;
-
- fstrcpy(user,p);
-
- p = skip_string(p,1);
-
- StrnCpy(pass1,p,16);
- StrnCpy(pass2,p+16,16);
-
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_badpass);
- SSVAL(*rparam,2,0); /* converter word */
-
- DEBUG(3,("Set password for <%s>\n",user));
-
- if (password_ok(user,pass1,strlen(pass1),NULL) &&
- chgpasswd(user,pass1,pass2))
- {
- SSVAL(*rparam,0,NERR_Success);
- }
-
- bzero(pass1,sizeof(fstring));
- bzero(pass2,sizeof(fstring));
-
- return(True);
-}
-
-/****************************************************************************
- delete a print job
- Form: <W> <>
- ****************************************************************************/
-static BOOL api_RDosPrintJobDel(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- int function = SVAL(param,0);
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int jobid, snum;
- int i, count;
-
- printjob_decode(SVAL(p,0), &snum, &jobid);
-
- /* check it's a supported varient */
- if (!(strcsequal(str1,"W") && strcsequal(str2,"")))
- return(False);
-
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_Success);
-
- if (snum >= 0 && VALID_SNUM(snum))
- {
- print_queue_struct *queue=NULL;
- lpq_reset(snum);
- count = get_printqueue(snum,cnum,&queue,NULL);
-
- for (i=0;i<count;i++)
- if ((queue[i].job&0xFF) == jobid)
- {
- switch (function) {
- case 81: /* delete */
- DEBUG(3,("Deleting queue entry %d\n",queue[i].job));
- del_printqueue(cnum,snum,queue[i].job);
- break;
- case 82: /* pause */
- case 83: /* resume */
- DEBUG(3,("%s queue entry %d\n",
- (function==82?"pausing":"resuming"),queue[i].job));
- status_printjob(cnum,snum,queue[i].job,
- (function==82?LPQ_PAUSED:LPQ_QUEUED));
- break;
- }
- break;
- }
-
- if (i==count)
- SSVAL(*rparam,0,NERR_JobNotFound);
-
- if (queue) free(queue);
- }
-
- SSVAL(*rparam,2,0); /* converter word */
-
- return(True);
-}
-
-static BOOL api_WPrintQueuePurge(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *QueueName = skip_string(str2,1);
- int snum;
-
- /* check it's a supported varient */
- if (!(strcsequal(str1,"z") && strcsequal(str2,"")))
- return(False);
-
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
- snum = lp_servicenumber(QueueName);
- if (snum < 0 && pcap_printername_ok(QueueName,NULL)) {
- int pnum = lp_servicenumber(PRINTERS_NAME);
- if (pnum >= 0) {
- lp_add_printer(QueueName,pnum);
- snum = lp_servicenumber(QueueName);
- }
- }
-
- if (snum >= 0 && VALID_SNUM(snum)) {
- print_queue_struct *queue=NULL;
- int i, count;
- lpq_reset(snum);
-
- count = get_printqueue(snum,cnum,&queue,NULL);
- for (i = 0; i < count; i++)
- del_printqueue(cnum,snum,queue[i].job);
-
- if (queue) free(queue);
- }
-
- DEBUG(3,("Print queue purge, queue=%s\n",QueueName));
-
- return(True);
-}
-
-
-/****************************************************************************
- set the property of a print job (undocumented?)
- ? function = 0xb -> set name of print job
- ? function = 0x6 -> move print job up/down
- Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz>
- or <WWsTP> <WB21BB16B10zWWzDDz>
-****************************************************************************/
-static int check_printjob_info(struct pack_desc* desc,
- int uLevel, char* id)
-{
- desc->subformat = NULL;
- switch( uLevel ) {
- case 0: desc->format = "W"; break;
- case 1: desc->format = "WB21BB16B10zWWzDDz"; break;
- case 2: desc->format = "WWzWWDDzz"; break;
- case 3: desc->format = "WWzWWDDzzzzzzzzzzlz"; break;
- default: return False;
- }
- if (strcmp(desc->format,id) != 0) return False;
- return True;
-}
-
-static BOOL api_PrintJobInfo(int cnum,uint16 vuid,char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- struct pack_desc desc;
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int jobid, snum;
- int uLevel = SVAL(p,2);
- int function = SVAL(p,4); /* what is this ?? */
- int i;
- char *s = data;
-
- printjob_decode(SVAL(p,0), &snum, &jobid);
-
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- /* check it's a supported varient */
- if ((strcmp(str1,"WWsTP")) || (!check_printjob_info(&desc,uLevel,str2)))
- return(False);
-
- switch (function) {
- case 0x6: /* change job place in the queue, data gives the new place */
- if (snum >= 0 && VALID_SNUM(snum))
- {
- print_queue_struct *queue=NULL;
- int count;
-
- lpq_reset(snum);
- count = get_printqueue(snum,cnum,&queue,NULL);
- for (i=0;i<count;i++) /* find job */
- if ((queue[i].job&0xFF) == jobid) break;
-
- if (i==count) {
- desc.errcode=NERR_JobNotFound;
- if (queue) free(queue);
- }
- else {
- desc.errcode=NERR_Success;
- i++;
-#if 0
- {
- int place= SVAL(data,0);
- /* we currently have no way of doing this. Can any unix do it? */
- if (i < place) /* move down */;
- else if (i > place ) /* move up */;
- }
-#endif
- desc.errcode=NERR_notsupported; /* not yet supported */
- if (queue) free(queue);
- }
- }
- else desc.errcode=NERR_JobNotFound;
- break;
- case 0xb: /* change print job name, data gives the name */
- /* jobid, snum should be zero */
- if (isalpha(*s))
- {
- pstring name;
- int l = 0;
- while (l<64 && *s)
- {
- if (issafe(*s)) name[l++] = *s;
- s++;
- }
- name[l] = 0;
-
- DEBUG(3,("Setting print name to %s\n",name));
-
- for (i=0;i<MAX_OPEN_FILES;i++)
- if (Files[i].open && Files[i].print_file)
- {
- pstring wd;
- GetWd(wd);
- unbecome_user();
-
- if (!become_user(Files[i].cnum,vuid) ||
- !become_service(Files[i].cnum,True))
- break;
-
- if (sys_rename(Files[i].name,name) == 0)
- string_set(&Files[i].name,name);
- break;
- }
- }
- desc.errcode=NERR_Success;
-
- break;
- default: /* not implemented */
- return False;
- }
-
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0); /* converter word */
-
- return(True);
-}
-
-
-/****************************************************************************
- get info about the server
- ****************************************************************************/
-static BOOL api_RNetServerGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel = SVAL(p,0);
- char *p2;
- int struct_len;
-
- DEBUG(4,("NetServerGetInfo level %d\n",uLevel));
-
- /* check it's a supported varient */
- if (!prefix_ok(str1,"WrLh")) return False;
- switch( uLevel ) {
- case 0:
- if (strcmp(str2,"B16") != 0) return False;
- struct_len = 16;
- break;
- case 1:
- if (strcmp(str2,"B16BBDz") != 0) return False;
- struct_len = 26;
- break;
- case 2:
- if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWz")
- != 0) return False;
- struct_len = 134;
- break;
- case 3:
- if (strcmp(str2,"B16BBDzDDDWWzWWWWWWWBB21zWWWWWWWWWWWWWWWWWWWWWWzDWz")
- != 0) return False;
- struct_len = 144;
- break;
- case 20:
- if (strcmp(str2,"DN") != 0) return False;
- struct_len = 6;
- break;
- case 50:
- if (strcmp(str2,"B16BBDzWWzzz") != 0) return False;
- struct_len = 42;
- break;
- default: return False;
- }
-
- *rdata_len = mdrcnt;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- p = *rdata;
- p2 = p + struct_len;
- if (uLevel != 20) {
- StrnCpy(p,local_machine,16);
- strupper(p);
- }
- p += 16;
- if (uLevel > 0)
- {
- struct srv_info_struct *servers=NULL;
- int i,count;
- pstring comment;
- uint32 servertype= lp_default_server_announce();
-
- pstrcpy(comment,lp_serverstring());
-
- if ((count=get_server_info(SV_TYPE_ALL,&servers,myworkgroup))>0) {
- for (i=0;i<count;i++)
- if (strequal(servers[i].name,local_machine))
- {
- servertype = servers[i].type;
- pstrcpy(comment,servers[i].comment);
- }
- }
- if (servers) free(servers);
-
- SCVAL(p,0,lp_major_announce_version());
- SCVAL(p,1,lp_minor_announce_version());
- SIVAL(p,2,servertype);
-
- if (mdrcnt == struct_len) {
- SIVAL(p,6,0);
- } else {
- SIVAL(p,6,PTR_DIFF(p2,*rdata));
- standard_sub(cnum,comment);
- StrnCpy(p2,comment,MAX(mdrcnt - struct_len,0));
- p2 = skip_string(p2,1);
- }
- }
- if (uLevel > 1)
- {
- return False; /* not yet implemented */
- }
-
- *rdata_len = PTR_DIFF(p2,*rdata);
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
- SSVAL(*rparam,4,*rdata_len);
-
- return(True);
-}
-
-
-/****************************************************************************
- get info about the server
- ****************************************************************************/
-static BOOL api_NetWkstaGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- char *p2;
- extern pstring sesssetup_user;
- int level = SVAL(p,0);
-
- DEBUG(4,("NetWkstaGetInfo level %d\n",level));
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- /* check it's a supported varient */
- if (!(level==10 && strcsequal(str1,"WrLh") && strcsequal(str2,"zzzBBzz")))
- return(False);
-
- *rdata_len = mdrcnt + 1024;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
- p2 = p + 22;
-
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* host name */
- strcpy(p2,local_machine);
- strupper(p2);
- p2 = skip_string(p2,1);
- p += 4;
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata));
- strcpy(p2,sesssetup_user);
- p2 = skip_string(p2,1);
- p += 4;
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* login domain */
- strcpy(p2,myworkgroup);
- strupper(p2);
- p2 = skip_string(p2,1);
- p += 4;
-
- SCVAL(p,0,lp_major_announce_version()); /* system version - e.g 4 in 4.1 */
- SCVAL(p,1,lp_minor_announce_version()); /* system version - e.g .1 in 4.1 */
- p += 2;
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata));
- strcpy(p2,myworkgroup); /* don't know. login domain?? */
- p2 = skip_string(p2,1);
- p += 4;
-
- SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* don't know */
- strcpy(p2,"");
- p2 = skip_string(p2,1);
- p += 4;
-
- *rdata_len = PTR_DIFF(p2,*rdata);
-
- SSVAL(*rparam,4,*rdata_len);
-
- return(True);
-}
-
-/****************************************************************************
- get info about a user
-
- struct user_info_11 {
- char usri11_name[21]; 0-20
- char usri11_pad; 21
- char *usri11_comment; 22-25
- char *usri11_usr_comment; 26-29
- unsigned short usri11_priv; 30-31
- unsigned long usri11_auth_flags; 32-35
- long usri11_password_age; 36-39
- char *usri11_homedir; 40-43
- char *usri11_parms; 44-47
- long usri11_last_logon; 48-51
- long usri11_last_logoff; 52-55
- unsigned short usri11_bad_pw_count; 56-57
- unsigned short usri11_num_logons; 58-59
- char *usri11_logon_server; 60-63
- unsigned short usri11_country_code; 64-65
- char *usri11_workstations; 66-69
- unsigned long usri11_max_storage; 70-73
- unsigned short usri11_units_per_week; 74-75
- unsigned char *usri11_logon_hours; 76-79
- unsigned short usri11_code_page; 80-81
- };
-
-where:
-
- usri11_name specifies the user name for which information is retireved
-
- usri11_pad aligns the next data structure element to a word boundary
-
- usri11_comment is a null terminated ASCII comment
-
- usri11_user_comment is a null terminated ASCII comment about the user
-
- usri11_priv specifies the level of the privilege assigned to the user.
- The possible values are:
-
-Name Value Description
-USER_PRIV_GUEST 0 Guest privilege
-USER_PRIV_USER 1 User privilege
-USER_PRV_ADMIN 2 Administrator privilege
-
- usri11_auth_flags specifies the account operator privileges. The
- possible values are:
-
-Name Value Description
-AF_OP_PRINT 0 Print operator
-
-
-Leach, Naik [Page 28]
-
-
-INTERNET-DRAFT CIFS Remote Admin Protocol January 10, 1997
-
-
-AF_OP_COMM 1 Communications operator
-AF_OP_SERVER 2 Server operator
-AF_OP_ACCOUNTS 3 Accounts operator
-
-
- usri11_password_age specifies how many seconds have elapsed since the
- password was last changed.
-
- usri11_home_dir points to a null terminated ASCII string that contains
- the path name of the user's home directory.
-
- usri11_parms points to a null terminated ASCII string that is set
- aside for use by applications.
-
- usri11_last_logon specifies the time when the user last logged on.
- This value is stored as the number of seconds elapsed since
- 00:00:00, January 1, 1970.
-
- usri11_last_logoff specifies the time when the user last logged off.
- This value is stored as the number of seconds elapsed since
- 00:00:00, January 1, 1970. A value of 0 means the last logoff
- time is unknown.
-
- usri11_bad_pw_count specifies the number of incorrect passwords
- entered since the last successful logon.
-
- usri11_log1_num_logons specifies the number of times this user has
- logged on. A value of -1 means the number of logons is unknown.
-
- usri11_logon_server points to a null terminated ASCII string that
- contains the name of the server to which logon requests are sent.
- A null string indicates logon requests should be sent to the
- domain controller.
-
- usri11_country_code specifies the country code for the user's language
- of choice.
-
- usri11_workstations points to a null terminated ASCII string that
- contains the names of workstations the user may log on from.
- There may be up to 8 workstations, with the names separated by
- commas. A null strings indicates there are no restrictions.
-
- usri11_max_storage specifies the maximum amount of disk space the user
- can occupy. A value of 0xffffffff indicates there are no
- restrictions.
-
- usri11_units_per_week specifies the equal number of time units into
- which a week is divided. This value must be equal to 168.
-
- usri11_logon_hours points to a 21 byte (168 bits) string that
- specifies the time during which the user can log on. Each bit
- represents one unique hour in a week. The first bit (bit 0, word
- 0) is Sunday, 0:00 to 0:59, the second bit (bit 1, word 0) is
-
-
-
-Leach, Naik [Page 29]
-
-
-INTERNET-DRAFT CIFS Remote Admin Protocol January 10, 1997
-
-
- Sunday, 1:00 to 1:59 and so on. A null pointer indicates there
- are no restrictions.
-
- usri11_code_page specifies the code page for the user's language of
- choice
-
-All of the pointers in this data structure need to be treated
-specially. The pointer is a 32 bit pointer. The higher 16 bits need
-to be ignored. The converter word returned in the parameters section
-needs to be subtracted from the lower 16 bits to calculate an offset
-into the return buffer where this ASCII string resides.
-
-There is no auxiliary data in the response.
-
- ****************************************************************************/
-
-#define usri11_name 0
-#define usri11_pad 21
-#define usri11_comment 22
-#define usri11_usr_comment 26
-#define usri11_full_name 30
-#define usri11_priv 34
-#define usri11_auth_flags 36
-#define usri11_password_age 40
-#define usri11_homedir 44
-#define usri11_parms 48
-#define usri11_last_logon 52
-#define usri11_last_logoff 56
-#define usri11_bad_pw_count 60
-#define usri11_num_logons 62
-#define usri11_logon_server 64
-#define usri11_country_code 68
-#define usri11_workstations 70
-#define usri11_max_storage 74
-#define usri11_units_per_week 78
-#define usri11_logon_hours 80
-#define usri11_code_page 84
-#define usri11_end 86
-
-#define USER_PRIV_GUEST 0
-#define USER_PRIV_USER 1
-#define USER_PRIV_ADMIN 2
-
-#define AF_OP_PRINT 0
-#define AF_OP_COMM 1
-#define AF_OP_SERVER 2
-#define AF_OP_ACCOUNTS 3
-
-
-static BOOL api_RNetUserGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *UserName = skip_string(str2,1);
- char *p = skip_string(UserName,1);
- int uLevel = SVAL(p,0);
- char *p2;
-
- /* get NIS home of a previously validated user - simeon */
- user_struct *vuser = get_valid_user_struct(vuid);
- DEBUG(3,(" Username of UID %d is %s\n", vuser->uid, vuser->name));
-#if (defined(NETGROUP) && defined(AUTOMOUNT))
- DEBUG(3,(" HOMESHR for %s is %s\n", vuser->name, vuser->home_share));
-#endif
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- /* check it's a supported variant */
- if (strcmp(str1,"zWrLh") != 0) return False;
- switch( uLevel )
- {
- case 0: p2 = "B21"; break;
- case 1: p2 = "B21BB16DWzzWz"; break;
- case 2: p2 = "B21BB16DWzzWzDzzzzDDDDWb21WWzWW"; break;
- case 10: p2 = "B21Bzzz"; break;
- case 11: p2 = "B21BzzzWDDzzDDWWzWzDWb21W"; break;
- default: return False;
- }
-
- if (strcmp(p2,str2) != 0) return False;
-
- *rdata_len = mdrcnt + 1024;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
- p2 = p + usri11_end;
-
- memset(p,0,21);
- fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */
-
- if (uLevel > 0)
- {
- SCVAL(p,usri11_pad,0); /* padding - 1 byte */
- *p2 = 0;
- }
- if (uLevel >= 10)
- {
- SIVAL(p,usri11_comment,PTR_DIFF(p2,p)); /* comment */
- strcpy(p2,"Comment");
- p2 = skip_string(p2,1);
-
- SIVAL(p,usri11_usr_comment,PTR_DIFF(p2,p)); /* user_comment */
- strcpy(p2,"UserComment");
- p2 = skip_string(p2,1);
-
- /* EEK! the cifsrap.txt doesn't have this in!!!! */
- SIVAL(p,usri11_full_name,PTR_DIFF(p2,p)); /* full name */
- strcpy(p2,vuser->real_name); /* simeon */
- p2 = skip_string(p2,1);
- }
-
- if (uLevel == 11) /* modelled after NTAS 3.51 reply */
- {
- SSVAL(p,usri11_priv,Connections[cnum].admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
- SIVAL(p,usri11_auth_flags,AF_OP_PRINT); /* auth flags */
- SIVALS(p,usri11_password_age,0xffffffff); /* password age */
- SIVAL(p,usri11_homedir,PTR_DIFF(p2,p)); /* home dir */
- if (*lp_logon_path())
- {
- strcpy(p2,lp_logon_path());
- }
- else
- {
-#if (defined(NETGROUP) && defined(AUTOMOUNT))
- strcpy(p2, vuser->home_share);
-#else
- strcpy(p2,"\\\\%L\\%U");
-#endif
- }
- standard_sub_basic(p2);
- p2 = skip_string(p2,1);
- SIVAL(p,usri11_parms,PTR_DIFF(p2,p)); /* parms */
- strcpy(p2,"");
- p2 = skip_string(p2,1);
- SIVAL(p,usri11_last_logon,0); /* last logon */
- SIVAL(p,usri11_last_logoff,0); /* last logoff */
- SSVALS(p,usri11_bad_pw_count,0xffffffff); /* bad pw counts */
- SSVALS(p,usri11_num_logons,0xffffffff); /* num logons */
- SIVAL(p,usri11_logon_server,PTR_DIFF(p2,p)); /* logon server */
- strcpy(p2,"\\\\*");
- p2 = skip_string(p2,1);
- SSVAL(p,usri11_country_code,0); /* country code */
-
- SIVAL(p,usri11_workstations,PTR_DIFF(p2,p)); /* workstations */
- strcpy(p2,"");
- p2 = skip_string(p2,1);
-
- SIVALS(p,usri11_max_storage,0xffffffff); /* max storage */
- SSVAL(p,usri11_units_per_week,168); /* units per week */
- SIVAL(p,usri11_logon_hours,PTR_DIFF(p2,p)); /* logon hours */
-
- /* a simple way to get logon hours at all times. */
- memset(p2,0xff,21);
- SCVAL(p2,21,0); /* fix zero termination */
- p2 = skip_string(p2,1);
-
- SSVAL(p,usri11_code_page,0); /* code page */
- }
- if (uLevel == 1 || uLevel == 2)
- {
- memset(p+22,' ',16); /* password */
- SIVALS(p,38,-1); /* password age */
- SSVAL(p,42,
- Connections[cnum].admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
- SIVAL(p,44,PTR_DIFF(p2,*rdata)); /* home dir */
- if (*lp_logon_path())
- {
- strcpy(p2,lp_logon_path());
- }
- else
- {
-#if (defined(NETGROUP) && defined(AUTOMOUNT))
- strcpy(p2, vuser->home_share);
-#else
- strcpy(p2,"\\\\%L\\%U");
-#endif
- }
- standard_sub_basic(p2);
- p2 = skip_string(p2,1);
- SIVAL(p,48,PTR_DIFF(p2,*rdata)); /* comment */
- *p2++ = 0;
- SSVAL(p,52,0); /* flags */
- SIVAL(p,54,0); /* script_path */
- if (uLevel == 2)
- {
- SIVAL(p,60,0); /* auth_flags */
- SIVAL(p,64,PTR_DIFF(p2,*rdata)); /* full_name */
- strcpy(p2,vuser->real_name); /* simeon */
- p2 = skip_string(p2,1);
- SIVAL(p,68,0); /* urs_comment */
- SIVAL(p,72,PTR_DIFF(p2,*rdata)); /* parms */
- strcpy(p2,"");
- p2 = skip_string(p2,1);
- SIVAL(p,76,0); /* workstations */
- SIVAL(p,80,0); /* last_logon */
- SIVAL(p,84,0); /* last_logoff */
- SIVALS(p,88,-1); /* acct_expires */
- SIVALS(p,92,-1); /* max_storage */
- SSVAL(p,96,168); /* units_per_week */
- SIVAL(p,98,PTR_DIFF(p2,*rdata)); /* logon_hours */
- memset(p2,-1,21);
- p2 += 21;
- SSVALS(p,102,-1); /* bad_pw_count */
- SSVALS(p,104,-1); /* num_logons */
- SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
- strcpy(p2,"\\\\%L");
- standard_sub_basic(p2);
- p2 = skip_string(p2,1);
- SSVAL(p,110,49); /* country_code */
- SSVAL(p,112,860); /* code page */
- }
- }
-
- *rdata_len = PTR_DIFF(p2,*rdata);
-
- SSVAL(*rparam,4,*rdata_len); /* is this right?? */
-
- return(True);
-}
-
-/*******************************************************************
- get groups that a user is a member of
- ******************************************************************/
-static BOOL api_NetUserGetGroups(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *UserName = skip_string(str2,1);
- char *p = skip_string(UserName,1);
- int uLevel = SVAL(p,0);
- char *p2;
- int count=0;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- /* check it's a supported varient */
- if (strcmp(str1,"zWrLeh") != 0) return False;
- switch( uLevel ) {
- case 0: p2 = "B21"; break;
- default: return False;
- }
- if (strcmp(p2,str2) != 0) return False;
-
- *rdata_len = mdrcnt + 1024;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- SSVAL(*rparam,0,NERR_Success);
- SSVAL(*rparam,2,0); /* converter word */
-
- p = *rdata;
-
- /* XXXX we need a real SAM database some day */
- strcpy(p,"Users"); p += 21; count++;
- strcpy(p,"Domain Users"); p += 21; count++;
- strcpy(p,"Guests"); p += 21; count++;
- strcpy(p,"Domain Guests"); p += 21; count++;
-
- *rdata_len = PTR_DIFF(p,*rdata);
-
- SSVAL(*rparam,4,count); /* is this right?? */
- SSVAL(*rparam,6,count); /* is this right?? */
-
- return(True);
-}
-
-
-static BOOL api_WWkstaUserLogon(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel;
- struct pack_desc desc;
- char* name;
- char* logon_script;
-
- uLevel = SVAL(p,0);
- name = p + 2;
-
- bzero(&desc,sizeof(desc));
-
- DEBUG(3,("WWkstaUserLogon uLevel=%d name=%s\n",uLevel,name));
-
- /* check it's a supported varient */
- if (strcmp(str1,"OOWb54WrLh") != 0) return False;
- if (uLevel != 1 || strcmp(str2,"WB21BWDWWDDDDDDDzzzD") != 0) return False;
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- desc.subformat = NULL;
- desc.format = str2;
-
- if (init_package(&desc,1,0))
- {
- PACKI(&desc,"W",0); /* code */
- PACKS(&desc,"B21",name); /* eff. name */
- PACKS(&desc,"B",""); /* pad */
- PACKI(&desc,"W",
- Connections[cnum].admin_user?USER_PRIV_ADMIN:USER_PRIV_USER);
- PACKI(&desc,"D",0); /* auth flags XXX */
- PACKI(&desc,"W",0); /* num logons */
- PACKI(&desc,"W",0); /* bad pw count */
- PACKI(&desc,"D",0); /* last logon */
- PACKI(&desc,"D",-1); /* last logoff */
- PACKI(&desc,"D",-1); /* logoff time */
- PACKI(&desc,"D",-1); /* kickoff time */
- PACKI(&desc,"D",0); /* password age */
- PACKI(&desc,"D",0); /* password can change */
- PACKI(&desc,"D",-1); /* password must change */
- {
- fstring mypath;
- strcpy(mypath,"\\\\");
- strcat(mypath,local_machine);
- strupper(mypath);
- PACKS(&desc,"z",mypath); /* computer */
- }
- PACKS(&desc,"z",myworkgroup);/* domain */
-
-/* JHT - By calling lp_logon_script() and standard_sub() we have */
-/* made sure all macros are fully substituted and available */
- logon_script = lp_logon_script();
- standard_sub( cnum, logon_script );
- PACKS(&desc,"z", logon_script); /* script path */
-/* End of JHT mods */
-
- PACKI(&desc,"D",0x00000000); /* reserved */
- }
-
- *rdata_len = desc.usedlen;
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,desc.neededlen);
-
- DEBUG(4,("WWkstaUserLogon: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-
-/****************************************************************************
- api_WAccessGetUserPerms
- ****************************************************************************/
-static BOOL api_WAccessGetUserPerms(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *user = skip_string(str2,1);
- char *resource = skip_string(user,1);
-
- DEBUG(3,("WAccessGetUserPerms user=%s resource=%s\n",user,resource));
-
- /* check it's a supported varient */
- if (strcmp(str1,"zzh") != 0) return False;
- if (strcmp(str2,"") != 0) return False;
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,0); /* errorcode */
- SSVAL(*rparam,2,0); /* converter word */
- SSVAL(*rparam,4,0x7f); /* permission flags */
-
- return(True);
-}
-
-/****************************************************************************
- api_WPrintJobEnumerate
- ****************************************************************************/
-static BOOL api_WPrintJobGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel,cbBuf;
- int count;
- int i;
- int snum;
- int job;
- struct pack_desc desc;
- print_queue_struct *queue=NULL;
- print_status_struct status;
-
- uLevel = SVAL(p,2);
- cbBuf = SVAL(p,4);
-
- bzero(&desc,sizeof(desc));
- bzero(&status,sizeof(status));
-
- DEBUG(3,("WPrintJobGetInfo uLevel=%d uJobId=0x%X\n",uLevel,SVAL(p,0)));
-
- /* check it's a supported varient */
- if (strcmp(str1,"WWrLh") != 0) return False;
- if (!check_printjob_info(&desc,uLevel,str2)) return False;
-
- printjob_decode(SVAL(p,0), &snum, &job);
-
- if (snum < 0 || !VALID_SNUM(snum)) return(False);
-
- count = get_printqueue(snum,cnum,&queue,&status);
- for (i = 0; i < count; i++) {
- if ((queue[i].job & 0xFF) == job) break;
- }
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
-
- if (init_package(&desc,1,0)) {
- if (i < count) {
- fill_printjob_info(cnum,snum,uLevel,&desc,&queue[i],i);
- *rdata_len = desc.usedlen;
- }
- else {
- desc.errcode = NERR_JobNotFound;
- *rdata_len = 0;
- }
- }
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,desc.neededlen);
-
- if (queue) free(queue);
-
- DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static BOOL api_WPrintJobEnumerate(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- char* name = p;
- int uLevel,cbBuf;
- int count;
- int i, succnt=0;
- int snum;
- struct pack_desc desc;
- print_queue_struct *queue=NULL;
- print_status_struct status;
-
- bzero(&desc,sizeof(desc));
- bzero(&status,sizeof(status));
-
- p = skip_string(p,1);
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintJobEnumerate uLevel=%d name=%s\n",uLevel,name));
-
- /* check it's a supported varient */
- if (strcmp(str1,"zWrLeh") != 0) return False;
- if (uLevel > 2) return False; /* defined only for uLevel 0,1,2 */
- if (!check_printjob_info(&desc,uLevel,str2)) return False;
-
- snum = lp_servicenumber(name);
- if (snum < 0 && pcap_printername_ok(name,NULL)) {
- int pnum = lp_servicenumber(PRINTERS_NAME);
- if (pnum >= 0) {
- lp_add_printer(name,pnum);
- snum = lp_servicenumber(name);
- }
- }
-
- if (snum < 0 || !VALID_SNUM(snum)) return(False);
-
- count = get_printqueue(snum,cnum,&queue,&status);
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
-
- if (init_package(&desc,count,0)) {
- succnt = 0;
- for (i = 0; i < count; i++) {
- fill_printjob_info(cnum,snum,uLevel,&desc,&queue[i],i);
- if (desc.errcode == NERR_Success) succnt = i+1;
- }
- }
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,count);
-
- if (queue) free(queue);
-
- DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static int check_printdest_info(struct pack_desc* desc,
- int uLevel, char* id)
-{
- desc->subformat = NULL;
- switch( uLevel ) {
- case 0: desc->format = "B9"; break;
- case 1: desc->format = "B9B21WWzW"; break;
- case 2: desc->format = "z"; break;
- case 3: desc->format = "zzzWWzzzWW"; break;
- default: return False;
- }
- if (strcmp(desc->format,id) != 0) return False;
- return True;
-}
-
-static void fill_printdest_info(int cnum, int snum, int uLevel,
- struct pack_desc* desc)
-{
- char buf[100];
- strncpy(buf,SERVICE(snum),sizeof(buf)-1);
- buf[sizeof(buf)-1] = 0;
- strupper(buf);
- if (uLevel <= 1) {
- PACKS(desc,"B9",buf); /* szName */
- if (uLevel == 1) {
- PACKS(desc,"B21",""); /* szUserName */
- PACKI(desc,"W",0); /* uJobId */
- PACKI(desc,"W",0); /* fsStatus */
- PACKS(desc,"z",""); /* pszStatus */
- PACKI(desc,"W",0); /* time */
- }
- }
- if (uLevel == 2 || uLevel == 3) {
- PACKS(desc,"z",buf); /* pszPrinterName */
- if (uLevel == 3) {
- PACKS(desc,"z",""); /* pszUserName */
- PACKS(desc,"z",""); /* pszLogAddr */
- PACKI(desc,"W",0); /* uJobId */
- PACKI(desc,"W",0); /* fsStatus */
- PACKS(desc,"z",""); /* pszStatus */
- PACKS(desc,"z",""); /* pszComment */
- PACKS(desc,"z","NULL"); /* pszDrivers */
- PACKI(desc,"W",0); /* time */
- PACKI(desc,"W",0); /* pad1 */
- }
- }
-}
-
-static BOOL api_WPrintDestGetInfo(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- char* PrinterName = p;
- int uLevel,cbBuf;
- struct pack_desc desc;
- int snum;
-
- bzero(&desc,sizeof(desc));
-
- p = skip_string(p,1);
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintDestGetInfo uLevel=%d PrinterName=%s\n",uLevel,PrinterName));
-
- /* check it's a supported varient */
- if (strcmp(str1,"zWrLh") != 0) return False;
- if (!check_printdest_info(&desc,uLevel,str2)) return False;
-
- snum = lp_servicenumber(PrinterName);
- if (snum < 0 && pcap_printername_ok(PrinterName,NULL)) {
- int pnum = lp_servicenumber(PRINTERS_NAME);
- if (pnum >= 0) {
- lp_add_printer(PrinterName,pnum);
- snum = lp_servicenumber(PrinterName);
- }
- }
-
- if (snum < 0) {
- *rdata_len = 0;
- desc.errcode = NERR_DestNotFound;
- desc.neededlen = 0;
- }
- else {
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- if (init_package(&desc,1,0)) {
- fill_printdest_info(cnum,snum,uLevel,&desc);
- }
- *rdata_len = desc.usedlen;
- }
-
- *rparam_len = 6;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,desc.neededlen);
-
- DEBUG(4,("WPrintDestGetInfo: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static BOOL api_WPrintDestEnum(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel,cbBuf;
- int queuecnt;
- int i, n, succnt=0;
- struct pack_desc desc;
- int services = lp_numservices();
-
- bzero(&desc,sizeof(desc));
-
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintDestEnum uLevel=%d\n",uLevel));
-
- /* check it's a supported varient */
- if (strcmp(str1,"WrLeh") != 0) return False;
- if (!check_printdest_info(&desc,uLevel,str2)) return False;
-
- queuecnt = 0;
- for (i = 0; i < services; i++)
- if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i))
- queuecnt++;
-
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- if (init_package(&desc,queuecnt,0)) {
- succnt = 0;
- n = 0;
- for (i = 0; i < services; i++) {
- if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
- fill_printdest_info(cnum,i,uLevel,&desc);
- n++;
- if (desc.errcode == NERR_Success) succnt = n;
- }
- }
- }
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,queuecnt);
-
- DEBUG(4,("WPrintDestEnumerate: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static BOOL api_WPrintDriverEnum(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel,cbBuf;
- int succnt;
- struct pack_desc desc;
-
- bzero(&desc,sizeof(desc));
-
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintDriverEnum uLevel=%d\n",uLevel));
-
- /* check it's a supported varient */
- if (strcmp(str1,"WrLeh") != 0) return False;
- if (uLevel != 0 || strcmp(str2,"B41") != 0) return False;
-
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- if (init_package(&desc,1,0)) {
- PACKS(&desc,"B41","NULL");
- }
-
- succnt = (desc.errcode == NERR_Success ? 1 : 0);
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,1);
-
- DEBUG(4,("WPrintDriverEnum: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static BOOL api_WPrintQProcEnum(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel,cbBuf;
- int succnt;
- struct pack_desc desc;
-
- bzero(&desc,sizeof(desc));
-
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintQProcEnum uLevel=%d\n",uLevel));
-
- /* check it's a supported varient */
- if (strcmp(str1,"WrLeh") != 0) return False;
- if (uLevel != 0 || strcmp(str2,"B13") != 0) return False;
-
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- desc.format = str2;
- if (init_package(&desc,1,0)) {
- PACKS(&desc,"B13","lpd");
- }
-
- succnt = (desc.errcode == NERR_Success ? 1 : 0);
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,1);
-
- DEBUG(4,("WPrintQProcEnum: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-static BOOL api_WPrintPortEnum(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- char *str1 = param+2;
- char *str2 = skip_string(str1,1);
- char *p = skip_string(str2,1);
- int uLevel,cbBuf;
- int succnt;
- struct pack_desc desc;
-
- bzero(&desc,sizeof(desc));
-
- uLevel = SVAL(p,0);
- cbBuf = SVAL(p,2);
-
- DEBUG(3,("WPrintPortEnum uLevel=%d\n",uLevel));
-
- /* check it's a supported varient */
- if (strcmp(str1,"WrLeh") != 0) return False;
- if (uLevel != 0 || strcmp(str2,"B9") != 0) return False;
-
- if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
- bzero(&desc,sizeof(desc));
- desc.base = *rdata;
- desc.buflen = mdrcnt;
- desc.format = str2;
- if (init_package(&desc,1,0)) {
- PACKS(&desc,"B13","lp0");
- }
-
- succnt = (desc.errcode == NERR_Success ? 1 : 0);
-
- *rdata_len = desc.usedlen;
-
- *rparam_len = 8;
- *rparam = REALLOC(*rparam,*rparam_len);
- SSVALS(*rparam,0,desc.errcode);
- SSVAL(*rparam,2,0);
- SSVAL(*rparam,4,succnt);
- SSVAL(*rparam,6,1);
-
- DEBUG(4,("WPrintPortEnum: errorcode %d\n",desc.errcode));
- return(True);
-}
-
-
-struct
-{
- char * name;
- char * pipename;
- int subcommand;
- BOOL (*fn) ();
-} api_fd_commands [] =
- {
- { "SetNmdPpHndState", "lsarpc", 1, api_LsarpcSNPHS },
-#ifdef NTDOMAIN
- { "TransactNmPipe", "lsarpc", 0x26, api_ntLsarpcTNP },
-#else
- { "TransactNmPipe", "lsarpc", 0x26, api_LsarpcTNP },
-#endif
- { NULL, NULL, -1, (BOOL (*)())api_Unsupported }
- };
-
-/****************************************************************************
- handle remote api calls delivered to a named pipe already opened.
- ****************************************************************************/
-static int api_fd_reply(int cnum,uint16 vuid,char *outbuf,
- uint16 *setup,char *data,char *params,
- int suwcnt,int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
-{
- char *rdata = NULL;
- char *rparam = NULL;
- int rdata_len = 0;
- int rparam_len = 0;
- BOOL reply=False;
- int i;
- int fd;
- int subcommand;
-
- /* First find out the name of this file. */
- if (suwcnt != 2)
- {
- DEBUG(0,("Unexpected named pipe transaction.\n"));
- return(-1);
- }
-
- /* Get the file handle and hence the file name. */
- fd = setup[1];
- subcommand = setup[0];
-
- DEBUG(3,("Got API command %d on pipe %s ",subcommand,Files[fd].name));
- DEBUG(3,("(tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
- tdscnt,tpscnt,mdrcnt,mprcnt));
-
- for (i=0;api_fd_commands[i].name;i++)
- if (strequal(api_fd_commands[i].pipename, Files[fd].name) &&
- api_fd_commands[i].subcommand == subcommand &&
- api_fd_commands[i].fn)
- {
- DEBUG(3,("Doing %s\n",api_fd_commands[i].name));
- break;
- }
-
- rdata = (char *)malloc(1024); if (rdata) bzero(rdata,1024);
- rparam = (char *)malloc(1024); if (rparam) bzero(rparam,1024);
-
- reply = api_fd_commands[i].fn(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
-
- if (rdata_len > mdrcnt ||
- rparam_len > mprcnt)
- {
- reply = api_TooSmall(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
- }
-
-
- /* if we get False back then it's actually unsupported */
- if (!reply)
- api_Unsupported(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
-
- /* now send the reply */
- send_trans_reply(outbuf,rdata,rparam,NULL,rdata_len,rparam_len,0);
-
- if (rdata)
- free(rdata);
- if (rparam)
- free(rparam);
-
- return(-1);
-}
-
-
-
-/****************************************************************************
- the buffer was too small
- ****************************************************************************/
-static BOOL api_TooSmall(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- *rparam_len = MIN(*rparam_len,mprcnt);
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_BufTooSmall);
-
- DEBUG(3,("Supplied buffer too small in API command\n"));
-
- return(True);
-}
-
-
-/****************************************************************************
- the request is not supported
- ****************************************************************************/
-static BOOL api_Unsupported(int cnum,uint16 vuid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- *rparam_len = 4;
- *rparam = REALLOC(*rparam,*rparam_len);
-
- *rdata_len = 0;
-
- SSVAL(*rparam,0,NERR_notsupported);
- SSVAL(*rparam,2,0); /* converter word */
-
- DEBUG(3,("Unsupported API command\n"));
-
- return(True);
-}
-
-
-
-
-struct
-{
- char *name;
- int id;
- BOOL (*fn)();
- int flags;
-} api_commands[] = {
- {"RNetShareEnum", 0, (BOOL (*)())api_RNetShareEnum,0},
- {"RNetShareGetInfo", 1, (BOOL (*)())api_RNetShareGetInfo,0},
- {"RNetServerGetInfo", 13, (BOOL (*)())api_RNetServerGetInfo,0},
- {"RNetUserGetInfo", 56, (BOOL (*)())api_RNetUserGetInfo,0},
- {"NetUserGetGroups", 59, (BOOL (*)())api_NetUserGetGroups,0},
- {"NetWkstaGetInfo", 63, (BOOL (*)())api_NetWkstaGetInfo,0},
- {"DosPrintQEnum", 69, (BOOL (*)())api_DosPrintQEnum,0},
- {"DosPrintQGetInfo", 70, (BOOL (*)())api_DosPrintQGetInfo,0},
- {"WPrintJobEnumerate",76, (BOOL (*)())api_WPrintJobEnumerate,0},
- {"WPrintJobGetInfo", 77, (BOOL (*)())api_WPrintJobGetInfo,0},
- {"RDosPrintJobDel", 81, (BOOL (*)())api_RDosPrintJobDel,0},
- {"RDosPrintJobPause", 82, (BOOL (*)())api_RDosPrintJobDel,0},
- {"RDosPrintJobResume",83, (BOOL (*)())api_RDosPrintJobDel,0},
- {"WPrintDestEnum", 84, (BOOL (*)())api_WPrintDestEnum,0},
- {"WPrintDestGetInfo", 85, (BOOL (*)())api_WPrintDestGetInfo,0},
- {"NetRemoteTOD", 91, (BOOL (*)())api_NetRemoteTOD,0},
- {"WPrintQueuePurge", 103, (BOOL (*)())api_WPrintQueuePurge,0},
- {"NetServerEnum", 104, (BOOL (*)())api_RNetServerEnum,0},
- {"WAccessGetUserPerms",105, (BOOL (*)())api_WAccessGetUserPerms,0},
- {"SetUserPassword", 115, (BOOL (*)())api_SetUserPassword,0},
- {"WWkstaUserLogon", 132, (BOOL (*)())api_WWkstaUserLogon,0},
- {"PrintJobInfo", 147, (BOOL (*)())api_PrintJobInfo,0},
- {"WPrintDriverEnum", 205, (BOOL (*)())api_WPrintDriverEnum,0},
- {"WPrintQProcEnum", 206, (BOOL (*)())api_WPrintQProcEnum,0},
- {"WPrintPortEnum", 207, (BOOL (*)())api_WPrintPortEnum,0},
- {NULL, -1, (BOOL (*)())api_Unsupported,0}};
-
-
-/****************************************************************************
- handle remote api calls
- ****************************************************************************/
-static int api_reply(int cnum,uint16 vuid,char *outbuf,char *data,char *params,
- int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
-{
- int api_command = SVAL(params,0);
- char *rdata = NULL;
- char *rparam = NULL;
- int rdata_len = 0;
- int rparam_len = 0;
- BOOL reply=False;
- int i;
-
- DEBUG(3,("Got API command %d of form <%s> <%s> (tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
- api_command,params+2,skip_string(params+2,1),
- tdscnt,tpscnt,mdrcnt,mprcnt));
-
- for (i=0;api_commands[i].name;i++)
- if (api_commands[i].id == api_command && api_commands[i].fn)
- {
- DEBUG(3,("Doing %s\n",api_commands[i].name));
- break;
- }
-
- rdata = (char *)malloc(1024); if (rdata) bzero(rdata,1024);
- rparam = (char *)malloc(1024); if (rparam) bzero(rparam,1024);
-
- reply = api_commands[i].fn(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
-
-
- if (rdata_len > mdrcnt ||
- rparam_len > mprcnt)
- {
- reply = api_TooSmall(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
- }
-
-
- /* if we get False back then it's actually unsupported */
- if (!reply)
- api_Unsupported(cnum,vuid,params,data,mdrcnt,mprcnt,
- &rdata,&rparam,&rdata_len,&rparam_len);
-
-
-
- /* now send the reply */
- send_trans_reply(outbuf,rdata,rparam,NULL,rdata_len,rparam_len,0);
-
- if (rdata)
- free(rdata);
- if (rparam)
- free(rparam);
-
- return(-1);
-}
-
-/****************************************************************************
- handle named pipe commands
- ****************************************************************************/
-static int named_pipe(int cnum,uint16 vuid, char *outbuf,char *name,
- uint16 *setup,char *data,char *params,
- int suwcnt,int tdscnt,int tpscnt,
- int msrcnt,int mdrcnt,int mprcnt)
-{
-
- if (strequal(name,"LANMAN"))
- return(api_reply(cnum,vuid,outbuf,data,params,tdscnt,tpscnt,mdrcnt,mprcnt));
-
-if (strlen(name) < 1)
- return(api_fd_reply(cnum,vuid,outbuf,setup,data,params,suwcnt,tdscnt,tpscnt,mdrcnt,mprcnt));
-
-
- DEBUG(3,("named pipe command on <%s> 0x%X setup1=%d\n",
- name,(int)setup[0],(int)setup[1]));
-
- return(0);
-}
-
-
-/****************************************************************************
- reply to a SMBtrans
- ****************************************************************************/
-int reply_trans(char *inbuf,char *outbuf)
-{
- fstring name;
-
- char *data=NULL,*params=NULL;
- uint16 *setup=NULL;
-
- int outsize = 0;
- int cnum = SVAL(inbuf,smb_tid);
- uint16 vuid = SVAL(inbuf,smb_uid);
-
- int tpscnt = SVAL(inbuf,smb_vwv0);
- int tdscnt = SVAL(inbuf,smb_vwv1);
- int mprcnt = SVAL(inbuf,smb_vwv2);
- int mdrcnt = SVAL(inbuf,smb_vwv3);
- int msrcnt = CVAL(inbuf,smb_vwv4);
- BOOL close_on_completion = BITSETW(inbuf+smb_vwv5,0);
- BOOL one_way = BITSETW(inbuf+smb_vwv5,1);
- int pscnt = SVAL(inbuf,smb_vwv9);
- int psoff = SVAL(inbuf,smb_vwv10);
- int dscnt = SVAL(inbuf,smb_vwv11);
- int dsoff = SVAL(inbuf,smb_vwv12);
- int suwcnt = CVAL(inbuf,smb_vwv13);
-
- fstrcpy(name,smb_buf(inbuf));
-
- if (dscnt > tdscnt || pscnt > tpscnt) {
- exit_server("invalid trans parameters\n");
- }
-
- if (tdscnt)
- {
- data = (char *)malloc(tdscnt);
- memcpy(data,smb_base(inbuf)+dsoff,dscnt);
- }
- if (tpscnt)
- {
- params = (char *)malloc(tpscnt);
- memcpy(params,smb_base(inbuf)+psoff,pscnt);
- }
-
- if (suwcnt)
- {
- int i;
- setup = (uint16 *)malloc(suwcnt*sizeof(setup[0]));
- for (i=0;i<suwcnt;i++)
- setup[i] = SVAL(inbuf,smb_vwv14+i*SIZEOFWORD);
- }
-
-
- if (pscnt < tpscnt || dscnt < tdscnt)
- {
- /* We need to send an interim response then receive the rest
- of the parameter/data bytes */
- outsize = set_message(outbuf,0,0,True);
- show_msg(outbuf);
- send_smb(Client,outbuf);
- }
-
- /* receive the rest of the trans packet */
- while (pscnt < tpscnt || dscnt < tdscnt)
- {
- int pcnt,poff,dcnt,doff,pdisp,ddisp;
-
- if (!receive_smb(Client,inbuf, SMB_SECONDARY_WAIT) ||
- CVAL(inbuf, smb_com) != SMBtrans)
- {
- DEBUG(2,("Invalid secondary trans2 packet\n"));
- if (params) free(params);
- if (data) free(data);
- if (setup) free(setup);
- return(ERROR(ERRSRV,ERRerror));
- }
-
- show_msg(inbuf);
-
- tpscnt = SVAL(inbuf,smb_vwv0);
- tdscnt = SVAL(inbuf,smb_vwv1);
-
- pcnt = SVAL(inbuf,smb_vwv2);
- poff = SVAL(inbuf,smb_vwv3);
- pdisp = SVAL(inbuf,smb_vwv4);
-
- dcnt = SVAL(inbuf,smb_vwv5);
- doff = SVAL(inbuf,smb_vwv6);
- ddisp = SVAL(inbuf,smb_vwv7);
-
- pscnt += pcnt;
- dscnt += dcnt;
-
- if (dscnt > tdscnt || pscnt > tpscnt) {
- exit_server("invalid trans parameters\n");
- }
-
- if (pcnt)
- memcpy(params+pdisp,smb_base(inbuf)+poff,pcnt);
- if (dcnt)
- memcpy(data+ddisp,smb_base(inbuf)+doff,dcnt);
- }
-
-
- DEBUG(3,("trans <%s> data=%d params=%d setup=%d\n",name,tdscnt,tpscnt,suwcnt));
-
-
- if (strncmp(name,"\\PIPE\\",strlen("\\PIPE\\")) == 0)
- outsize = named_pipe(cnum,vuid,outbuf,name+strlen("\\PIPE\\"),setup,data,params,
- suwcnt,tdscnt,tpscnt,msrcnt,mdrcnt,mprcnt);
-
-
- if (data) free(data);
- if (params) free(params);
- if (setup) free(setup);
-
- if (close_on_completion)
- close_cnum(cnum,vuid);
-
- if (one_way)
- return(-1);
-
- if (outsize == 0)
- return(ERROR(ERRSRV,ERRnosupport));
-
- return(outsize);
-}
diff --git a/source/smbd/mangle.c b/source/smbd/mangle.c
deleted file mode 100644
index b0a45ffb47c..00000000000
--- a/source/smbd/mangle.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Name mangling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-extern int case_default;
-extern BOOL case_mangle;
-
-/****************************************************************************
-provide a checksum on a string
-****************************************************************************/
-int str_checksum(char *s)
-{
- int res = 0;
- int c;
- int i=0;
- while (*s)
- {
- c = *s;
- res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
- s++; i++;
- }
- return(res);
-}
-
-/****************************************************************************
-return True if a name is a special msdos reserved name
-****************************************************************************/
-static BOOL is_reserved_msdos(char *fname)
-{
- char upperFname[13];
- char *p;
-
- StrnCpy (upperFname, fname, 12);
-
- /* lpt1.txt and con.txt etc are also illegal */
- p=strchr(upperFname,'.');
- if (p)
- *p='\0';
- strupper (upperFname);
- if ((strcmp(upperFname,"CLOCK$") == 0) ||
- (strcmp(upperFname,"CON") == 0) ||
- (strcmp(upperFname,"AUX") == 0) ||
- (strcmp(upperFname,"COM1") == 0) ||
- (strcmp(upperFname,"COM2") == 0) ||
- (strcmp(upperFname,"COM3") == 0) ||
- (strcmp(upperFname,"COM4") == 0) ||
- (strcmp(upperFname,"LPT1") == 0) ||
- (strcmp(upperFname,"LPT2") == 0) ||
- (strcmp(upperFname,"LPT3") == 0) ||
- (strcmp(upperFname,"NUL") == 0) ||
- (strcmp(upperFname,"PRN") == 0))
- return (True) ;
-
- return (False);
-}
-
-
-
-/****************************************************************************
-return True if a name is in 8.3 dos format
-****************************************************************************/
-BOOL is_8_3(char *fname, BOOL check_case)
-{
- int len;
- char *dot_pos;
- char *slash_pos = strrchr(fname,'/');
- int l;
-
- if (slash_pos) fname = slash_pos+1;
- len = strlen(fname);
-
- DEBUG(5,("checking %s for 8.3\n",fname));
-
- if (check_case && case_mangle)
- switch (case_default)
- {
- case CASE_LOWER:
- if (strhasupper(fname)) return(False);
- break;
- case CASE_UPPER:
- if (strhaslower(fname)) return(False);
- break;
- }
-
- /* can't be longer than 12 chars */
- if (len == 0 || len > 12)
- return(False);
-
- /* can't be an MS-DOS Special file such as lpt1 or even lpt1.txt */
- if (is_reserved_msdos(fname))
- return(False);
-
- /* can't contain invalid dos chars */
- /* Windows use the ANSI charset.
- But filenames are translated in the PC charset.
- This Translation may be more or less relaxed depending
- the Windows application. */
-
- /* %%% A nice improvment to name mangling would be to translate
- filename to ANSI charset on the smb server host */
-
- dot_pos = strchr(fname,'.');
-
- {
- char *p = fname;
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- dot_pos = 0;
- while (*p)
- {
- if (is_shift_jis (*p))
- p += 2;
- else if (is_kana (*p))
- p ++;
- else
- {
- if (*p == '.' && !dot_pos)
- dot_pos = (char *) p;
- if (!isdoschar(*p))
- return(False);
- p++;
- }
- }
- }
- else
- {
- while (*p)
- {
- if (!isdoschar(*p))
- return(False);
- p++;
- }
- }
- }
-
- /* no dot and less than 9 means OK */
- if (!dot_pos)
- return(len <= 8);
-
- l = PTR_DIFF(dot_pos,fname);
-
- /* base must be at least 1 char except special cases . and .. */
- if (l == 0)
- return(strcmp(fname,".") == 0 || strcmp(fname,"..") == 0);
-
- /* base can't be greater than 8 */
- if (l > 8)
- return(False);
-
- if (lp_strip_dot() &&
- len - l == 1 &&
- !strchr(dot_pos+1,'.'))
- {
- *dot_pos = 0;
- return(True);
- }
-
- /* extension must be between 1 and 3 */
- if ( (len - l < 2 ) || (len - l > 4) )
- return(False);
-
- /* extension can't have a dot */
- if (strchr(dot_pos+1,'.'))
- return(False);
-
- /* must be in 8.3 format */
- return(True);
-}
-
-
-
-/*
-keep a stack of name mangling results - just
-so file moves and copies have a chance of working
-*/
-fstring *mangled_stack = NULL;
-int mangled_stack_size = 0;
-int mangled_stack_len = 0;
-
-/****************************************************************************
-create the mangled stack
-****************************************************************************/
-void create_mangled_stack(int size)
-{
- if (mangled_stack)
- {
- free(mangled_stack);
- mangled_stack_size = 0;
- mangled_stack_len = 0;
- }
- if (size > 0)
- mangled_stack = (fstring *)malloc(sizeof(fstring)*size);
- if (mangled_stack) mangled_stack_size = size;
-}
-
-/****************************************************************************
-push a mangled name onto the stack
-****************************************************************************/
-static void push_mangled_name(char *s)
-{
- int i;
- char *p;
-
- if (!mangled_stack)
- return;
-
- for (i=0;i<mangled_stack_len;i++)
- if (strcmp(s,mangled_stack[i]) == 0)
- {
- array_promote(mangled_stack[0],sizeof(fstring),i);
- return;
- }
-
- memmove(mangled_stack[1],mangled_stack[0],
- sizeof(fstring)*MIN(mangled_stack_len,mangled_stack_size-1));
- strcpy(mangled_stack[0],s);
- p = strrchr(mangled_stack[0],'.');
- if (p && (!strhasupper(p+1)) && (strlen(p+1) < 4))
- *p = 0;
- mangled_stack_len = MIN(mangled_stack_size,mangled_stack_len+1);
-}
-
-/****************************************************************************
-check for a name on the mangled name stack
-****************************************************************************/
-BOOL check_mangled_stack(char *s)
-{
- int i;
- pstring tmpname;
- char extension[5];
- char *p = strrchr(s,'.');
- BOOL check_extension = False;
-
- extension[0] = 0;
-
- if (!mangled_stack) return(False);
-
- if (p)
- {
- check_extension = True;
- StrnCpy(extension,p,4);
- strlower(extension); /* XXXXXXX */
- }
-
- for (i=0;i<mangled_stack_len;i++)
- {
- strcpy(tmpname,mangled_stack[i]);
- mangle_name_83(tmpname);
- if (strequal(tmpname,s))
- {
- strcpy(s,mangled_stack[i]);
- break;
- }
- if (check_extension && !strchr(mangled_stack[i],'.'))
- {
- pstrcpy(tmpname,mangled_stack[i]);
- strcat(tmpname,extension);
- mangle_name_83(tmpname);
- if (strequal(tmpname,s))
- {
- strcpy(s,mangled_stack[i]);
- strcat(s,extension);
- break;
- }
- }
- }
-
- if (i < mangled_stack_len)
- {
- DEBUG(3,("Found %s on mangled stack as %s\n",s,mangled_stack[i]));
- array_promote(mangled_stack[0],sizeof(fstring),i);
- return(True);
- }
-
- return(False);
-}
-
-static char *map_filename(char *s, /* This is null terminated */
- char *pattern, /* This isn't. */
- int len) /* This is the length of pattern. */
-{
- static pstring matching_bit; /* The bit of the string which matches */
- /* a * in pattern if indeed there is a * */
- char *sp; /* Pointer into s. */
- char *pp; /* Pointer into p. */
- char *match_start; /* Where the matching bit starts. */
- pstring pat;
-
- StrnCpy(pat, pattern, len); /* Get pattern into a proper string! */
- pstrcpy(matching_bit,""); /* Match but no star gets this. */
- pp = pat; /* Initialise the pointers. */
- sp = s;
- if ((len == 1) && (*pattern == '*')) {
- return NULL; /* Impossible, too ambiguous for */
- /* words! */
- }
-
- while ((*sp) /* Not the end of the string. */
- && (*pp) /* Not the end of the pattern. */
- && (*sp == *pp) /* The two match. */
- && (*pp != '*')) { /* No wildcard. */
- sp++; /* Keep looking. */
- pp++;
- }
- if (!*sp && !*pp) /* End of pattern. */
- return matching_bit; /* Simple match. Return empty string. */
- if (*pp == '*') {
- pp++; /* Always interrested in the chacter */
- /* after the '*' */
- if (!*pp) { /* It is at the end of the pattern. */
- StrnCpy(matching_bit, s, sp-s);
- return matching_bit;
- } else {
- /* The next character in pattern must match a character further */
- /* along s than sp so look for that character. */
- match_start = sp;
- while ((*sp) /* Not the end of s. */
- && (*sp != *pp)) /* Not the same */
- sp++; /* Keep looking. */
- if (!*sp) { /* Got to the end without a match. */
- return NULL;
- } else { /* Still hope for a match. */
- /* Now sp should point to a matching character. */
- StrnCpy(matching_bit, match_start, sp-match_start);
- /* Back to needing a stright match again. */
- while ((*sp) /* Not the end of the string. */
- && (*pp) /* Not the end of the pattern. */
- && (*sp == *pp)) { /* The two match. */
- sp++; /* Keep looking. */
- pp++;
- }
- if (!*sp && !*pp) /* Both at end so it matched */
- return matching_bit;
- else
- return NULL;
- }
- }
- }
- return NULL; /* No match. */
-}
-
-
-/* this is the magic char used for mangling */
-char magic_char = '~';
-
-
-/****************************************************************************
-determine whther is name could be a mangled name
-****************************************************************************/
-BOOL is_mangled(char *s)
-{
- char *m = strchr(s,magic_char);
- if (!m) return(False);
-
- /* we use two base 36 chars efore the extension */
- if (m[1] == '.' || m[1] == 0 ||
- m[2] == '.' || m[2] == 0 ||
- (m[3] != '.' && m[3] != 0))
- return(is_mangled(m+1));
-
- /* it could be */
- return(True);
-}
-
-
-
-/****************************************************************************
-return a base 36 character. v must be from 0 to 35.
-****************************************************************************/
-static char base36(unsigned int v)
-{
- static char basechars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- return basechars[v % 36];
-}
-
-
-static void do_fwd_mangled_map(char *s, char *MangledMap)
-{
- /* MangledMap is a series of name pairs in () separated by spaces.
- * If s matches the first of the pair then the name given is the
- * second of the pair. A * means any number of any character and if
- * present in the second of the pair as well as the first the
- * matching part of the first string takes the place of the * in the
- * second.
- *
- * I wanted this so that we could have RCS files which can be used
- * by UNIX and DOS programs. My mapping string is (RCS rcs) which
- * converts the UNIX RCS file subdirectory to lowercase thus
- * preventing mangling.
- */
- char *start=MangledMap; /* Use this to search for mappings. */
- char *end; /* Used to find the end of strings. */
- char *match_string;
- pstring new_string; /* Make up the result here. */
- char *np; /* Points into new_string. */
-
- DEBUG(5,("Mangled Mapping '%s' map '%s'\n", s, MangledMap));
- while (*start) {
- while ((*start) && (*start != '('))
- start++;
- if (!*start)
- continue; /* Always check for the end. */
- start++; /* Skip the ( */
- end = start; /* Search for the ' ' or a ')' */
- DEBUG(5,("Start of first in pair '%s'\n", start));
- while ((*end) && !((*end == ' ') || (*end == ')')))
- end++;
- if (!*end) {
- start = end;
- continue; /* Always check for the end. */
- }
- DEBUG(5,("End of first in pair '%s'\n", end));
- if ((match_string = map_filename(s, start, end-start))) {
- DEBUG(5,("Found a match\n"));
- /* Found a match. */
- start = end+1; /* Point to start of what it is to become. */
- DEBUG(5,("Start of second in pair '%s'\n", start));
- end = start;
- np = new_string;
- while ((*end) /* Not the end of string. */
- && (*end != ')') /* Not the end of the pattern. */
- && (*end != '*')) /* Not a wildcard. */
- *np++ = *end++;
- if (!*end) {
- start = end;
- continue; /* Always check for the end. */
- }
- if (*end == '*') {
- pstrcpy(np, match_string);
- np += strlen(match_string);
- end++; /* Skip the '*' */
- while ((*end) /* Not the end of string. */
- && (*end != ')') /* Not the end of the pattern. */
- && (*end != '*')) /* Not a wildcard. */
- *np++ = *end++;
- }
- if (!*end) {
- start = end;
- continue; /* Always check for the end. */
- }
- *np++ = '\0'; /* NULL terminate it. */
- DEBUG(5,("End of second in pair '%s'\n", end));
- pstrcpy(s, new_string); /* Substitute with the new name. */
- DEBUG(5,("s is now '%s'\n", s));
- }
- start = end; /* Skip a bit which cannot be wanted */
- /* anymore. */
- start++;
- }
-}
-
-/****************************************************************************
-do the actual mangling to 8.3 format
-****************************************************************************/
-void mangle_name_83(char *s)
-{
- int csum = str_checksum(s);
- char *p;
- char extension[4];
- char base[9];
- int baselen = 0;
- int extlen = 0;
-
- extension[0]=0;
- base[0]=0;
-
- p = strrchr(s,'.');
- if (p && (strlen(p+1)<4) )
- {
- BOOL all_normal = (strisnormal(p+1)); /* XXXXXXXXX */
- if (all_normal && p[1] != 0)
- {
- *p = 0;
- csum = str_checksum(s);
- *p = '.';
- }
- }
-
-
- strupper(s);
-
- DEBUG(5,("Mangling name %s to ",s));
-
- if (p)
- {
- if (p == s)
- strcpy(extension,"___");
- else
- {
- *p++ = 0;
- while (*p && extlen < 3)
- {
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- if (is_shift_jis (*p))
- {
- if (extlen < 2)
- {
- extension[extlen++] = p[0];
- extension[extlen++] = p[1];
- }
- else
- {
- extension[extlen++] = base36 (((unsigned char) *p) % 36);
- }
- p += 2;
- }
- else if (is_kana (*p))
- {
- extension[extlen++] = p[0];
- p++;
- }
- else
- {
- if (isdoschar (*p) && *p != '.')
- extension[extlen++] = p[0];
- p++;
- }
- }
- else
- {
- if (isdoschar(*p) && *p != '.')
- extension[extlen++] = *p;
- p++;
- }
- }
- extension[extlen] = 0;
- }
- }
-
- p = s;
-
- while (*p && baselen < 5)
- {
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- if (is_shift_jis (*p))
- {
- if (baselen < 4)
- {
- base[baselen++] = p[0];
- base[baselen++] = p[1];
- }
- else
- {
- base[baselen++] = base36 (((unsigned char) *p) % 36);
- }
- p += 2;
- }
- else if (is_kana (*p))
- {
- base[baselen++] = p[0];
- p++;
- }
- else
- {
- if (isdoschar (*p) && *p != '.')
- base[baselen++] = p[0];
- p++;
- }
- }
- else
- {
- if (isdoschar(*p) && *p != '.')
- base[baselen++] = *p;
- p++;
- }
- }
- base[baselen] = 0;
-
- csum = csum % (36*36);
-
- sprintf(s,"%s%c%c%c",base,magic_char,base36(csum/36),base36(csum%36));
-
- if (*extension)
- {
- strcat(s,".");
- strcat(s,extension);
- }
- DEBUG(5,("%s\n",s));
-}
-
-
-
-/*******************************************************************
- work out if a name is illegal, even for long names
- ******************************************************************/
-static BOOL illegal_name(char *name)
-{
- static unsigned char illegal[256];
- static BOOL initialised=False;
- unsigned char *s;
-
- if (!initialised)
- {
- char *ill = "*\\/?<>|\":{}";
- initialised = True;
-
- bzero((char *)illegal,256);
- for (s = (unsigned char *)ill; *s; s++)
- illegal[*s] = True;
- }
-
- if(lp_client_code_page() == KANJI_CODEPAGE)
- {
- for (s = (unsigned char *)name; *s;) {
- if (is_shift_jis (*s)) {
- s += 2;
- } else if (illegal[*s]) {
- return(True);
- } else {
- s++;
- }
- }
- }
- else
- {
- for (s = (unsigned char *)name;*s;s++)
- if (illegal[*s]) return(True);
- }
-
- return(False);
-}
-
-
-/****************************************************************************
-convert a filename to DOS format. return True if successful.
-****************************************************************************/
-BOOL name_map_mangle(char *OutName,BOOL need83,int snum)
-{
-#ifdef MANGLE_LONG_FILENAMES
- if (!need83 && illegal_name(OutName)) need83 = True;
-#endif
-
- /* apply any name mappings */
- {
- char *map = lp_mangled_map(snum);
- if (map && *map)
- do_fwd_mangled_map(OutName,map);
- }
-
- /* check if it's already in 8.3 format */
- if (need83 && !is_8_3(OutName, True)) {
- if (!lp_manglednames(snum)) return(False);
-
- /* mangle it into 8.3 */
- push_mangled_name(OutName);
- mangle_name_83(OutName);
- }
-
- return(True);
-}
-
diff --git a/source/smbd/message.c b/source/smbd/message.c
deleted file mode 100644
index 64253932abb..00000000000
--- a/source/smbd/message.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB messaging
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-/*
- This file handles the messaging system calls for winpopup style
- messages
-*/
-
-
-#include "includes.h"
-
-/* look in server.c for some explanation of these variables */
-extern int DEBUGLEVEL;
-
-
-static char msgbuf[1600];
-static int msgpos=0;
-static fstring msgfrom="";
-static fstring msgto="";
-
-/****************************************************************************
-deliver the message
-****************************************************************************/
-static void msg_deliver(void)
-{
- pstring s;
- fstring name;
- int i;
- int fd;
-
- if (! (*lp_msg_command()))
- {
- DEBUG(1,("no messaging command specified\n"));
- msgpos = 0;
- return;
- }
-
- /* put it in a temporary file */
- sprintf(s,"%s/msg.XXXXXX",tmpdir());
- fstrcpy(name,(char *)mktemp(s));
-
- fd = open(name,O_WRONLY|O_CREAT|O_TRUNC|O_EXCL,0600);
- if (fd == -1) {
- DEBUG(1,("can't open message file %s\n",name));
- return;
- }
-
- for (i=0;i<msgpos;) {
- if (msgbuf[i]=='\r' && i<(msgpos-1) && msgbuf[i+1]=='\n') {
- i++; continue;
- }
- write(fd,&msgbuf[i++],1);
- }
- close(fd);
-
-
- /* run the command */
- if (*lp_msg_command())
- {
- pstrcpy(s,lp_msg_command());
- string_sub(s,"%s",name);
- string_sub(s,"%f",msgfrom);
- string_sub(s,"%t",msgto);
- standard_sub(-1,s);
- smbrun(s,NULL,False);
- }
-
- msgpos = 0;
-}
-
-
-
-/****************************************************************************
- reply to a sends
-****************************************************************************/
-int reply_sends(char *inbuf,char *outbuf)
-{
- int len;
- char *orig,*dest,*msg;
- int outsize = 0;
-
- msgpos = 0;
-
-
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
-
- outsize = set_message(outbuf,0,0,True);
-
- orig = smb_buf(inbuf)+1;
- dest = skip_string(orig,1)+1;
- msg = skip_string(dest,1)+1;
-
- fstrcpy(msgfrom,orig);
- fstrcpy(msgto,dest);
-
- len = SVAL(msg,0);
- len = MIN(len,1600-msgpos);
-
- memcpy(&msgbuf[msgpos],msg+2,len);
- msgpos += len;
-
- DEBUG(3,("%s SMBsends (from %s to %s)\n",timestring(),orig,dest));
-
- msg_deliver();
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a sendstrt
-****************************************************************************/
-int reply_sendstrt(char *inbuf,char *outbuf)
-{
- char *orig,*dest;
- int outsize = 0;
-
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
-
- outsize = set_message(outbuf,1,0,True);
-
- msgpos = 0;
-
- orig = smb_buf(inbuf)+1;
- dest = skip_string(orig,1)+1;
-
- fstrcpy(msgfrom,orig);
- fstrcpy(msgto,dest);
-
- DEBUG(3,("%s SMBsendstrt (from %s to %s)\n",timestring(),msgfrom,msgto));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a sendtxt
-****************************************************************************/
-int reply_sendtxt(char *inbuf,char *outbuf)
-{
- int len;
- int outsize = 0;
- char *msg;
-
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
-
- outsize = set_message(outbuf,0,0,True);
-
- msg = smb_buf(inbuf) + 1;
-
- len = SVAL(msg,0);
- len = MIN(len,1600-msgpos);
-
- memcpy(&msgbuf[msgpos],msg+2,len);
- msgpos += len;
-
- DEBUG(3,("%s SMBsendtxt\n",timestring()));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a sendend
-****************************************************************************/
-int reply_sendend(char *inbuf,char *outbuf)
-{
- int outsize = 0;
-
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s SMBsendend\n",timestring()));
-
- msg_deliver();
-
- return(outsize);
-}
-
diff --git a/source/smbd/password.c b/source/smbd/password.c
deleted file mode 100644
index f4d94791cf3..00000000000
--- a/source/smbd/password.c
+++ /dev/null
@@ -1,1707 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Password and authentication handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-#if (defined(NETGROUP) && defined (AUTOMOUNT))
-#include "rpcsvc/ypclnt.h"
-#endif
-
-extern int DEBUGLEVEL;
-extern int Protocol;
-
-/* users from session setup */
-static pstring session_users="";
-
-/* these are kept here to keep the string_combinations function simple */
-static char this_user[100]="";
-static char this_salt[100]="";
-static char this_crypted[100]="";
-
-/* Data to do lanman1/2 password challenge. */
-static unsigned char saved_challenge[8];
-static BOOL challenge_sent=False;
-
-/*******************************************************************
-Get the next challenge value - no repeats.
-********************************************************************/
-void generate_next_challenge(char *challenge)
-{
- unsigned char buf[16];
- static int counter = 0;
- struct timeval tval;
- int v1,v2;
-
- /* get a sort-of random number */
- GetTimeOfDay(&tval);
- v1 = (counter++) + getpid() + tval.tv_sec;
- v2 = (counter++) * getpid() + tval.tv_usec;
- SIVAL(challenge,0,v1);
- SIVAL(challenge,4,v2);
-
- /* mash it up with md4 */
- mdfour(buf, (unsigned char *)challenge, 8);
-
- memcpy(saved_challenge, buf, 8);
- memcpy(challenge,buf,8);
- challenge_sent = True;
-}
-
-/*******************************************************************
-set the last challenge sent, usually from a password server
-********************************************************************/
-BOOL set_challenge(char *challenge)
-{
- memcpy(saved_challenge,challenge,8);
- challenge_sent = True;
- return(True);
-}
-
-/*******************************************************************
-get the last challenge sent
-********************************************************************/
-BOOL last_challenge(char *challenge)
-{
- if (!challenge_sent) return(False);
- memcpy(challenge,saved_challenge,8);
- return(True);
-}
-
-/* this holds info on user ids that are already validated for this VC */
-static user_struct *validated_users = NULL;
-static int num_validated_users = 0;
-
-/****************************************************************************
-check if a uid has been validated, and return an pointer to the user_struct
-if it has. NULL if not. vuid is biased by an offset. This allows us to
-tell random client vuid's (normally zero) from valid vuids.
-****************************************************************************/
-user_struct *get_valid_user_struct(uint16 vuid)
-{
- if(vuid == UID_FIELD_INVALID)
- return NULL;
- vuid -= VUID_OFFSET;
- if((vuid >= (uint16)num_validated_users) ||
- (validated_users[vuid].uid == -1) || (validated_users[vuid].gid == -1))
- return NULL;
- return &validated_users[vuid];
-}
-
-/****************************************************************************
-invalidate a uid
-****************************************************************************/
-void invalidate_vuid(uint16 vuid)
-{
- user_struct *vuser = get_valid_user_struct(vuid);
- if(vuser == 0)
- return;
-
- vuser->uid = -1;
- vuser->gid = -1;
- vuser->user_ngroups = 0;
- if(vuser->user_groups &&
- (vuser->user_groups != (gid_t *)vuser->user_igroups))
- free(vuser->user_groups);
- vuser->user_groups = NULL;
- if(vuser->user_igroups)
- free(vuser->user_igroups);
- vuser->user_igroups = NULL;
-}
-
-
-/****************************************************************************
-return a validated username
-****************************************************************************/
-char *validated_username(uint16 vuid)
-{
- user_struct *vuser = get_valid_user_struct(vuid);
- if(vuser == 0)
- return 0;
- return(vuser->name);
-}
-
-/****************************************************************************
-register a uid/name pair as being valid and that a valid password
-has been given. vuid is biased by an offset. This allows us to
-tell random client vuid's (normally zero) from valid vuids.
-****************************************************************************/
-uint16 register_vuid(int uid,int gid, char *name,BOOL guest)
-{
- user_struct *vuser;
-
-#if (defined(NETGROUP) && defined (AUTOMOUNT))
- int nis_error; /* returned by yp all functions */
- char *nis_result; /* yp_match inits this */
- int nis_result_len; /* and set this */
- char *nis_domain; /* yp_get_default_domain inits this */
- char *nis_map = (char *)lp_nis_home_map_name();
- int home_server_len;
-#endif
- struct passwd *pwfile; /* for getting real name from passwd file */
- int real_name_len;
-
-#if 0
- /*
- * After observing MS-Exchange services writing to a Samba share
- * I belive this code is incorrect. Each service does it's own
- * sessionsetup_and_X for the same user, and as each service shuts
- * down, it does a user_logoff_and_X. As we are consolidating multiple
- * sessionsetup_and_X's onto the same vuid here, when the first service
- * shuts down, it invalidates all the open files for the other services.
- * Hence I am removing this code and forcing each sessionsetup_and_X
- * to get a new vuid.
- * Jeremy Allison. (jallison@whistle.com).
- */
-
- int i;
- for(i = 0; i < num_validated_users; i++) {
- vuser = &validated_users[i];
- if( vuser->uid == uid )
- return (uint16)(i + VUID_OFFSET); /* User already validated */
- }
-#endif
-
- validated_users = (user_struct *)Realloc(validated_users,
- sizeof(user_struct)*
- (num_validated_users+1));
-
- if (!validated_users)
- {
- DEBUG(0,("Failed to realloc users struct!\n"));
- num_validated_users = 0;
- return UID_FIELD_INVALID;
- }
-
- vuser = &validated_users[num_validated_users];
- num_validated_users++;
-
- vuser->uid = uid;
- vuser->gid = gid;
- vuser->guest = guest;
- strcpy(vuser->name,name);
-
- vuser->user_ngroups = 0;
- vuser->user_groups = NULL;
- vuser->user_igroups = NULL;
-
- /* Find all the groups this uid is in and store them.
- Used by become_user() */
- setup_groups(name,uid,gid,
- &vuser->user_ngroups,
- &vuser->user_igroups,
- &vuser->user_groups);
-
- DEBUG(3,("uid %d registered to name %s\n",uid,name));
-
-#if (defined(NETGROUP) && defined (AUTOMOUNT))
- vuser->home_share = NULL;
- DEBUG(3, ("Setting default HOMESHR to: \\\\logon server\\HOMES\n"));
- vuser->home_share = Realloc(vuser->home_share, 32);
- strcpy(vuser->home_share,"\\\\%L\\HOMES");
-
- if (nis_error = yp_get_default_domain(&nis_domain))
- DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
- DEBUG(3, ("NIS Domain: %s\n", nis_domain));
-
- if (nis_error = yp_match(nis_domain, nis_map, vuser->name, strlen(vuser->name),
- &nis_result, &nis_result_len))
- DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
- if (!nis_error && lp_nis_home_map()) {
- home_server_len = strcspn(nis_result,":");
- DEBUG(3, ("NIS lookup succeeded\n\tHome server length: %d\n",home_server_len));
- vuser->home_share = (char *)Realloc(vuser->home_share, home_server_len+12);
- DEBUG(3, ("\tAllocated %d bytes for HOMESHR\n",home_server_len+12 ));
- strcpy(vuser->home_share,"\\\\");
- strncat(vuser->home_share, nis_result, home_server_len);
- strcat(vuser->home_share,"\\homes");
- DEBUG(2,("\tUser = %s\n\tUID = %d\n\tNIS result = %s\n\tHOMESHR = %s\n",
- vuser->name, vuser->uid, nis_result, vuser->home_share));
- }
-#endif
-
- vuser->real_name = NULL;
- DEBUG(3, ("Clearing default real name\n"));
- vuser->real_name = Realloc(vuser->real_name, 15);
- strcpy(vuser->real_name, "<Full Name>\0");
- if (lp_unix_realname()) {
- if((pwfile=getpwnam(vuser->name))!= NULL)
- {
- DEBUG(3, ("User name: %s\tReal name: %s\n",vuser->name,pwfile->pw_gecos));
- real_name_len = strcspn(pwfile->pw_gecos, ",");
- DEBUG(3, ("Real name length: %d\n", real_name_len));
- vuser->real_name = (char *)Realloc(vuser->real_name, real_name_len+1);
- strncpy(vuser->real_name, pwfile->pw_gecos, real_name_len);
- vuser->real_name[real_name_len]='\0';
- }
- }
-
- return (uint16)((num_validated_users - 1) + VUID_OFFSET);
-}
-
-
-/****************************************************************************
-add a name to the session users list
-****************************************************************************/
-void add_session_user(char *user)
-{
- fstring suser;
- StrnCpy(suser,user,sizeof(suser)-1);
-
- if (!Get_Pwnam(suser,True)) return;
-
- if (suser && *suser && !in_list(suser,session_users,False))
- {
- if (strlen(suser) + strlen(session_users) + 2 >= sizeof(pstring))
- DEBUG(1,("Too many session users??\n"));
- else
- {
- strcat(session_users," ");
- strcat(session_users,suser);
- }
- }
-}
-
-
-#ifdef NO_GETSPNAM
-/* a fake shadow password routine which just fills a fake spwd struct
- * with the sp_pwdp field. (sreiz@aie.nl)
- */
-static struct spwd *getspnam(char *username) /* fake shadow password routine */
-{
- FILE *f;
- char line[1024];
- static char pw[20];
- static struct spwd static_spwd;
-
- static_spwd.sp_pwdp=0;
- if (!(f=fopen("/etc/master.passwd", "r")))
- return 0;
- while (fgets(line, 1024, f)) {
- if (!strncmp(line, username, strlen(username)) &&
- line[strlen(username)]==':') { /* found entry */
- char *p, *q;
-
- p=line+strlen(username)+1;
- if ((q=strchr(p, ':'))) {
- *q=0;
- if (q-p+1>20)
- break;
- strcpy(pw, p);
- static_spwd.sp_pwdp=pw;
- }
- break;
- }
- }
- fclose(f);
- if (static_spwd.sp_pwdp)
- return &static_spwd;
- return 0;
-}
-#endif
-
-
-#ifdef OSF1_ENH_SEC
-/****************************************************************************
-an enhanced crypt for OSF1
-****************************************************************************/
-static char *osf1_bigcrypt(char *password,char *salt1)
-{
- static char result[AUTH_MAX_PASSWD_LENGTH] = "";
- char *p1;
- char *p2=password;
- char salt[3];
- int i;
- int parts = strlen(password) / AUTH_CLEARTEXT_SEG_CHARS;
- if (strlen(password)%AUTH_CLEARTEXT_SEG_CHARS)
- parts++;
-
- StrnCpy(salt,salt1,2);
- StrnCpy(result,salt1,2);
-
- for (i=0; i<parts;i++)
- {
- p1 = crypt(p2,salt);
- strcat(result,p1+2);
- StrnCpy(salt,&result[2+i*AUTH_CIPHERTEXT_SEG_CHARS],2);
- p2 += AUTH_CLEARTEXT_SEG_CHARS;
- }
-
- return(result);
-}
-#endif
-
-
-/****************************************************************************
-update the enhanced security database. Only relevant for OSF1 at the moment.
-****************************************************************************/
-static void update_protected_database( char *user, BOOL result)
-{
-#ifdef OSF1_ENH_SEC
- struct pr_passwd *mypasswd;
- time_t starttime;
-
- mypasswd = getprpwnam (user);
- starttime = time (NULL);
-
- if (result)
- {
- mypasswd->ufld.fd_slogin = starttime;
- mypasswd->ufld.fd_nlogins = 0;
-
- putprpwnam(user,mypasswd);
-
- DEBUG(3,("Update protected database for Account %s after succesful connection\n",user));
- }
- else
- {
- mypasswd->ufld.fd_ulogin = starttime;
- mypasswd->ufld.fd_nlogins = mypasswd->ufld.fd_nlogins + 1;
- if ( mypasswd->ufld.fd_max_tries != 0 && mypasswd->ufld.fd_nlogins > mypasswd->ufld.fd_max_tries )
- {
- mypasswd->uflg.fg_lock = 0;
- DEBUG(3,("Account is disabled -- see Account Administrator.\n"));
- }
- putprpwnam ( user , mypasswd );
- DEBUG(3,("Update protected database for Account %s after refusing connection\n",user));
- }
-#else
- DEBUG(6,("Updated database with %s %s\n",user,BOOLSTR(result)));
-#endif
-}
-
-
-#ifdef USE_PAM
-/*******************************************************************
-check on PAM authentication
-********************************************************************/
-
-/* We first need some helper functions */
-#include <security/pam_appl.h>
-/* Static variables used to communicate between the conversation function
- * and the server_login function
- */
-static char *PAM_username;
-static char *PAM_password;
-
-/* PAM conversation function
- * Here we assume (for now, at least) that echo on means login name, and
- * echo off means password.
- */
-static int PAM_conv (int num_msg,
- struct pam_message **msg,
- struct pam_response **resp,
- void *appdata_ptr) {
- int count = 0, replies = 0;
- struct pam_response *reply = NULL;
- int size = sizeof(struct pam_response);
-
- #define GET_MEM if (reply) realloc(reply, size); else reply = malloc(size); \
- if (!reply) return PAM_CONV_ERR; \
- size += sizeof(struct pam_response)
- #define COPY_STRING(s) (s) ? strdup(s) : NULL
-
- for (count = 0; count < num_msg; count++) {
- switch (msg[count]->msg_style) {
- case PAM_PROMPT_ECHO_ON:
- GET_MEM;
- reply[replies].resp_retcode = PAM_SUCCESS;
- reply[replies++].resp = COPY_STRING(PAM_username);
- /* PAM frees resp */
- break;
- case PAM_PROMPT_ECHO_OFF:
- GET_MEM;
- reply[replies].resp_retcode = PAM_SUCCESS;
- reply[replies++].resp = COPY_STRING(PAM_password);
- /* PAM frees resp */
- break;
- case PAM_TEXT_INFO:
- /* ignore it... */
- break;
- case PAM_ERROR_MSG:
- default:
- /* Must be an error of some sort... */
- free (reply);
- return PAM_CONV_ERR;
- }
- }
- if (reply) *resp = reply;
- return PAM_SUCCESS;
-}
-static struct pam_conv PAM_conversation = {
- &PAM_conv,
- NULL
-};
-
-
-static BOOL pam_auth(char *this_user,char *password)
-{
- pam_handle_t *pamh;
- int pam_error;
-
- /* Now use PAM to do authentication. For now, we won't worry about
- * session logging, only authentication. Bail out if there are any
- * errors. Since this is a limited protocol, and an even more limited
- * function within a server speaking this protocol, we can't be as
- * verbose as would otherwise make sense.
- * Query: should we be using PAM_SILENT to shut PAM up?
- */
- #define PAM_BAIL if (pam_error != PAM_SUCCESS) { \
- pam_end(pamh, 0); return False; \
- }
- PAM_password = password;
- PAM_username = this_user;
- pam_error = pam_start("samba", this_user, &PAM_conversation, &pamh);
- PAM_BAIL;
- pam_error = pam_authenticate(pamh, 0);
- PAM_BAIL;
- /* It is not clear to me that account management is the right thing
- * to do, but it is not clear that it isn't, either. This can be
- * removed if no account management should be done. Alternately,
- * put a pam_allow.so entry in /etc/pam.conf for account handling. */
- pam_error = pam_acct_mgmt(pamh, 0);
- PAM_BAIL;
- pam_end(pamh, PAM_SUCCESS);
- /* If this point is reached, the user has been authenticated. */
- return(True);
-}
-#endif
-
-
-#ifdef AFS_AUTH
-/*******************************************************************
-check on AFS authentication
-********************************************************************/
-static BOOL afs_auth(char *this_user,char *password)
-{
- long password_expires = 0;
- char *reason;
-
- /* For versions of AFS prior to 3.3, this routine has few arguments, */
- /* but since I can't find the old documentation... :-) */
- setpag();
- if (ka_UserAuthenticateGeneral(KA_USERAUTH_VERSION+KA_USERAUTH_DOSETPAG,
- this_user,
- (char *) 0, /* instance */
- (char *) 0, /* cell */
- password,
- 0, /* lifetime, default */
- &password_expires, /*days 'til it expires */
- 0, /* spare 2 */
- &reason) == 0)
- return(True);
- return(False);
-}
-#endif
-
-
-#ifdef DFS_AUTH
-
-sec_login_handle_t my_dce_sec_context;
-int dcelogin_atmost_once = 0;
-
-/*******************************************************************
-check on a DCE/DFS authentication
-********************************************************************/
-static BOOL dfs_auth(char *this_user,char *password)
-{
- error_status_t err;
- int err2;
- int prterr;
- boolean32 password_reset;
- sec_passwd_rec_t my_dce_password;
- sec_login_auth_src_t auth_src = sec_login_auth_src_network;
- unsigned char dce_errstr[dce_c_error_string_len];
-
- /*
- * We only go for a DCE login context if the given password
- * matches that stored in the local password file..
- * Assumes local passwd file is kept in sync w/ DCE RGY!
- */
-
- if (!strcmp((char *)crypt(password,this_salt),this_crypted) ||
- dcelogin_atmost_once)
- return(False);
-
- if (sec_login_setup_identity(
- (unsigned char *)this_user,
- sec_login_no_flags,
- &my_dce_sec_context,
- &err) == 0)
- {
- dce_error_inq_text(err, dce_errstr, &err2);
- DEBUG(0,("DCE Setup Identity for %s failed: %s\n",
- this_user,dce_errstr));
- return(False);
- }
-
- my_dce_password.version_number = sec_passwd_c_version_none;
- my_dce_password.pepper = NULL;
- my_dce_password.key.key_type = sec_passwd_plain;
- my_dce_password.key.tagged_union.plain = (idl_char *)password;
-
- if (sec_login_valid_and_cert_ident(my_dce_sec_context,
- &my_dce_password,
- &password_reset,
- &auth_src,
- &err) == 0 )
- {
- dce_error_inq_text(err, dce_errstr, &err2);
- DEBUG(0,("DCE Identity Validation failed for principal %s: %s\n",
- this_user,dce_errstr));
-
- return(False);
- }
-
- sec_login_set_context(my_dce_sec_context, &err);
- if (err != error_status_ok )
- {
- dce_error_inq_text(err, dce_errstr, &err2);
- DEBUG(0,("DCE login failed for principal %s, cant set context: %s\n",
- this_user,dce_errstr));
- sec_login_purge_context(my_dce_sec_context, &err);
- return(False);
- }
- else
- {
- DEBUG(0,("DCE login succeeded for principal %s on pid %d\n",
- this_user, getpid()));
- }
-
- dcelogin_atmost_once = 1;
- return (True);
-}
-
-void dfs_unlogin(void)
-{
- error_status_t err;
- int err2;
- unsigned char dce_errstr[dce_c_error_string_len];
-
- sec_login_purge_context(my_dce_sec_context, &err);
- if (err != error_status_ok )
- {
- dce_error_inq_text(err, dce_errstr, &err2);
- DEBUG(0,("DCE purge login context failed for server instance %d: %s\n",
- getpid(), dce_errstr));
- }
-}
-
-#endif
-
-#ifdef KRB5_AUTH
-/*******************************************************************
-check on Kerberos authentication
-********************************************************************/
-static BOOL krb5_auth(char *this_user,char *password)
-{
- krb5_data tgtname = {
- 0,
- KRB5_TGS_NAME_SIZE,
- KRB5_TGS_NAME
- };
- krb5_context kcontext;
- krb5_principal kprinc;
- krb5_principal server;
- krb5_creds kcreds;
- int options = 0;
- krb5_address **addrs = (krb5_address **)0;
- krb5_preauthtype *preauth = NULL;
- krb5_keytab keytab = NULL;
- krb5_timestamp now;
- krb5_ccache ccache = NULL;
- int retval;
- char *name;
-
- if ( retval=krb5_init_context(&kcontext))
- {
- return(False);
- }
-
- if ( retval = krb5_timeofday(kcontext, &now) )
- {
- return(False);
- }
-
- if ( retval = krb5_cc_default(kcontext, &ccache) )
- {
- return(False);
- }
-
- if ( retval = krb5_parse_name(kcontext, this_user, &kprinc) )
- {
- return(False);
- }
-
- memset((char *)&kcreds, 0, sizeof(kcreds));
-
- kcreds.client = kprinc;
-
- if ((retval = krb5_build_principal_ext(kcontext, &server,
- krb5_princ_realm(kcontext, kprinc)->length,
- krb5_princ_realm(kcontext, kprinc)->data,
- tgtname.length,
- tgtname.data,
- krb5_princ_realm(kcontext, kprinc)->length,
- krb5_princ_realm(kcontext, kprinc)->data,
- 0)))
- {
- return(False);
- }
-
- kcreds.server = server;
-
- retval = krb5_get_in_tkt_with_password(kcontext,
- options,
- addrs,
- NULL,
- preauth,
- password,
- 0,
- &kcreds,
- 0);
-
- if ( retval )
- {
- return(False);
- }
-
- return(True);
-}
-#endif /* KRB5_AUTH */
-
-#ifdef LINUX_BIGCRYPT
-/****************************************************************************
-an enhanced crypt for Linux to handle password longer than 8 characters
-****************************************************************************/
-static int linux_bigcrypt(char *password,char *salt1, char *crypted)
-{
-#define LINUX_PASSWORD_SEG_CHARS 8
- char salt[3];
- int i;
-
- StrnCpy(salt,salt1,2);
- crypted +=2;
-
- for ( i=strlen(password); i > 0; i -= LINUX_PASSWORD_SEG_CHARS) {
- char * p = crypt(password,salt) + 2;
- if(strncmp(p, crypted, LINUX_PASSWORD_SEG_CHARS) != 0)
- return(0);
- password += LINUX_PASSWORD_SEG_CHARS;
- crypted += strlen(p);
- }
-
- return(1);
-}
-#endif
-
-
-/****************************************************************************
-apply a function to upper/lower case combinations
-of a string and return true if one of them returns true.
-try all combinations with N uppercase letters.
-offset is the first char to try and change (start with 0)
-it assumes the string starts lowercased
-****************************************************************************/
-static BOOL string_combinations2(char *s,int offset,BOOL (*fn)(),int N)
-{
- int len = strlen(s);
- int i;
-
-#ifdef PASSWORD_LENGTH
- len = MIN(len,PASSWORD_LENGTH);
-#endif
-
- if (N <= 0 || offset >= len)
- return(fn(s));
-
- for (i=offset;i<(len-(N-1));i++)
- {
- char c = s[i];
- if (!islower(c)) continue;
- s[i] = toupper(c);
- if (string_combinations2(s,i+1,fn,N-1))
- return(True);
- s[i] = c;
- }
- return(False);
-}
-
-/****************************************************************************
-apply a function to upper/lower case combinations
-of a string and return true if one of them returns true.
-try all combinations with up to N uppercase letters.
-offset is the first char to try and change (start with 0)
-it assumes the string starts lowercased
-****************************************************************************/
-static BOOL string_combinations(char *s,BOOL (*fn)(),int N)
-{
- int n;
- for (n=1;n<=N;n++)
- if (string_combinations2(s,0,fn,n)) return(True);
- return(False);
-}
-
-
-
-/****************************************************************************
-core of password checking routine
-****************************************************************************/
-BOOL password_check(char *password)
-{
-
-#ifdef USE_PAM
-/* This falls through if the password check fails
- - if NO_CRYPT is defined this causes an error msg
- saying Warning - no crypt available
- - if NO_CRYPT is NOT defined this is a potential security hole
- as it may authenticate via the crypt call when PAM
- settings say it should fail.
- if (pam_auth(this_user,password)) return(True);
-Hence we make a direct return to avoid a second chance!!!
-*/
- return (pam_auth(this_user,password));
-#endif
-
-#ifdef AFS_AUTH
- if (afs_auth(this_user,password)) return(True);
-#endif
-
-#ifdef DFS_AUTH
- if (dfs_auth(this_user,password)) return(True);
-#endif
-
-#ifdef KRB5_AUTH
- if (krb5_auth(this_user,password)) return(True);
-#endif
-
-#ifdef PWDAUTH
- if (pwdauth(this_user,password) == 0)
- return(True);
-#endif
-
-#ifdef OSF1_ENH_SEC
- return(strcmp(osf1_bigcrypt(password,this_salt),this_crypted) == 0);
-#endif
-
-#ifdef ULTRIX_AUTH
- return (strcmp((char *)crypt16(password, this_salt ),this_crypted) == 0);
-#endif
-
-#ifdef LINUX_BIGCRYPT
- return(linux_bigcrypt(password,this_salt,this_crypted));
-#endif
-
-#ifdef NO_CRYPT
- DEBUG(1,("Warning - no crypt available\n"));
- return(False);
-#else
- return(strcmp((char *)crypt(password,this_salt),this_crypted) == 0);
-#endif
-}
-
-/****************************************************************************
-core of smb password checking routine.
-****************************************************************************/
-BOOL smb_password_check(char *password, unsigned char *part_passwd, unsigned char *c8)
-{
- /* Finish the encryption of part_passwd. */
- unsigned char p21[21];
- unsigned char p24[24];
-
- if(part_passwd == NULL)
- DEBUG(10,("No password set - allowing access\n"));
- /* No password set - always true ! */
- if(part_passwd == NULL)
- return 1;
-
- memset(p21,'\0',21);
- memcpy(p21,part_passwd,16);
- E_P24(p21, c8, p24);
-#if DEBUG_PASSWORD
- {
- int i;
- DEBUG(100,("Part password (P16) was |"));
- for(i = 0; i < 16; i++)
- DEBUG(100,("%X ", (unsigned char)part_passwd[i]));
- DEBUG(100,("|\n"));
- DEBUG(100,("Password from client was |"));
- for(i = 0; i < 24; i++)
- DEBUG(100,("%X ", (unsigned char)password[i]));
- DEBUG(100,("|\n"));
- DEBUG(100,("Given challenge was |"));
- for(i = 0; i < 8; i++)
- DEBUG(100,("%X ", (unsigned char)c8[i]));
- DEBUG(100,("|\n"));
- DEBUG(100,("Value from encryption was |"));
- for(i = 0; i < 24; i++)
- DEBUG(100,("%X ", (unsigned char)p24[i]));
- DEBUG(100,("|\n"));
- }
-#endif
- return (memcmp(p24, password, 24) == 0);
-}
-
-/****************************************************************************
-check if a username/password is OK
-****************************************************************************/
-BOOL password_ok(char *user,char *password, int pwlen, struct passwd *pwd)
-{
- pstring pass2;
- int level = lp_passwordlevel();
- struct passwd *pass;
- char challenge[8];
- struct smb_passwd *smb_pass;
- BOOL challenge_done = False;
-
- if (password) password[pwlen] = 0;
-
- if (pwlen == 24)
- challenge_done = last_challenge(challenge);
-
-#if DEBUG_PASSWORD
- if (challenge_done)
- {
- int i;
- DEBUG(100,("checking user=[%s] pass=[",user));
- for( i = 0; i < 24; i++)
- DEBUG(100,("%0x ", (unsigned char)password[i]));
- DEBUG(100,("]\n"));
- } else {
- DEBUG(100,("checking user=[%s] pass=[%s]\n",user,password));
- }
-#endif
-
- if (!password)
- return(False);
-
- if (((!*password) || (!pwlen)) && !lp_null_passwords())
- return(False);
-
- if (pwd && !user)
- {
- pass = (struct passwd *) pwd;
- user = pass->pw_name;
- }
- else
- pass = Get_Pwnam(user,True);
-
- DEBUG(4,("SMB Password - pwlen = %d, challenge_done = %d\n", pwlen, challenge_done));
-
- if((pwlen == 24) && challenge_done)
- {
- DEBUG(4,("Checking SMB password for user %s (l=24)\n",user));
-
- if (!pass)
- {
- DEBUG(3,("Couldn't find user %s\n",user));
- return(False);
- }
-
- smb_pass = get_smbpwnam(user);
- if(!smb_pass)
- {
- DEBUG(3,("Couldn't find user %s in smb_passwd file.\n", user));
- return(False);
- }
-
- /* Ensure the uid's match */
- if(smb_pass->smb_userid != pass->pw_uid)
- {
- DEBUG(3,("Error : UNIX and SMB uids in password files do not match !\n"));
- return(False);
- }
-
- if(Protocol >= PROTOCOL_NT1)
- {
- /* We have the NT MD4 hash challenge available - see if we can
- use it (ie. does it exist in the smbpasswd file).
- */
- if(smb_pass->smb_nt_passwd != NULL)
- {
- DEBUG(4,("Checking NT MD4 password\n"));
- if(smb_password_check(password,
- smb_pass->smb_nt_passwd,
- (unsigned char *)challenge))
- {
- update_protected_database(user,True);
- return(True);
- }
- DEBUG(4,("NT MD4 password check failed\n"));
- }
- }
-
- /* Try against the lanman password */
-
- if (smb_password_check(password,
- smb_pass->smb_passwd,
- (unsigned char *)challenge)) {
- update_protected_database(user,True);
- return(True);
- }
-
- DEBUG(3,("Error smb_password_check failed\n"));
- }
-
- DEBUG(4,("Checking password for user %s (l=%d)\n",user,pwlen));
-
- if (!pass)
- {
- DEBUG(3,("Couldn't find user %s\n",user));
- return(False);
- }
-
-#ifdef SHADOW_PWD
- {
- struct spwd *spass;
-
- /* many shadow systems require you to be root to get the password,
- in most cases this should already be the case when this
- function is called, except perhaps for IPC password changing
- requests */
-
- spass = getspnam(pass->pw_name);
- if (spass && spass->sp_pwdp)
- pass->pw_passwd = spass->sp_pwdp;
- }
-#elif defined(IA_UINFO)
- {
- /* Need to get password with SVR4.2's ia_ functions instead of
- get{sp,pw}ent functions. Required by UnixWare 2.x, tested on
- version 2.1. (tangent@cyberport.com) */
- uinfo_t uinfo;
- if (ia_openinfo(pass->pw_name, &uinfo) != -1)
- ia_get_logpwd(uinfo, &(pass->pw_passwd));
- }
-#endif
-
-#ifdef SecureWare
- {
- struct pr_passwd *pr_pw = getprpwnam(pass->pw_name);
- if (pr_pw && pr_pw->ufld.fd_encrypt)
- pass->pw_passwd = pr_pw->ufld.fd_encrypt;
- }
-#endif
-
-#ifdef HPUX_10_TRUSTED
- {
- struct pr_passwd *pr_pw = getprpwnam(pass->pw_name);
- if (pr_pw && pr_pw->ufld.fd_encrypt)
- pass->pw_passwd = pr_pw->ufld.fd_encrypt;
- }
-#endif
-
-#ifdef OSF1_ENH_SEC
- {
- struct pr_passwd *mypasswd;
- DEBUG(5,("Checking password for user %s in OSF1_ENH_SEC\n",user));
- mypasswd = getprpwnam (user);
- if ( mypasswd )
- {
- strcpy(pass->pw_name,mypasswd->ufld.fd_name);
- strcpy(pass->pw_passwd,mypasswd->ufld.fd_encrypt);
- }
- else
- {
- DEBUG(5,("No entry for user %s in protected database !\n",user));
- return(False);
- }
- }
-#endif
-
-#ifdef ULTRIX_AUTH
- {
- AUTHORIZATION *ap = getauthuid( pass->pw_uid );
- if (ap)
- {
- strcpy( pass->pw_passwd, ap->a_password );
- endauthent();
- }
- }
-#endif
-
- /* extract relevant info */
- strcpy(this_user,pass->pw_name);
- strcpy(this_salt,pass->pw_passwd);
- strcpy(this_crypted,pass->pw_passwd);
-
- if (!*this_crypted) {
- if (!lp_null_passwords()) {
- DEBUG(2,("Disallowing access to %s due to null password\n",this_user));
- return(False);
- }
-#ifndef PWDAUTH
- if (!*password) {
- DEBUG(3,("Allowing access to %s with null password\n",this_user));
- return(True);
- }
-#endif
- }
-
- /* try it as it came to us */
- if (password_check(password))
- {
- update_protected_database(user,True);
- return(True);
- }
-
- /* if the password was given to us with mixed case then we don't
- need to proceed as we know it hasn't been case modified by the
- client */
- if (strhasupper(password) && strhaslower(password))
- return(False);
-
- /* make a copy of it */
- StrnCpy(pass2,password,sizeof(pstring)-1);
-
- /* try all lowercase */
- strlower(password);
- if (password_check(password))
- {
- update_protected_database(user,True);
- return(True);
- }
-
- /* give up? */
- if(level < 1)
- {
- update_protected_database(user,False);
-
- /* restore it */
- strcpy(password,pass2);
-
- return(False);
- }
-
- /* last chance - all combinations of up to level chars upper! */
- strlower(password);
-
- if (string_combinations(password,password_check,level))
- {
- update_protected_database(user,True);
- return(True);
- }
-
- update_protected_database(user,False);
-
- /* restore it */
- strcpy(password,pass2);
-
- return(False);
-}
-
-
-
-/****************************************************************************
-check if a username is valid
-****************************************************************************/
-BOOL user_ok(char *user,int snum)
-{
- pstring valid, invalid;
- BOOL ret;
-
- StrnCpy(valid, lp_valid_users(snum), sizeof(pstring));
- StrnCpy(invalid, lp_invalid_users(snum), sizeof(pstring));
-
- string_sub(valid,"%S",lp_servicename(snum));
- string_sub(invalid,"%S",lp_servicename(snum));
-
- ret = !user_in_list(user,invalid);
-
- if (ret && valid && *valid)
- ret = user_in_list(user,valid);
-
- if (ret && lp_onlyuser(snum)) {
- char *user_list = lp_username(snum);
- string_sub(user_list,"%S",lp_servicename(snum));
- ret = user_in_list(user,user_list);
- }
-
- return(ret);
-}
-
-
-
-
-/****************************************************************************
-validate a group username entry. Return the username or NULL
-****************************************************************************/
-static char *validate_group(char *group,char *password,int pwlen,int snum)
-{
-#ifdef NETGROUP
- {
- char *host, *user, *domain;
- setnetgrent(group);
- while (getnetgrent(&host, &user, &domain)) {
- if (user) {
- if (user_ok(user, snum) &&
- password_ok(user,password,pwlen,NULL)) {
- endnetgrent();
- return(user);
- }
- }
- }
- endnetgrent();
- }
-#endif
-
-#if HAVE_GETGRNAM
- {
- struct group *gptr = (struct group *)getgrnam(group);
- char **member;
- if (gptr)
- {
- member = gptr->gr_mem;
- while (member && *member)
- {
- static fstring name;
- strcpy(name,*member);
- if (user_ok(name,snum) &&
- password_ok(name,password,pwlen,NULL))
- return(&name[0]);
- member++;
- }
-#ifdef GROUP_CHECK_PWENT
- {
- struct passwd *pwd;
- static fstring tm;
-
- setpwent ();
- while (pwd = getpwent ()) {
- if (*(pwd->pw_passwd) && pwd->pw_gid == gptr->gr_gid) {
- /* This Entry have PASSWORD and same GID then check pwd */
- if (password_ok(NULL, password, pwlen, pwd)) {
- strcpy(tm, pwd->pw_name);
- endpwent ();
- return tm;
- }
- }
- }
- endpwent ();
- }
-#endif /* GROUP_CHECK_PWENT */
- }
- }
-#endif
- return(NULL);
-}
-
-
-
-/****************************************************************************
-check for authority to login to a service with a given username/password
-****************************************************************************/
-BOOL authorise_login(int snum,char *user,char *password, int pwlen,
- BOOL *guest,BOOL *force,uint16 vuid)
-{
- BOOL ok = False;
-
- *guest = False;
-
-#if DEBUG_PASSWORD
- DEBUG(100,("checking authorisation on user=%s pass=%s\n",user,password));
-#endif
-
- /* there are several possibilities:
- 1) login as the given user with given password
- 2) login as a previously registered username with the given password
- 3) login as a session list username with the given password
- 4) login as a previously validated user/password pair
- 5) login as the "user =" user with given password
- 6) login as the "user =" user with no password (guest connection)
- 7) login as guest user with no password
-
- if the service is guest_only then steps 1 to 5 are skipped
- */
-
- if (GUEST_ONLY(snum)) *force = True;
-
- if (!(GUEST_ONLY(snum) && GUEST_OK(snum)))
- {
-
- user_struct *vuser = get_valid_user_struct(vuid);
-
- /* check the given username and password */
- if (!ok && (*user) && user_ok(user,snum)) {
- ok = password_ok(user,password, pwlen, NULL);
- if (ok) DEBUG(3,("ACCEPTED: given username password ok\n"));
- }
-
- /* check for a previously registered guest username */
- if (!ok && (vuser != 0) && vuser->guest) {
- if (user_ok(vuser->name,snum) &&
- password_ok(vuser->name, password, pwlen, NULL)) {
- strcpy(user, vuser->name);
- vuser->guest = False;
- DEBUG(3,("ACCEPTED: given password with registered user %s\n", user));
- ok = True;
- }
- }
-
-
- /* now check the list of session users */
- if (!ok)
- {
- char *auser;
- char *user_list = strdup(session_users);
- if (!user_list) return(False);
-
- for (auser=strtok(user_list,LIST_SEP);
- !ok && auser;
- auser = strtok(NULL,LIST_SEP))
- {
- fstring user2;
- strcpy(user2,auser);
- if (!user_ok(user2,snum)) continue;
-
- if (password_ok(user2,password, pwlen, NULL)) {
- ok = True;
- strcpy(user,user2);
- DEBUG(3,("ACCEPTED: session list username and given password ok\n"));
- }
- }
- free(user_list);
- }
-
- /* check for a previously validated username/password pair */
- if (!ok && !lp_revalidate(snum) &&
- (vuser != 0) && !vuser->guest &&
- user_ok(vuser->name,snum)) {
- strcpy(user,vuser->name);
- *guest = False;
- DEBUG(3,("ACCEPTED: validated uid ok as non-guest\n"));
- ok = True;
- }
-
- /* check for a rhosts entry */
- if (!ok && user_ok(user,snum) && check_hosts_equiv(user)) {
- ok = True;
- DEBUG(3,("ACCEPTED: hosts equiv or rhosts entry\n"));
- }
-
- /* check the user= fields and the given password */
- if (!ok && lp_username(snum)) {
- char *auser;
- pstring user_list;
- StrnCpy(user_list,lp_username(snum),sizeof(pstring));
-
- string_sub(user_list,"%S",lp_servicename(snum));
-
- for (auser=strtok(user_list,LIST_SEP);
- auser && !ok;
- auser = strtok(NULL,LIST_SEP))
- {
- if (*auser == '@')
- {
- auser = validate_group(auser+1,password,pwlen,snum);
- if (auser)
- {
- ok = True;
- strcpy(user,auser);
- DEBUG(3,("ACCEPTED: group username and given password ok\n"));
- }
- }
- else
- {
- fstring user2;
- strcpy(user2,auser);
- if (user_ok(user2,snum) &&
- password_ok(user2,password,pwlen,NULL))
- {
- ok = True;
- strcpy(user,user2);
- DEBUG(3,("ACCEPTED: user list username and given password ok\n"));
- }
- }
- }
- }
- } /* not guest only */
-
- /* check for a normal guest connection */
- if (!ok && GUEST_OK(snum))
- {
- fstring guestname;
- StrnCpy(guestname,lp_guestaccount(snum),sizeof(guestname)-1);
- if (Get_Pwnam(guestname,True))
- {
- strcpy(user,guestname);
- ok = True;
- DEBUG(3,("ACCEPTED: guest account and guest ok\n"));
- }
- else
- DEBUG(0,("Invalid guest account %s??\n",guestname));
- *guest = True;
- *force = True;
- }
-
- if (ok && !user_ok(user,snum))
- {
- DEBUG(0,("rejected invalid user %s\n",user));
- ok = False;
- }
-
- return(ok);
-}
-
-
-/****************************************************************************
-read the a hosts.equiv or .rhosts file and check if it
-allows this user from this machine
-****************************************************************************/
-static BOOL check_user_equiv(char *user, char *remote, char *equiv_file)
-{
- pstring buf;
- int plus_allowed = 1;
- char *file_host;
- char *file_user;
- FILE *fp = fopen(equiv_file, "r");
- DEBUG(5, ("check_user_equiv %s %s %s\n", user, remote, equiv_file));
- if (! fp) return False;
- while(fgets(buf, sizeof(buf), fp))
- {
- trim_string(buf," "," ");
-
- if (buf[0] != '#' && buf[0] != '\n')
- {
- BOOL is_group = False;
- int plus = 1;
- char *bp = buf;
- if (strcmp(buf, "NO_PLUS\n") == 0)
- {
- DEBUG(6, ("check_user_equiv NO_PLUS\n"));
- plus_allowed = 0;
- }
- else {
- if (buf[0] == '+')
- {
- bp++;
- if (*bp == '\n' && plus_allowed)
- {
- /* a bare plus means everbody allowed */
- DEBUG(6, ("check_user_equiv everybody allowed\n"));
- fclose(fp);
- return True;
- }
- }
- else if (buf[0] == '-')
- {
- bp++;
- plus = 0;
- }
- if (*bp == '@')
- {
- is_group = True;
- bp++;
- }
- file_host = strtok(bp, " \t\n");
- file_user = strtok(NULL, " \t\n");
- DEBUG(7, ("check_user_equiv %s %s\n", file_host ? file_host : "(null)",
- file_user ? file_user : "(null)" ));
- if (file_host && *file_host)
- {
- BOOL host_ok = False;
-
-#ifdef NETGROUP
- if (is_group)
- {
- static char *mydomain = NULL;
- if (!mydomain)
- yp_get_default_domain(&mydomain);
- if (mydomain && innetgr(file_host,remote,user,mydomain))
- host_ok = True;
- }
-#else
- if (is_group)
- {
- DEBUG(1,("Netgroups not configured - add -DNETGROUP and recompile\n"));
- continue;
- }
-#endif
-
- /* is it this host */
- /* the fact that remote has come from a call of gethostbyaddr
- * means that it may have the fully qualified domain name
- * so we could look up the file version to get it into
- * a canonical form, but I would rather just type it
- * in full in the equiv file
- */
- if (!host_ok && !is_group && strequal(remote, file_host))
- host_ok = True;
-
- if (!host_ok)
- continue;
-
- /* is it this user */
- if (file_user == 0 || strequal(user, file_user))
- {
- fclose(fp);
- DEBUG(5, ("check_user_equiv matched %s%s %s\n",
- (plus ? "+" : "-"), file_host,
- (file_user ? file_user : "")));
- return (plus ? True : False);
- }
- }
- }
- }
- }
- fclose(fp);
- return False;
-}
-
-
-/****************************************************************************
-check for a possible hosts equiv or rhosts entry for the user
-****************************************************************************/
-BOOL check_hosts_equiv(char *user)
-{
- char *fname = NULL;
- pstring rhostsfile;
- struct passwd *pass = Get_Pwnam(user,True);
-
- if (!pass)
- return(False);
-
- fname = lp_hosts_equiv();
-
- /* note: don't allow hosts.equiv on root */
- if (fname && *fname && (pass->pw_uid != 0))
- {
- if (check_user_equiv(user,client_name(),fname))
- return(True);
- }
-
- if (lp_use_rhosts())
- {
- char *home = get_home_dir(user);
- if (home)
- {
- sprintf(rhostsfile, "%s/.rhosts", home);
- if (check_user_equiv(user,client_name(),rhostsfile))
- return(True);
- }
- }
-
- return(False);
-}
-
-
-int password_client = -1;
-static fstring pserver;
-static char *secserver_inbuf = NULL;
-
-/****************************************************************************
-attempted support for server level security
-****************************************************************************/
-BOOL server_cryptkey(char *buf)
-{
- pstring outbuf;
- fstring pass_protocol;
- extern fstring remote_machine;
- char *p;
- int len;
- fstring desthost;
- struct in_addr dest_ip;
- int port = SMB_PORT;
- BOOL ret;
-
- if(secserver_inbuf == NULL) {
- secserver_inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if(secserver_inbuf == NULL) {
- DEBUG(0,("server_cryptkey: malloc fail for input buffer.\n"));
- return False;
- }
- }
-
- if (password_client >= 0)
- close(password_client);
- password_client = -1;
-
- if (Protocol < PROTOCOL_NT1) {
- strcpy(pass_protocol,"LM1.2X002");
- } else {
- strcpy(pass_protocol,"NT LM 0.12");
- }
-
- bzero(secserver_inbuf,BUFFER_SIZE + SAFETY_MARGIN);
- bzero(outbuf,sizeof(outbuf));
-
- for (p=strtok(lp_passwordserver(),LIST_SEP); p ; p = strtok(NULL,LIST_SEP)) {
- strcpy(desthost,p);
- standard_sub_basic(desthost);
- strupper(desthost);
-
- dest_ip = *interpret_addr2(desthost);
- if (zero_ip(dest_ip)) {
- DEBUG(1,("Can't resolve address for %s\n",p));
- continue;
- }
-
- if (ismyip(dest_ip)) {
- DEBUG(1,("Password server loop - disabling password server %s\n",p));
- continue;
- }
-
- password_client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
- if (password_client >= 0) {
- DEBUG(3,("connected to password server %s\n",p));
- StrnCpy(pserver,p,sizeof(pserver)-1);
- break;
- }
- }
-
- if (password_client < 0) {
- DEBUG(1,("password server not available\n"));
- return(False);
- }
-
-
- /* send a session request (RFC 8002) */
-
- /* put in the destination name */
- len = 4;
- p = outbuf+len;
- name_mangle(desthost,p,' ');
- len += name_len(p);
- p = outbuf+len;
-
- /* and my name */
- /* Fix from Frank Varnavas <varnavas@ny.ubs.com>.
- We cannot use the same name as the client to
- the NT password server, as NT will drop client
- connections if the same client name connects
- twice. Instead, synthesize a name from our pid.
- and the remote machine name.
- */
- {
- char buf2[32]; /* create name as PIDname */
- sprintf(buf2,"%d", getpid());
- strncpy(&buf2[strlen(buf2)], remote_machine, 31 - strlen(buf2));
- buf2[31] = '\0';
- DEBUG(1,("negprot w/password server as %s\n",buf2));
- name_mangle(buf2,p,' ');
- len += name_len(p);
- }
-
- _smb_setlen(outbuf,len);
- CVAL(outbuf,0) = 0x81;
-
- send_smb(password_client,outbuf);
-
-
- if (!receive_smb(password_client,secserver_inbuf,5000) ||
- CVAL(secserver_inbuf,0) != 0x82) {
- DEBUG(1,("%s rejected the session\n",pserver));
- close(password_client); password_client = -1;
- return(False);
- }
-
- DEBUG(3,("got session\n"));
-
- bzero(outbuf,smb_size);
-
- /* setup the protocol string */
- set_message(outbuf,0,strlen(pass_protocol)+2,True);
- p = smb_buf(outbuf);
- *p++ = 2;
- strcpy(p,pass_protocol);
-
- CVAL(outbuf,smb_com) = SMBnegprot;
- CVAL(outbuf,smb_flg) = 0x8;
- SSVAL(outbuf,smb_flg2,0x1);
-
- send_smb(password_client,outbuf);
- ret = receive_smb(password_client,secserver_inbuf,5000);
-
- if (!ret || CVAL(secserver_inbuf,smb_rcls) || SVAL(secserver_inbuf,smb_vwv0)) {
- DEBUG(1,("%s rejected the protocol\n",pserver));
- close(password_client); password_client= -1;
- return(False);
- }
-
- if (!(CVAL(secserver_inbuf,smb_vwv1) & 1)) {
- DEBUG(1,("%s isn't in user level security mode\n",pserver));
- close(password_client); password_client= -1;
- return(False);
- }
-
- memcpy(buf,secserver_inbuf,smb_len(secserver_inbuf)+4);
-
- DEBUG(3,("password server OK\n"));
-
- return(True);
-}
-
-/****************************************************************************
-attempted support for server level security
-****************************************************************************/
-BOOL server_validate(char *buf)
-{
- pstring outbuf;
- BOOL ret;
-
- if(secserver_inbuf == NULL) {
- secserver_inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if(secserver_inbuf == NULL) {
- DEBUG(0,("server_validate: malloc fail for input buffer.\n"));
- return False;
- }
- }
-
- if (password_client < 0) {
- DEBUG(1,("%s not connected\n",pserver));
- return(False);
- }
-
- bzero(secserver_inbuf,BUFFER_SIZE + SAFETY_MARGIN);
- memcpy(outbuf,buf,sizeof(outbuf));
-
- /* send a session setup command */
- CVAL(outbuf,smb_flg) = 0x8;
- SSVAL(outbuf,smb_flg2,0x1);
- CVAL(outbuf,smb_vwv0) = 0xFF;
-
- set_message(outbuf,smb_numwords(outbuf),smb_buflen(outbuf),False);
-
- SCVAL(secserver_inbuf,smb_rcls,1);
-
- send_smb(password_client,outbuf);
- ret = receive_smb(password_client,secserver_inbuf,5000);
-
- if (!ret || CVAL(secserver_inbuf,smb_rcls) != 0) {
- DEBUG(1,("password server %s rejected the password\n",pserver));
- return(False);
- }
-
- /* if logged in as guest then reject */
- if ((SVAL(secserver_inbuf,smb_vwv2) & 1) != 0) {
- DEBUG(1,("password server %s gave us guest only\n",pserver));
- return(False);
- }
-
- DEBUG(3,("password server %s accepted the password\n",pserver));
-
-#if !KEEP_PASSWORD_SERVER_OPEN
- close(password_client); password_client= -1;
-#endif
-
- return(True);
-}
-
-
diff --git a/source/smbd/pipes.c b/source/smbd/pipes.c
deleted file mode 100644
index 6937412e29f..00000000000
--- a/source/smbd/pipes.c
+++ /dev/null
@@ -1,1196 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Pipe SMB reply routines
- Copyright (C) Andrew Tridgell 1992-1997,
- Copyright (C) Luke Kenneth Casson Leighton 1996-1997.
- Copyright (C) Paul Ashton 1997.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-/*
- This file handles reply_ calls on named pipes that the server
- makes to handle specific protocols
-*/
-
-
-#include "includes.h"
-#include "trans2.h"
-#include "nterr.h"
-
-#define PIPE "\\PIPE\\"
-#define PIPELEN strlen(PIPE)
-
-#define REALLOC(ptr,size) Realloc(ptr,MAX((size),4*1024))
-
-/* look in server.c for some explanation of these variables */
-extern int Protocol;
-extern int DEBUGLEVEL;
-extern int chain_fnum;
-extern char magic_char;
-extern connection_struct Connections[];
-extern files_struct Files[];
-extern BOOL case_sensitive;
-extern pstring sesssetup_user;
-extern int Client;
-extern fstring myworkgroup;
-
-/* this macro should always be used to extract an fnum (smb_fid) from
-a packet to ensure chaining works correctly */
-#define GETFNUM(buf,where) (chain_fnum!= -1?chain_fnum:SVAL(buf,where))
-
-char * known_pipes [] =
-{
- "lsarpc",
-#if NTDOMAIN
- "NETLOGON",
-#endif
- NULL
-};
-
-/****************************************************************************
- reply to an open and X on a named pipe
-
- In fact what we do is to open a regular file with the same name in
- /tmp. This can then be closed as normal. Reading and writing won't
- make much sense, but will do *something*. The real reason for this
- support is to be able to do transactions on them (well, on lsarpc
- for domain login purposes...).
-
- This code is basically stolen from reply_open_and_X with some
- wrinkles to handle pipes.
-****************************************************************************/
-int reply_open_pipe_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- pstring fname;
- int cnum = SVAL(inbuf,smb_tid);
- int fnum = -1;
- int smb_mode = SVAL(inbuf,smb_vwv3);
- int smb_attr = SVAL(inbuf,smb_vwv5);
-#if 0
- int open_flags = SVAL(inbuf,smb_vwv2);
- int smb_sattr = SVAL(inbuf,smb_vwv4);
- uint32 smb_time = make_unix_date3(inbuf+smb_vwv6);
-#endif
- int smb_ofun = SVAL(inbuf,smb_vwv8);
- int unixmode;
- int size=0,fmode=0,mtime=0,rmode=0;
- struct stat sbuf;
- int smb_action = 0;
- int i;
- BOOL bad_path = False;
-
- /* XXXX we need to handle passed times, sattr and flags */
- pstrcpy(fname,smb_buf(inbuf));
-
- /* If the name doesn't start \PIPE\ then this is directed */
- /* at a mailslot or something we really, really don't understand, */
- /* not just something we really don't understand. */
- if ( strncmp(fname,PIPE,PIPELEN) != 0 )
- return(ERROR(ERRSRV,ERRaccess));
-
- DEBUG(4,("Opening pipe %s.\n", fname));
-
- /* Strip \PIPE\ off the name. */
- pstrcpy(fname,smb_buf(inbuf) + PIPELEN);
-
- /* See if it is one we want to handle. */
- for( i = 0; known_pipes[i] ; i++ )
- if( strcmp(fname,known_pipes[i]) == 0 )
- break;
-
- if ( known_pipes[i] == NULL )
- return(ERROR(ERRSRV,ERRaccess));
-
- /* Known pipes arrive with DIR attribs. Remove it so a regular file */
- /* can be opened and add it in after the open. */
- DEBUG(3,("Known pipe %s opening.\n",fname));
- smb_attr &= ~aDIR;
- Connections[cnum].read_only = 0;
- smb_ofun |= 0x10; /* Add Create it not exists flag */
-
- unix_convert(fname,cnum,0,&bad_path);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- unixmode = unix_mode(cnum,smb_attr);
-
- open_file_shared(fnum,cnum,fname,smb_mode,smb_ofun,unixmode,
- 0, &rmode,&smb_action);
-
- if (!Files[fnum].open)
- {
- /* Change the error code if bad_path was set. */
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- if (fstat(Files[fnum].fd_ptr->fd,&sbuf) != 0) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- size = sbuf.st_size;
- fmode = dos_mode(cnum,fname,&sbuf);
- mtime = sbuf.st_mtime;
- if (fmode & aDIR) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- /* Prepare the reply */
- set_message(outbuf,15,0,True);
-
- /* Put things back the way they were. */
- Connections[cnum].read_only = 1;
-
- /* Mark the opened file as an existing named pipe in message mode. */
- SSVAL(outbuf,smb_vwv9,2);
- SSVAL(outbuf,smb_vwv10,0xc700);
- if (rmode == 2)
- {
- DEBUG(4,("Resetting open result to open from create.\n"));
- rmode = 1;
- }
-
- SSVAL(outbuf,smb_vwv2,fnum);
- SSVAL(outbuf,smb_vwv3,fmode);
- put_dos_date3(outbuf,smb_vwv4,mtime);
- SIVAL(outbuf,smb_vwv6,size);
- SSVAL(outbuf,smb_vwv8,rmode);
- SSVAL(outbuf,smb_vwv11,smb_action);
-
- chain_fnum = fnum;
-
- DEBUG(4,("Opened pipe %s with handle %d, saved name %s.\n",
- fname, fnum, Files[fnum].name));
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- api_LsarpcSNPHS
-
- SetNamedPipeHandleState on \PIPE\lsarpc. We can't really do much here,
- so just blithely return True. This is really only for NT domain stuff,
- we we're only handling that - don't assume Samba now does complete
- named pipe handling.
-****************************************************************************/
-BOOL api_LsarpcSNPHS(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- uint16 id;
-
- id = param[0] + (param[1] << 8);
- DEBUG(4,("lsarpc SetNamedPipeHandleState to code %x\n",id));
- return(True);
-}
-
-
-/****************************************************************************
- api_LsarpcTNP
-
- TransactNamedPipe on \PIPE\lsarpc.
-****************************************************************************/
-static void LsarpcTNP1(char *data,char **rdata, int *rdata_len)
-{
- uint32 dword1, dword2;
- char pname[] = "\\PIPE\\lsass";
-
- /* All kinds of mysterious numbers here */
- *rdata_len = 68;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- dword1 = IVAL(data,0xC);
- dword2 = IVAL(data,0x10);
-
- SIVAL(*rdata,0,0xc0005);
- SIVAL(*rdata,4,0x10);
- SIVAL(*rdata,8,0x44);
- SIVAL(*rdata,0xC,dword1);
-
- SIVAL(*rdata,0x10,dword2);
- SIVAL(*rdata,0x14,0x15);
- SSVAL(*rdata,0x18,sizeof(pname));
- strcpy(*rdata + 0x1a,pname);
- SIVAL(*rdata,0x28,1);
- memcpy(*rdata + 0x30, data + 0x34, 0x14);
-}
-
-static void LsarpcTNP2(char *data,char **rdata, int *rdata_len)
-{
- uint32 dword1;
-
- /* All kinds of mysterious numbers here */
- *rdata_len = 48;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- dword1 = IVAL(data,0xC);
-
- SIVAL(*rdata,0,0x03020005);
- SIVAL(*rdata,4,0x10);
- SIVAL(*rdata,8,0x30);
- SIVAL(*rdata,0xC,dword1);
- SIVAL(*rdata,0x10,0x18);
- SIVAL(*rdata,0x1c,0x44332211);
- SIVAL(*rdata,0x20,0x88776655);
- SIVAL(*rdata,0x24,0xCCBBAA99);
- SIVAL(*rdata,0x28,0x11FFEEDD);
-}
-
-static void LsarpcTNP3(char *data,char **rdata, int *rdata_len)
-{
- uint32 dword1;
- uint16 word1;
- char * workgroup = myworkgroup;
- int wglen = strlen(workgroup);
- int i;
-
- /* All kinds of mysterious numbers here */
- *rdata_len = 90 + 2 * wglen;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- dword1 = IVAL(data,0xC);
- word1 = SVAL(data,0x2C);
-
- SIVAL(*rdata,0,0x03020005);
- SIVAL(*rdata,4,0x10);
- SIVAL(*rdata,8,0x60);
- SIVAL(*rdata,0xC,dword1);
- SIVAL(*rdata,0x10,0x48);
- SSVAL(*rdata,0x18,0x5988); /* This changes */
- SSVAL(*rdata,0x1A,0x15);
- SSVAL(*rdata,0x1C,word1);
- SSVAL(*rdata,0x20,6);
- SSVAL(*rdata,0x22,8);
- SSVAL(*rdata,0x24,0x8E8); /* So does this */
- SSVAL(*rdata,0x26,0x15);
- SSVAL(*rdata,0x28,0x4D48); /* And this */
- SSVAL(*rdata,0x2A,0x15);
- SIVAL(*rdata,0x2C,4);
- SIVAL(*rdata,0x34,wglen);
- for ( i = 0 ; i < wglen ; i++ )
- (*rdata)[0x38 + i * 2] = workgroup[i];
-
- /* Now fill in the rest */
- i = 0x38 + wglen * 2;
- SSVAL(*rdata,i,0x648);
- SIVAL(*rdata,i+2,4);
- SIVAL(*rdata,i+6,0x401);
- SSVAL(*rdata,i+0xC,0x500);
- SIVAL(*rdata,i+0xE,0x15);
- SIVAL(*rdata,i+0x12,0x2372FE1);
- SIVAL(*rdata,i+0x16,0x7E831BEF);
- SIVAL(*rdata,i+0x1A,0x4B454B2);
-}
-
-static void LsarpcTNP4(char *data,char **rdata, int *rdata_len)
-{
- uint32 dword1;
-
- /* All kinds of mysterious numbers here */
- *rdata_len = 48;
- *rdata = REALLOC(*rdata,*rdata_len);
-
- dword1 = IVAL(data,0xC);
-
- SIVAL(*rdata,0,0x03020005);
- SIVAL(*rdata,4,0x10);
- SIVAL(*rdata,8,0x30);
- SIVAL(*rdata,0xC,dword1);
- SIVAL(*rdata,0x10,0x18);
-}
-
-
-BOOL api_LsarpcTNP(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- uint32 id,id2;
-
- id = IVAL(data,0);
-
- DEBUG(4,("lsarpc TransactNamedPipe id %lx\n",id));
- switch (id)
- {
- case 0xb0005:
- LsarpcTNP1(data,rdata,rdata_len);
- break;
-
- case 0x03000005:
- id2 = IVAL(data,8);
- DEBUG(4,("\t- Suboperation %lx\n",id2));
- switch (id2 & 0xF)
- {
- case 8:
- LsarpcTNP2(data,rdata,rdata_len);
- break;
-
- case 0xC:
- LsarpcTNP4(data,rdata,rdata_len);
- break;
-
- case 0xE:
- LsarpcTNP3(data,rdata,rdata_len);
- break;
- }
- break;
- }
- return(True);
-}
-
-
-#ifdef NTDOMAIN
-/*
- PAXX: Someone fix above.
- The above API is indexing RPC calls based on RPC flags and
- fragment length. I've decided to do it based on operation number :-)
-*/
-
-/* this function is due to be replaced */
-static void initrpcreply(char *inbuf, char *q)
-{
- uint32 callid;
-
- SCVAL(q, 0, 5); q++; /* RPC version 5 */
- SCVAL(q, 0, 0); q++; /* minor version 0 */
- SCVAL(q, 0, 2); q++; /* RPC response packet */
- SCVAL(q, 0, 3); q++; /* first frag + last frag */
- RSIVAL(q, 0, 0x10000000); q += 4; /* packed data representation */
- RSSVAL(q, 0, 0); q += 2; /* fragment length, fill in later */
- SSVAL(q, 0, 0); q += 2; /* authentication length */
- callid = RIVAL(inbuf, 12);
- RSIVAL(q, 0, callid); q += 4; /* call identifier - match incoming RPC */
- SIVAL(q, 0, 0x18); q += 4; /* allocation hint (no idea) */
- SSVAL(q, 0, 0); q += 2; /* presentation context identifier */
- SCVAL(q, 0, 0); q++; /* cancel count */
- SCVAL(q, 0, 0); q++; /* reserved */
-}
-
-/* this function is due to be replaced */
-static void endrpcreply(char *inbuf, char *q, int datalen, int rtnval, int *rlen)
-{
- SSVAL(q, 8, datalen + 4);
- SIVAL(q,0x10,datalen+4-0x18); /* allocation hint */
- SIVAL(q, datalen, rtnval);
- *rlen = datalen + 4;
- { int fd; fd = open("/tmp/rpc", O_RDWR); write(fd, q, datalen + 4); }
-}
-
-/* RID username mapping function. just for fun, it maps to the unix uid */
-static uint32 name_to_rid(char *user_name)
-{
- struct passwd *pw = Get_Pwnam(user_name, False);
- if (!pw)
- {
- DEBUG(1,("Username %s is invalid on this system\n", user_name));
- return (uint32)(-1);
- }
-
- return (uint32)(pw->pw_uid);
-}
-
-
-/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
-char *dom_sid_to_string(DOM_SID *sid)
-{
- static pstring sidstr;
- char subauth[16];
- int i;
- uint32 ia = (sid->id_auth[0]) +
- (sid->id_auth[1] << 8 ) +
- (sid->id_auth[2] << 16) +
- (sid->id_auth[3] << 24);
-
- sprintf(sidstr, "S-%d-%d", sid->sid_no, ia);
-
- for (i = 0; i < sid->num_auths; i++)
- {
- sprintf(subauth, "-%d", sid->sub_auths[i]);
- strcat(sidstr, subauth);
- }
-
- DEBUG(5,("dom_sid_to_string returning %s\n", sidstr));
- return sidstr;
-}
-
-/* BIG NOTE: this function only does SIDS where the identauth is not >= 2^32 */
-/* identauth >= 2^32 can be detected because it will be specified in hex */
-static void make_dom_sid(DOM_SID *sid, char *domsid)
-{
- int identauth;
- char *p;
-
- DEBUG(4,("netlogon domain SID: %s\n", domsid));
-
- /* assume, but should check, that domsid starts "S-" */
- p = strtok(domsid+2,"-");
- sid->sid_no = atoi(p);
-
- /* identauth in decimal should be < 2^32 */
- /* identauth in hex should be >= 2^32 */
- identauth = atoi(strtok(0,"-"));
-
- DEBUG(4,("netlogon rev %d\n", sid->sid_no));
- DEBUG(4,("netlogon %s ia %d\n", p, identauth));
-
- sid->id_auth[0] = 0;
- sid->id_auth[1] = 0;
- sid->id_auth[2] = (identauth & 0xff000000) >> 24;
- sid->id_auth[3] = (identauth & 0x00ff0000) >> 16;
- sid->id_auth[4] = (identauth & 0x0000ff00) >> 8;
- sid->id_auth[5] = (identauth & 0x000000ff);
-
- sid->num_auths = 0;
-
- while ((p = strtok(0, "-")) != NULL)
- {
- sid->sub_auths[sid->num_auths++] = atoi(p);
- }
-}
-
-static void create_rpc_reply(RPC_HDR *hdr, uint32 call_id, int data_len)
-{
- if (hdr == NULL) return;
-
- hdr->major = 5; /* RPC version 5 */
- hdr->minor = 0; /* minor version 0 */
- hdr->pkt_type = 2; /* RPC response packet */
- hdr->frag = 3; /* first frag + last frag */
- hdr->pack_type = 1; /* packed data representation */
- hdr->frag_len = data_len; /* fragment length, fill in later */
- hdr->auth_len = 0; /* authentication length */
- hdr->call_id = call_id; /* call identifier - match incoming RPC */
- hdr->alloc_hint = data_len - 0x18; /* allocation hint (no idea) */
- hdr->context_id = 0; /* presentation context identifier */
- hdr->cancel_count = 0; /* cancel count */
- hdr->reserved = 0; /* reserved */
-}
-
-static void make_rpc_reply(char *inbuf, char *q, int data_len)
-{
- uint32 callid = RIVAL(inbuf, 12);
- RPC_HDR hdr;
-
- create_rpc_reply(&hdr, callid, data_len);
- smb_io_rpc_hdr(False, &hdr, q, q, 4);
-}
-
-static int lsa_reply_open_policy(char *q, char *base)
-{
- char *start = q;
- LSA_R_OPEN_POL r_o;
-
- /* set up the LSA QUERY INFO response */
- bzero(&(r_o.pol.data), POL_HND_SIZE);
- r_o.status = 0x0;
-
- /* store the response in the SMB stream */
- q = lsa_io_r_open_pol(False, &r_o, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static void make_uni_hdr(UNIHDR *hdr, int max_len, int len, uint16 terminate)
-{
- hdr->uni_max_len = max_len;
- hdr->uni_str_len = len;
- hdr->undoc = terminate;
-}
-
-static void make_uni_hdr2(UNIHDR2 *hdr, int max_len, int len, uint16 terminate)
-{
- make_uni_hdr(&(hdr->unihdr), max_len, len, terminate);
- hdr->undoc_buffer = len > 0 ? 1 : 0;
-}
-
-static void make_unistr(UNISTR *str, char *buf)
-{
- /* store the string (null-terminated copy) */
- PutUniCode((char *)(str->buffer), buf);
-}
-
-static void make_unistr2(UNISTR2 *str, char *buf, int len, char terminate)
-{
- /* set up string lengths. add one if string is not null-terminated */
- str->uni_max_len = len + (terminate != 0 ? 1 : 0);
- str->undoc = 0;
- str->uni_str_len = len;
-
- /* store the string (null-terminated copy) */
- PutUniCode((char *)str->buffer, buf);
-
- /* overwrite the last character: some strings are terminated with 4 not 0 */
- str->buffer[len] = (uint16)terminate;
-}
-
-static void make_dom_rid2(DOM_RID2 *rid2, uint32 rid)
-{
- rid2->type = 0x5;
- rid2->undoc = 0x5;
- rid2->rid = rid;
- rid2->rid_idx = 0;
-}
-
-static void make_dom_sid2(DOM_SID2 *sid2, char *sid_str)
-{
- int len_sid_str = strlen(sid_str);
-
- sid2->type = 0x5;
- sid2->undoc = 0;
- make_uni_hdr2(&(sid2->hdr), len_sid_str, len_sid_str, 0);
- make_unistr (&(sid2->str), sid_str);
-}
-
-static void make_dom_query(DOM_QUERY *d_q, char *dom_name, char *dom_sid)
-{
- int domlen = strlen(dom_name);
-
- d_q->uni_dom_max_len = domlen * 2;
- d_q->padding = 0;
- d_q->uni_dom_str_len = domlen * 2;
-
- d_q->buffer_dom_name = 0; /* domain buffer pointer */
- d_q->buffer_dom_sid = 0; /* domain sid pointer */
-
- /* NOT null-terminated: 4-terminated instead! */
- make_unistr2(&(d_q->uni_domain_name), dom_name, domlen, 4);
-
- make_dom_sid(&(d_q->dom_sid), dom_sid);
-}
-
-static int lsa_reply_query_info(LSA_Q_QUERY_INFO *q_q, char *q, char *base,
- char *dom_name, char *dom_sid)
-{
- char *start = q;
- LSA_R_QUERY_INFO r_q;
-
- /* set up the LSA QUERY INFO response */
-
- r_q.undoc_buffer = 1; /* not null */
- r_q.info_class = q_q->info_class;
-
- make_dom_query(&r_q.dom.id5, dom_name, dom_sid);
-
- r_q.status = 0x0;
-
- /* store the response in the SMB stream */
- q = lsa_io_r_query(False, &r_q, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-/* pretty much hard-coded choice of "other" sids, unfortunately... */
-static void make_dom_ref(DOM_R_REF *ref,
- char *dom_name, char *dom_sid,
- char *other_sid1, char *other_sid2, char *other_sid3)
-{
- int len_dom_name = strlen(dom_name);
- int len_other_sid1 = strlen(other_sid1);
- int len_other_sid2 = strlen(other_sid2);
- int len_other_sid3 = strlen(other_sid3);
-
- ref->undoc_buffer = 1;
- ref->num_ref_doms_1 = 4;
- ref->buffer_dom_name = 1;
- ref->max_entries = 32;
- ref->num_ref_doms_2 = 4;
-
- make_uni_hdr2(&(ref->hdr_dom_name ), len_dom_name , len_dom_name , 0);
- make_uni_hdr2(&(ref->hdr_ref_dom[0]), len_other_sid1, len_other_sid1, 0);
- make_uni_hdr2(&(ref->hdr_ref_dom[1]), len_other_sid2, len_other_sid2, 0);
- make_uni_hdr2(&(ref->hdr_ref_dom[2]), len_other_sid3, len_other_sid3, 0);
-
- if (dom_name != NULL)
- {
- make_unistr(&(ref->uni_dom_name), dom_name);
- }
-
- make_dom_sid(&(ref->ref_dom[0]), dom_sid );
- make_dom_sid(&(ref->ref_dom[1]), other_sid1);
- make_dom_sid(&(ref->ref_dom[2]), other_sid2);
- make_dom_sid(&(ref->ref_dom[3]), other_sid3);
-}
-
-static void make_reply_lookup_rids(LSA_R_LOOKUP_RIDS *r_l,
- int num_entries, uint32 dom_rids[MAX_LOOKUP_SIDS],
- char *dom_name, char *dom_sid,
- char *other_sid1, char *other_sid2, char *other_sid3)
-{
- int i;
-
- make_dom_ref(&(r_l->dom_ref), dom_name, dom_sid,
- other_sid1, other_sid2, other_sid3);
-
- r_l->num_entries = num_entries;
- r_l->undoc_buffer = 1;
- r_l->num_entries2 = num_entries;
-
- for (i = 0; i < num_entries; i++)
- {
- make_dom_rid2(&(r_l->dom_rid[i]), dom_rids[i]);
- }
-
- r_l->num_entries3 = num_entries;
-}
-
-static void make_reply_lookup_sids(LSA_R_LOOKUP_SIDS *r_l,
- int num_entries, fstring dom_sids[MAX_LOOKUP_SIDS],
- char *dom_name, char *dom_sid,
- char *other_sid1, char *other_sid2, char *other_sid3)
-{
- int i;
-
- make_dom_ref(&(r_l->dom_ref), dom_name, dom_sid,
- other_sid1, other_sid2, other_sid3);
-
- r_l->num_entries = num_entries;
- r_l->undoc_buffer = 1;
- r_l->num_entries2 = num_entries;
-
- for (i = 0; i < num_entries; i++)
- {
- make_dom_sid2(&(r_l->dom_sid[i]), dom_sids[i]);
- }
-
- r_l->num_entries3 = num_entries;
-}
-
-static int lsa_reply_lookup_sids(char *q, char *base,
- int num_entries, fstring dom_sids[MAX_LOOKUP_SIDS],
- char *dom_name, char *dom_sid,
- char *other_sid1, char *other_sid2, char *other_sid3)
-{
- char *start = q;
- LSA_R_LOOKUP_SIDS r_l;
-
- /* set up the LSA Lookup SIDs response */
- make_reply_lookup_sids(&r_l, num_entries, dom_sids,
- dom_name, dom_sid, other_sid1, other_sid2, other_sid3);
- r_l.status = 0x0;
-
- /* store the response in the SMB stream */
- q = lsa_io_r_lookup_sids(False, &r_l, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static int lsa_reply_lookup_rids(char *q, char *base,
- int num_entries, uint32 dom_rids[MAX_LOOKUP_SIDS],
- char *dom_name, char *dom_sid,
- char *other_sid1, char *other_sid2, char *other_sid3)
-{
- char *start = q;
- LSA_R_LOOKUP_RIDS r_l;
-
- /* set up the LSA Lookup RIDs response */
- make_reply_lookup_rids(&r_l, num_entries, dom_rids,
- dom_name, dom_sid, other_sid1, other_sid2, other_sid3);
- r_l.status = 0x0;
-
- /* store the response in the SMB stream */
- q = lsa_io_r_lookup_rids(False, &r_l, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static void make_lsa_r_req_chal(LSA_R_REQ_CHAL *r_c, char chal[8], int status)
-{
- memcpy(r_c->srv_chal.data, chal, sizeof(r_c->srv_chal.data));
- r_c->status = status;
-}
-
-#if 0
- char chal[8];
- /* PAXX: set these to random values */
- for (int i = 0; i < 8; i+++)
- {
- chal[i] = 0xA5;
- }
-#endif
-
-static int lsa_reply_req_chal(LSA_Q_REQ_CHAL *q_c, char *q, char *base,
- char chal[8])
-{
- char *start = q;
- LSA_R_REQ_CHAL r_c;
-
- /* set up the LSA REQUEST CHALLENGE response */
-
- make_lsa_r_req_chal(&r_c, chal, 0);
-
- /* store the response in the SMB stream */
- q = lsa_io_r_req_chal(False, &r_c, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static void make_lsa_chal(DOM_CHAL *cred, char resp_cred[8])
-{
- memcpy(cred->data, resp_cred, sizeof(cred->data));
-}
-
-static void make_lsa_r_auth_2(LSA_R_AUTH_2 *r_a,
- char resp_cred[8], NEG_FLAGS *flgs, int status)
-{
- make_lsa_chal(&(r_a->srv_chal), resp_cred);
- memcpy(&(r_a->srv_flgs), flgs, sizeof(r_a->srv_flgs));
- r_a->status = status;
-}
-
-static int lsa_reply_auth_2(LSA_Q_AUTH_2 *q_a, char *q, char *base,
- char resp_cred[8], int status)
-{
- char *start = q;
- LSA_R_AUTH_2 r_a;
-
- /* set up the LSA AUTH 2 response */
-
- make_lsa_r_auth_2(&r_a, resp_cred, &(q_a->clnt_flgs), status);
-
- /* store the response in the SMB stream */
- q = lsa_io_r_auth_2(False, &r_a, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static void make_lsa_dom_chal(DOM_CRED *cred, char srv_chal[8], UTIME srv_time)
-{
- make_lsa_chal(&(cred->challenge), srv_chal);
- cred->timestamp = srv_time;
-}
-
-
-static void make_lsa_r_srv_pwset(LSA_R_SRV_PWSET *r_a,
- char srv_chal[8], UTIME srv_time, int status)
-{
- make_lsa_dom_chal(&(r_a->srv_cred), srv_chal, srv_time);
- r_a->status = status;
-}
-
-static int lsa_reply_srv_pwset(LSA_Q_SRV_PWSET *q_s, char *q, char *base,
- char srv_cred[8], UTIME srv_time,
- int status)
-{
- char *start = q;
- LSA_R_SRV_PWSET r_s;
-
- /* set up the LSA Server Password Set response */
- make_lsa_r_srv_pwset(&r_s, srv_cred, srv_time, status);
-
- /* store the response in the SMB stream */
- q = lsa_io_r_srv_pwset(False, &r_s, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-static void make_lsa_user_info(LSA_USER_INFO *usr,
-
- NTTIME *logon_time,
- NTTIME *logoff_time,
- NTTIME *kickoff_time,
- NTTIME *pass_last_set_time,
- NTTIME *pass_can_change_time,
- NTTIME *pass_must_change_time,
-
- char *user_name,
- char *full_name,
- char *logon_script,
- char *profile_path,
- char *home_dir,
- char *dir_drive,
-
- uint16 logon_count,
- uint16 bad_pw_count,
-
- uint32 user_id,
- uint32 group_id,
- uint32 num_groups,
- DOM_GID *gids,
- uint32 user_flgs,
-
- char sess_key[16],
-
- char *logon_srv,
- char *logon_dom,
-
- char *dom_sid,
- char *other_sids) /* space-delimited set of SIDs */
-{
- /* only cope with one "other" sid, right now. */
- /* need to count the number of space-delimited sids */
- int i;
- int num_other_sids = other_sids != NULL ? 1 : 0;
-
- int len_user_name = strlen(user_name );
- int len_full_name = strlen(full_name );
- int len_logon_script = strlen(logon_script);
- int len_profile_path = strlen(profile_path);
- int len_home_dir = strlen(home_dir );
- int len_dir_drive = strlen(dir_drive );
-
- int len_logon_srv = strlen(logon_srv);
- int len_logon_dom = strlen(logon_dom);
-
- usr->undoc_buffer = 1; /* yes, we're bothering to put USER_INFO data here */
-
- usr->logon_time = *logon_time;
- usr->logoff_time = *logoff_time;
- usr->kickoff_time = *kickoff_time;
- usr->pass_last_set_time = *pass_last_set_time;
- usr->pass_can_change_time = *pass_can_change_time;
- usr->pass_must_change_time = *pass_must_change_time;
-
- make_uni_hdr(&(usr->hdr_user_name ), len_user_name , len_user_name , 4);
- make_uni_hdr(&(usr->hdr_full_name ), len_full_name , len_full_name , 4);
- make_uni_hdr(&(usr->hdr_logon_script), len_logon_script, len_logon_script, 4);
- make_uni_hdr(&(usr->hdr_profile_path), len_profile_path, len_profile_path, 4);
- make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir , len_home_dir , 4);
- make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive , len_dir_drive , 4);
-
- usr->logon_count = logon_count;
- usr->bad_pw_count = bad_pw_count;
-
- usr->user_id = user_id;
- usr->group_id = group_id;
- usr->num_groups = num_groups;
- usr->buffer_groups = num_groups ? 1 : 0; /* yes, we're bothering to put group info in */
- usr->user_flgs = user_flgs;
-
- if (sess_key != NULL)
- {
- memcpy(usr->sess_key, sess_key, sizeof(usr->sess_key));
- }
- else
- {
- bzero(usr->sess_key, sizeof(usr->sess_key));
- }
-
- make_uni_hdr(&(usr->hdr_logon_srv), len_logon_srv, len_logon_srv, 4);
- make_uni_hdr(&(usr->hdr_logon_dom), len_logon_dom, len_logon_dom, 4);
-
- usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
-
- bzero(usr->padding, sizeof(usr->padding));
-
- usr->num_other_sids = num_other_sids;
- usr->buffer_other_sids = num_other_sids != 0 ? 1 : 0;
-
- make_unistr2(&(usr->uni_user_name ), user_name , len_user_name , 0);
- make_unistr2(&(usr->uni_full_name ), full_name , len_full_name , 0);
- make_unistr2(&(usr->uni_logon_script), logon_script, len_logon_script, 0);
- make_unistr2(&(usr->uni_profile_path), profile_path, len_profile_path, 0);
- make_unistr2(&(usr->uni_home_dir ), home_dir , len_home_dir , 0);
- make_unistr2(&(usr->uni_dir_drive ), dir_drive , len_dir_drive , 0);
-
- usr->num_groups2 = num_groups;
- for (i = 0; i < num_groups; i++)
- {
- usr->gids[i] = gids[i];
- }
-
- make_unistr2(&(usr->uni_logon_srv), logon_srv, len_logon_srv, 0);
- make_unistr2(&(usr->uni_logon_dom), logon_dom, len_logon_dom, 0);
-
- make_dom_sid(&(usr->dom_sid), dom_sid);
- make_dom_sid(&(usr->other_sids[0]), other_sids);
-}
-
-
-static int lsa_reply_sam_logon(LSA_Q_SAM_LOGON *q_s, char *q, char *base,
- char srv_cred[8], UTIME srv_time,
- LSA_USER_INFO *user_info)
-{
- char *start = q;
- LSA_R_SAM_LOGON r_s;
-
- /* XXXX maybe we want to say 'no', reject the client's credentials */
- r_s.buffer_creds = 1; /* yes, we have valid server credentials */
- make_lsa_dom_chal(&(r_s.srv_creds), srv_cred, srv_time);
-
- /* store the user information, if there is any. */
- r_s.user = user_info;
- r_s.buffer_user = user_info != NULL ? 1 : 0;
- r_s.status = user_info != NULL ? 0 : (0xC000000|NT_STATUS_NO_SUCH_USER);
-
- /* store the response in the SMB stream */
- q = lsa_io_r_sam_logon(False, &r_s, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-
-static int lsa_reply_sam_logoff(LSA_Q_SAM_LOGOFF *q_s, char *q, char *base,
- char srv_cred[8], UTIME srv_time,
- uint32 status)
-{
- char *start = q;
- LSA_R_SAM_LOGOFF r_s;
-
- /* XXXX maybe we want to say 'no', reject the client's credentials */
- r_s.buffer_creds = 1; /* yes, we have valid server credentials */
- make_lsa_dom_chal(&(r_s.srv_creds), srv_cred, srv_time);
-
- r_s.status = status;
-
- /* store the response in the SMB stream */
- q = lsa_io_r_sam_logoff(False, &r_s, q, base, 4);
-
- /* return length of SMB data stored */
- return q - start;
-}
-
-
-static void api_lsa_open_policy( char *param, char *data,
- char **rdata, int *rdata_len )
-{
- int reply_len;
-
- /* we might actually want to decode the query, but it's not necessary */
- /* lsa_io_q_open_policy(...); */
-
- /* return a 20 byte policy handle */
- reply_len = lsa_reply_open_policy(*rdata + 0x18, *rdata + 0x18);
-
- /* construct header, now that we know the reply length */
- make_rpc_reply(data, *rdata, reply_len);
- *rdata_len = reply_len + 0x18;
-}
-
-static void api_lsa_query_info( char *param, char *data,
- char **rdata, int *rdata_len )
-{
- int reply_len;
-
- LSA_Q_QUERY_INFO q_i;
- pstring dom_name;
- pstring dom_sid;
-
- /* grab the info class and policy handle */
- lsa_io_q_query(True, &q_i, data + 0x18, data + 0x18, 4);
-
- pstrcpy(dom_name, lp_workgroup());
- pstrcpy(dom_sid , lp_domainsid());
-
- /* construct reply. return status is always 0x0 */
- reply_len = lsa_reply_query_info(&q_i, *rdata + 0x18, *rdata + 0x18,
- dom_name, dom_sid);
-
- /* construct header, now that we know the reply length */
- make_rpc_reply(data, *rdata, reply_len);
- *rdata_len = reply_len + 0x18;
-}
-
-static void api_lsa_lookup_sids( char *param, char *data,
- char **rdata, int *rdata_len )
-{
- int reply_len;
-
- int i;
- LSA_Q_LOOKUP_SIDS q_l;
- pstring dom_name;
- pstring dom_sid;
- fstring dom_sids[MAX_LOOKUP_SIDS];
-
- /* grab the info class and policy handle */
- lsa_io_q_lookup_sids(True, &q_l, data + 0x18, data + 0x18, 4);
-
- pstrcpy(dom_name, lp_workgroup());
- pstrcpy(dom_sid , lp_domainsid());
-
- /* convert received SIDs to strings, so we can do them. */
- for (i = 0; i < q_l.num_entries; i++)
- {
- fstrcpy(dom_sids[i], dom_sid_to_string(&(q_l.dom_sids[i])));
- }
-
- /* construct reply. return status is always 0x0 */
- reply_len = lsa_reply_lookup_sids(*rdata + 0x18, *rdata + 0x18,
- q_l.num_entries, dom_sids, /* text-converted SIDs */
- dom_name, dom_sid, /* domain name, domain SID */
- "S-1-1", "S-1-3", "S-1-5"); /* the three other SIDs */
-
- /* construct header, now that we know the reply length */
- make_rpc_reply(data, *rdata, reply_len);
- *rdata_len = reply_len + 0x18;
-}
-
-static void api_lsa_lookup_names( char *param, char *data,
- char **rdata, int *rdata_len )
-{
- int reply_len;
-
- int i;
- LSA_Q_LOOKUP_RIDS q_l;
- pstring dom_name;
- pstring dom_sid;
- uint32 dom_rids[MAX_LOOKUP_SIDS];
-
- /* grab the info class and policy handle */
- lsa_io_q_lookup_rids(True, &q_l, data + 0x18, data + 0x18, 4);
-
- pstrcpy(dom_name, lp_workgroup());
- pstrcpy(dom_sid , lp_domainsid());
-
- /* convert received RIDs to strings, so we can do them. */
- for (i = 0; i < q_l.num_entries; i++)
- {
- char *user_name = unistr2(q_l.lookup_name[i].str.buffer);
- dom_rids[i] = name_to_rid(user_name);
- }
-
- /* construct reply. return status is always 0x0 */
- reply_len = lsa_reply_lookup_rids(*rdata + 0x18, *rdata + 0x18,
- q_l.num_entries, dom_rids, /* text-converted SIDs */
- dom_name, dom_sid, /* domain name, domain SID */
- "S-1-1", "S-1-3", "S-1-5"); /* the three other SIDs */
-
- /* construct header, now that we know the reply length */
- make_rpc_reply(data, *rdata, reply_len);
- *rdata_len = reply_len + 0x18;
-}
-
-BOOL api_ntlsarpcTNP(int cnum,int uid, char *param,char *data,
- int mdrcnt,int mprcnt,
- char **rdata,char **rparam,
- int *rdata_len,int *rparam_len)
-{
- uint16 opnum = SVAL(data,22);
-
- int pkttype = CVAL(data, 2);
- if (pkttype == 0x0b) /* RPC BIND */
- {
- DEBUG(4,("netlogon rpc bind %x\n",pkttype));
- LsarpcTNP1(data,rdata,rdata_len);
- return True;
- }
-
- DEBUG(4,("ntlsa TransactNamedPipe op %x\n",opnum));
- switch (opnum)
- {
- case LSA_OPENPOLICY:
- {
- DEBUG(3,("LSA_OPENPOLICY\n"));
- api_lsa_open_policy(param, data, rdata, rdata_len);
- break;
- }
-
- case LSA_QUERYINFOPOLICY:
- {
- DEBUG(3,("LSA_QUERYINFOPOLICY\n"));
-
- api_lsa_query_info(param, data, rdata, rdata_len);
- break;
- }
-
- case LSA_ENUMTRUSTDOM:
- {
- char *q = *rdata + 0x18;
-
- DEBUG(3,("LSA_ENUMTRUSTDOM\n"));
-
- initrpcreply(data, *rdata);
-
- SIVAL(q, 0, 0); /* enumeration context */
- SIVAL(q, 0, 4); /* entries read */
- SIVAL(q, 0, 8); /* trust information */
-
- endrpcreply(data, *rdata, q-*rdata, 0x8000001a, rdata_len);
-
- break;
- }
-
- case LSA_CLOSE:
- {
- char *q = *rdata + 0x18;
-
- DEBUG(3,("LSA_CLOSE\n"));
-
- initrpcreply(data, *rdata);
-
- SIVAL(q, 0, 0);
- SIVAL(q, 0, 4);
- SIVAL(q, 0, 8);
- SIVAL(q, 0, 12);
- SIVAL(q, 0, 16);
-
- endrpcreply(data, *rdata, q-*rdata, 0, rdata_len);
-
- break;
- }
-
- case LSA_OPENSECRET:
- {
- char *q = *rdata + 0x18;
- DEBUG(3,("LSA_OPENSECRET\n"));
-
- initrpcreply(data, *rdata);
-
- SIVAL(q, 0, 0);
- SIVAL(q, 0, 4);
- SIVAL(q, 0, 8);
- SIVAL(q, 0, 12);
- SIVAL(q, 0, 16);
-
- endrpcreply(data, *rdata, q-*rdata, 0xc000034, rdata_len);
-
- break;
- }
-
- case LSA_LOOKUPSIDS:
- {
- DEBUG(3,("LSA_OPENSECRET\n"));
- api_lsa_lookup_sids(param, data, rdata, rdata_len);
- break;
- }
-
- case LSA_LOOKUPNAMES:
- {
- DEBUG(3,("LSA_LOOKUPNAMES\n"));
- api_lsa_lookup_names(param, data, rdata, rdata_len);
- break;
- }
-
- default:
- {
- DEBUG(4, ("NTLSARPC, unknown code: %lx\n", opnum));
- break;
- }
- }
- return True;
-}
-
-#endif /* NTDOMAIN */
diff --git a/source/smbd/predict.c b/source/smbd/predict.c
deleted file mode 100644
index 7d6b2498f5a..00000000000
--- a/source/smbd/predict.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- file read prediction routines
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-
-/* variables used by the read prediction module */
-static int rp_fd = -1;
-static int rp_offset = 0;
-static int rp_length = 0;
-static int rp_alloced = 0;
-static int rp_predict_fd = -1;
-static int rp_predict_offset = 0;
-static int rp_predict_length = 0;
-static int rp_timeout = 5;
-static time_t rp_time = 0;
-static char *rp_buffer = NULL;
-static BOOL predict_skip=False;
-time_t smb_last_time=(time_t)0;
-
-/****************************************************************************
-handle read prediction on a file
-****************************************************************************/
-int read_predict(int fd,int offset,char *buf,char **ptr,int num)
-{
- int ret = 0;
- int possible = rp_length - (offset - rp_offset);
-
- possible = MIN(possible,num);
-
- /* give data if possible */
- if (fd == rp_fd &&
- offset >= rp_offset &&
- possible>0 &&
- smb_last_time-rp_time < rp_timeout)
- {
- ret = possible;
- if (buf)
- memcpy(buf,rp_buffer + (offset-rp_offset),possible);
- else
- *ptr = rp_buffer + (offset-rp_offset);
- DEBUG(5,("read-prediction gave %d bytes of %d\n",ret,num));
- }
-
- if (ret == num) {
- predict_skip = True;
- } else {
- struct stat rp_stat;
-
- /* Find the end of the file - ensure we don't
- read predict beyond it. */
- if(fstat(fd,&rp_stat) < 0)
- {
- DEBUG(0,("read-prediction failed on fstat. Error was %s\n", strerror(errno)));
- predict_skip = True;
- }
- else
- {
- predict_skip = False;
-
- /* prepare the next prediction */
- rp_predict_fd = fd;
- /* Make sure we don't seek beyond the end of the file. */
- rp_predict_offset = MIN((offset + num),rp_stat.st_size);
- rp_predict_length = num;
- }
- }
-
- if (ret < 0) ret = 0;
-
- return(ret);
-}
-
-/****************************************************************************
-pre-read some data
-****************************************************************************/
-void do_read_prediction()
-{
- static int readsize = 0;
-
- if (predict_skip) return;
-
- if (rp_predict_fd == -1)
- return;
-
- rp_fd = rp_predict_fd;
- rp_offset = rp_predict_offset;
- rp_length = 0;
-
- rp_predict_fd = -1;
-
- if (readsize == 0) {
- readsize = lp_readsize();
- readsize = MAX(readsize,1024);
- }
-
- rp_predict_length = MIN(rp_predict_length,2*readsize);
- rp_predict_length = MAX(rp_predict_length,1024);
- rp_offset = (rp_offset/1024)*1024;
- rp_predict_length = (rp_predict_length/1024)*1024;
-
- if (rp_predict_length > rp_alloced)
- {
- rp_buffer = Realloc(rp_buffer,rp_predict_length);
- rp_alloced = rp_predict_length;
- if (!rp_buffer)
- {
- DEBUG(0,("can't allocate read-prediction buffer\n"));
- rp_predict_fd = -1;
- rp_fd = -1;
- rp_alloced = 0;
- return;
- }
- }
-
- if (lseek(rp_fd,rp_offset,SEEK_SET) != rp_offset) {
- rp_fd = -1;
- rp_predict_fd = -1;
- return;
- }
-
- rp_length = read(rp_fd,rp_buffer,rp_predict_length);
- rp_time = time(NULL);
- if (rp_length < 0)
- rp_length = 0;
-}
-
-/****************************************************************************
-invalidate read-prediction on a fd
-****************************************************************************/
-void invalidate_read_prediction(int fd)
-{
- if (rp_fd == fd)
- rp_fd = -1;
- if (rp_predict_fd == fd)
- rp_predict_fd = -1;
-}
-
diff --git a/source/smbd/quotas.c b/source/smbd/quotas.c
deleted file mode 100644
index 8810bcd909d..00000000000
--- a/source/smbd/quotas.c
+++ /dev/null
@@ -1,657 +0,0 @@
-#ifdef QUOTAS
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- support for quotas
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-/*
- * This is one of the most system dependent parts of Samba, and its
- * done a litle differently. Each system has its own way of doing
- * things :-(
- */
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-#ifdef LINUX
-
-#include <sys/types.h>
-#include <asm/types.h>
-#include <sys/quota.h>
-
-#include <mntent.h>
-#include <linux/unistd.h>
-
-_syscall4(int, quotactl, int, cmd, const char *, special, int, id, caddr_t, addr);
-
-/****************************************************************************
-try to get the disk space from disk quotas (LINUX version)
-****************************************************************************/
-
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- uid_t euser_id;
- int r;
- struct dqblk D;
- struct stat S;
- FILE *fp;
- struct mntent *mnt;
- int devno;
- int found;
-
- /* find the block device file */
-
- if ( stat(path, &S) == -1 ) {
- return(False) ;
- }
-
- devno = S.st_dev ;
-
- fp = setmntent(MOUNTED,"r");
- found = False ;
-
- while ((mnt = getmntent(fp))) {
- if ( stat(mnt->mnt_dir,&S) == -1 )
- continue ;
- if (S.st_dev == devno) {
- found = True ;
- break ;
- }
- }
- endmntent(fp) ;
-
- if (!found) {
- return(False);
- }
-
- euser_id=geteuid();
- seteuid(0);
- r=quotactl(QCMD(Q_GETQUOTA,USRQUOTA), mnt->mnt_fsname, euser_id, (caddr_t)&D);
- seteuid(euser_id);
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
- *bsize = 1024;
- if (r)
- {
- if (errno == EDQUOT)
- {
- *dfree =0;
- *dsize =D.dqb_curblocks;
- return (True);
- }
- else return(False);
- }
- /* Use softlimit to determine disk space, except when it has been exceeded */
- if (
- (D.dqb_bsoftlimit && D.dqb_curblocks>=D.dqb_bsoftlimit) ||
- (D.dqb_bhardlimit && D.dqb_curblocks>=D.dqb_bhardlimit) ||
- (D.dqb_isoftlimit && D.dqb_curinodes>=D.dqb_isoftlimit) ||
- (D.dqb_ihardlimit && D.dqb_curinodes>=D.dqb_ihardlimit)
- )
- {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- }
- else if (D.dqb_bsoftlimit==0 && D.dqb_bhardlimit==0)
- {
- return(False);
- }
- else {
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
- *dsize = D.dqb_bsoftlimit;
- }
- return (True);
-}
-
-#elif defined(CRAY)
-
-#include <sys/quota.h>
-#include <mntent.h>
-
-/****************************************************************************
-try to get the disk space from disk quotas (CRAY VERSION)
-****************************************************************************/
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- struct mntent *mnt;
- FILE *fd;
- struct stat sbuf;
- dev_t devno ;
- static dev_t devno_cached = 0 ;
- static char name[MNTMAXSTR] ;
- struct q_request request ;
- struct qf_header header ;
- static int quota_default = 0 ;
- int found ;
-
- if ( stat(path,&sbuf) == -1 )
- return(False) ;
-
- devno = sbuf.st_dev ;
-
- if ( devno != devno_cached ) {
-
- devno_cached = devno ;
-
- if ((fd = setmntent(KMTAB)) == NULL)
- return(False) ;
-
- found = False ;
-
- while ((mnt = getmntent(fd)) != NULL) {
-
- if ( stat(mnt->mnt_dir,&sbuf) == -1 )
- continue ;
-
- if (sbuf.st_dev == devno) {
-
- found = True ;
- break ;
-
- }
-
- }
-
- strcpy(name,mnt->mnt_dir) ;
- endmntent(fd) ;
-
- if ( ! found )
- return(False) ;
- }
-
- request.qf_magic = QF_MAGIC ;
- request.qf_entry.id = geteuid() ;
-
- if (quotactl(name, Q_GETQUOTA, &request) == -1)
- return(False) ;
-
- if ( ! request.user )
- return(False) ;
-
- if ( request.qf_entry.user_q.f_quota == QFV_DEFAULT ) {
-
- if ( ! quota_default ) {
-
- if ( quotactl(name, Q_GETHEADER, &header) == -1 )
- return(False) ;
- else
- quota_default = header.user_h.def_fq ;
- }
-
- *dfree = quota_default ;
-
- }else if ( request.qf_entry.user_q.f_quota == QFV_PREVENT ) {
-
- *dfree = 0 ;
-
- }else{
-
- *dfree = request.qf_entry.user_q.f_quota ;
-
- }
-
- *dsize = request.qf_entry.user_q.f_use ;
-
- if ( *dfree )
- *dfree -= *dsize ;
-
- if ( *dfree < 0 )
- *dfree = 0 ;
-
- *bsize = 4096 ; /* Cray blocksize */
-
- return(True) ;
-
-}
-
-
-#elif defined(SUNOS5) || defined(SUNOS4)
-
-#include <fcntl.h>
-#if defined(SUNOS5)
-#include <sys/fs/ufs_quota.h>
-#include <sys/mnttab.h>
-#else /* defined(SUNOS4) */
-#include <ufs/quota.h>
-#include <mntent.h>
-#endif
-
-/****************************************************************************
-try to get the disk space from disk quotas (solaris 2 version)
-****************************************************************************/
-/* Quota code by Peter Urbanec (amiga@cse.unsw.edu.au) */
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- uid_t user_id, euser_id;
- int ret;
- struct dqblk D;
-#if defined(SUNOS5)
- struct quotctl command;
- int file;
- struct mnttab mnt;
- static char name[MNT_LINE_MAX] ;
-#else
- struct mntent *mnt;
- static char name[MNTMAXSTR] ;
-#endif
- FILE *fd;
- struct stat sbuf;
- dev_t devno ;
- static dev_t devno_cached = 0 ;
- int found ;
-
- if ( stat(path,&sbuf) == -1 )
- return(False) ;
-
- devno = sbuf.st_dev ;
- DEBUG(5,("disk_quotas: looking for path \"%s\" devno=%o\n", path,devno));
- if ( devno != devno_cached ) {
- devno_cached = devno ;
-#if defined(SUNOS5)
- if ((fd = fopen(MNTTAB, "r")) == NULL)
- return(False) ;
-
- found = False ;
- while (getmntent(fd, &mnt) == 0) {
- if ( stat(mnt.mnt_mountp,&sbuf) == -1 )
- continue ;
- DEBUG(5,("disk_quotas: testing \"%s\" devno=%o\n",
- mnt.mnt_mountp,sbuf.st_dev));
- if (sbuf.st_dev == devno) {
- found = True ;
- break ;
- }
- }
-
- strcpy(name,mnt.mnt_mountp) ;
- strcat(name,"/quotas") ;
- fclose(fd) ;
-#else
- if ((fd = setmntent(MOUNTED, "r")) == NULL)
- return(False) ;
-
- found = False ;
- while ((mnt = getmntent(fd)) != NULL) {
- if ( stat(mnt->mnt_dir,&sbuf) == -1 )
- continue ;
- DEBUG(5,("disk_quotas: testing \"%s\" devno=%o\n",
- mnt->mnt_dir,sbuf.st_dev));
- if (sbuf.st_dev == devno) {
- found = True ;
- break ;
- }
- }
-
- strcpy(name,mnt->mnt_fsname) ;
- endmntent(fd) ;
-#endif
-
- if ( ! found )
- return(False) ;
- }
-
- euser_id = geteuid();
- user_id = getuid();
-
- setuid(0); /* Solaris seems to want to give info only to super-user */
- seteuid(0);
-
-#if defined(SUNOS5)
- DEBUG(5,("disk_quotas: looking for quotas file \"%s\"\n", name));
- if((file=open(name, O_RDONLY))<0) {
- setuid(user_id); /* Restore the original UID status */
- seteuid(euser_id);
- return(False);
- }
- command.op = Q_GETQUOTA;
- command.uid = euser_id;
- command.addr = (caddr_t) &D;
- ret = ioctl(file, Q_QUOTACTL, &command);
- close(file);
-#else
- DEBUG(5,("disk_quotas: trying quotactl on device \"%s\"\n", name));
- ret = quotactl(Q_GETQUOTA, name, euser_id, &D);
-#endif
-
- setuid(user_id); /* Restore the original uid status. */
- seteuid(euser_id);
-
- if (ret < 0) {
- DEBUG(2,("disk_quotas ioctl (Solaris) failed\n"));
- return(False);
- }
-
-
- /* Use softlimit to determine disk space. A user exceeding the quota is told
- * that there's no space left. Writes might actually work for a bit if the
- * hardlimit is set higher than softlimit. Effectively the disk becomes
- * made of rubber latex and begins to expand to accommodate the user :-)
- */
-
- if (D.dqb_bsoftlimit==0)
- return(False);
- *bsize = 512;
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
- *dsize = D.dqb_bsoftlimit;
- if(*dfree < 0)
- {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- }
-
-DEBUG(5,("disk_quotas for path \"%s\" returning bsize %d, dfree %d, dsize %d\n",
- path,*bsize,*dfree,*dsize));
-
- return(True);
-}
-
-
-#elif defined(OSF1)
-#include <ufs/quota.h>
-
-/****************************************************************************
-try to get the disk space from disk quotas - OFS1 version
-****************************************************************************/
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- uid_t user_id, euser_id;
- int r, save_errno;
- struct dqblk D;
- struct stat S;
-
- euser_id = geteuid();
- user_id = getuid();
-
- setreuid(euser_id, -1);
- r= quotactl(path,QCMD(Q_GETQUOTA, USRQUOTA),euser_id,(char *) &D);
- if (r)
- save_errno = errno;
-
- if (setreuid(user_id, -1) == -1)
- DEBUG(5,("Unable to reset uid to %d\n", user_id));
-
- *bsize = DEV_BSIZE;
-
- if (r)
- {
- if (save_errno == EDQUOT) // disk quota exceeded
- {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- return (True);
- }
- else
- return (False);
- }
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
-
- if (D.dqb_bsoftlimit==0)
- return(False);
-
- if ((D.dqb_curblocks>D.dqb_bsoftlimit)) {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- } else {
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
- *dsize = D.dqb_bsoftlimit;
- }
- return (True);
-}
-
-#elif defined (SGI6)
-/****************************************************************************
-try to get the disk space from disk quotas (IRIX 6.2 version)
-****************************************************************************/
-
-#include <sys/quota.h>
-#include <mntent.h>
-
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- uid_t euser_id;
- int r;
- struct dqblk D;
- struct fs_disk_quota F;
- struct stat S;
- FILE *fp;
- struct mntent *mnt;
- int devno;
- int found;
-
- /* find the block device file */
-
- if ( stat(path, &S) == -1 ) {
- return(False) ;
- }
-
- devno = S.st_dev ;
-
- fp = setmntent(MOUNTED,"r");
- found = False ;
-
- while ((mnt = getmntent(fp))) {
- if ( stat(mnt->mnt_dir,&S) == -1 )
- continue ;
- if (S.st_dev == devno) {
- found = True ;
- break ;
- }
- }
- endmntent(fp) ;
-
- if (!found) {
- return(False);
- }
-
- euser_id=geteuid();
- seteuid(0);
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
-
- *bsize = 512;
-
- if ( 0 == strcmp ( mnt->mnt_type, "efs" ))
- {
- r=quotactl (Q_GETQUOTA, mnt->mnt_fsname, euser_id, (caddr_t) &D);
-
- if (r==-1)
- return(False);
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
- if (
- (D.dqb_bsoftlimit && D.dqb_curblocks>=D.dqb_bsoftlimit) ||
- (D.dqb_bhardlimit && D.dqb_curblocks>=D.dqb_bhardlimit) ||
- (D.dqb_fsoftlimit && D.dqb_curfiles>=D.dqb_fsoftlimit) ||
- (D.dqb_fhardlimit && D.dqb_curfiles>=D.dqb_fhardlimit)
- )
- {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- }
- else if (D.dqb_bsoftlimit==0 && D.dqb_bhardlimit==0)
- {
- return(False);
- }
- else
- {
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
- *dsize = D.dqb_bsoftlimit;
- }
-
- }
- else if ( 0 == strcmp ( mnt->mnt_type, "xfs" ))
- {
- r=quotactl (Q_XGETQUOTA, mnt->mnt_fsname, euser_id, (caddr_t) &F);
-
- if (r==-1)
- return(False);
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
- if (
- (F.d_blk_softlimit && F.d_bcount>=F.d_blk_softlimit) ||
- (F.d_blk_hardlimit && F.d_bcount>=F.d_blk_hardlimit) ||
- (F.d_ino_softlimit && F.d_icount>=F.d_ino_softlimit) ||
- (F.d_ino_hardlimit && F.d_icount>=F.d_ino_hardlimit)
- )
- {
- /*
- * Fixme!: these are __uint64_t, this may truncate values
- */
- *dfree = 0;
- *dsize = (int) F.d_bcount;
- }
- else if (F.d_blk_softlimit==0 && F.d_blk_hardlimit==0)
- {
- return(False);
- }
- else
- {
- *dfree = (int)(F.d_blk_softlimit - F.d_bcount);
- *dsize = (int)F.d_blk_softlimit;
- }
-
- }
- else
- return(False);
-
- return (True);
-
-}
-
-#else
-
-#ifdef __FreeBSD__
-#include <ufs/ufs/quota.h>
-#include <machine/param.h>
-#elif AIX
-/* AIX quota patch from Ole Holm Nielsen <ohnielse@fysik.dtu.dk> */
-#include <jfs/quota.h>
-/* AIX 4.X: Rename members of the dqblk structure (ohnielse@fysik.dtu.dk) */
-#define dqb_curfiles dqb_curinodes
-#define dqb_fhardlimit dqb_ihardlimit
-#define dqb_fsoftlimit dqb_isoftlimit
-#else /* !__FreeBSD__ && !AIX */
-#include <sys/quota.h>
-#include <devnm.h>
-#endif
-
-/****************************************************************************
-try to get the disk space from disk quotas - default version
-****************************************************************************/
-BOOL disk_quotas(char *path, int *bsize, int *dfree, int *dsize)
-{
- uid_t euser_id;
- int r;
- struct dqblk D;
-#if !defined(__FreeBSD__) && !defined(AIX)
- char dev_disk[256];
- struct stat S;
- /* find the block device file */
- if ((stat(path, &S)<0) ||
- (devnm(S_IFBLK, S.st_dev, dev_disk, 256, 0)<0)) return (False);
-#endif
-
- euser_id = geteuid();
-
-#ifdef USE_SETRES
- {
- uid_t user_id;
-
- /* for HPUX, real uid must be same as euid to execute quotactl for euid */
- user_id = getuid();
- setresuid(euser_id,-1,-1);
- r=quotactl(Q_GETQUOTA, dev_disk, euser_id, &D);
- if (setresuid(user_id,-1,-1))
- DEBUG(5,("Unable to reset uid to %d\n", user_id));
- }
-#else /* USE_SETRES */
-#if defined(__FreeBSD__)
- {
- /* FreeBSD patches from Marty Moll <martym@arbor.edu> */
- uid_t user_id;
- gid_t egrp_id;
-
- /* Need to be root to get quotas in FreeBSD */
- user_id = getuid();
- egrp_id = getegid();
- setuid(0);
- seteuid(0);
- r= quotactl(path,QCMD(Q_GETQUOTA,USRQUOTA),euser_id,(char *) &D);
-
- /* As FreeBSD has group quotas, if getting the user
- quota fails, try getting the group instead. */
- if (r)
- r= quotactl(path,QCMD(Q_GETQUOTA,GRPQUOTA),egrp_id,(char *) &D);
- setuid(user_id);
- seteuid(euser_id);
- }
-#elif defined(AIX)
- /* AIX has both USER and GROUP quotas:
- Get the USER quota (ohnielse@fysik.dtu.dk) */
- r= quotactl(path,QCMD(Q_GETQUOTA,USRQUOTA),euser_id,(char *) &D);
-#else /* !__FreeBSD__ && !AIX */
- r=quotactl(Q_GETQUOTA, dev_disk, euser_id, &D);
-#endif /* !__FreeBSD__ && !AIX */
-#endif /* USE_SETRES */
-
- /* Use softlimit to determine disk space, except when it has been exceeded */
-#if defined(__FreeBSD__)
- *bsize = DEV_BSIZE;
-#else /* !__FreeBSD__ */
- *bsize = 1024;
-#endif /*!__FreeBSD__ */
-
- if (r)
- {
- if (errno == EDQUOT)
- {
- *dfree =0;
- *dsize =D.dqb_curblocks;
- return (True);
- }
- else return(False);
- }
- if (D.dqb_bsoftlimit==0)
- return(False);
- /* Use softlimit to determine disk space, except when it has been exceeded */
- if ((D.dqb_curblocks>D.dqb_bsoftlimit)
-#if !defined(__FreeBSD__)
-||((D.dqb_curfiles>D.dqb_fsoftlimit) && (D.dqb_fsoftlimit != 0))
-#endif
- ) {
- *dfree = 0;
- *dsize = D.dqb_curblocks;
- }
- else {
- *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
- *dsize = D.dqb_bsoftlimit;
- }
- return (True);
-}
-
-#endif
-
-#else
-/* this keeps fussy compilers happy */
- void quotas_dummy(void) {}
-#endif /* QUOTAS */
-
diff --git a/source/smbd/reply.c b/source/smbd/reply.c
deleted file mode 100644
index baccb762911..00000000000
--- a/source/smbd/reply.c
+++ /dev/null
@@ -1,3821 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Main SMB reply routines
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-/*
- This file handles most of the reply_ calls that the server
- makes to handle specific protocols
-*/
-
-
-#include "includes.h"
-#include "trans2.h"
-
-/* look in server.c for some explanation of these variables */
-extern int Protocol;
-extern int DEBUGLEVEL;
-extern int max_send;
-extern int max_recv;
-extern int chain_fnum;
-extern char magic_char;
-extern connection_struct Connections[];
-extern files_struct Files[];
-extern BOOL case_sensitive;
-extern BOOL case_preserve;
-extern BOOL short_case_preserve;
-extern pstring sesssetup_user;
-extern fstring myworkgroup;
-extern int Client;
-extern int global_oplock_break;
-
-/* this macro should always be used to extract an fnum (smb_fid) from
-a packet to ensure chaining works correctly */
-#define GETFNUM(buf,where) (chain_fnum!= -1?chain_fnum:SVAL(buf,where))
-
-
-/****************************************************************************
-report a possible attack via the password buffer overflow bug
-****************************************************************************/
-static void overflow_attack(int len)
-{
- DEBUG(0,("ERROR: Invalid password length %d\n", len));
- DEBUG(0,("your machine may be under attack by a user exploiting an old bug\n"));
- DEBUG(0,("Attack was from IP=%s\n", client_addr()));
- exit_server("possible attack");
-}
-
-
-/****************************************************************************
- reply to an special message
-****************************************************************************/
-int reply_special(char *inbuf,char *outbuf)
-{
- int outsize = 4;
- int msg_type = CVAL(inbuf,0);
- int msg_flags = CVAL(inbuf,1);
- pstring name1,name2;
- extern fstring remote_machine;
- extern fstring local_machine;
- char *p;
-
- *name1 = *name2 = 0;
-
- smb_setlen(outbuf,0);
-
- switch (msg_type) {
- case 0x81: /* session request */
- CVAL(outbuf,0) = 0x82;
- CVAL(outbuf,3) = 0;
- if (name_len(inbuf+4) > 50 || name_len(inbuf+4 + name_len(inbuf + 4)) > 50) {
- DEBUG(0,("Invalid name length in session request\n"));
- return(0);
- }
- name_extract(inbuf,4,name1);
- name_extract(inbuf,4 + name_len(inbuf + 4),name2);
- DEBUG(2,("netbios connect: name1=%s name2=%s\n",
- name1,name2));
-
- fstrcpy(remote_machine,name2);
- trim_string(remote_machine," "," ");
- p = strchr(remote_machine,' ');
- strlower(remote_machine);
- if (p) *p = 0;
-
- fstrcpy(local_machine,name1);
- trim_string(local_machine," "," ");
- p = strchr(local_machine,' ');
- strlower(local_machine);
- if (p) *p = 0;
-
- add_session_user(remote_machine);
-
- reload_services(True);
- reopen_logs();
-
- break;
-
- case 0x89: /* session keepalive request
- (some old clients produce this?) */
- CVAL(outbuf,0) = 0x85;
- CVAL(outbuf,3) = 0;
- break;
-
- case 0x82: /* positive session response */
- case 0x83: /* negative session response */
- case 0x84: /* retarget session response */
- DEBUG(0,("Unexpected session response\n"));
- break;
-
- case 0x85: /* session keepalive */
- default:
- return(0);
- }
-
- DEBUG(5,("%s init msg_type=0x%x msg_flags=0x%x\n",
- timestring(),msg_type,msg_flags));
-
- return(outsize);
-}
-
-
-/*******************************************************************
-work out what error to give to a failed connection
-********************************************************************/
-static int connection_error(char *inbuf,char *outbuf,int connection_num)
-{
- switch (connection_num)
- {
- case -8:
- return(ERROR(ERRSRV,ERRnoresource));
- case -7:
- return(ERROR(ERRSRV,ERRbaduid));
- case -6:
- return(ERROR(ERRSRV,ERRinvdevice));
- case -5:
- return(ERROR(ERRSRV,ERRinvnetname));
- case -4:
- return(ERROR(ERRSRV,ERRaccess));
- case -3:
- return(ERROR(ERRDOS,ERRnoipc));
- case -2:
- return(ERROR(ERRSRV,ERRinvnetname));
- }
- return(ERROR(ERRSRV,ERRbadpw));
-}
-
-
-
-/****************************************************************************
- parse a share descriptor string
-****************************************************************************/
-static void parse_connect(char *p,char *service,char *user,
- char *password,int *pwlen,char *dev)
-{
- char *p2;
-
- DEBUG(4,("parsing connect string %s\n",p));
-
- p2 = strrchr(p,'\\');
- if (p2 == NULL)
- fstrcpy(service,p);
- else
- fstrcpy(service,p2+1);
-
- p += strlen(p) + 2;
-
- fstrcpy(password,p);
- *pwlen = strlen(password);
-
- p += strlen(p) + 2;
-
- fstrcpy(dev,p);
-
- *user = 0;
- p = strchr(service,'%');
- if (p != NULL)
- {
- *p = 0;
- fstrcpy(user,p+1);
- }
-}
-
-
-
-
-/****************************************************************************
- reply to a tcon
-****************************************************************************/
-int reply_tcon(char *inbuf,char *outbuf)
-{
- pstring service;
- pstring user;
- pstring password;
- pstring dev;
- int connection_num;
- int outsize = 0;
- uint16 vuid = SVAL(inbuf,smb_uid);
- int pwlen=0;
-
- *service = *user = *password = *dev = 0;
-
- parse_connect(smb_buf(inbuf)+1,service,user,password,&pwlen,dev);
-
- connection_num = make_connection(service,user,password,pwlen,dev,vuid);
-
- if (connection_num < 0)
- return(connection_error(inbuf,outbuf,connection_num));
-
- outsize = set_message(outbuf,2,0,True);
- SSVAL(outbuf,smb_vwv0,max_recv);
- SSVAL(outbuf,smb_vwv1,connection_num);
- SSVAL(outbuf,smb_tid,connection_num);
-
- DEBUG(3,("%s tcon service=%s user=%s cnum=%d\n",timestring(),service,user,connection_num));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a tcon and X
-****************************************************************************/
-int reply_tcon_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- pstring service;
- pstring user;
- pstring password;
- pstring devicename;
- int connection_num;
- uint16 vuid = SVAL(inbuf,smb_uid);
- int passlen = SVAL(inbuf,smb_vwv3);
- BOOL doencrypt = SMBENCRYPT();
-
- *service = *user = *password = *devicename = 0;
-
- /* we might have to close an old one */
- if ((SVAL(inbuf,smb_vwv2) & 0x1) != 0)
- close_cnum(SVAL(inbuf,smb_tid),vuid);
-
- if (passlen > MAX_PASS_LEN) {
- overflow_attack(passlen);
- }
-
- {
- char *path;
- char *p;
- memcpy(password,smb_buf(inbuf),passlen);
- password[passlen]=0;
- path = smb_buf(inbuf) + passlen;
-
- if (!doencrypt || passlen != 24) {
- if (strequal(password," "))
- *password = 0;
- passlen = strlen(password);
- }
-
- fstrcpy(service,path+2);
- p = strchr(service,'\\');
- if (!p)
- return(ERROR(ERRSRV,ERRinvnetname));
- *p = 0;
- fstrcpy(service,p+1);
- p = strchr(service,'%');
- if (p)
- {
- *p++ = 0;
- fstrcpy(user,p);
- }
- StrnCpy(devicename,path + strlen(path) + 1,6);
- DEBUG(4,("Got device type %s\n",devicename));
- }
-
- connection_num = make_connection(service,user,password,passlen,devicename,vuid);
-
- if (connection_num < 0)
- return(connection_error(inbuf,outbuf,connection_num));
-
- if (Protocol < PROTOCOL_NT1)
- {
- set_message(outbuf,2,strlen(devicename)+1,True);
- strcpy(smb_buf(outbuf),devicename);
- }
- else
- {
- char *fsname = "SAMBA";
- char *p;
-
- set_message(outbuf,3,3,True);
-
- p = smb_buf(outbuf);
- strcpy(p,devicename); p = skip_string(p,1); /* device name */
- strcpy(p,fsname); p = skip_string(p,1); /* filesystem type e.g NTFS */
-
- set_message(outbuf,3,PTR_DIFF(p,smb_buf(outbuf)),False);
-
- SSVAL(outbuf, smb_vwv2, 0x0); /* optional support */
- }
-
- DEBUG(3,("%s tconX service=%s user=%s cnum=%d\n",timestring(),service,user,connection_num));
-
- /* set the incoming and outgoing tid to the just created one */
- SSVAL(inbuf,smb_tid,connection_num);
- SSVAL(outbuf,smb_tid,connection_num);
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to an unknown type
-****************************************************************************/
-int reply_unknown(char *inbuf,char *outbuf)
-{
- int cnum;
- int type;
- cnum = SVAL(inbuf,smb_tid);
- type = CVAL(inbuf,smb_com);
-
- DEBUG(0,("%s unknown command type (%s): cnum=%d type=%d (0x%X)\n",
- timestring(),
- smb_fn_name(type),
- cnum,type,type));
-
- return(ERROR(ERRSRV,ERRunknownsmb));
-}
-
-
-/****************************************************************************
- reply to an ioctl
-****************************************************************************/
-int reply_ioctl(char *inbuf,char *outbuf)
-{
- DEBUG(3,("ignoring ioctl\n"));
-#if 0
- /* we just say it succeeds and hope its all OK.
- some day it would be nice to interpret them individually */
- return set_message(outbuf,1,0,True);
-#else
- return(ERROR(ERRSRV,ERRnosupport));
-#endif
-}
-
-
-/****************************************************************************
-reply to a session setup command
-****************************************************************************/
-int reply_sesssetup_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- uint16 sess_vuid;
- int gid;
- int uid;
- int smb_bufsize;
- int smb_mpxmax;
- int smb_vc_num;
- uint32 smb_sesskey;
- int smb_apasslen = 0;
- pstring smb_apasswd;
- int smb_ntpasslen = 0;
- pstring smb_ntpasswd;
- BOOL valid_nt_password = False;
- pstring user;
- BOOL guest=False;
- BOOL computer_id=False;
- static BOOL done_sesssetup = False;
- BOOL doencrypt = SMBENCRYPT();
-
- *smb_apasswd = 0;
-
- smb_bufsize = SVAL(inbuf,smb_vwv2);
- smb_mpxmax = SVAL(inbuf,smb_vwv3);
- smb_vc_num = SVAL(inbuf,smb_vwv4);
- smb_sesskey = IVAL(inbuf,smb_vwv5);
-
- if (Protocol < PROTOCOL_NT1) {
- smb_apasslen = SVAL(inbuf,smb_vwv7);
- if (smb_apasslen > MAX_PASS_LEN)
- {
- overflow_attack(smb_apasslen);
- }
-
- memcpy(smb_apasswd,smb_buf(inbuf),smb_apasslen);
- pstrcpy(user,smb_buf(inbuf)+smb_apasslen);
-
- if (lp_security() != SEC_SERVER && !doencrypt) {
- smb_apasslen = strlen(smb_apasswd);
- }
- } else {
- uint16 passlen1 = SVAL(inbuf,smb_vwv7);
- uint16 passlen2 = SVAL(inbuf,smb_vwv8);
- uint32 client_caps = IVAL(inbuf,smb_vwv11);
- enum remote_arch_types ra_type = get_remote_arch();
-
- char *p = smb_buf(inbuf);
-
- /* client_caps is used as final determination if client is NT or Win95.
- This is needed to return the correct error codes in some
- circumstances.
- */
-
- if(ra_type == RA_WINNT || ra_type == RA_WIN95)
- {
- if(client_caps & (CAP_NT_SMBS | CAP_STATUS32))
- set_remote_arch( RA_WINNT);
- else
- set_remote_arch( RA_WIN95);
- }
-
- if (passlen1 != 24 && passlen2 != 24)
- doencrypt = False;
-
- if (passlen1 > MAX_PASS_LEN) {
- overflow_attack(passlen1);
- }
-
- passlen1 = MIN(passlen1, MAX_PASS_LEN);
- passlen2 = MIN(passlen2, MAX_PASS_LEN);
-
- if(doencrypt) {
- /* Save the lanman2 password and the NT md4 password. */
- smb_apasslen = passlen1;
- memcpy(smb_apasswd,p,smb_apasslen);
- smb_ntpasslen = passlen2;
- memcpy(smb_ntpasswd,p+passlen1,smb_ntpasslen);
- } else {
- /* both Win95 and WinNT stuff up the password lengths for
- non-encrypting systems. Uggh.
-
- if passlen1==24 its a win95 system, and its setting the
- password length incorrectly. Luckily it still works with the
- default code because Win95 will null terminate the password
- anyway
-
- if passlen1>0 and passlen2>0 then maybe its a NT box and its
- setting passlen2 to some random value which really stuffs
- things up. we need to fix that one. */
- if (passlen1 > 0 && passlen2 > 0 && passlen2 != 24 &&
- passlen2 != 1) {
- passlen2 = 0;
- }
- /* we use the first password that they gave */
- smb_apasslen = passlen1;
- StrnCpy(smb_apasswd,p,smb_apasslen);
-
- /* trim the password */
- smb_apasslen = strlen(smb_apasswd);
-
- /* wfwg sometimes uses a space instead of a null */
- if (strequal(smb_apasswd," ")) {
- smb_apasslen = 0;
- *smb_apasswd = 0;
- }
- }
-
- p += passlen1 + passlen2;
- fstrcpy(user,p); p = skip_string(p,1);
- DEBUG(3,("Domain=[%s] NativeOS=[%s] NativeLanMan=[%s]\n",
- p,skip_string(p,1),skip_string(p,2)));
- }
-
-
- DEBUG(3,("sesssetupX:name=[%s]\n",user));
-
- /* If name ends in $ then I think it's asking about whether a */
- /* computer with that name (minus the $) has access. For now */
- /* say yes to everything ending in $. */
- if (user[strlen(user) - 1] == '$') {
- computer_id = True;
- user[strlen(user) - 1] = '\0';
- }
-
-
- /* If no username is sent use the guest account */
- if (!*user)
- {
- strcpy(user,lp_guestaccount(-1));
- /* If no user and no password then set guest flag. */
- if( *smb_apasswd == 0)
- guest = True;
- }
-
- strlower(user);
-
- strcpy(sesssetup_user,user);
-
- reload_services(True);
-
- add_session_user(user);
-
- /* Check if the given username was the guest user with no password.
- We need to do this check after add_session_user() as that
- call can potentially change the username (via map_user).
- */
-
- if(!guest && strequal(user,lp_guestaccount(-1)) && (*smb_apasswd == 0))
- guest = True;
-
- if (!guest && !(lp_security() == SEC_SERVER && server_validate(inbuf)) &&
- !check_hosts_equiv(user))
- {
-
- /* now check if it's a valid username/password */
- /* If an NT password was supplied try and validate with that
- first. This is superior as the passwords are mixed case
- 128 length unicode */
- if(smb_ntpasslen)
- {
- if(!password_ok(user,smb_ntpasswd,smb_ntpasslen,NULL))
- DEBUG(0,("NT Password did not match ! Defaulting to Lanman\n"));
- else
- valid_nt_password = True;
- }
- if (!valid_nt_password && !password_ok(user,smb_apasswd,smb_apasslen,NULL))
- {
- if (!computer_id && lp_security() >= SEC_USER) {
-#if (GUEST_SESSSETUP == 0)
- return(ERROR(ERRSRV,ERRbadpw));
-#endif
-#if (GUEST_SESSSETUP == 1)
- if (Get_Pwnam(user,True))
- return(ERROR(ERRSRV,ERRbadpw));
-#endif
- }
- if (*smb_apasswd || !Get_Pwnam(user,True))
- strcpy(user,lp_guestaccount(-1));
- DEBUG(3,("Registered username %s for guest access\n",user));
- guest = True;
- }
- }
-
- if (!Get_Pwnam(user,True)) {
- DEBUG(3,("No such user %s - using guest account\n",user));
- strcpy(user,lp_guestaccount(-1));
- guest = True;
- }
-
- if (!strequal(user,lp_guestaccount(-1)) &&
- lp_servicenumber(user) < 0)
- {
- int homes = lp_servicenumber(HOMES_NAME);
- char *home = get_home_dir(user);
- if (homes >= 0 && home)
- lp_add_home(user,homes,home);
- }
-
-
- /* it's ok - setup a reply */
- if (Protocol < PROTOCOL_NT1) {
- set_message(outbuf,3,0,True);
- } else {
- char *p;
- set_message(outbuf,3,3,True);
- p = smb_buf(outbuf);
- strcpy(p,"Unix"); p = skip_string(p,1);
- strcpy(p,"Samba "); strcat(p,VERSION); p = skip_string(p,1);
- strcpy(p,myworkgroup); p = skip_string(p,1);
- set_message(outbuf,3,PTR_DIFF(p,smb_buf(outbuf)),False);
- /* perhaps grab OS version here?? */
- }
-
- /* Set the correct uid in the outgoing and incoming packets
- We will use this on future requests to determine which
- user we should become.
- */
- {
- struct passwd *pw = Get_Pwnam(user,False);
- if (!pw) {
- DEBUG(1,("Username %s is invalid on this system\n",user));
- return(ERROR(ERRSRV,ERRbadpw));
- }
- gid = pw->pw_gid;
- uid = pw->pw_uid;
- }
-
- if (guest && !computer_id)
- SSVAL(outbuf,smb_vwv2,1);
-
- /* register the name and uid as being validated, so further connections
- to a uid can get through without a password, on the same VC */
- sess_vuid = register_vuid(uid,gid,user,guest);
-
- SSVAL(outbuf,smb_uid,sess_vuid);
- SSVAL(inbuf,smb_uid,sess_vuid);
-
- if (!done_sesssetup)
- max_send = MIN(max_send,smb_bufsize);
-
- DEBUG(6,("Client requested max send size of %d\n", max_send));
-
- done_sesssetup = True;
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a chkpth
-****************************************************************************/
-int reply_chkpth(char *inbuf,char *outbuf)
-{
- int outsize = 0;
- int cnum,mode;
- pstring name;
- BOOL ok = False;
- BOOL bad_path = False;
-
- cnum = SVAL(inbuf,smb_tid);
-
- pstrcpy(name,smb_buf(inbuf) + 1);
- unix_convert(name,cnum,0,&bad_path);
-
- mode = SVAL(inbuf,smb_vwv0);
-
- if (check_name(name,cnum))
- ok = directory_exist(name,NULL);
-
- if (!ok)
- {
- /* We special case this - as when a Windows machine
- is parsing a path is steps through the components
- one at a time - if a component fails it expects
- ERRbadpath, not ERRbadfile.
- */
- if(errno == ENOENT)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
-
-#if 0
- /* Ugly - NT specific hack - maybe not needed ? (JRA) */
- if((errno == ENOTDIR) && (Protocol >= PROTOCOL_NT1) &&
- (get_remote_arch() == RA_WINNT))
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbaddirectory;
- }
-#endif
-
- return(UNIXERROR(ERRDOS,ERRbadpath));
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s chkpth %s cnum=%d mode=%d\n",timestring(),name,cnum,mode));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a getatr
-****************************************************************************/
-int reply_getatr(char *inbuf,char *outbuf)
-{
- pstring fname;
- int cnum;
- int outsize = 0;
- struct stat sbuf;
- BOOL ok = False;
- int mode=0;
- uint32 size=0;
- time_t mtime=0;
- BOOL bad_path = False;
-
- cnum = SVAL(inbuf,smb_tid);
-
- pstrcpy(fname,smb_buf(inbuf) + 1);
- unix_convert(fname,cnum,0,&bad_path);
-
- /* dos smetimes asks for a stat of "" - it returns a "hidden directory"
- under WfWg - weird! */
- if (! (*fname))
- {
- mode = aHIDDEN | aDIR;
- if (!CAN_WRITE(cnum)) mode |= aRONLY;
- size = 0;
- mtime = 0;
- ok = True;
- }
- else
- if (check_name(fname,cnum))
- {
- if (sys_stat(fname,&sbuf) == 0)
- {
- mode = dos_mode(cnum,fname,&sbuf);
- size = sbuf.st_size;
- mtime = sbuf.st_mtime;
- if (mode & aDIR)
- size = 0;
- ok = True;
- }
- else
- DEBUG(3,("stat of %s failed (%s)\n",fname,strerror(errno)));
- }
-
- if (!ok)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
-
- return(UNIXERROR(ERRDOS,ERRbadfile));
- }
-
- outsize = set_message(outbuf,10,0,True);
-
- SSVAL(outbuf,smb_vwv0,mode);
- put_dos_date3(outbuf,smb_vwv1,mtime);
- SIVAL(outbuf,smb_vwv3,size);
-
- if (Protocol >= PROTOCOL_NT1) {
- char *p = strrchr(fname,'/');
- uint16 flg2 = SVAL(outbuf,smb_flg2);
- if (!p) p = fname;
- if (!is_8_3(fname, True))
- SSVAL(outbuf,smb_flg2,flg2 | 0x40); /* IS_LONG_NAME */
- }
-
- DEBUG(3,("%s getatr name=%s mode=%d size=%d\n",timestring(),fname,mode,size));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a setatr
-****************************************************************************/
-int reply_setatr(char *inbuf,char *outbuf)
-{
- pstring fname;
- int cnum;
- int outsize = 0;
- BOOL ok=False;
- int mode;
- time_t mtime;
- BOOL bad_path = False;
-
- cnum = SVAL(inbuf,smb_tid);
-
- pstrcpy(fname,smb_buf(inbuf) + 1);
- unix_convert(fname,cnum,0,&bad_path);
-
- mode = SVAL(inbuf,smb_vwv0);
- mtime = make_unix_date3(inbuf+smb_vwv1);
-
- if (directory_exist(fname,NULL))
- mode |= aDIR;
- if (check_name(fname,cnum))
- ok = (dos_chmod(cnum,fname,mode,NULL) == 0);
- if (ok)
- ok = set_filetime(fname,mtime);
-
- if (!ok)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
-
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s setatr name=%s mode=%d\n",timestring(),fname,mode));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a dskattr
-****************************************************************************/
-int reply_dskattr(char *inbuf,char *outbuf)
-{
- int cnum;
- int outsize = 0;
- int dfree,dsize,bsize;
-
- cnum = SVAL(inbuf,smb_tid);
-
- sys_disk_free(".",&bsize,&dfree,&dsize);
-
- outsize = set_message(outbuf,5,0,True);
-
- SSVAL(outbuf,smb_vwv0,dsize);
- SSVAL(outbuf,smb_vwv1,bsize/512);
- SSVAL(outbuf,smb_vwv2,512);
- SSVAL(outbuf,smb_vwv3,dfree);
-
- DEBUG(3,("%s dskattr cnum=%d dfree=%d\n",timestring(),cnum,dfree));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a search
- Can be called from SMBsearch, SMBffirst or SMBfunique.
-****************************************************************************/
-int reply_search(char *inbuf,char *outbuf)
-{
- pstring mask;
- pstring directory;
- pstring fname;
- int size,mode;
- time_t date;
- int dirtype;
- int cnum;
- int outsize = 0;
- int numentries = 0;
- BOOL finished = False;
- int maxentries;
- int i;
- char *p;
- BOOL ok = False;
- int status_len;
- char *path;
- char status[21];
- int dptr_num= -1;
- BOOL check_descend = False;
- BOOL expect_close = False;
- BOOL can_open = True;
- BOOL bad_path = False;
-
- *mask = *directory = *fname = 0;
-
- /* If we were called as SMBffirst then we must expect close. */
- if(CVAL(inbuf,smb_com) == SMBffirst)
- expect_close = True;
-
- cnum = SVAL(inbuf,smb_tid);
-
- outsize = set_message(outbuf,1,3,True);
- maxentries = SVAL(inbuf,smb_vwv0);
- dirtype = SVAL(inbuf,smb_vwv1);
- path = smb_buf(inbuf) + 1;
- status_len = SVAL(smb_buf(inbuf),3 + strlen(path));
-
-
- /* dirtype &= ~aDIR; */
-
- DEBUG(5,("path=%s status_len=%d\n",path,status_len));
-
-
- if (status_len == 0)
- {
- pstring dir2;
-
- pstrcpy(directory,smb_buf(inbuf)+1);
- pstrcpy(dir2,smb_buf(inbuf)+1);
- unix_convert(directory,cnum,0,&bad_path);
- unix_format(dir2);
-
- if (!check_name(directory,cnum))
- can_open = False;
-
- p = strrchr(dir2,'/');
- if (p == NULL)
- {
- strcpy(mask,dir2);
- *dir2 = 0;
- }
- else
- {
- *p = 0;
- pstrcpy(mask,p+1);
- }
-
- p = strrchr(directory,'/');
- if (!p)
- *directory = 0;
- else
- *p = 0;
-
- if (strlen(directory) == 0)
- strcpy(directory,"./");
- bzero(status,21);
- CVAL(status,0) = dirtype;
- }
- else
- {
- memcpy(status,smb_buf(inbuf) + 1 + strlen(path) + 4,21);
- memcpy(mask,status+1,11);
- mask[11] = 0;
- dirtype = CVAL(status,0) & 0x1F;
- Connections[cnum].dirptr = dptr_fetch(status+12,&dptr_num);
- if (!Connections[cnum].dirptr)
- goto SearchEmpty;
- string_set(&Connections[cnum].dirpath,dptr_path(dptr_num));
- if (!case_sensitive)
- strnorm(mask);
- }
-
- /* turn strings of spaces into a . */
- {
- trim_string(mask,NULL," ");
- if ((p = strrchr(mask,' ')))
- {
- fstring ext;
- fstrcpy(ext,p+1);
- *p = 0;
- trim_string(mask,NULL," ");
- strcat(mask,".");
- strcat(mask,ext);
- }
- }
-
- {
- for (p=mask; *p; p++)
- {
- if (*p != '?' && *p != '*' && !isdoschar(*p))
- {
- DEBUG(5,("Invalid char [%c] in search mask?\n",*p));
- *p = '?';
- }
- }
- }
-
- if (!strchr(mask,'.') && strlen(mask)>8)
- {
- fstring tmp;
- fstrcpy(tmp,&mask[8]);
- mask[8] = '.';
- mask[9] = 0;
- strcat(mask,tmp);
- }
-
- DEBUG(5,("mask=%s directory=%s\n",mask,directory));
-
- if (can_open)
- {
- p = smb_buf(outbuf) + 3;
-
- ok = True;
-
- if (status_len == 0)
- {
- dptr_num = dptr_create(cnum,directory,expect_close,SVAL(inbuf,smb_pid));
- if (dptr_num < 0)
- {
- if(dptr_num == -2)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return (UNIXERROR(ERRDOS,ERRnofids));
- }
- return(ERROR(ERRDOS,ERRnofids));
- }
- }
-
- DEBUG(4,("dptr_num is %d\n",dptr_num));
-
- if (ok)
- {
- if ((dirtype&0x1F) == aVOLID)
- {
- memcpy(p,status,21);
- make_dir_struct(p,"???????????",volume_label(SNUM(cnum)),0,aVOLID,0);
- dptr_fill(p+12,dptr_num);
- if (dptr_zero(p+12) && (status_len==0))
- numentries = 1;
- else
- numentries = 0;
- p += DIR_STRUCT_SIZE;
- }
- else
- {
- DEBUG(8,("dirpath=<%s> dontdescend=<%s>\n",Connections[cnum].dirpath,lp_dontdescend(SNUM(cnum))));
- if (in_list(Connections[cnum].dirpath,
- lp_dontdescend(SNUM(cnum)),True))
- check_descend = True;
-
- for (i=numentries;(i<maxentries) && !finished;i++)
- {
- finished =
- !get_dir_entry(cnum,mask,dirtype,fname,&size,&mode,&date,check_descend);
- if (!finished)
- {
- memcpy(p,status,21);
- make_dir_struct(p,mask,fname,size,mode,date);
- dptr_fill(p+12,dptr_num);
- numentries++;
- }
- p += DIR_STRUCT_SIZE;
- }
- }
- }
- }
-
-
- SearchEmpty:
-
- if (numentries == 0 || !ok)
- {
- CVAL(outbuf,smb_rcls) = ERRDOS;
- SSVAL(outbuf,smb_err,ERRnofiles);
- }
-
- /* If we were called as SMBffirst with smb_search_id == NULL
- and no entries were found then return error and close dirptr
- (X/Open spec) */
-
- if(ok && expect_close && numentries == 0 && status_len == 0)
- {
- CVAL(outbuf,smb_rcls) = ERRDOS;
- SSVAL(outbuf,smb_err,ERRnofiles);
- /* Also close the dptr - we know it's gone */
- dptr_close(dptr_num);
- }
-
- /* If we were called as SMBfunique, then we can close the dirptr now ! */
- if(dptr_num >= 0 && CVAL(inbuf,smb_com) == SMBfunique)
- dptr_close(dptr_num);
-
- SSVAL(outbuf,smb_vwv0,numentries);
- SSVAL(outbuf,smb_vwv1,3 + numentries * DIR_STRUCT_SIZE);
- CVAL(smb_buf(outbuf),0) = 5;
- SSVAL(smb_buf(outbuf),1,numentries*DIR_STRUCT_SIZE);
-
- if (Protocol >= PROTOCOL_NT1) {
- uint16 flg2 = SVAL(outbuf,smb_flg2);
- SSVAL(outbuf,smb_flg2,flg2 | 0x40); /* IS_LONG_NAME */
- }
-
- outsize += DIR_STRUCT_SIZE*numentries;
- smb_setlen(outbuf,outsize - 4);
-
- if ((! *directory) && dptr_path(dptr_num))
- sprintf(directory,"(%s)",dptr_path(dptr_num));
-
- DEBUG(4,("%s %s mask=%s path=%s cnum=%d dtype=%d nument=%d of %d\n",
- timestring(),
- smb_fn_name(CVAL(inbuf,smb_com)),
- mask,directory,cnum,dirtype,numentries,maxentries));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a fclose (stop directory search)
-****************************************************************************/
-int reply_fclose(char *inbuf,char *outbuf)
-{
- int cnum;
- int outsize = 0;
- int status_len;
- char *path;
- char status[21];
- int dptr_num= -1;
-
- cnum = SVAL(inbuf,smb_tid);
-
- outsize = set_message(outbuf,1,0,True);
- path = smb_buf(inbuf) + 1;
- status_len = SVAL(smb_buf(inbuf),3 + strlen(path));
-
-
- if (status_len == 0)
- return(ERROR(ERRSRV,ERRsrverror));
-
- memcpy(status,smb_buf(inbuf) + 1 + strlen(path) + 4,21);
-
- if(dptr_fetch(status+12,&dptr_num)) {
- /* Close the dptr - we know it's gone */
- dptr_close(dptr_num);
- }
-
- SSVAL(outbuf,smb_vwv0,0);
-
- DEBUG(3,("%s search close cnum=%d\n",timestring(),cnum));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to an open
-****************************************************************************/
-int reply_open(char *inbuf,char *outbuf)
-{
- pstring fname;
- int cnum;
- int fnum = -1;
- int outsize = 0;
- int fmode=0;
- int share_mode;
- int size = 0;
- time_t mtime=0;
- int unixmode;
- int rmode=0;
- struct stat sbuf;
- BOOL bad_path = False;
- files_struct *fsp;
- int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
-
- cnum = SVAL(inbuf,smb_tid);
-
- share_mode = SVAL(inbuf,smb_vwv0);
-
- pstrcpy(fname,smb_buf(inbuf)+1);
- unix_convert(fname,cnum,0,&bad_path);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- unixmode = unix_mode(cnum,aARCH);
-
- open_file_shared(fnum,cnum,fname,share_mode,3,unixmode,
- oplock_request,&rmode,NULL);
-
- fsp = &Files[fnum];
-
- if (!fsp->open)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- if (fstat(fsp->fd_ptr->fd,&sbuf) != 0) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- size = sbuf.st_size;
- fmode = dos_mode(cnum,fname,&sbuf);
- mtime = sbuf.st_mtime;
-
- if (fmode & aDIR) {
- DEBUG(3,("attempt to open a directory %s\n",fname));
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- outsize = set_message(outbuf,7,0,True);
- SSVAL(outbuf,smb_vwv0,fnum);
- SSVAL(outbuf,smb_vwv1,fmode);
- put_dos_date3(outbuf,smb_vwv2,mtime);
- SIVAL(outbuf,smb_vwv4,size);
- SSVAL(outbuf,smb_vwv6,rmode);
-
- if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- }
-
- if(fsp->granted_oplock)
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to an open and X
-****************************************************************************/
-int reply_open_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- pstring fname;
- int cnum = SVAL(inbuf,smb_tid);
- int fnum = -1;
- int smb_mode = SVAL(inbuf,smb_vwv3);
- int smb_attr = SVAL(inbuf,smb_vwv5);
- BOOL oplock_request = EXTENDED_OPLOCK_REQUEST(inbuf);
-#if 0
- int open_flags = SVAL(inbuf,smb_vwv2);
- int smb_sattr = SVAL(inbuf,smb_vwv4);
- uint32 smb_time = make_unix_date3(inbuf+smb_vwv6);
-#endif
- int smb_ofun = SVAL(inbuf,smb_vwv8);
- int unixmode;
- int size=0,fmode=0,mtime=0,rmode=0;
- struct stat sbuf;
- int smb_action = 0;
- BOOL bad_path = False;
- files_struct *fsp;
-
- /* If it's an IPC, pass off the pipe handler. */
- if (IS_IPC(cnum))
- return reply_open_pipe_and_X(inbuf,outbuf,length,bufsize);
-
- /* XXXX we need to handle passed times, sattr and flags */
-
- pstrcpy(fname,smb_buf(inbuf));
- unix_convert(fname,cnum,0,&bad_path);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- unixmode = unix_mode(cnum,smb_attr | aARCH);
-
- open_file_shared(fnum,cnum,fname,smb_mode,smb_ofun,unixmode,
- oplock_request, &rmode,&smb_action);
-
- fsp = &Files[fnum];
-
- if (!fsp->open)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- if (fstat(fsp->fd_ptr->fd,&sbuf) != 0) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- size = sbuf.st_size;
- fmode = dos_mode(cnum,fname,&sbuf);
- mtime = sbuf.st_mtime;
- if (fmode & aDIR) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
- smb_action |= EXTENDED_OPLOCK_GRANTED;
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- }
-
- if(fsp->granted_oplock) {
- smb_action |= EXTENDED_OPLOCK_GRANTED;
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- }
-
- set_message(outbuf,15,0,True);
- SSVAL(outbuf,smb_vwv2,fnum);
- SSVAL(outbuf,smb_vwv3,fmode);
- put_dos_date3(outbuf,smb_vwv4,mtime);
- SIVAL(outbuf,smb_vwv6,size);
- SSVAL(outbuf,smb_vwv8,rmode);
- SSVAL(outbuf,smb_vwv11,smb_action);
-
- chain_fnum = fnum;
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a SMBulogoffX
-****************************************************************************/
-int reply_ulogoffX(char *inbuf,char *outbuf,int length,int bufsize)
-{
- uint16 vuid = SVAL(inbuf,smb_uid);
- user_struct *vuser = get_valid_user_struct(vuid);
-
- if(vuser == 0) {
- DEBUG(3,("ulogoff, vuser id %d does not map to user.\n", vuid));
- }
-
- /* in user level security we are supposed to close any files
- open by this user */
- if ((vuser != 0) && (lp_security() != SEC_SHARE)) {
- int i;
- for (i=0;i<MAX_OPEN_FILES;i++)
- if (Files[i].uid == vuser->uid && Files[i].open) {
- close_file(i);
- }
- }
-
- invalidate_vuid(vuid);
-
- set_message(outbuf,2,0,True);
-
- DEBUG(3,("%s ulogoffX vuid=%d\n",timestring(),vuid));
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a mknew or a create
-****************************************************************************/
-int reply_mknew(char *inbuf,char *outbuf)
-{
- pstring fname;
- int cnum,com;
- int fnum = -1;
- int outsize = 0;
- int createmode;
- mode_t unixmode;
- int ofun = 0;
- BOOL bad_path = False;
- files_struct *fsp;
- int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
-
- com = SVAL(inbuf,smb_com);
- cnum = SVAL(inbuf,smb_tid);
-
- createmode = SVAL(inbuf,smb_vwv0);
- pstrcpy(fname,smb_buf(inbuf)+1);
- unix_convert(fname,cnum,0,&bad_path);
-
- if (createmode & aVOLID)
- {
- DEBUG(0,("Attempt to create file (%s) with volid set - please report this\n",fname));
- }
-
- unixmode = unix_mode(cnum,createmode);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- if(com == SMBmknew)
- {
- /* We should fail if file exists. */
- ofun = 0x10;
- }
- else
- {
- /* SMBcreate - Create if file doesn't exist, truncate if it does. */
- ofun = 0x12;
- }
-
- /* Open file in dos compatibility share mode. */
- open_file_shared(fnum,cnum,fname,(DENY_FCB<<4)|0xF, ofun, unixmode,
- oplock_request, NULL, NULL);
-
- fsp = &Files[fnum];
-
- if (!fsp->open)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- outsize = set_message(outbuf,1,0,True);
- SSVAL(outbuf,smb_vwv0,fnum);
-
- if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- }
-
- if(fsp->granted_oplock)
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
-
- DEBUG(2,("new file %s\n",fname));
- DEBUG(3,("%s mknew %s fd=%d fnum=%d cnum=%d dmode=%d umode=%o\n",timestring(),fname,Files[fnum].fd_ptr->fd,fnum,cnum,createmode,unixmode));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a create temporary file
-****************************************************************************/
-int reply_ctemp(char *inbuf,char *outbuf)
-{
- pstring fname;
- pstring fname2;
- int cnum;
- int fnum = -1;
- int outsize = 0;
- int createmode;
- mode_t unixmode;
- BOOL bad_path = False;
- files_struct *fsp;
- int oplock_request = CORE_OPLOCK_REQUEST(inbuf);
-
- cnum = SVAL(inbuf,smb_tid);
- createmode = SVAL(inbuf,smb_vwv0);
- pstrcpy(fname,smb_buf(inbuf)+1);
- strcat(fname,"/TMXXXXXX");
- unix_convert(fname,cnum,0,&bad_path);
-
- unixmode = unix_mode(cnum,createmode);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- strcpy(fname2,(char *)mktemp(fname));
-
- /* Open file in dos compatibility share mode. */
- /* We should fail if file exists. */
- open_file_shared(fnum,cnum,fname2,(DENY_FCB<<4)|0xF, 0x10, unixmode,
- oplock_request, NULL, NULL);
-
- fsp = &Files[fnum];
-
- if (!fsp->open)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- outsize = set_message(outbuf,1,2 + strlen(fname2),True);
- SSVAL(outbuf,smb_vwv0,fnum);
- CVAL(smb_buf(outbuf),0) = 4;
- strcpy(smb_buf(outbuf) + 1,fname2);
-
- if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
- }
-
- if(fsp->granted_oplock)
- CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED;
-
- DEBUG(2,("created temp file %s\n",fname2));
- DEBUG(3,("%s ctemp %s fd=%d fnum=%d cnum=%d dmode=%d umode=%o\n",timestring(),fname2,Files[fnum].fd_ptr->fd,fnum,cnum,createmode,unixmode));
-
- return(outsize);
-}
-
-
-/*******************************************************************
-check if a user is allowed to delete a file
-********************************************************************/
-static BOOL can_delete(char *fname,int cnum,int dirtype)
-{
- struct stat sbuf;
- int fmode;
-
- if (!CAN_WRITE(cnum)) return(False);
-
- if (sys_lstat(fname,&sbuf) != 0) return(False);
- fmode = dos_mode(cnum,fname,&sbuf);
- if (fmode & aDIR) return(False);
- if (!lp_delete_readonly(SNUM(cnum))) {
- if (fmode & aRONLY) return(False);
- }
- if ((fmode & ~dirtype) & (aHIDDEN | aSYSTEM))
- return(False);
- if (!check_file_sharing(cnum,fname)) return(False);
- return(True);
-}
-
-/****************************************************************************
- reply to a unlink
-****************************************************************************/
-int reply_unlink(char *inbuf,char *outbuf)
-{
- int outsize = 0;
- pstring name;
- int cnum;
- int dirtype;
- pstring directory;
- pstring mask;
- char *p;
- int count=0;
- int error = ERRnoaccess;
- BOOL has_wild;
- BOOL exists=False;
- BOOL bad_path = False;
-
- *directory = *mask = 0;
-
- cnum = SVAL(inbuf,smb_tid);
- dirtype = SVAL(inbuf,smb_vwv0);
-
- pstrcpy(name,smb_buf(inbuf) + 1);
-
- DEBUG(3,("reply_unlink : %s\n",name));
-
- unix_convert(name,cnum,0,&bad_path);
-
- p = strrchr(name,'/');
- if (!p) {
- strcpy(directory,"./");
- strcpy(mask,name);
- } else {
- *p = 0;
- strcpy(directory,name);
- strcpy(mask,p+1);
- }
-
- if (is_mangled(mask))
- check_mangled_stack(mask);
-
- has_wild = strchr(mask,'*') || strchr(mask,'?');
-
- if (!has_wild) {
- strcat(directory,"/");
- strcat(directory,mask);
- if (can_delete(directory,cnum,dirtype) && !sys_unlink(directory)) count++;
- if (!count) exists = file_exist(directory,NULL);
- } else {
- void *dirptr = NULL;
- char *dname;
-
- if (check_name(directory,cnum))
- dirptr = OpenDir(cnum, directory, True);
-
- /* XXXX the CIFS spec says that if bit0 of the flags2 field is set then
- the pattern matches against the long name, otherwise the short name
- We don't implement this yet XXXX
- */
-
- if (dirptr)
- {
- error = ERRbadfile;
-
- if (strequal(mask,"????????.???"))
- strcpy(mask,"*");
-
- while ((dname = ReadDirName(dirptr)))
- {
- pstring fname;
- pstrcpy(fname,dname);
-
- if(!mask_match(fname, mask, case_sensitive, False)) continue;
-
- error = ERRnoaccess;
- sprintf(fname,"%s/%s",directory,dname);
- if (!can_delete(fname,cnum,dirtype)) continue;
- if (!sys_unlink(fname)) count++;
- DEBUG(3,("reply_unlink : doing unlink on %s\n",fname));
- }
- CloseDir(dirptr);
- }
- }
-
- if (count == 0) {
- if (exists)
- return(ERROR(ERRDOS,error));
- else
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,error));
- }
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a readbraw (core+ protocol)
-****************************************************************************/
-int reply_readbraw(char *inbuf, char *outbuf)
-{
- int cnum,maxcount,mincount,fnum;
- int nread = 0;
- uint32 startpos;
- char *header = outbuf;
- int ret=0;
- int fd;
- char *fname;
-
- /*
- * Special check if an oplock break has been issued
- * and the readraw request croses on the wire, we must
- * return a zero length response here.
- */
-
- if(global_oplock_break)
- {
- _smb_setlen(header,0);
- transfer_file(0,Client,0,header,4,0);
- DEBUG(5,("readbraw - oplock break finished\n"));
- return -1;
- }
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- startpos = IVAL(inbuf,smb_vwv1);
- maxcount = SVAL(inbuf,smb_vwv3);
- mincount = SVAL(inbuf,smb_vwv4);
-
- /* ensure we don't overrun the packet size */
- maxcount = MIN(65535,maxcount);
- maxcount = MAX(mincount,maxcount);
-
- if (!FNUM_OK(fnum,cnum) || !Files[fnum].can_read)
- {
- DEBUG(3,("fnum %d not open in readbraw - cache prime?\n",fnum));
- _smb_setlen(header,0);
- transfer_file(0,Client,0,header,4,0);
- return(-1);
- }
- else
- {
- fd = Files[fnum].fd_ptr->fd;
- fname = Files[fnum].name;
- }
-
-
- if (!is_locked(fnum,cnum,maxcount,startpos))
- {
- int size = Files[fnum].size;
- int sizeneeded = startpos + maxcount;
-
- if (size < sizeneeded) {
- struct stat st;
- if (fstat(Files[fnum].fd_ptr->fd,&st) == 0)
- size = st.st_size;
- if (!Files[fnum].can_write)
- Files[fnum].size = size;
- }
-
- nread = MIN(maxcount,(int)(size - startpos));
- }
-
- if (nread < mincount)
- nread = 0;
-
- DEBUG(3,("%s readbraw fnum=%d cnum=%d start=%d max=%d min=%d nread=%d\n",
- timestring(),
- fnum,cnum,startpos,
- maxcount,mincount,nread));
-
-#if UNSAFE_READRAW
- {
- int predict=0;
- _smb_setlen(header,nread);
-
- if (!Files[fnum].can_write)
- predict = read_predict(fd,startpos,header+4,NULL,nread);
-
- if ((nread-predict) > 0)
- seek_file(fnum,startpos + predict);
-
- ret = transfer_file(fd,Client,nread-predict,header,4+predict,
- startpos+predict);
- }
-
- if (ret != nread+4)
- DEBUG(0,("ERROR: file read failure on %s at %d for %d bytes (%d)\n",
- fname,startpos,nread,ret));
-
-#else
- ret = read_file(fnum,header+4,startpos,nread);
- if (ret < mincount) ret = 0;
-
- _smb_setlen(header,ret);
- transfer_file(0,Client,0,header,4+ret,0);
-#endif
-
- DEBUG(5,("readbraw finished\n"));
- return -1;
-}
-
-
-/****************************************************************************
- reply to a lockread (core+ protocol)
-****************************************************************************/
-int reply_lockread(char *inbuf,char *outbuf)
-{
- int cnum,fnum;
- int nread = -1;
- char *data;
- int outsize = 0;
- uint32 startpos, numtoread;
- int eclass;
- uint32 ecode;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_READ(fnum);
- CHECK_ERROR(fnum);
-
- numtoread = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
-
- outsize = set_message(outbuf,5,3,True);
- numtoread = MIN(BUFFER_SIZE-outsize,numtoread);
- data = smb_buf(outbuf) + 3;
-
- if(!do_lock( fnum, cnum, numtoread, startpos, &eclass, &ecode))
- return (ERROR(eclass,ecode));
-
- nread = read_file(fnum,data,startpos,numtoread);
-
- if (nread < 0)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- outsize += nread;
- SSVAL(outbuf,smb_vwv0,nread);
- SSVAL(outbuf,smb_vwv5,nread+3);
- SSVAL(smb_buf(outbuf),1,nread);
-
- DEBUG(3,("%s lockread fnum=%d cnum=%d num=%d nread=%d\n",timestring(),fnum,cnum,numtoread,nread));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a read
-****************************************************************************/
-int reply_read(char *inbuf,char *outbuf)
-{
- int cnum,numtoread,fnum;
- int nread = 0;
- char *data;
- uint32 startpos;
- int outsize = 0;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_READ(fnum);
- CHECK_ERROR(fnum);
-
- numtoread = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
-
- outsize = set_message(outbuf,5,3,True);
- numtoread = MIN(BUFFER_SIZE-outsize,numtoread);
- data = smb_buf(outbuf) + 3;
-
- if (is_locked(fnum,cnum,numtoread,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- if (numtoread > 0)
- nread = read_file(fnum,data,startpos,numtoread);
-
- if (nread < 0)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- outsize += nread;
- SSVAL(outbuf,smb_vwv0,nread);
- SSVAL(outbuf,smb_vwv5,nread+3);
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,nread);
-
- DEBUG(3,("%s read fnum=%d cnum=%d num=%d nread=%d\n",timestring(),fnum,cnum,numtoread,nread));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a read and X
-****************************************************************************/
-int reply_read_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int fnum = GETFNUM(inbuf,smb_vwv2);
- uint32 smb_offs = IVAL(inbuf,smb_vwv3);
- int smb_maxcnt = SVAL(inbuf,smb_vwv5);
- int smb_mincnt = SVAL(inbuf,smb_vwv6);
- int cnum;
- int nread = -1;
- char *data;
- BOOL ok = False;
-
- cnum = SVAL(inbuf,smb_tid);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_READ(fnum);
- CHECK_ERROR(fnum);
-
- set_message(outbuf,12,0,True);
- data = smb_buf(outbuf);
-
- if (is_locked(fnum,cnum,smb_maxcnt,smb_offs))
- return(ERROR(ERRDOS,ERRlock));
- nread = read_file(fnum,data,smb_offs,smb_maxcnt);
- ok = True;
-
- if (nread < 0)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- SSVAL(outbuf,smb_vwv5,nread);
- SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf));
- SSVAL(smb_buf(outbuf),-2,nread);
-
- DEBUG(3,("%s readX fnum=%d cnum=%d min=%d max=%d nread=%d\n",
- timestring(),fnum,cnum,
- smb_mincnt,smb_maxcnt,nread));
-
- chain_fnum = fnum;
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a writebraw (core+ or LANMAN1.0 protocol)
-****************************************************************************/
-int reply_writebraw(char *inbuf,char *outbuf)
-{
- int nwritten=0;
- int total_written=0;
- int numtowrite=0;
- int cnum,fnum;
- int outsize = 0;
- long startpos;
- char *data=NULL;
- BOOL write_through;
- int tcount;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- tcount = IVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv3);
- write_through = BITSETW(inbuf+smb_vwv7,0);
-
- /* We have to deal with slightly different formats depending
- on whether we are using the core+ or lanman1.0 protocol */
- if(Protocol <= PROTOCOL_COREPLUS) {
- numtowrite = SVAL(smb_buf(inbuf),-2);
- data = smb_buf(inbuf);
- } else {
- numtowrite = SVAL(inbuf,smb_vwv10);
- data = smb_base(inbuf) + SVAL(inbuf, smb_vwv11);
- }
-
- /* force the error type */
- CVAL(inbuf,smb_com) = SMBwritec;
- CVAL(outbuf,smb_com) = SMBwritec;
-
- if (is_locked(fnum,cnum,tcount,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- if (seek_file(fnum,startpos) != startpos)
- DEBUG(0,("couldn't seek to %d in writebraw\n",startpos));
-
- if (numtowrite>0)
- nwritten = write_file(fnum,data,numtowrite);
-
- DEBUG(3,("%s writebraw1 fnum=%d cnum=%d start=%d num=%d wrote=%d sync=%d\n",
- timestring(),fnum,cnum,startpos,numtowrite,nwritten,write_through));
-
- if (nwritten < numtowrite)
- return(UNIXERROR(ERRHRD,ERRdiskfull));
-
- total_written = nwritten;
-
- /* Return a message to the redirector to tell it
- to send more bytes */
- CVAL(outbuf,smb_com) = SMBwritebraw;
- SSVALS(outbuf,smb_vwv0,-1);
- outsize = set_message(outbuf,Protocol>PROTOCOL_COREPLUS?1:0,0,True);
- send_smb(Client,outbuf);
-
- /* Now read the raw data into the buffer and write it */
- if (read_smb_length(Client,inbuf,SMB_SECONDARY_WAIT) == -1) {
- exit_server("secondary writebraw failed");
- }
-
- /* Even though this is not an smb message, smb_len
- returns the generic length of an smb message */
- numtowrite = smb_len(inbuf);
-
- if (tcount > nwritten+numtowrite) {
- DEBUG(3,("Client overestimated the write %d %d %d\n",
- tcount,nwritten,numtowrite));
- }
-
- nwritten = transfer_file(Client,Files[fnum].fd_ptr->fd,numtowrite,NULL,0,
- startpos+nwritten);
- total_written += nwritten;
-
- /* Set up outbuf to return the correct return */
- outsize = set_message(outbuf,1,0,True);
- CVAL(outbuf,smb_com) = SMBwritec;
- SSVAL(outbuf,smb_vwv0,total_written);
-
- if (nwritten < numtowrite) {
- CVAL(outbuf,smb_rcls) = ERRHRD;
- SSVAL(outbuf,smb_err,ERRdiskfull);
- }
-
- if (lp_syncalways(SNUM(cnum)) || write_through)
- sync_file(fnum);
-
- DEBUG(3,("%s writebraw2 fnum=%d cnum=%d start=%d num=%d wrote=%d\n",
- timestring(),fnum,cnum,startpos,numtowrite,total_written));
-
- /* we won't return a status if write through is not selected - this
- follows what WfWg does */
- if (!write_through && total_written==tcount)
- return(-1);
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a writeunlock (core+)
-****************************************************************************/
-int reply_writeunlock(char *inbuf,char *outbuf)
-{
- int cnum,fnum;
- int nwritten = -1;
- int outsize = 0;
- char *data;
- uint32 numtowrite,startpos;
- int eclass;
- uint32 ecode;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- numtowrite = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
- data = smb_buf(inbuf) + 3;
-
- if (is_locked(fnum,cnum,numtowrite,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- seek_file(fnum,startpos);
-
- /* The special X/Open SMB protocol handling of
- zero length writes is *NOT* done for
- this call */
- if(numtowrite == 0)
- nwritten = 0;
- else
- nwritten = write_file(fnum,data,numtowrite);
-
- if (lp_syncalways(SNUM(cnum)))
- sync_file(fnum);
-
- if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- if(!do_unlock(fnum, cnum, numtowrite, startpos, &eclass, &ecode))
- return(ERROR(eclass,ecode));
-
- outsize = set_message(outbuf,1,0,True);
-
- SSVAL(outbuf,smb_vwv0,nwritten);
-
- DEBUG(3,("%s writeunlock fnum=%d cnum=%d num=%d wrote=%d\n",
- timestring(),fnum,cnum,numtowrite,nwritten));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a write
-****************************************************************************/
-int reply_write(char *inbuf,char *outbuf,int dum1,int dum2)
-{
- int cnum,numtowrite,fnum;
- int nwritten = -1;
- int outsize = 0;
- int startpos;
- char *data;
-
- dum1 = dum2 = 0;
-
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- numtowrite = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
- data = smb_buf(inbuf) + 3;
-
- if (is_locked(fnum,cnum,numtowrite,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- seek_file(fnum,startpos);
-
- /* X/Open SMB protocol says that if smb_vwv1 is
- zero then the file size should be extended or
- truncated to the size given in smb_vwv[2-3] */
- if(numtowrite == 0)
- nwritten = set_filelen(Files[fnum].fd_ptr->fd, startpos);
- else
- nwritten = write_file(fnum,data,numtowrite);
-
- if (lp_syncalways(SNUM(cnum)))
- sync_file(fnum);
-
- if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0))
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- outsize = set_message(outbuf,1,0,True);
-
- SSVAL(outbuf,smb_vwv0,nwritten);
-
- if (nwritten < numtowrite) {
- CVAL(outbuf,smb_rcls) = ERRHRD;
- SSVAL(outbuf,smb_err,ERRdiskfull);
- }
-
- DEBUG(3,("%s write fnum=%d cnum=%d num=%d wrote=%d\n",timestring(),fnum,cnum,numtowrite,nwritten));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a write and X
-****************************************************************************/
-int reply_write_and_X(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int fnum = GETFNUM(inbuf,smb_vwv2);
- uint32 smb_offs = IVAL(inbuf,smb_vwv3);
- int smb_dsize = SVAL(inbuf,smb_vwv10);
- int smb_doff = SVAL(inbuf,smb_vwv11);
- BOOL write_through = BITSETW(inbuf+smb_vwv7,0);
- int cnum;
- int nwritten = -1;
- char *data;
-
- cnum = SVAL(inbuf,smb_tid);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- data = smb_base(inbuf) + smb_doff;
-
- if (is_locked(fnum,cnum,smb_dsize,smb_offs))
- return(ERROR(ERRDOS,ERRlock));
-
- seek_file(fnum,smb_offs);
-
- /* X/Open SMB protocol says that, unlike SMBwrite
- if the length is zero then NO truncation is
- done, just a write of zero. To truncate a file,
- use SMBwrite. */
- if(smb_dsize == 0)
- nwritten = 0;
- else
- nwritten = write_file(fnum,data,smb_dsize);
-
- if(((nwritten == 0) && (smb_dsize != 0))||(nwritten < 0))
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- set_message(outbuf,6,0,True);
-
- SSVAL(outbuf,smb_vwv2,nwritten);
-
- if (nwritten < smb_dsize) {
- CVAL(outbuf,smb_rcls) = ERRHRD;
- SSVAL(outbuf,smb_err,ERRdiskfull);
- }
-
- DEBUG(3,("%s writeX fnum=%d cnum=%d num=%d wrote=%d\n",timestring(),fnum,cnum,smb_dsize,nwritten));
-
- chain_fnum = fnum;
-
- if (lp_syncalways(SNUM(cnum)) || write_through)
- sync_file(fnum);
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a lseek
-****************************************************************************/
-int reply_lseek(char *inbuf,char *outbuf)
-{
- int cnum,fnum;
- uint32 startpos;
- int32 res= -1;
- int mode,umode;
- int outsize = 0;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- mode = SVAL(inbuf,smb_vwv1) & 3;
- startpos = IVAL(inbuf,smb_vwv2);
-
- switch (mode & 3)
- {
- case 0: umode = SEEK_SET; break;
- case 1: umode = SEEK_CUR; break;
- case 2: umode = SEEK_END; break;
- default:
- umode = SEEK_SET; break;
- }
-
- res = lseek(Files[fnum].fd_ptr->fd,startpos,umode);
- Files[fnum].pos = res;
-
- outsize = set_message(outbuf,2,0,True);
- SIVALS(outbuf,smb_vwv0,res);
-
- DEBUG(3,("%s lseek fnum=%d cnum=%d ofs=%d mode=%d\n",timestring(),fnum,cnum,startpos,mode));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a flush
-****************************************************************************/
-int reply_flush(char *inbuf,char *outbuf)
-{
- int cnum, fnum;
- int outsize = set_message(outbuf,0,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- if (fnum != 0xFFFF) {
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
- }
-
- if (fnum == 0xFFFF)
- {
- int i;
- for (i=0;i<MAX_OPEN_FILES;i++)
- if (OPEN_FNUM(i))
- sync_file(i);
- }
- else
- sync_file(fnum);
-
- DEBUG(3,("%s flush fnum=%d\n",timestring(),fnum));
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a exit
-****************************************************************************/
-int reply_exit(char *inbuf,char *outbuf)
-{
- int outsize = set_message(outbuf,0,0,True);
- DEBUG(3,("%s exit\n",timestring()));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a close
-****************************************************************************/
-int reply_close(char *inbuf,char *outbuf)
-{
- int fnum,cnum;
- int outsize = 0;
- time_t mtime;
- int32 eclass = 0, err = 0;
-
- outsize = set_message(outbuf,0,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
-
- fnum = GETFNUM(inbuf,smb_vwv0);
- CHECK_FNUM(fnum,cnum);
-
- if(HAS_CACHED_ERROR(fnum)) {
- eclass = Files[fnum].wbmpx_ptr->wr_errclass;
- err = Files[fnum].wbmpx_ptr->wr_error;
- }
-
- mtime = make_unix_date3(inbuf+smb_vwv1);
-
- /* try and set the date */
- set_filetime(Files[fnum].name,mtime);
-
- close_file(fnum);
-
- /* We have a cached error */
- if(eclass || err)
- return(ERROR(eclass,err));
-
- DEBUG(3,("%s close fd=%d fnum=%d cnum=%d (numopen=%d)\n",
- timestring(),Files[fnum].fd_ptr->fd,fnum,cnum,
- Connections[cnum].num_files_open));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a writeclose (Core+ protocol)
-****************************************************************************/
-int reply_writeclose(char *inbuf,char *outbuf)
-{
- int cnum,numtowrite,fnum;
- int nwritten = -1;
- int outsize = 0;
- int startpos;
- char *data;
- time_t mtime;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- numtowrite = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
- mtime = make_unix_date3(inbuf+smb_vwv4);
- data = smb_buf(inbuf) + 1;
-
- if (is_locked(fnum,cnum,numtowrite,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- seek_file(fnum,startpos);
-
- nwritten = write_file(fnum,data,numtowrite);
-
- set_filetime(Files[fnum].name,mtime);
-
- close_file(fnum);
-
- DEBUG(3,("%s writeclose fnum=%d cnum=%d num=%d wrote=%d (numopen=%d)\n",
- timestring(),fnum,cnum,numtowrite,nwritten,
- Connections[cnum].num_files_open));
-
- if (nwritten <= 0)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- outsize = set_message(outbuf,1,0,True);
-
- SSVAL(outbuf,smb_vwv0,nwritten);
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a lock
-****************************************************************************/
-int reply_lock(char *inbuf,char *outbuf)
-{
- int fnum,cnum;
- int outsize = set_message(outbuf,0,0,True);
- uint32 count,offset;
- int eclass;
- uint32 ecode;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- count = IVAL(inbuf,smb_vwv1);
- offset = IVAL(inbuf,smb_vwv3);
-
- DEBUG(3,("%s lock fd=%d fnum=%d cnum=%d ofs=%d cnt=%d\n",timestring(),Files[fnum].fd_ptr->fd,fnum,cnum,offset,count));
-
- if(!do_lock( fnum, cnum, count, offset, &eclass, &ecode))
- return (ERROR(eclass,ecode));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a unlock
-****************************************************************************/
-int reply_unlock(char *inbuf,char *outbuf)
-{
- int fnum,cnum;
- int outsize = set_message(outbuf,0,0,True);
- uint32 count,offset;
- int eclass;
- uint32 ecode;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- count = IVAL(inbuf,smb_vwv1);
- offset = IVAL(inbuf,smb_vwv3);
-
- if(!do_unlock(fnum, cnum, count, offset, &eclass, &ecode))
- return (ERROR(eclass,ecode));
-
- DEBUG(3,("%s unlock fd=%d fnum=%d cnum=%d ofs=%d cnt=%d\n",timestring(),Files[fnum].fd_ptr->fd,fnum,cnum,offset,count));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a tdis
-****************************************************************************/
-int reply_tdis(char *inbuf,char *outbuf)
-{
- int cnum;
- int outsize = set_message(outbuf,0,0,True);
- uint16 vuid;
-
- cnum = SVAL(inbuf,smb_tid);
- vuid = SVAL(inbuf,smb_uid);
-
- if (!OPEN_CNUM(cnum)) {
- DEBUG(4,("Invalid cnum in tdis (%d)\n",cnum));
- return(ERROR(ERRSRV,ERRinvnid));
- }
-
- Connections[cnum].used = False;
-
- close_cnum(cnum,vuid);
-
- DEBUG(3,("%s tdis cnum=%d\n",timestring(),cnum));
-
- return outsize;
-}
-
-
-
-/****************************************************************************
- reply to a echo
-****************************************************************************/
-int reply_echo(char *inbuf,char *outbuf)
-{
- int cnum;
- int smb_reverb = SVAL(inbuf,smb_vwv0);
- int seq_num;
- int data_len = smb_buflen(inbuf);
- int outsize = set_message(outbuf,1,data_len,True);
-
- cnum = SVAL(inbuf,smb_tid);
-
- /* According to the latest CIFS spec we shouldn't
- care what the TID is.
- */
-
-#if 0
- if (cnum != 0xFFFF && !OPEN_CNUM(cnum))
- {
- DEBUG(4,("Invalid cnum in echo (%d)\n",cnum));
- return(ERROR(ERRSRV,ERRinvnid));
- }
-#endif
-
- /* copy any incoming data back out */
- if (data_len > 0)
- memcpy(smb_buf(outbuf),smb_buf(inbuf),data_len);
-
- if (smb_reverb > 100)
- {
- DEBUG(0,("large reverb (%d)?? Setting to 100\n",smb_reverb));
- smb_reverb = 100;
- }
-
- for (seq_num =1 ; seq_num <= smb_reverb ; seq_num++)
- {
- SSVAL(outbuf,smb_vwv0,seq_num);
-
- smb_setlen(outbuf,outsize - 4);
-
- send_smb(Client,outbuf);
- }
-
- DEBUG(3,("%s echo %d times cnum=%d\n",timestring(),smb_reverb,cnum));
-
- return -1;
-}
-
-
-/****************************************************************************
- reply to a printopen
-****************************************************************************/
-int reply_printopen(char *inbuf,char *outbuf)
-{
- pstring fname;
- pstring fname2;
- int cnum;
- int fnum = -1;
- int outsize = 0;
-
- *fname = *fname2 = 0;
-
- cnum = SVAL(inbuf,smb_tid);
-
- if (!CAN_PRINT(cnum))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- {
- pstring s;
- char *p;
- pstrcpy(s,smb_buf(inbuf)+1);
- p = s;
- while (*p)
- {
- if (!(isalnum(*p) || strchr("._-",*p)))
- *p = 'X';
- p++;
- }
-
- if (strlen(s) > 10) s[10] = 0;
-
- sprintf(fname,"%s.XXXXXX",s);
- }
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- strcpy(fname2,(char *)mktemp(fname));
-
- if (!check_name(fname2,cnum))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- /* Open for exclusive use, write only. */
- open_file_shared(fnum,cnum,fname2,(DENY_ALL<<4)|1, 0x12, unix_mode(cnum,0),
- 0, NULL, NULL);
-
- if (!Files[fnum].open)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- /* force it to be a print file */
- Files[fnum].print_file = True;
-
- outsize = set_message(outbuf,1,0,True);
- SSVAL(outbuf,smb_vwv0,fnum);
-
- DEBUG(3,("%s openprint %s fd=%d fnum=%d cnum=%d\n",timestring(),fname2,Files[fnum].fd_ptr->fd,fnum,cnum));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a printclose
-****************************************************************************/
-int reply_printclose(char *inbuf,char *outbuf)
-{
- int fnum,cnum;
- int outsize = set_message(outbuf,0,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- if (!CAN_PRINT(cnum))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- close_file(fnum);
-
- DEBUG(3,("%s printclose fd=%d fnum=%d cnum=%d\n",timestring(),Files[fnum].fd_ptr->fd,fnum,cnum));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a printqueue
-****************************************************************************/
-int reply_printqueue(char *inbuf,char *outbuf)
-{
- int cnum;
- int outsize = set_message(outbuf,2,3,True);
- int max_count = SVAL(inbuf,smb_vwv0);
- int start_index = SVAL(inbuf,smb_vwv1);
- uint16 vuid;
-
- cnum = SVAL(inbuf,smb_tid);
- vuid = SVAL(inbuf,smb_uid);
-
-/* allow checking the queue for anyone */
-#if 0
- if (!CAN_PRINT(cnum))
- return(ERROR(ERRDOS,ERRnoaccess));
-#endif
-
- SSVAL(outbuf,smb_vwv0,0);
- SSVAL(outbuf,smb_vwv1,0);
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,0);
-
- DEBUG(3,("%s printqueue cnum=%d start_index=%d max_count=%d\n",
- timestring(),cnum,start_index,max_count));
-
- if (!OPEN_CNUM(cnum) || !Connections[cnum].printer)
- {
- int i;
- cnum = -1;
-
- for (i=0;i<MAX_CONNECTIONS;i++)
- if (CAN_PRINT(i) && Connections[i].printer)
- cnum = i;
-
- if (cnum == -1)
- for (i=0;i<MAX_CONNECTIONS;i++)
- if (OPEN_CNUM(i))
- cnum = i;
-
- if (!OPEN_CNUM(cnum))
- return(ERROR(ERRSRV,ERRinvnid));
-
- DEBUG(5,("connection not open or not a printer, using cnum %d\n",cnum));
- }
-
- if (!become_user(cnum,vuid))
- return(ERROR(ERRSRV,ERRinvnid));
-
- {
- print_queue_struct *queue = NULL;
- char *p = smb_buf(outbuf) + 3;
- int count = get_printqueue(SNUM(cnum),cnum,&queue,NULL);
- int num_to_get = ABS(max_count);
- int first = (max_count>0?start_index:start_index+max_count+1);
- int i;
-
- if (first >= count)
- num_to_get = 0;
- else
- num_to_get = MIN(num_to_get,count-first);
-
-
- for (i=first;i<first+num_to_get;i++)
- {
- put_dos_date2(p,0,queue[i].time);
- CVAL(p,4) = (queue[i].status==LPQ_PRINTING?2:3);
- SSVAL(p,5,printjob_encode(SNUM(cnum), queue[i].job));
- SIVAL(p,7,queue[i].size);
- CVAL(p,11) = 0;
- StrnCpy(p+12,queue[i].user,16);
- p += 28;
- }
-
- if (count > 0)
- {
- outsize = set_message(outbuf,2,28*count+3,False);
- SSVAL(outbuf,smb_vwv0,count);
- SSVAL(outbuf,smb_vwv1,(max_count>0?first+count:first-1));
- CVAL(smb_buf(outbuf),0) = 1;
- SSVAL(smb_buf(outbuf),1,28*count);
- }
-
- if (queue) free(queue);
-
- DEBUG(3,("%d entries returned in queue\n",count));
- }
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a printwrite
-****************************************************************************/
-int reply_printwrite(char *inbuf,char *outbuf)
-{
- int cnum,numtowrite,fnum;
- int outsize = set_message(outbuf,0,0,True);
- char *data;
-
- cnum = SVAL(inbuf,smb_tid);
-
- if (!CAN_PRINT(cnum))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- numtowrite = SVAL(smb_buf(inbuf),1);
- data = smb_buf(inbuf) + 3;
-
- if (write_file(fnum,data,numtowrite) != numtowrite)
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- DEBUG(3,("%s printwrite fnum=%d cnum=%d num=%d\n",timestring(),fnum,cnum,numtowrite));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a mkdir
-****************************************************************************/
-int reply_mkdir(char *inbuf,char *outbuf)
-{
- pstring directory;
- int cnum;
- int outsize,ret= -1;
- BOOL bad_path = False;
-
- pstrcpy(directory,smb_buf(inbuf) + 1);
- cnum = SVAL(inbuf,smb_tid);
- unix_convert(directory,cnum,0,&bad_path);
-
- if (check_name(directory,cnum))
- ret = sys_mkdir(directory,unix_mode(cnum,aDIR));
-
- if (ret < 0)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s mkdir %s cnum=%d ret=%d\n",timestring(),directory,cnum,ret));
-
- return(outsize);
-}
-
-/****************************************************************************
-Static function used by reply_rmdir to delete an entire directory
-tree recursively.
-****************************************************************************/
-static BOOL recursive_rmdir(char *directory)
-{
- char *dname = NULL;
- BOOL ret = False;
- void *dirptr = OpenDir(-1, directory, False);
-
- if(dirptr == NULL)
- return True;
-
- while((dname = ReadDirName(dirptr)))
- {
- pstring fullname;
- struct stat st;
-
- if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0))
- continue;
-
- /* Construct the full name. */
- if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname))
- {
- errno = ENOMEM;
- ret = True;
- break;
- }
- strcpy(fullname, directory);
- strcat(fullname, "/");
- strcat(fullname, dname);
-
- if(sys_lstat(fullname, &st) != 0)
- {
- ret = True;
- break;
- }
-
- if(st.st_mode & S_IFDIR)
- {
- if(recursive_rmdir(fullname)!=0)
- {
- ret = True;
- break;
- }
- if(sys_rmdir(fullname) != 0)
- {
- ret = True;
- break;
- }
- }
- else if(sys_unlink(fullname) != 0)
- {
- ret = True;
- break;
- }
- }
- CloseDir(dirptr);
- return ret;
-}
-
-/****************************************************************************
- reply to a rmdir
-****************************************************************************/
-int reply_rmdir(char *inbuf,char *outbuf)
-{
- pstring directory;
- int cnum;
- int outsize = 0;
- BOOL ok = False;
- BOOL bad_path = False;
-
- cnum = SVAL(inbuf,smb_tid);
- pstrcpy(directory,smb_buf(inbuf) + 1);
- unix_convert(directory,cnum,0,&bad_path);
-
- if (check_name(directory,cnum))
- {
-
- dptr_closepath(directory,SVAL(inbuf,smb_pid));
- ok = (sys_rmdir(directory) == 0);
- if(!ok && (errno == ENOTEMPTY) && lp_veto_files(SNUM(cnum)))
- {
- /* Check to see if the only thing in this directory are
- vetoed files/directories. If so then delete them and
- retry. If we fail to delete any of them (and we *don't*
- do a recursive delete) then fail the rmdir. */
- BOOL all_veto_files = True;
- char *dname;
- void *dirptr = OpenDir(cnum, directory, False);
-
- if(dirptr != NULL)
- {
- int dirpos = TellDir(dirptr);
- while ((dname = ReadDirName(dirptr)))
- {
- if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0))
- continue;
- if(!IS_VETO_PATH(cnum, dname))
- {
- all_veto_files = False;
- break;
- }
- }
- if(all_veto_files)
- {
- SeekDir(dirptr,dirpos);
- while ((dname = ReadDirName(dirptr)))
- {
- pstring fullname;
- struct stat st;
-
- if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0))
- continue;
-
- /* Construct the full name. */
- if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname))
- {
- errno = ENOMEM;
- break;
- }
- pstrcpy(fullname, directory);
- strcat(fullname, "/");
- strcat(fullname, dname);
-
- if(sys_lstat(fullname, &st) != 0)
- break;
- if(st.st_mode & S_IFDIR)
- {
- if(lp_recursive_veto_delete(SNUM(cnum)))
- {
- if(recursive_rmdir(fullname) != 0)
- break;
- }
- if(sys_rmdir(fullname) != 0)
- break;
- }
- else if(sys_unlink(fullname) != 0)
- break;
- }
- CloseDir(dirptr);
- /* Retry the rmdir */
- ok = (sys_rmdir(directory) == 0);
- }
- else
- CloseDir(dirptr);
- }
- else
- errno = ENOTEMPTY;
- }
-
- if (!ok)
- DEBUG(3,("couldn't remove directory %s : %s\n",
- directory,strerror(errno)));
- }
-
- if (!ok)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRbadpath));
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s rmdir %s\n",timestring(),directory));
-
- return(outsize);
-}
-
-
-/*******************************************************************
-resolve wildcards in a filename rename
-********************************************************************/
-static BOOL resolve_wildcards(char *name1,char *name2)
-{
- fstring root1,root2;
- fstring ext1,ext2;
- char *p,*p2;
-
- name1 = strrchr(name1,'/');
- name2 = strrchr(name2,'/');
-
- if (!name1 || !name2) return(False);
-
- fstrcpy(root1,name1);
- fstrcpy(root2,name2);
- p = strrchr(root1,'.');
- if (p) {
- *p = 0;
- fstrcpy(ext1,p+1);
- } else {
- fstrcpy(ext1,"");
- }
- p = strrchr(root2,'.');
- if (p) {
- *p = 0;
- fstrcpy(ext2,p+1);
- } else {
- fstrcpy(ext2,"");
- }
-
- p = root1;
- p2 = root2;
- while (*p2) {
- if (*p2 == '?') {
- *p2 = *p;
- p2++;
- } else {
- p2++;
- }
- if (*p) p++;
- }
-
- p = ext1;
- p2 = ext2;
- while (*p2) {
- if (*p2 == '?') {
- *p2 = *p;
- p2++;
- } else {
- p2++;
- }
- if (*p) p++;
- }
-
- strcpy(name2,root2);
- if (ext2[0]) {
- strcat(name2,".");
- strcat(name2,ext2);
- }
-
- return(True);
-}
-
-/*******************************************************************
-check if a user is allowed to rename a file
-********************************************************************/
-static BOOL can_rename(char *fname,int cnum)
-{
- struct stat sbuf;
-
- if (!CAN_WRITE(cnum)) return(False);
-
- if (sys_lstat(fname,&sbuf) != 0) return(False);
- if (!check_file_sharing(cnum,fname)) return(False);
-
- return(True);
-}
-
-/****************************************************************************
- reply to a mv
-****************************************************************************/
-int reply_mv(char *inbuf,char *outbuf)
-{
- int outsize = 0;
- pstring name;
- int cnum;
- pstring directory;
- pstring mask,newname;
- pstring newname_last_component;
- char *p;
- int count=0;
- int error = ERRnoaccess;
- BOOL has_wild;
- BOOL exists=False;
- BOOL bad_path1 = False;
- BOOL bad_path2 = False;
-
- *directory = *mask = 0;
-
- cnum = SVAL(inbuf,smb_tid);
-
- pstrcpy(name,smb_buf(inbuf) + 1);
- pstrcpy(newname,smb_buf(inbuf) + 3 + strlen(name));
-
- DEBUG(3,("reply_mv : %s -> %s\n",name,newname));
-
- unix_convert(name,cnum,0,&bad_path1);
- unix_convert(newname,cnum,newname_last_component,&bad_path2);
-
- /*
- * Split the old name into directory and last component
- * strings. Note that unix_convert may have stripped off a
- * leading ./ from both name and newname if the rename is
- * at the root of the share. We need to make sure either both
- * name and newname contain a / character or neither of them do
- * as this is checked in resolve_wildcards().
- */
-
- p = strrchr(name,'/');
- if (!p) {
- strcpy(directory,".");
- strcpy(mask,name);
- } else {
- *p = 0;
- strcpy(directory,name);
- strcpy(mask,p+1);
- *p = '/'; /* Replace needed for exceptional test below. */
- }
-
- if (is_mangled(mask))
- check_mangled_stack(mask);
-
- has_wild = strchr(mask,'*') || strchr(mask,'?');
-
- if (!has_wild) {
- BOOL is_short_name = is_8_3(name, True);
-
- /* Add a terminating '/' to the directory name. */
- strcat(directory,"/");
- strcat(directory,mask);
-
- /* Ensure newname contains a '/' also */
- if(strrchr(newname,'/') == 0) {
- pstring tmpstr;
-
- strcpy(tmpstr, "./");
- strcat(tmpstr, newname);
- strcpy(newname, tmpstr);
- }
-
- DEBUG(3,("reply_mv : case_sensitive = %d, case_preserve = %d, short case preserve = %d, directory = %s, newname = %s, newname_last_component = %s, is_8_3 = %d\n",
- case_sensitive, case_preserve, short_case_preserve, directory,
- newname, newname_last_component, is_short_name));
-
- /*
- * Check for special case with case preserving and not
- * case sensitive, if directory and newname are identical,
- * and the old last component differs from the original
- * last component only by case, then we should allow
- * the rename (user is trying to change the case of the
- * filename).
- */
- if((case_sensitive == False) && ( ((case_preserve == True) && (is_short_name == False)) ||
- ((short_case_preserve == True) && (is_short_name == True))) &&
- strcsequal(directory, newname)) {
- pstring newname_modified_last_component;
-
- /*
- * Get the last component of the modified name.
- * Note that we guarantee that newname contains a '/'
- * character above.
- */
- p = strrchr(newname,'/');
- strcpy(newname_modified_last_component,p+1);
-
- if(strcsequal(newname_modified_last_component,
- newname_last_component) == False) {
- /*
- * Replace the modified last component with
- * the original.
- */
- strcpy(p+1, newname_last_component);
- }
- }
-
- if (resolve_wildcards(directory,newname) &&
- can_rename(directory,cnum) &&
- !file_exist(newname,NULL) &&
- !sys_rename(directory,newname)) count++;
-
- DEBUG(3,("reply_mv : %s doing rename on %s -> %s\n",(count != 0) ? "succeeded" : "failed",
- directory,newname));
-
- if (!count) exists = file_exist(directory,NULL);
- if (!count && exists && file_exist(newname,NULL)) {
- exists = True;
- error = 183;
- }
- } else {
- void *dirptr = NULL;
- char *dname;
- pstring destname;
-
- if (check_name(directory,cnum))
- dirptr = OpenDir(cnum, directory, True);
-
- if (dirptr)
- {
- error = ERRbadfile;
-
- if (strequal(mask,"????????.???"))
- strcpy(mask,"*");
-
- while ((dname = ReadDirName(dirptr)))
- {
- pstring fname;
- pstrcpy(fname,dname);
-
- if(!mask_match(fname, mask, case_sensitive, False)) continue;
-
- error = ERRnoaccess;
- sprintf(fname,"%s/%s",directory,dname);
- if (!can_rename(fname,cnum)) continue;
- pstrcpy(destname,newname);
-
- if (!resolve_wildcards(fname,destname)) continue;
-
- if (file_exist(destname,NULL)) {
- error = 183;
- continue;
- }
- if (!sys_rename(fname,destname)) count++;
- DEBUG(3,("reply_mv : doing rename on %s -> %s\n",fname,destname));
- }
- CloseDir(dirptr);
- }
- }
-
- if (count == 0) {
- if (exists)
- return(ERROR(ERRDOS,error));
- else
- {
- if((errno == ENOENT) && (bad_path1 || bad_path2))
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,error));
- }
- }
-
- outsize = set_message(outbuf,0,0,True);
-
- return(outsize);
-}
-
-/*******************************************************************
- copy a file as part of a reply_copy
- ******************************************************************/
-static BOOL copy_file(char *src,char *dest1,int cnum,int ofun,
- int count,BOOL target_is_directory)
-{
- int Access,action;
- struct stat st;
- int ret=0;
- int fnum1,fnum2;
- pstring dest;
-
- pstrcpy(dest,dest1);
- if (target_is_directory) {
- char *p = strrchr(src,'/');
- if (p)
- p++;
- else
- p = src;
- strcat(dest,"/");
- strcat(dest,p);
- }
-
- if (!file_exist(src,&st)) return(False);
-
- fnum1 = find_free_file();
- if (fnum1<0) return(False);
- open_file_shared(fnum1,cnum,src,(DENY_NONE<<4),
- 1,0,0,&Access,&action);
-
- if (!Files[fnum1].open) return(False);
-
- if (!target_is_directory && count)
- ofun = 1;
-
- fnum2 = find_free_file();
- if (fnum2<0) {
- close_file(fnum1);
- return(False);
- }
- open_file_shared(fnum2,cnum,dest,(DENY_NONE<<4)|1,
- ofun,st.st_mode,0,&Access,&action);
-
- if (!Files[fnum2].open) {
- close_file(fnum1);
- return(False);
- }
-
- if ((ofun&3) == 1) {
- lseek(Files[fnum2].fd_ptr->fd,0,SEEK_END);
- }
-
- if (st.st_size)
- ret = transfer_file(Files[fnum1].fd_ptr->fd,Files[fnum2].fd_ptr->fd,st.st_size,NULL,0,0);
-
- close_file(fnum1);
- close_file(fnum2);
-
- return(ret == st.st_size);
-}
-
-
-
-/****************************************************************************
- reply to a file copy.
- ****************************************************************************/
-int reply_copy(char *inbuf,char *outbuf)
-{
- int outsize = 0;
- pstring name;
- int cnum;
- pstring directory;
- pstring mask,newname;
- char *p;
- int count=0;
- int error = ERRnoaccess;
- BOOL has_wild;
- BOOL exists=False;
- int tid2 = SVAL(inbuf,smb_vwv0);
- int ofun = SVAL(inbuf,smb_vwv1);
- int flags = SVAL(inbuf,smb_vwv2);
- BOOL target_is_directory=False;
- BOOL bad_path1 = False;
- BOOL bad_path2 = False;
-
- *directory = *mask = 0;
-
- cnum = SVAL(inbuf,smb_tid);
-
- pstrcpy(name,smb_buf(inbuf));
- pstrcpy(newname,smb_buf(inbuf) + 1 + strlen(name));
-
- DEBUG(3,("reply_copy : %s -> %s\n",name,newname));
-
- if (tid2 != cnum) {
- /* can't currently handle inter share copies XXXX */
- DEBUG(3,("Rejecting inter-share copy\n"));
- return(ERROR(ERRSRV,ERRinvdevice));
- }
-
- unix_convert(name,cnum,0,&bad_path1);
- unix_convert(newname,cnum,0,&bad_path2);
-
- target_is_directory = directory_exist(newname,NULL);
-
- if ((flags&1) && target_is_directory) {
- return(ERROR(ERRDOS,ERRbadfile));
- }
-
- if ((flags&2) && !target_is_directory) {
- return(ERROR(ERRDOS,ERRbadpath));
- }
-
- if ((flags&(1<<5)) && directory_exist(name,NULL)) {
- /* wants a tree copy! XXXX */
- DEBUG(3,("Rejecting tree copy\n"));
- return(ERROR(ERRSRV,ERRerror));
- }
-
- p = strrchr(name,'/');
- if (!p) {
- strcpy(directory,"./");
- strcpy(mask,name);
- } else {
- *p = 0;
- strcpy(directory,name);
- strcpy(mask,p+1);
- }
-
- if (is_mangled(mask))
- check_mangled_stack(mask);
-
- has_wild = strchr(mask,'*') || strchr(mask,'?');
-
- if (!has_wild) {
- strcat(directory,"/");
- strcat(directory,mask);
- if (resolve_wildcards(directory,newname) &&
- copy_file(directory,newname,cnum,ofun,
- count,target_is_directory)) count++;
- if (!count) exists = file_exist(directory,NULL);
- } else {
- void *dirptr = NULL;
- char *dname;
- pstring destname;
-
- if (check_name(directory,cnum))
- dirptr = OpenDir(cnum, directory, True);
-
- if (dirptr)
- {
- error = ERRbadfile;
-
- if (strequal(mask,"????????.???"))
- strcpy(mask,"*");
-
- while ((dname = ReadDirName(dirptr)))
- {
- pstring fname;
- pstrcpy(fname,dname);
-
- if(!mask_match(fname, mask, case_sensitive, False)) continue;
-
- error = ERRnoaccess;
- sprintf(fname,"%s/%s",directory,dname);
- strcpy(destname,newname);
- if (resolve_wildcards(fname,destname) &&
- copy_file(directory,newname,cnum,ofun,
- count,target_is_directory)) count++;
- DEBUG(3,("reply_copy : doing copy on %s -> %s\n",fname,destname));
- }
- CloseDir(dirptr);
- }
- }
-
- if (count == 0) {
- if (exists)
- return(ERROR(ERRDOS,error));
- else
- {
- if((errno == ENOENT) && (bad_path1 || bad_path2))
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,error));
- }
- }
-
- outsize = set_message(outbuf,1,0,True);
- SSVAL(outbuf,smb_vwv0,count);
-
- return(outsize);
-}
-
-
-
-/****************************************************************************
- reply to a setdir
-****************************************************************************/
-int reply_setdir(char *inbuf,char *outbuf)
-{
- int cnum,snum;
- int outsize = 0;
- BOOL ok = False;
- pstring newdir;
-
- cnum = SVAL(inbuf,smb_tid);
-
- snum = Connections[cnum].service;
- if (!CAN_SETDIR(snum))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- pstrcpy(newdir,smb_buf(inbuf) + 1);
- strlower(newdir);
-
- if (strlen(newdir) == 0)
- ok = True;
- else
- {
- ok = directory_exist(newdir,NULL);
- if (ok)
- string_set(&Connections[cnum].connectpath,newdir);
- }
-
- if (!ok)
- return(ERROR(ERRDOS,ERRbadpath));
-
- outsize = set_message(outbuf,0,0,True);
- CVAL(outbuf,smb_reh) = CVAL(inbuf,smb_reh);
-
- DEBUG(3,("%s setdir %s cnum=%d\n",timestring(),newdir,cnum));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a lockingX request
-****************************************************************************/
-int reply_lockingX(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int fnum = GETFNUM(inbuf,smb_vwv2);
- unsigned char locktype = CVAL(inbuf,smb_vwv3);
-#if 0
- unsigned char oplocklevel = CVAL(inbuf,smb_vwv3+1);
-#endif
- uint16 num_ulocks = SVAL(inbuf,smb_vwv6);
- uint16 num_locks = SVAL(inbuf,smb_vwv7);
- uint32 count, offset;
-
- int cnum;
- int i;
- char *data;
- uint32 ecode=0, dummy2;
- int eclass=0, dummy1;
-
- cnum = SVAL(inbuf,smb_tid);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- data = smb_buf(inbuf);
-
- /* Check if this is an oplock break on a file
- we have granted an oplock on.
- */
- if((locktype == LOCKING_ANDX_OPLOCK_RELEASE) &&
- (num_ulocks == 0) && (num_locks == 0) &&
- (CVAL(inbuf,smb_vwv0) == 0xFF))
- {
- share_lock_token token;
- files_struct *fsp = &Files[fnum];
- uint32 dev = fsp->fd_ptr->dev;
- uint32 inode = fsp->fd_ptr->inode;
-
- DEBUG(5,("reply_lockingX: oplock break reply from client for fnum = %d\n",
- fnum));
- /*
- * Make sure we have granted an oplock on this file.
- */
- if(!fsp->granted_oplock)
- {
- DEBUG(0,("reply_lockingX: Error : oplock break from client for fnum = %d and \
-no oplock granted on this file.\n", fnum));
- return ERROR(ERRDOS,ERRlock);
- }
-
- /* Remove the oplock flag from the sharemode. */
- lock_share_entry(fsp->cnum, dev, inode, &token);
- if(remove_share_oplock( fnum, token)==False)
- {
- DEBUG(0,("reply_lockingX: failed to remove share oplock for fnum %d, \
-dev = %x, inode = %x\n", fnum, dev, inode));
- unlock_share_entry(fsp->cnum, dev, inode, token);
- return -1;
- }
- unlock_share_entry(fsp->cnum, dev, inode, token);
-
- /* Clear the granted flag and return. */
-
- fsp->granted_oplock = False;
- return -1;
- }
-
- /* Data now points at the beginning of the list
- of smb_unlkrng structs */
- for(i = 0; i < (int)num_ulocks; i++) {
- count = IVAL(data,SMB_LKLEN_OFFSET(i));
- offset = IVAL(data,SMB_LKOFF_OFFSET(i));
- if(!do_unlock(fnum,cnum,count,offset,&eclass, &ecode))
- return ERROR(eclass,ecode);
- }
-
- /* Now do any requested locks */
- data += 10*num_ulocks;
- /* Data now points at the beginning of the list
- of smb_lkrng structs */
- for(i = 0; i < (int)num_locks; i++) {
- count = IVAL(data,SMB_LKLEN_OFFSET(i));
- offset = IVAL(data,SMB_LKOFF_OFFSET(i));
- if(!do_lock(fnum,cnum,count,offset, &eclass, &ecode))
- break;
- }
-
- /* If any of the above locks failed, then we must unlock
- all of the previous locks (X/Open spec). */
- if(i != num_locks && num_locks != 0) {
- for(; i >= 0; i--) {
- count = IVAL(data,SMB_LKLEN_OFFSET(i));
- offset = IVAL(data,SMB_LKOFF_OFFSET(i));
- do_unlock(fnum,cnum,count,offset,&dummy1,&dummy2);
- }
- return ERROR(eclass,ecode);
- }
-
- set_message(outbuf,2,0,True);
-
- DEBUG(3,("%s lockingX fnum=%d cnum=%d type=%d num_locks=%d num_ulocks=%d\n",
- timestring(),fnum,cnum,(unsigned int)locktype,num_locks,num_ulocks));
-
- chain_fnum = fnum;
-
- return chain_reply(inbuf,outbuf,length,bufsize);
-}
-
-
-/****************************************************************************
- reply to a SMBreadbmpx (read block multiplex) request
-****************************************************************************/
-int reply_readbmpx(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int cnum,fnum;
- int nread = -1;
- int total_read;
- char *data;
- uint32 startpos;
- int outsize, mincount, maxcount;
- int max_per_packet;
- int tcount;
- int pad;
-
- /* this function doesn't seem to work - disable by default */
- if (!lp_readbmpx())
- return(ERROR(ERRSRV,ERRuseSTD));
-
- outsize = set_message(outbuf,8,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_READ(fnum);
- CHECK_ERROR(fnum);
-
- startpos = IVAL(inbuf,smb_vwv1);
- maxcount = SVAL(inbuf,smb_vwv3);
- mincount = SVAL(inbuf,smb_vwv4);
-
- data = smb_buf(outbuf);
- pad = ((long)data)%4;
- if (pad) pad = 4 - pad;
- data += pad;
-
- max_per_packet = bufsize-(outsize+pad);
- tcount = maxcount;
- total_read = 0;
-
- if (is_locked(fnum,cnum,maxcount,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- do
- {
- int N = MIN(max_per_packet,tcount-total_read);
-
- nread = read_file(fnum,data,startpos,N);
-
- if (nread <= 0) nread = 0;
-
- if (nread < N)
- tcount = total_read + nread;
-
- set_message(outbuf,8,nread,False);
- SIVAL(outbuf,smb_vwv0,startpos);
- SSVAL(outbuf,smb_vwv2,tcount);
- SSVAL(outbuf,smb_vwv6,nread);
- SSVAL(outbuf,smb_vwv7,smb_offset(data,outbuf));
-
- send_smb(Client,outbuf);
-
- total_read += nread;
- startpos += nread;
- }
- while (total_read < tcount);
-
- return(-1);
-}
-
-
-/****************************************************************************
- reply to a SMBwritebmpx (write block multiplex primary) request
-****************************************************************************/
-int reply_writebmpx(char *inbuf,char *outbuf)
-{
- int cnum,numtowrite,fnum;
- int nwritten = -1;
- int outsize = 0;
- uint32 startpos;
- int tcount, write_through, smb_doff;
- char *data;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
- CHECK_ERROR(fnum);
-
- tcount = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv3);
- write_through = BITSETW(inbuf+smb_vwv7,0);
- numtowrite = SVAL(inbuf,smb_vwv10);
- smb_doff = SVAL(inbuf,smb_vwv11);
-
- data = smb_base(inbuf) + smb_doff;
-
- /* If this fails we need to send an SMBwriteC response,
- not an SMBwritebmpx - set this up now so we don't forget */
- CVAL(outbuf,smb_com) = SMBwritec;
-
- if (is_locked(fnum,cnum,tcount,startpos))
- return(ERROR(ERRDOS,ERRlock));
-
- seek_file(fnum,startpos);
- nwritten = write_file(fnum,data,numtowrite);
-
- if(lp_syncalways(SNUM(cnum)) || write_through)
- sync_file(fnum);
-
- if(nwritten < numtowrite)
- return(UNIXERROR(ERRHRD,ERRdiskfull));
-
- /* If the maximum to be written to this file
- is greater than what we just wrote then set
- up a secondary struct to be attached to this
- fd, we will use this to cache error messages etc. */
- if(tcount > nwritten)
- {
- write_bmpx_struct *wbms;
- if(Files[fnum].wbmpx_ptr != NULL)
- wbms = Files[fnum].wbmpx_ptr; /* Use an existing struct */
- else
- wbms = (write_bmpx_struct *)malloc(sizeof(write_bmpx_struct));
- if(!wbms)
- {
- DEBUG(0,("Out of memory in reply_readmpx\n"));
- return(ERROR(ERRSRV,ERRnoresource));
- }
- wbms->wr_mode = write_through;
- wbms->wr_discard = False; /* No errors yet */
- wbms->wr_total_written = nwritten;
- wbms->wr_errclass = 0;
- wbms->wr_error = 0;
- Files[fnum].wbmpx_ptr = wbms;
- }
-
- /* We are returning successfully, set the message type back to
- SMBwritebmpx */
- CVAL(outbuf,smb_com) = SMBwriteBmpx;
-
- outsize = set_message(outbuf,1,0,True);
-
- SSVALS(outbuf,smb_vwv0,-1); /* We don't support smb_remaining */
-
- DEBUG(3,("%s writebmpx fnum=%d cnum=%d num=%d wrote=%d\n",
- timestring(),fnum,cnum,numtowrite,nwritten));
-
- if (write_through && tcount==nwritten) {
- /* we need to send both a primary and a secondary response */
- smb_setlen(outbuf,outsize - 4);
- send_smb(Client,outbuf);
-
- /* now the secondary */
- outsize = set_message(outbuf,1,0,True);
- CVAL(outbuf,smb_com) = SMBwritec;
- SSVAL(outbuf,smb_vwv0,nwritten);
- }
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a SMBwritebs (write block multiplex secondary) request
-****************************************************************************/
-int reply_writebs(char *inbuf,char *outbuf)
-{
- int cnum,numtowrite,fnum;
- int nwritten = -1;
- int outsize = 0;
- int32 startpos;
- int tcount, write_through, smb_doff;
- char *data;
- write_bmpx_struct *wbms;
- BOOL send_response = False;
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
- CHECK_FNUM(fnum,cnum);
- CHECK_WRITE(fnum);
-
- tcount = SVAL(inbuf,smb_vwv1);
- startpos = IVAL(inbuf,smb_vwv2);
- numtowrite = SVAL(inbuf,smb_vwv6);
- smb_doff = SVAL(inbuf,smb_vwv7);
-
- data = smb_base(inbuf) + smb_doff;
-
- /* We need to send an SMBwriteC response, not an SMBwritebs */
- CVAL(outbuf,smb_com) = SMBwritec;
-
- /* This fd should have an auxiliary struct attached,
- check that it does */
- wbms = Files[fnum].wbmpx_ptr;
- if(!wbms) return(-1);
-
- /* If write through is set we can return errors, else we must
- cache them */
- write_through = wbms->wr_mode;
-
- /* Check for an earlier error */
- if(wbms->wr_discard)
- return -1; /* Just discard the packet */
-
- seek_file(fnum,startpos);
- nwritten = write_file(fnum,data,numtowrite);
-
- if(lp_syncalways(SNUM(cnum)) || write_through)
- sync_file(fnum);
-
- if (nwritten < numtowrite)
- {
- if(write_through) {
- /* We are returning an error - we can delete the aux struct */
- if (wbms) free((char *)wbms);
- Files[fnum].wbmpx_ptr = NULL;
- return(ERROR(ERRHRD,ERRdiskfull));
- }
- return(CACHE_ERROR(wbms,ERRHRD,ERRdiskfull));
- }
-
- /* Increment the total written, if this matches tcount
- we can discard the auxiliary struct (hurrah !) and return a writeC */
- wbms->wr_total_written += nwritten;
- if(wbms->wr_total_written >= tcount)
- {
- if (write_through) {
- outsize = set_message(outbuf,1,0,True);
- SSVAL(outbuf,smb_vwv0,wbms->wr_total_written);
- send_response = True;
- }
-
- free((char *)wbms);
- Files[fnum].wbmpx_ptr = NULL;
- }
-
- if(send_response)
- return(outsize);
-
- return(-1);
-}
-
-
-/****************************************************************************
- reply to a SMBsetattrE
-****************************************************************************/
-int reply_setattrE(char *inbuf,char *outbuf)
-{
- int cnum,fnum;
- struct utimbuf unix_times;
- int outsize = 0;
-
- outsize = set_message(outbuf,0,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- /* Convert the DOS times into unix times. Ignore create
- time as UNIX can't set this.
- */
- unix_times.actime = make_unix_date2(inbuf+smb_vwv3);
- unix_times.modtime = make_unix_date2(inbuf+smb_vwv5);
-
- /*
- * Patch from Ray Frush <frush@engr.colostate.edu>
- * Sometimes times are sent as zero - ignore them.
- */
-
- if ((unix_times.actime == 0) && (unix_times.modtime == 0))
- {
- /* Ignore request */
- DEBUG(3,("%s reply_setattrE fnum=%d cnum=%d ignoring zero request - \
-not setting timestamps of 0\n",
- timestring(), fnum,cnum,unix_times.actime,unix_times.modtime));
- return(outsize);
- }
- else if ((unix_times.actime != 0) && (unix_times.modtime == 0))
- {
- /* set modify time = to access time if modify time was 0 */
- unix_times.modtime = unix_times.actime;
- }
-
- /* Set the date on this file */
- if(sys_utime(Files[fnum].name, &unix_times))
- return(ERROR(ERRDOS,ERRnoaccess));
-
- DEBUG(3,("%s reply_setattrE fnum=%d cnum=%d actime=%d modtime=%d\n",
- timestring(), fnum,cnum,unix_times.actime,unix_times.modtime));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a SMBgetattrE
-****************************************************************************/
-int reply_getattrE(char *inbuf,char *outbuf)
-{
- int cnum,fnum;
- struct stat sbuf;
- int outsize = 0;
- int mode;
-
- outsize = set_message(outbuf,11,0,True);
-
- cnum = SVAL(inbuf,smb_tid);
- fnum = GETFNUM(inbuf,smb_vwv0);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- /* Do an fstat on this file */
- if(fstat(Files[fnum].fd_ptr->fd, &sbuf))
- return(UNIXERROR(ERRDOS,ERRnoaccess));
-
- mode = dos_mode(cnum,Files[fnum].name,&sbuf);
-
- /* Convert the times into dos times. Set create
- date to be last modify date as UNIX doesn't save
- this */
- put_dos_date2(outbuf,smb_vwv0,sbuf.st_mtime);
- put_dos_date2(outbuf,smb_vwv2,sbuf.st_atime);
- put_dos_date2(outbuf,smb_vwv4,sbuf.st_mtime);
- if (mode & aDIR)
- {
- SIVAL(outbuf,smb_vwv6,0);
- SIVAL(outbuf,smb_vwv8,0);
- }
- else
- {
- SIVAL(outbuf,smb_vwv6,sbuf.st_size);
- SIVAL(outbuf,smb_vwv8,ROUNDUP(sbuf.st_size,1024));
- }
- SSVAL(outbuf,smb_vwv10, mode);
-
- DEBUG(3,("%s reply_getattrE fnum=%d cnum=%d\n",timestring(),fnum,cnum));
-
- return(outsize);
-}
diff --git a/source/smbd/server.c b/source/smbd/server.c
deleted file mode 100644
index d387b7375bb..00000000000
--- a/source/smbd/server.c
+++ /dev/null
@@ -1,5024 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Main SMB server routines
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-#include "trans2.h"
-
-pstring servicesf = CONFIGFILE;
-extern pstring debugf;
-extern pstring sesssetup_user;
-extern fstring myworkgroup;
-
-char *InBuffer = NULL;
-char *OutBuffer = NULL;
-char *last_inbuf = NULL;
-
-int am_parent = 1;
-int atexit_set = 0;
-
-/* the last message the was processed */
-int last_message = -1;
-
-/* a useful macro to debug the last message processed */
-#define LAST_MESSAGE() smb_fn_name(last_message)
-
-extern pstring scope;
-extern int DEBUGLEVEL;
-extern int case_default;
-extern BOOL case_sensitive;
-extern BOOL case_preserve;
-extern BOOL use_mangled_map;
-extern BOOL short_case_preserve;
-extern BOOL case_mangle;
-extern time_t smb_last_time;
-
-extern int smb_read_error;
-
-extern pstring user_socket_options;
-
-connection_struct Connections[MAX_CONNECTIONS];
-files_struct Files[MAX_OPEN_FILES];
-
-/*
- * Indirection for file fd's. Needed as POSIX locking
- * is based on file/process, not fd/process.
- */
-file_fd_struct FileFd[MAX_OPEN_FILES];
-int max_file_fd_used = 0;
-
-extern int Protocol;
-
-/*
- * Size of data we can send to client. Set
- * by the client for all protocols above CORE.
- * Set by us for CORE protocol.
- */
-int max_send = BUFFER_SIZE;
-/*
- * Size of the data we can receive. Set by us.
- * Can be modified by the max xmit parameter.
- */
-int max_recv = BUFFER_SIZE;
-
-/* a fnum to use when chaining */
-int chain_fnum = -1;
-
-/* number of open connections */
-static int num_connections_open = 0;
-
-/* Oplock ipc UDP socket. */
-int oplock_sock = -1;
-uint16 oplock_port = 0;
-/* Current number of oplocks we have outstanding. */
-int32 global_oplocks_open = 0;
-
-BOOL global_oplock_break = False;
-
-extern fstring remote_machine;
-
-pstring OriginalDir;
-
-/* these can be set by some functions to override the error codes */
-int unix_ERR_class=SUCCESS;
-int unix_ERR_code=0;
-
-
-extern int extra_time_offset;
-
-extern pstring myhostname;
-
-static int find_free_connection(int hash);
-
-/* for readability... */
-#define IS_DOS_READONLY(test_mode) (((test_mode) & aRONLY) != 0)
-#define IS_DOS_DIR(test_mode) (((test_mode) & aDIR) != 0)
-#define IS_DOS_ARCHIVE(test_mode) (((test_mode) & aARCH) != 0)
-#define IS_DOS_SYSTEM(test_mode) (((test_mode) & aSYSTEM) != 0)
-#define IS_DOS_HIDDEN(test_mode) (((test_mode) & aHIDDEN) != 0)
-
-/****************************************************************************
- when exiting, take the whole family
-****************************************************************************/
-void *dflt_sig(void)
-{
- exit_server("caught signal");
- return 0; /* Keep -Wall happy :-) */
-}
-/****************************************************************************
- Send a SIGTERM to our process group.
-*****************************************************************************/
-void killkids(void)
-{
- if(am_parent) kill(0,SIGTERM);
-}
-
-/****************************************************************************
- change a dos mode to a unix mode
- base permission for files:
- everybody gets read bit set
- dos readonly is represented in unix by removing everyone's write bit
- dos archive is represented in unix by the user's execute bit
- dos system is represented in unix by the group's execute bit
- dos hidden is represented in unix by the other's execute bit
- Then apply create mask,
- then add force bits.
- base permission for directories:
- dos directory is represented in unix by unix's dir bit and the exec bit
- Then apply create mask,
- then add force bits.
-****************************************************************************/
-mode_t unix_mode(int cnum,int dosmode)
-{
- mode_t result = (S_IRUSR | S_IRGRP | S_IROTH);
-
- if ( !IS_DOS_READONLY(dosmode) )
- result |= (S_IWUSR | S_IWGRP | S_IWOTH);
-
- if (IS_DOS_DIR(dosmode)) {
- /* We never make directories read only for the owner as under DOS a user
- can always create a file in a read-only directory. */
- result |= (S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH | S_IWUSR);
- /* Apply directory mask */
- result &= lp_dir_mode(SNUM(cnum));
- /* Add in force bits */
- result |= lp_force_dir_mode(SNUM(cnum));
- } else {
- if (MAP_ARCHIVE(cnum) && IS_DOS_ARCHIVE(dosmode))
- result |= S_IXUSR;
-
- if (MAP_SYSTEM(cnum) && IS_DOS_SYSTEM(dosmode))
- result |= S_IXGRP;
-
- if (MAP_HIDDEN(cnum) && IS_DOS_HIDDEN(dosmode))
- result |= S_IXOTH;
-
- /* Apply mode mask */
- result &= lp_create_mode(SNUM(cnum));
- /* Add in force bits */
- result |= lp_force_create_mode(SNUM(cnum));
- }
- return(result);
-}
-
-
-/****************************************************************************
- change a unix mode to a dos mode
-****************************************************************************/
-int dos_mode(int cnum,char *path,struct stat *sbuf)
-{
- int result = 0;
- extern struct current_user current_user;
-
- DEBUG(8,("dos_mode: %d %s\n", cnum, path));
-
- if (CAN_WRITE(cnum) && !lp_alternate_permissions(SNUM(cnum))) {
- if (!((sbuf->st_mode & S_IWOTH) ||
- Connections[cnum].admin_user ||
- ((sbuf->st_mode & S_IWUSR) && current_user.uid==sbuf->st_uid) ||
- ((sbuf->st_mode & S_IWGRP) &&
- in_group(sbuf->st_gid,current_user.gid,
- current_user.ngroups,current_user.igroups))))
- result |= aRONLY;
- } else {
- if ((sbuf->st_mode & S_IWUSR) == 0)
- result |= aRONLY;
- }
-
- if (MAP_ARCHIVE(cnum) && ((sbuf->st_mode & S_IXUSR) != 0))
- result |= aARCH;
-
- if (MAP_SYSTEM(cnum) && ((sbuf->st_mode & S_IXGRP) != 0))
- result |= aSYSTEM;
-
- if (MAP_HIDDEN(cnum) && ((sbuf->st_mode & S_IXOTH) != 0))
- result |= aHIDDEN;
-
- if (S_ISDIR(sbuf->st_mode))
- result = aDIR | (result & aRONLY);
-
-#ifdef S_ISLNK
-#if LINKS_READ_ONLY
- if (S_ISLNK(sbuf->st_mode) && S_ISDIR(sbuf->st_mode))
- result |= aRONLY;
-#endif
-#endif
-
- /* hide files with a name starting with a . */
- if (lp_hide_dot_files(SNUM(cnum)))
- {
- char *p = strrchr(path,'/');
- if (p)
- p++;
- else
- p = path;
-
- if (p[0] == '.' && p[1] != '.' && p[1] != 0)
- result |= aHIDDEN;
- }
-
- /* Optimization : Only call is_hidden_path if it's not already
- hidden. */
- if (!(result & aHIDDEN) && IS_HIDDEN_PATH(cnum,path))
- {
- result |= aHIDDEN;
- }
-
- DEBUG(8,("dos_mode returning "));
-
- if (result & aHIDDEN) DEBUG(8, ("h"));
- if (result & aRONLY ) DEBUG(8, ("r"));
- if (result & aSYSTEM) DEBUG(8, ("s"));
- if (result & aDIR ) DEBUG(8, ("d"));
- if (result & aARCH ) DEBUG(8, ("a"));
-
- DEBUG(8,("\n"));
-
- return(result);
-}
-
-
-/*******************************************************************
-chmod a file - but preserve some bits
-********************************************************************/
-int dos_chmod(int cnum,char *fname,int dosmode,struct stat *st)
-{
- struct stat st1;
- int mask=0;
- int tmp;
- int unixmode;
-
- if (!st) {
- st = &st1;
- if (sys_stat(fname,st)) return(-1);
- }
-
- if (S_ISDIR(st->st_mode)) dosmode |= aDIR;
-
- if (dos_mode(cnum,fname,st) == dosmode) return(0);
-
- unixmode = unix_mode(cnum,dosmode);
-
- /* preserve the s bits */
- mask |= (S_ISUID | S_ISGID);
-
- /* preserve the t bit */
-#ifdef S_ISVTX
- mask |= S_ISVTX;
-#endif
-
- /* possibly preserve the x bits */
- if (!MAP_ARCHIVE(cnum)) mask |= S_IXUSR;
- if (!MAP_SYSTEM(cnum)) mask |= S_IXGRP;
- if (!MAP_HIDDEN(cnum)) mask |= S_IXOTH;
-
- unixmode |= (st->st_mode & mask);
-
- /* if we previously had any r bits set then leave them alone */
- if ((tmp = st->st_mode & (S_IRUSR|S_IRGRP|S_IROTH))) {
- unixmode &= ~(S_IRUSR|S_IRGRP|S_IROTH);
- unixmode |= tmp;
- }
-
- /* if we previously had any w bits set then leave them alone
- if the new mode is not rdonly */
- if (!IS_DOS_READONLY(dosmode) &&
- (tmp = st->st_mode & (S_IWUSR|S_IWGRP|S_IWOTH))) {
- unixmode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
- unixmode |= tmp;
- }
-
- return(sys_chmod(fname,unixmode));
-}
-
-
-/****************************************************************************
-check if two filenames are equal
-
-this needs to be careful about whether we are case sensitive
-****************************************************************************/
-static BOOL fname_equal(char *name1, char *name2)
-{
- int l1 = strlen(name1);
- int l2 = strlen(name2);
-
- /* handle filenames ending in a single dot */
- if (l1-l2 == 1 && name1[l1-1] == '.' && lp_strip_dot())
- {
- BOOL ret;
- name1[l1-1] = 0;
- ret = fname_equal(name1,name2);
- name1[l1-1] = '.';
- return(ret);
- }
-
- if (l2-l1 == 1 && name2[l2-1] == '.' && lp_strip_dot())
- {
- BOOL ret;
- name2[l2-1] = 0;
- ret = fname_equal(name1,name2);
- name2[l2-1] = '.';
- return(ret);
- }
-
- /* now normal filename handling */
- if (case_sensitive)
- return(strcmp(name1,name2) == 0);
-
- return(strequal(name1,name2));
-}
-
-
-/****************************************************************************
-mangle the 2nd name and check if it is then equal to the first name
-****************************************************************************/
-static BOOL mangled_equal(char *name1, char *name2)
-{
- pstring tmpname;
-
- if (is_8_3(name2, True))
- return(False);
-
- strcpy(tmpname,name2);
- mangle_name_83(tmpname);
-
- return(strequal(name1,tmpname));
-}
-
-
-/****************************************************************************
-scan a directory to find a filename, matching without case sensitivity
-
-If the name looks like a mangled name then try via the mangling functions
-****************************************************************************/
-static BOOL scan_directory(char *path, char *name,int cnum,BOOL docache)
-{
- void *cur_dir;
- char *dname;
- BOOL mangled;
- pstring name2;
-
- mangled = is_mangled(name);
-
- /* handle null paths */
- if (*path == 0)
- path = ".";
-
- if (docache && (dname = DirCacheCheck(path,name,SNUM(cnum)))) {
- strcpy(name, dname);
- return(True);
- }
-
- if (mangled)
- check_mangled_stack(name);
-
- /* open the directory */
- if (!(cur_dir = OpenDir(cnum, path, True)))
- {
- DEBUG(3,("scan dir didn't open dir [%s]\n",path));
- return(False);
- }
-
- /* now scan for matching names */
- while ((dname = ReadDirName(cur_dir)))
- {
- if (*dname == '.' &&
- (strequal(dname,".") || strequal(dname,"..")))
- continue;
-
- pstrcpy(name2,dname);
- if (!name_map_mangle(name2,False,SNUM(cnum))) continue;
-
- if ((mangled && mangled_equal(name,name2))
- || fname_equal(name, name2)) /* name2 here was changed to dname - since 1.9.16p2 - not sure of reason (jra) */
- {
- /* we've found the file, change it's name and return */
- if (docache) DirCacheAdd(path,name,dname,SNUM(cnum));
- strcpy(name, dname);
- CloseDir(cur_dir);
- return(True);
- }
- }
-
- CloseDir(cur_dir);
- return(False);
-}
-
-/****************************************************************************
-This routine is called to convert names from the dos namespace to unix
-namespace. It needs to handle any case conversions, mangling, format
-changes etc.
-
-We assume that we have already done a chdir() to the right "root" directory
-for this service.
-
-The function will return False if some part of the name except for the last
-part cannot be resolved
-
-If the saved_last_component != 0, then the unmodified last component
-of the pathname is returned there. This is used in an exceptional
-case in reply_mv (so far). If saved_last_component == 0 then nothing
-is returned there.
-
-The bad_path arg is set to True if the filename walk failed. This is
-used to pick the correct error code to return between ENOENT and ENOTDIR
-as Windows applications depend on ERRbadpath being returned if a component
-of a pathname does not exist.
-****************************************************************************/
-BOOL unix_convert(char *name,int cnum,pstring saved_last_component, BOOL *bad_path)
-{
- struct stat st;
- char *start, *end;
- pstring dirpath;
- int saved_errno;
-
- *dirpath = 0;
- *bad_path = False;
-
- if(saved_last_component)
- *saved_last_component = 0;
-
- /* convert to basic unix format - removing \ chars and cleaning it up */
- unix_format(name);
- unix_clean_name(name);
-
- /* names must be relative to the root of the service - trim any leading /.
- also trim trailing /'s */
- trim_string(name,"/","/");
-
- /*
- * Ensure saved_last_component is valid even if file exists.
- */
- if(saved_last_component) {
- end = strrchr(name, '/');
- if(end)
- strcpy(saved_last_component, end + 1);
- else
- strcpy(saved_last_component, name);
- }
-
- if (!case_sensitive &&
- (!case_preserve || (is_8_3(name, False) && !short_case_preserve)))
- strnorm(name);
-
- /* check if it's a printer file */
- if (Connections[cnum].printer)
- {
- if ((! *name) || strchr(name,'/') || !is_8_3(name, True))
- {
- char *s;
- fstring name2;
- sprintf(name2,"%.6s.XXXXXX",remote_machine);
- /* sanitise the name */
- for (s=name2 ; *s ; s++)
- if (!issafe(*s)) *s = '_';
- strcpy(name,(char *)mktemp(name2));
- }
- return(True);
- }
-
- /* stat the name - if it exists then we are all done! */
- if (sys_stat(name,&st) == 0)
- return(True);
-
- saved_errno = errno;
-
- DEBUG(5,("unix_convert(%s,%d)\n",name,cnum));
-
- /* a special case - if we don't have any mangling chars and are case
- sensitive then searching won't help */
- if (case_sensitive && !is_mangled(name) &&
- !lp_strip_dot() && !use_mangled_map && (saved_errno != ENOENT))
- return(False);
-
- /* now we need to recursively match the name against the real
- directory structure */
-
- start = name;
- while (strncmp(start,"./",2) == 0)
- start += 2;
-
- /* now match each part of the path name separately, trying the names
- as is first, then trying to scan the directory for matching names */
- for (;start;start = (end?end+1:(char *)NULL))
- {
- /* pinpoint the end of this section of the filename */
- end = strchr(start, '/');
-
- /* chop the name at this point */
- if (end) *end = 0;
-
- if(saved_last_component != 0)
- strcpy(saved_last_component, end ? end + 1 : start);
-
- /* check if the name exists up to this point */
- if (sys_stat(name, &st) == 0)
- {
- /* it exists. it must either be a directory or this must be
- the last part of the path for it to be OK */
- if (end && !(st.st_mode & S_IFDIR))
- {
- /* an intermediate part of the name isn't a directory */
- DEBUG(5,("Not a dir %s\n",start));
- *end = '/';
- return(False);
- }
- }
- else
- {
- pstring rest;
-
- *rest = 0;
-
- /* remember the rest of the pathname so it can be restored
- later */
- if (end) pstrcpy(rest,end+1);
-
- /* try to find this part of the path in the directory */
- if (strchr(start,'?') || strchr(start,'*') ||
- !scan_directory(dirpath, start, cnum, end?True:False))
- {
- if (end)
- {
- /* an intermediate part of the name can't be found */
- DEBUG(5,("Intermediate not found %s\n",start));
- *end = '/';
- /* We need to return the fact that the intermediate
- name resolution failed. This is used to return an
- error of ERRbadpath rather than ERRbadfile. Some
- Windows applications depend on the difference between
- these two errors.
- */
- *bad_path = True;
- return(False);
- }
-
- /* just the last part of the name doesn't exist */
- /* we may need to strupper() or strlower() it in case
- this conversion is being used for file creation
- purposes */
- /* if the filename is of mixed case then don't normalise it */
- if (!case_preserve &&
- (!strhasupper(start) || !strhaslower(start)))
- strnorm(start);
-
- /* check on the mangled stack to see if we can recover the
- base of the filename */
- if (is_mangled(start))
- check_mangled_stack(start);
-
- DEBUG(5,("New file %s\n",start));
- return(True);
- }
-
- /* restore the rest of the string */
- if (end)
- {
- strcpy(start+strlen(start)+1,rest);
- end = start + strlen(start);
- }
- }
-
- /* add to the dirpath that we have resolved so far */
- if (*dirpath) strcat(dirpath,"/");
- strcat(dirpath,start);
-
- /* restore the / that we wiped out earlier */
- if (end) *end = '/';
- }
-
- /* the name has been resolved */
- DEBUG(5,("conversion finished %s\n",name));
- return(True);
-}
-
-
-/****************************************************************************
-normalise for DOS usage
-****************************************************************************/
-static void disk_norm(int *bsize,int *dfree,int *dsize)
-{
- /* check if the disk is beyond the max disk size */
- int maxdisksize = lp_maxdisksize();
- if (maxdisksize) {
- /* convert to blocks - and don't overflow */
- maxdisksize = ((maxdisksize*1024)/(*bsize))*1024;
- if (*dsize > maxdisksize) *dsize = maxdisksize;
- if (*dfree > maxdisksize) *dfree = maxdisksize-1; /* the -1 should stop
- applications getting
- div by 0 errors */
- }
-
- while (*dfree > WORDMAX || *dsize > WORDMAX || *bsize < 512)
- {
- *dfree /= 2;
- *dsize /= 2;
- *bsize *= 2;
- if (*bsize > WORDMAX )
- {
- *bsize = WORDMAX;
- if (*dsize > WORDMAX)
- *dsize = WORDMAX;
- if (*dfree > WORDMAX)
- *dfree = WORDMAX;
- break;
- }
- }
-}
-
-/****************************************************************************
- return number of 1K blocks available on a path and total number
-****************************************************************************/
-int disk_free(char *path,int *bsize,int *dfree,int *dsize)
-{
- char *df_command = lp_dfree_command();
- int dfree_retval;
-#ifdef QUOTAS
- int dfreeq_retval;
- int dfreeq = 0;
- int bsizeq = *bsize;
- int dsizeq = *dsize;
-#endif
-
-#ifndef NO_STATFS
-#ifdef USE_STATVFS
- struct statvfs fs;
-#else
-#ifdef ULTRIX
- struct fs_data fs;
-#else
- struct statfs fs;
-#endif
-#endif
-#endif
-
- /* possibly use system() to get the result */
- if (df_command && *df_command)
- {
- int ret;
- pstring syscmd;
- pstring outfile;
-
- sprintf(outfile,"%s/dfree.smb.%d",tmpdir(),(int)getpid());
- sprintf(syscmd,"%s %s",df_command,path);
- standard_sub_basic(syscmd);
-
- ret = smbrun(syscmd,outfile,False);
- DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
-
- {
- FILE *f = fopen(outfile,"r");
- *dsize = 0;
- *dfree = 0;
- *bsize = 1024;
- if (f)
- {
- fscanf(f,"%d %d %d",dsize,dfree,bsize);
- fclose(f);
- }
- else
- DEBUG(0,("Can't open %s\n",outfile));
- }
-
- unlink(outfile);
- disk_norm(bsize,dfree,dsize);
- dfree_retval = ((*bsize)/1024)*(*dfree);
-#ifdef QUOTAS
- /* Ensure we return the min value between the users quota and
- what's free on the disk. Thanks to Albrecht Gebhardt
- <albrecht.gebhardt@uni-klu.ac.at> for this fix.
- */
- if (disk_quotas(path, &bsizeq, &dfreeq, &dsizeq))
- {
- disk_norm(&bsizeq, &dfreeq, &dsizeq);
- dfreeq_retval = ((bsizeq)/1024)*(dfreeq);
- dfree_retval = ( dfree_retval < dfreeq_retval ) ?
- dfree_retval : dfreeq_retval ;
- /* maybe dfree and dfreeq are calculated using different bsizes
- so convert dfree from bsize into bsizeq */
- /* avoid overflows due to multiplication, so do not:
- *dfree = ((*dfree) * (*bsize)) / (bsizeq);
- bsize and bsizeq are powers of 2 so its better to
- to divide them getting a multiplication or division factor
- for dfree. Rene Nieuwenhuizen (07-10-1997) */
- if (*bsize >= bsizeq)
- *dfree = *dfree * (*bsize / bsizeq);
- else
- *dfree = *dfree / (bsizeq / *bsize);
- *dfree = ( *dfree < dfreeq ) ? *dfree : dfreeq ;
- *bsize = bsizeq;
- *dsize = dsizeq;
- }
-#endif
- return(dfree_retval);
- }
-
-#ifdef NO_STATFS
- DEBUG(1,("Warning - no statfs function\n"));
- return(1);
-#else
-#ifdef STATFS4
- if (statfs(path,&fs,sizeof(fs),0) != 0)
-#else
-#ifdef USE_STATVFS
- if (statvfs(path, &fs))
-#else
-#ifdef STATFS3
- if (statfs(path,&fs,sizeof(fs)) == -1)
-#else
- if (statfs(path,&fs) == -1)
-#endif /* STATFS3 */
-#endif /* USE_STATVFS */
-#endif /* STATFS4 */
- {
- DEBUG(3,("dfree call failed code errno=%d\n",errno));
- *bsize = 1024;
- *dfree = 1;
- *dsize = 1;
- return(((*bsize)/1024)*(*dfree));
- }
-
-#ifdef ULTRIX
- *bsize = 1024;
- *dfree = fs.fd_req.bfree;
- *dsize = fs.fd_req.btot;
-#else
-#ifdef USE_STATVFS
- *bsize = fs.f_frsize;
-#else
-#ifdef USE_F_FSIZE
- /* eg: osf1 has f_fsize = fundamental filesystem block size,
- f_bsize = optimal transfer block size (MX: 94-04-19) */
- *bsize = fs.f_fsize;
-#else
- *bsize = fs.f_bsize;
-#endif /* STATFS3 */
-#endif /* USE_STATVFS */
-
-#ifdef STATFS4
- *dfree = fs.f_bfree;
-#else
- *dfree = fs.f_bavail;
-#endif /* STATFS4 */
- *dsize = fs.f_blocks;
-#endif /* ULTRIX */
-
-#if defined(SCO) || defined(ISC) || defined(MIPS)
- *bsize = 512;
-#endif
-
-/* handle rediculous bsize values - some OSes are broken */
-if ((*bsize) < 512 || (*bsize)>0xFFFF) *bsize = 1024;
-
- disk_norm(bsize,dfree,dsize);
-
- if (*bsize < 256)
- *bsize = 512;
- if ((*dsize)<1)
- {
- DEBUG(0,("dfree seems to be broken on your system\n"));
- *dsize = 20*1024*1024/(*bsize);
- *dfree = MAX(1,*dfree);
- }
- dfree_retval = ((*bsize)/1024)*(*dfree);
-#ifdef QUOTAS
- /* Ensure we return the min value between the users quota and
- what's free on the disk. Thanks to Albrecht Gebhardt
- <albrecht.gebhardt@uni-klu.ac.at> for this fix.
- */
- if (disk_quotas(path, &bsizeq, &dfreeq, &dsizeq))
- {
- disk_norm(&bsizeq, &dfreeq, &dsizeq);
- dfreeq_retval = ((bsizeq)/1024)*(dfreeq);
- dfree_retval = ( dfree_retval < dfreeq_retval ) ?
- dfree_retval : dfreeq_retval ;
- /* maybe dfree and dfreeq are calculated using different bsizes
- so convert dfree from bsize into bsizeq */
- /* avoid overflows due to multiplication, so do not:
- *dfree = ((*dfree) * (*bsize)) / (bsizeq);
- bsize and bsizeq are powers of 2 so its better to
- to divide them getting a multiplication or division factor
- for dfree. Rene Nieuwenhuizen (07-10-1997) */
- if (*bsize >= bsizeq)
- *dfree = *dfree * (*bsize / bsizeq);
- else
- *dfree = *dfree / (bsizeq / *bsize);
- *dfree = ( *dfree < dfreeq ) ? *dfree : dfreeq ;
- *bsize = bsizeq;
- *dsize = dsizeq;
- }
-#endif
- return(dfree_retval);
-#endif
-}
-
-
-/****************************************************************************
-wrap it to get filenames right
-****************************************************************************/
-int sys_disk_free(char *path,int *bsize,int *dfree,int *dsize)
-{
- return(disk_free(dos_to_unix(path,False),bsize,dfree,dsize));
-}
-
-
-
-/****************************************************************************
-check a filename - possibly caling reducename
-
-This is called by every routine before it allows an operation on a filename.
-It does any final confirmation necessary to ensure that the filename is
-a valid one for the user to access.
-****************************************************************************/
-BOOL check_name(char *name,int cnum)
-{
- BOOL ret;
-
- errno = 0;
-
- if( IS_VETO_PATH(cnum, name))
- {
- DEBUG(5,("file path name %s vetoed\n",name));
- return(0);
- }
-
- ret = reduce_name(name,Connections[cnum].connectpath,lp_widelinks(SNUM(cnum)));
-
- /* Check if we are allowing users to follow symlinks */
- /* Patch from David Clerc <David.Clerc@cui.unige.ch>
- University of Geneva */
-
-#ifdef S_ISLNK
- if (!lp_symlinks(SNUM(cnum)))
- {
- struct stat statbuf;
- if ( (sys_lstat(name,&statbuf) != -1) &&
- (S_ISLNK(statbuf.st_mode)) )
- {
- DEBUG(3,("check_name: denied: file path name %s is a symlink\n",name));
- ret=0;
- }
- }
-#endif
-
- if (!ret)
- DEBUG(5,("check_name on %s failed\n",name));
-
- return(ret);
-}
-
-/****************************************************************************
-check a filename - possibly caling reducename
-****************************************************************************/
-static void check_for_pipe(char *fname)
-{
- /* special case of pipe opens */
- char s[10];
- StrnCpy(s,fname,9);
- strlower(s);
- if (strstr(s,"pipe/"))
- {
- DEBUG(3,("Rejecting named pipe open for %s\n",fname));
- unix_ERR_class = ERRSRV;
- unix_ERR_code = ERRaccess;
- }
-}
-
-/****************************************************************************
-fd support routines - attempt to do a sys_open
-****************************************************************************/
-static int fd_attempt_open(char *fname, int flags, int mode)
-{
- int fd = sys_open(fname,flags,mode);
-
- /* Fix for files ending in '.' */
- if((fd == -1) && (errno == ENOENT) &&
- (strchr(fname,'.')==NULL))
- {
- strcat(fname,".");
- fd = sys_open(fname,flags,mode);
- }
-
-#if (defined(ENAMETOOLONG) && defined(HAVE_PATHCONF))
- if ((fd == -1) && (errno == ENAMETOOLONG))
- {
- int max_len;
- char *p = strrchr(fname, '/');
-
- if (p == fname) /* name is "/xxx" */
- {
- max_len = pathconf("/", _PC_NAME_MAX);
- p++;
- }
- else if ((p == NULL) || (p == fname))
- {
- p = fname;
- max_len = pathconf(".", _PC_NAME_MAX);
- }
- else
- {
- *p = '\0';
- max_len = pathconf(fname, _PC_NAME_MAX);
- *p = '/';
- p++;
- }
- if (strlen(p) > max_len)
- {
- char tmp = p[max_len];
-
- p[max_len] = '\0';
- if ((fd = sys_open(fname,flags,mode)) == -1)
- p[max_len] = tmp;
- }
- }
-#endif
- return fd;
-}
-
-/****************************************************************************
-fd support routines - attempt to find an already open file by dev
-and inode - increments the ref_count of the returned file_fd_struct *.
-****************************************************************************/
-static file_fd_struct *fd_get_already_open(struct stat *sbuf)
-{
- int i;
- file_fd_struct *fd_ptr;
-
- if(sbuf == 0)
- return 0;
-
- for(i = 0; i <= max_file_fd_used; i++) {
- fd_ptr = &FileFd[i];
- if((fd_ptr->ref_count > 0) &&
- (((uint32)sbuf->st_dev) == fd_ptr->dev) &&
- (((uint32)sbuf->st_ino) == fd_ptr->inode)) {
- fd_ptr->ref_count++;
- DEBUG(3,
- ("Re-used file_fd_struct %d, dev = %x, inode = %x, ref_count = %d\n",
- i, fd_ptr->dev, fd_ptr->inode, fd_ptr->ref_count));
- return fd_ptr;
- }
- }
- return 0;
-}
-
-/****************************************************************************
-fd support routines - attempt to find a empty slot in the FileFd array.
-Increments the ref_count of the returned entry.
-****************************************************************************/
-static file_fd_struct *fd_get_new()
-{
- int i;
- file_fd_struct *fd_ptr;
-
- for(i = 0; i < MAX_OPEN_FILES; i++) {
- fd_ptr = &FileFd[i];
- if(fd_ptr->ref_count == 0) {
- fd_ptr->dev = (uint32)-1;
- fd_ptr->inode = (uint32)-1;
- fd_ptr->fd = -1;
- fd_ptr->fd_readonly = -1;
- fd_ptr->fd_writeonly = -1;
- fd_ptr->real_open_flags = -1;
- fd_ptr->ref_count++;
- /* Increment max used counter if neccessary, cuts down
- on search time when re-using */
- if(i > max_file_fd_used)
- max_file_fd_used = i;
- DEBUG(3,("Allocated new file_fd_struct %d, dev = %x, inode = %x\n",
- i, fd_ptr->dev, fd_ptr->inode));
- return fd_ptr;
- }
- }
- DEBUG(1,("ERROR! Out of file_fd structures - perhaps increase MAX_OPEN_FILES?\
-n"));
- return 0;
-}
-
-/****************************************************************************
-fd support routines - attempt to re-open an already open fd as O_RDWR.
-Save the already open fd (we cannot close due to POSIX file locking braindamage.
-****************************************************************************/
-static void fd_attempt_reopen(char *fname, int mode, file_fd_struct *fd_ptr)
-{
- int fd = sys_open( fname, O_RDWR, mode);
-
- if(fd == -1)
- return;
-
- if(fd_ptr->real_open_flags == O_RDONLY)
- fd_ptr->fd_readonly = fd_ptr->fd;
- if(fd_ptr->real_open_flags == O_WRONLY)
- fd_ptr->fd_writeonly = fd_ptr->fd;
-
- fd_ptr->fd = fd;
- fd_ptr->real_open_flags = O_RDWR;
-}
-
-/****************************************************************************
-fd support routines - attempt to close the file referenced by this fd.
-Decrements the ref_count and returns it.
-****************************************************************************/
-static int fd_attempt_close(file_fd_struct *fd_ptr)
-{
- DEBUG(3,("fd_attempt_close on file_fd_struct %d, fd = %d, dev = %x, inode = %x, open_flags = %d, ref_count = %d.\n",
- fd_ptr - &FileFd[0],
- fd_ptr->fd, fd_ptr->dev, fd_ptr->inode,
- fd_ptr->real_open_flags,
- fd_ptr->ref_count));
- if(fd_ptr->ref_count > 0) {
- fd_ptr->ref_count--;
- if(fd_ptr->ref_count == 0) {
- if(fd_ptr->fd != -1)
- close(fd_ptr->fd);
- if(fd_ptr->fd_readonly != -1)
- close(fd_ptr->fd_readonly);
- if(fd_ptr->fd_writeonly != -1)
- close(fd_ptr->fd_writeonly);
- fd_ptr->fd = -1;
- fd_ptr->fd_readonly = -1;
- fd_ptr->fd_writeonly = -1;
- fd_ptr->real_open_flags = -1;
- fd_ptr->dev = (uint32)-1;
- fd_ptr->inode = (uint32)-1;
- }
- }
- return fd_ptr->ref_count;
-}
-
-/****************************************************************************
-open a file
-****************************************************************************/
-static void open_file(int fnum,int cnum,char *fname1,int flags,int mode, struct stat *sbuf)
-{
- extern struct current_user current_user;
- pstring fname;
- struct stat statbuf;
- file_fd_struct *fd_ptr;
- files_struct *fsp = &Files[fnum];
-
- fsp->open = False;
- fsp->fd_ptr = 0;
- fsp->granted_oplock = False;
- errno = EPERM;
-
- pstrcpy(fname,fname1);
-
- /* check permissions */
- if ((flags != O_RDONLY) && !CAN_WRITE(cnum) && !Connections[cnum].printer)
- {
- DEBUG(3,("Permission denied opening %s\n",fname));
- check_for_pipe(fname);
- return;
- }
-
- /* this handles a bug in Win95 - it doesn't say to create the file when it
- should */
- if (Connections[cnum].printer)
- flags |= O_CREAT;
-
-/*
- if (flags == O_WRONLY)
- DEBUG(3,("Bug in client? Set O_WRONLY without O_CREAT\n"));
-*/
-
-#if UTIME_WORKAROUND
- /* XXXX - is this OK?? */
- /* this works around a utime bug but can cause other problems */
- if ((flags & (O_WRONLY|O_RDWR)) && (flags & O_CREAT) && !(flags & O_APPEND))
- sys_unlink(fname);
-#endif
-
- /*
- * Ensure we have a valid struct stat so we can search the
- * open fd table.
- */
- if(sbuf == 0) {
- if(stat(fname, &statbuf) < 0) {
- if(errno != ENOENT) {
- DEBUG(3,("Error doing stat on file %s (%s)\n",
- fname,strerror(errno)));
-
- check_for_pipe(fname);
- return;
- }
- sbuf = 0;
- } else {
- sbuf = &statbuf;
- }
- }
-
- /*
- * Check to see if we have this file already
- * open. If we do, just use the already open fd and increment the
- * reference count (fd_get_already_open increments the ref_count).
- */
- if((fd_ptr = fd_get_already_open(sbuf))!= 0) {
-
- int accmode = (flags & (O_RDONLY | O_WRONLY | O_RDWR));
-
- /* File was already open. */
- if((flags & O_CREAT) && (flags & O_EXCL)) {
- fd_ptr->ref_count--;
- errno = EEXIST;
- return;
- }
-
- /*
- * If not opened O_RDWR try
- * and do that here - a chmod may have been done
- * between the last open and now.
- */
- if(fd_ptr->real_open_flags != O_RDWR)
- fd_attempt_reopen(fname, mode, fd_ptr);
-
- /*
- * Ensure that if we wanted write access
- * it has been opened for write, and if we wanted read it
- * was open for read.
- */
- if(((accmode == O_WRONLY) && (fd_ptr->real_open_flags == O_RDONLY)) ||
- ((accmode == O_RDONLY) && (fd_ptr->real_open_flags == O_WRONLY)) ||
- ((accmode == O_RDWR) && (fd_ptr->real_open_flags != O_RDWR))) {
- DEBUG(3,("Error opening (already open for flags=%d) file %s (%s) (flags=%d)\n",
- fd_ptr->real_open_flags, fname,strerror(EACCES),flags));
- check_for_pipe(fname);
- fd_ptr->ref_count--;
- return;
- }
-
- } else {
- int open_flags;
- /* We need to allocate a new file_fd_struct (this increments the
- ref_count). */
- if((fd_ptr = fd_get_new()) == 0)
- return;
- /*
- * Whatever the requested flags, attempt read/write access,
- * as we don't know what flags future file opens may require.
- * If this fails, try again with the required flags.
- * Even if we open read/write when only read access was
- * requested the setting of the can_write flag in
- * the file_struct will protect us from errant
- * write requests. We never need to worry about O_APPEND
- * as this is not set anywhere in Samba.
- */
- fd_ptr->real_open_flags = O_RDWR;
- /* Set the flags as needed without the read/write modes. */
- open_flags = flags & ~(O_RDWR|O_WRONLY|O_RDONLY);
- fd_ptr->fd = fd_attempt_open(fname, open_flags|O_RDWR, mode);
- /*
- * On some systems opening a file for R/W access on a read only
- * filesystems sets errno to EROFS.
- */
-#ifdef EROFS
- if((fd_ptr->fd == -1) && ((errno == EACCES) || (errno == EROFS))) {
-#else /* No EROFS */
- if((fd_ptr->fd == -1) && (errno == EACCES)) {
-#endif /* EROFS */
- if(flags & O_WRONLY) {
- fd_ptr->fd = fd_attempt_open(fname, open_flags|O_WRONLY, mode);
- fd_ptr->real_open_flags = O_WRONLY;
- } else {
- fd_ptr->fd = fd_attempt_open(fname, open_flags|O_RDONLY, mode);
- fd_ptr->real_open_flags = O_RDONLY;
- }
- }
- }
-
- if ((fd_ptr->fd >=0) &&
- Connections[cnum].printer && lp_minprintspace(SNUM(cnum))) {
- pstring dname;
- int dum1,dum2,dum3;
- char *p;
- pstrcpy(dname,fname);
- p = strrchr(dname,'/');
- if (p) *p = 0;
- if (sys_disk_free(dname,&dum1,&dum2,&dum3) <
- lp_minprintspace(SNUM(cnum))) {
- fd_attempt_close(fd_ptr);
- fsp->fd_ptr = 0;
- if(fd_ptr->ref_count == 0)
- sys_unlink(fname);
- errno = ENOSPC;
- return;
- }
- }
-
- if (fd_ptr->fd < 0)
- {
- DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
- fname,strerror(errno),flags));
- /* Ensure the ref_count is decremented. */
- fd_attempt_close(fd_ptr);
- check_for_pipe(fname);
- return;
- }
-
- if (fd_ptr->fd >= 0)
- {
- if(sbuf == 0) {
- /* Do the fstat */
- if(fstat(fd_ptr->fd, &statbuf) == -1) {
- /* Error - backout !! */
- DEBUG(3,("Error doing fstat on fd %d, file %s (%s)\n",
- fd_ptr->fd, fname,strerror(errno)));
- /* Ensure the ref_count is decremented. */
- fd_attempt_close(fd_ptr);
- return;
- }
- sbuf = &statbuf;
- }
- /* Set the correct entries in fd_ptr. */
- fd_ptr->dev = (uint32)sbuf->st_dev;
- fd_ptr->inode = (uint32)sbuf->st_ino;
-
- fsp->fd_ptr = fd_ptr;
- Connections[cnum].num_files_open++;
- fsp->mode = sbuf->st_mode;
- GetTimeOfDay(&fsp->open_time);
- fsp->uid = current_user.id;
- fsp->size = 0;
- fsp->pos = -1;
- fsp->open = True;
- fsp->mmap_ptr = NULL;
- fsp->mmap_size = 0;
- fsp->can_lock = True;
- fsp->can_read = ((flags & O_WRONLY)==0);
- fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
- fsp->share_mode = 0;
- fsp->print_file = Connections[cnum].printer;
- fsp->modified = False;
- fsp->granted_oplock = False;
- fsp->cnum = cnum;
- string_set(&fsp->name,dos_to_unix(fname,False));
- fsp->wbmpx_ptr = NULL;
-
- /*
- * If the printer is marked as postscript output a leading
- * file identifier to ensure the file is treated as a raw
- * postscript file.
- * This has a similar effect as CtrlD=0 in WIN.INI file.
- * tim@fsg.com 09/06/94
- */
- if (fsp->print_file && POSTSCRIPT(cnum) &&
- fsp->can_write)
- {
- DEBUG(3,("Writing postscript line\n"));
- write_file(fnum,"%!\n",3);
- }
-
- DEBUG(2,("%s %s opened file %s read=%s write=%s (numopen=%d fnum=%d)\n",
- timestring(),Connections[cnum].user,fname,
- BOOLSTR(fsp->can_read),BOOLSTR(fsp->can_write),
- Connections[cnum].num_files_open,fnum));
-
- }
-
-#if USE_MMAP
- /* mmap it if read-only */
- if (!fsp->can_write)
- {
- fsp->mmap_size = file_size(fname);
- fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size,
- PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0);
-
- if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr)
- {
- DEBUG(3,("Failed to mmap() %s - %s\n",fname,strerror(errno)));
- fsp->mmap_ptr = NULL;
- }
- }
-#endif
-}
-
-/*******************************************************************
-sync a file
-********************************************************************/
-void sync_file(int fnum)
-{
-#ifndef NO_FSYNC
- fsync(Files[fnum].fd_ptr->fd);
-#endif
-}
-
-/****************************************************************************
-run a file if it is a magic script
-****************************************************************************/
-static void check_magic(int fnum,int cnum)
-{
- if (!*lp_magicscript(SNUM(cnum)))
- return;
-
- DEBUG(5,("checking magic for %s\n",Files[fnum].name));
-
- {
- char *p;
- if (!(p = strrchr(Files[fnum].name,'/')))
- p = Files[fnum].name;
- else
- p++;
-
- if (!strequal(lp_magicscript(SNUM(cnum)),p))
- return;
- }
-
- {
- int ret;
- pstring magic_output;
- pstring fname;
- pstrcpy(fname,Files[fnum].name);
-
- if (*lp_magicoutput(SNUM(cnum)))
- pstrcpy(magic_output,lp_magicoutput(SNUM(cnum)));
- else
- sprintf(magic_output,"%s.out",fname);
-
- chmod(fname,0755);
- ret = smbrun(fname,magic_output,False);
- DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
- unlink(fname);
- }
-}
-
-
-/****************************************************************************
-close a file - possibly invalidating the read prediction
-****************************************************************************/
-void close_file(int fnum)
-{
- files_struct *fs_p = &Files[fnum];
- int cnum = fs_p->cnum;
- uint32 dev = fs_p->fd_ptr->dev;
- uint32 inode = fs_p->fd_ptr->inode;
- share_lock_token token;
-
- invalidate_read_prediction(fs_p->fd_ptr->fd);
- fs_p->open = False;
- Connections[cnum].num_files_open--;
- if(fs_p->wbmpx_ptr)
- {
- free((char *)fs_p->wbmpx_ptr);
- fs_p->wbmpx_ptr = NULL;
- }
-
-#if USE_MMAP
- if(fs_p->mmap_ptr)
- {
- munmap(fs_p->mmap_ptr,fs_p->mmap_size);
- fs_p->mmap_ptr = NULL;
- }
-#endif
-
- if (lp_share_modes(SNUM(cnum)))
- {
- lock_share_entry( cnum, dev, inode, &token);
- del_share_mode(token, fnum);
- }
-
- fd_attempt_close(fs_p->fd_ptr);
-
- if (lp_share_modes(SNUM(cnum)))
- unlock_share_entry( cnum, dev, inode, token);
-
- /* NT uses smbclose to start a print - weird */
- if (fs_p->print_file)
- print_file(fnum);
-
- /* check for magic scripts */
- check_magic(fnum,cnum);
-
- DEBUG(2,("%s %s closed file %s (numopen=%d)\n",
- timestring(),Connections[cnum].user,fs_p->name,
- Connections[cnum].num_files_open));
-}
-
-enum {AFAIL,AREAD,AWRITE,AALL};
-
-/*******************************************************************
-reproduce the share mode access table
-********************************************************************/
-static int access_table(int new_deny,int old_deny,int old_mode,
- int share_pid,char *fname)
-{
- if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
-
- if (new_deny == DENY_DOS || old_deny == DENY_DOS) {
- int pid = getpid();
- if (old_deny == new_deny && share_pid == pid)
- return(AALL);
-
- if (old_mode == 0) return(AREAD);
-
- /* the new smbpub.zip spec says that if the file extension is
- .com, .dll, .exe or .sym then allow the open. I will force
- it to read-only as this seems sensible although the spec is
- a little unclear on this. */
- if ((fname = strrchr(fname,'.'))) {
- if (strequal(fname,".com") ||
- strequal(fname,".dll") ||
- strequal(fname,".exe") ||
- strequal(fname,".sym"))
- return(AREAD);
- }
-
- return(AFAIL);
- }
-
- switch (new_deny)
- {
- case DENY_WRITE:
- if (old_deny==DENY_WRITE && old_mode==0) return(AREAD);
- if (old_deny==DENY_READ && old_mode==0) return(AWRITE);
- if (old_deny==DENY_NONE && old_mode==0) return(AALL);
- return(AFAIL);
- case DENY_READ:
- if (old_deny==DENY_WRITE && old_mode==1) return(AREAD);
- if (old_deny==DENY_READ && old_mode==1) return(AWRITE);
- if (old_deny==DENY_NONE && old_mode==1) return(AALL);
- return(AFAIL);
- case DENY_NONE:
- if (old_deny==DENY_WRITE) return(AREAD);
- if (old_deny==DENY_READ) return(AWRITE);
- if (old_deny==DENY_NONE) return(AALL);
- return(AFAIL);
- }
- return(AFAIL);
-}
-
-/*******************************************************************
-check if the share mode on a file allows it to be deleted or unlinked
-return True if sharing doesn't prevent the operation
-********************************************************************/
-BOOL check_file_sharing(int cnum,char *fname)
-{
- int i;
- int ret = False;
- min_share_mode_entry *old_shares = 0;
- int num_share_modes;
- struct stat sbuf;
- share_lock_token token;
- int pid = getpid();
- uint32 dev, inode;
-
- if(!lp_share_modes(SNUM(cnum)))
- return True;
-
- if (stat(fname,&sbuf) == -1) return(True);
-
- dev = (uint32)sbuf.st_dev;
- inode = (uint32)sbuf.st_ino;
-
- lock_share_entry(cnum, dev, inode, &token);
- num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
-
- /*
- * Check if the share modes will give us access.
- */
-
- if(num_share_modes != 0)
- {
- BOOL broke_oplock;
-
- do
- {
-
- broke_oplock = False;
- for(i = 0; i < num_share_modes; i++)
- {
- min_share_mode_entry *share_entry = &old_shares[i];
-
- /*
- * Break oplocks before checking share modes. See comment in
- * open_file_shared for details.
- * Check if someone has an oplock on this file. If so we must
- * break it before continuing.
- */
- if(share_entry->op_type & BATCH_OPLOCK)
- {
-
- DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
-dev = %x, inode = %x\n", share_entry->op_type, fname, dev, inode));
-
- /* Oplock break.... */
- unlock_share_entry(cnum, dev, inode, token);
- if(request_oplock_break(share_entry, dev, inode) == False)
- {
- free((char *)old_shares);
- DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
-dev = %x, inode = %x\n", old_shares[i].op_type, fname, dev, inode));
- return False;
- }
- lock_share_entry(cnum, dev, inode, &token);
- broke_oplock = True;
- break;
- }
-
- /* someone else has a share lock on it, check to see
- if we can too */
- if ((share_entry->share_mode != DENY_DOS) || (share_entry->pid != pid))
- goto free_and_exit;
-
- } /* end for */
-
- if(broke_oplock)
- {
- free((char *)old_shares);
- num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
- }
- } while(broke_oplock);
- }
-
- /* XXXX exactly what share mode combinations should be allowed for
- deleting/renaming? */
- /* If we got here then either there were no share modes or
- all share modes were DENY_DOS and the pid == getpid() */
- ret = True;
-
-free_and_exit:
-
- unlock_share_entry(cnum, dev, inode, token);
- if(old_shares != NULL)
- free((char *)old_shares);
- return(ret);
-}
-
-/****************************************************************************
- C. Hoch 11/22/95
- Helper for open_file_shared.
- Truncate a file after checking locking; close file if locked.
- **************************************************************************/
-static void truncate_unless_locked(int fnum, int cnum, share_lock_token token,
- BOOL *share_locked)
-{
- if (Files[fnum].can_write){
- if (is_locked(fnum,cnum,0x3FFFFFFF,0)){
- /* If share modes are in force for this connection we
- have the share entry locked. Unlock it before closing. */
- if (*share_locked && lp_share_modes(SNUM(cnum)))
- unlock_share_entry( cnum, Files[fnum].fd_ptr->dev,
- Files[fnum].fd_ptr->inode, token);
- close_file(fnum);
- /* Share mode no longer locked. */
- *share_locked = False;
- errno = EACCES;
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRlock;
- }
- else
- ftruncate(Files[fnum].fd_ptr->fd,0);
- }
-}
-
-/****************************************************************************
-check if we can open a file with a share mode
-****************************************************************************/
-int check_share_mode( min_share_mode_entry *share, int deny_mode, char *fname,
- BOOL fcbopen, int *flags)
-{
- int old_open_mode = share->share_mode &0xF;
- int old_deny_mode = (share->share_mode >>4)&7;
-
- if (old_deny_mode > 4 || old_open_mode > 2)
- {
- DEBUG(0,("Invalid share mode found (%d,%d,%d) on file %s\n",
- deny_mode,old_deny_mode,old_open_mode,fname));
- return False;
- }
-
- {
- int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
- share->pid,fname);
-
- if ((access_allowed == AFAIL) ||
- (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
- (access_allowed == AREAD && *flags == O_WRONLY) ||
- (access_allowed == AWRITE && *flags == O_RDONLY))
- {
- DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s) = %d\n",
- deny_mode,old_deny_mode,old_open_mode,
- share->pid,fname, access_allowed));
- return False;
- }
-
- if (access_allowed == AREAD)
- *flags = O_RDONLY;
-
- if (access_allowed == AWRITE)
- *flags = O_WRONLY;
-
- }
- return True;
-}
-
-/****************************************************************************
-open a file with a share mode
-****************************************************************************/
-void open_file_shared(int fnum,int cnum,char *fname,int share_mode,int ofun,
- int mode,int oplock_request, int *Access,int *action)
-{
- files_struct *fs_p = &Files[fnum];
- int flags=0;
- int flags2=0;
- int deny_mode = (share_mode>>4)&7;
- struct stat sbuf;
- BOOL file_existed = file_exist(fname,&sbuf);
- BOOL share_locked = False;
- BOOL fcbopen = False;
- share_lock_token token;
- uint32 dev = 0;
- uint32 inode = 0;
- int num_share_modes = 0;
-
- fs_p->open = False;
- fs_p->fd_ptr = 0;
-
- /* this is for OS/2 EAs - try and say we don't support them */
- if (strstr(fname,".+,;=[]."))
- {
- unix_ERR_class = ERRDOS;
- /* OS/2 Workplace shell fix may be main code stream in a later release. */
-#ifdef OS2_WPS_FIX
- unix_ERR_code = ERRcannotopen;
-#else /* OS2_WPS_FIX */
- unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
-#endif /* OS2_WPS_FIX */
-
- return;
- }
-
- if ((ofun & 0x3) == 0 && file_existed)
- {
- errno = EEXIST;
- return;
- }
-
- if (ofun & 0x10)
- flags2 |= O_CREAT;
- if ((ofun & 0x3) == 2)
- flags2 |= O_TRUNC;
-
- /* note that we ignore the append flag as
- append does not mean the same thing under dos and unix */
-
- switch (share_mode&0xF)
- {
- case 1:
- flags = O_WRONLY;
- break;
- case 0xF:
- fcbopen = True;
- flags = O_RDWR;
- break;
- case 2:
- flags = O_RDWR;
- break;
- default:
- flags = O_RDONLY;
- break;
- }
-
- if (flags != O_RDONLY && file_existed &&
- (!CAN_WRITE(cnum) || IS_DOS_READONLY(dos_mode(cnum,fname,&sbuf))))
- {
- if (!fcbopen)
- {
- errno = EACCES;
- return;
- }
- flags = O_RDONLY;
- }
-
- if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB)
- {
- DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
- errno = EINVAL;
- return;
- }
-
- if (deny_mode == DENY_FCB) deny_mode = DENY_DOS;
-
- if (lp_share_modes(SNUM(cnum)))
- {
- int i;
- min_share_mode_entry *old_shares = 0;
-
- if (file_existed)
- {
- dev = (uint32)sbuf.st_dev;
- inode = (uint32)sbuf.st_ino;
- lock_share_entry(cnum, dev, inode, &token);
- share_locked = True;
- num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
- }
-
- /*
- * Check if the share modes will give us access.
- */
-
- if(share_locked && (num_share_modes != 0))
- {
- BOOL broke_oplock;
-
- do
- {
-
- broke_oplock = False;
- for(i = 0; i < num_share_modes; i++)
- {
- min_share_mode_entry *share_entry = &old_shares[i];
-
- /*
- * By observation of NetBench, oplocks are broken *before* share
- * modes are checked. This allows a file to be closed by the client
- * if the share mode would deny access and the client has an oplock.
- * Check if someone has an oplock on this file. If so we must break
- * it before continuing.
- */
- if(share_entry->op_type & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
- {
-
- DEBUG(5,("open_file_shared: breaking oplock (%x) on file %s, \
-dev = %x, inode = %x\n", share_entry->op_type, fname, dev, inode));
-
- /* Oplock break.... */
- unlock_share_entry(cnum, dev, inode, token);
- if(request_oplock_break(share_entry, dev, inode) == False)
- {
- free((char *)old_shares);
- DEBUG(0,("open_file_shared: FAILED when breaking oplock (%x) on file %s, \
-dev = %x, inode = %x\n", old_shares[i].op_type, fname, dev, inode));
- errno = EACCES;
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadshare;
- return;
- }
- lock_share_entry(cnum, dev, inode, &token);
- broke_oplock = True;
- break;
- }
-
- /* someone else has a share lock on it, check to see
- if we can too */
- if(check_share_mode(share_entry, deny_mode, fname, fcbopen, &flags) == False)
- {
- free((char *)old_shares);
- unlock_share_entry(cnum, dev, inode, token);
- errno = EACCES;
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadshare;
- return;
- }
-
- } /* end for */
-
- if(broke_oplock)
- {
- free((char *)old_shares);
- num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
- }
- } while(broke_oplock);
- }
-
- if(old_shares != 0)
- free((char *)old_shares);
- }
-
- DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
- flags,flags2,mode));
-
- open_file(fnum,cnum,fname,flags|(flags2&~(O_TRUNC)),mode,file_existed ? &sbuf : 0);
- if (!fs_p->open && flags==O_RDWR && errno!=ENOENT && fcbopen)
- {
- flags = O_RDONLY;
- open_file(fnum,cnum,fname,flags,mode,file_existed ? &sbuf : 0 );
- }
-
- if (fs_p->open)
- {
- int open_mode=0;
-
- if((share_locked == False) && lp_share_modes(SNUM(cnum)))
- {
- /* We created the file - thus we must now lock the share entry before creating it. */
- dev = fs_p->fd_ptr->dev;
- inode = fs_p->fd_ptr->inode;
- lock_share_entry(cnum, dev, inode, &token);
- share_locked = True;
- }
-
- switch (flags)
- {
- case O_RDONLY:
- open_mode = 0;
- break;
- case O_RDWR:
- open_mode = 2;
- break;
- case O_WRONLY:
- open_mode = 1;
- break;
- }
-
- fs_p->share_mode = (deny_mode<<4) | open_mode;
-
- if (Access)
- (*Access) = open_mode;
-
- if (action)
- {
- if (file_existed && !(flags2 & O_TRUNC)) *action = 1;
- if (!file_existed) *action = 2;
- if (file_existed && (flags2 & O_TRUNC)) *action = 3;
- }
- /* We must create the share mode entry before truncate as
- truncate can fail due to locking and have to close the
- file (which expects the share_mode_entry to be there).
- */
- if (lp_share_modes(SNUM(cnum)))
- {
- uint16 port = 0;
- /* JRA. Currently this only services Exlcusive and batch
- oplocks (no other opens on this file). This needs to
- be extended to level II oplocks (multiple reader
- oplocks). */
-
- if(oplock_request && (num_share_modes == 0) && lp_oplocks(SNUM(cnum)))
- {
- fs_p->granted_oplock = True;
- global_oplocks_open++;
- port = oplock_port;
-
- DEBUG(5,("open_file_shared: granted oplock (%x) on file %s, \
-dev = %x, inode = %x\n", oplock_request, fname, dev, inode));
-
- }
- else
- {
- port = 0;
- oplock_request = 0;
- }
- set_share_mode(token, fnum, port, oplock_request);
- }
-
- if ((flags2&O_TRUNC) && file_existed)
- truncate_unless_locked(fnum,cnum,token,&share_locked);
- }
-
- if (share_locked && lp_share_modes(SNUM(cnum)))
- unlock_share_entry( cnum, dev, inode, token);
-}
-
-/****************************************************************************
-seek a file. Try to avoid the seek if possible
-****************************************************************************/
-int seek_file(int fnum,uint32 pos)
-{
- uint32 offset = 0;
- if (Files[fnum].print_file && POSTSCRIPT(Files[fnum].cnum))
- offset = 3;
-
- Files[fnum].pos = (int)(lseek(Files[fnum].fd_ptr->fd,pos+offset,SEEK_SET)
- - offset);
- return(Files[fnum].pos);
-}
-
-/****************************************************************************
-read from a file
-****************************************************************************/
-int read_file(int fnum,char *data,uint32 pos,int n)
-{
- int ret=0,readret;
-
- if (!Files[fnum].can_write)
- {
- ret = read_predict(Files[fnum].fd_ptr->fd,pos,data,NULL,n);
-
- data += ret;
- n -= ret;
- pos += ret;
- }
-
-#if USE_MMAP
- if (Files[fnum].mmap_ptr)
- {
- int num = MIN(n,(int)(Files[fnum].mmap_size-pos));
- if (num > 0)
- {
- memcpy(data,Files[fnum].mmap_ptr+pos,num);
- data += num;
- pos += num;
- n -= num;
- ret += num;
- }
- }
-#endif
-
- if (n <= 0)
- return(ret);
-
- if (seek_file(fnum,pos) != pos)
- {
- DEBUG(3,("Failed to seek to %d\n",pos));
- return(ret);
- }
-
- if (n > 0) {
- readret = read(Files[fnum].fd_ptr->fd,data,n);
- if (readret > 0) ret += readret;
- }
-
- return(ret);
-}
-
-
-/****************************************************************************
-write to a file
-****************************************************************************/
-int write_file(int fnum,char *data,int n)
-{
- if (!Files[fnum].can_write) {
- errno = EPERM;
- return(0);
- }
-
- if (!Files[fnum].modified) {
- struct stat st;
- Files[fnum].modified = True;
- if (fstat(Files[fnum].fd_ptr->fd,&st) == 0) {
- int dosmode = dos_mode(Files[fnum].cnum,Files[fnum].name,&st);
- if (MAP_ARCHIVE(Files[fnum].cnum) && !IS_DOS_ARCHIVE(dosmode)) {
- dos_chmod(Files[fnum].cnum,Files[fnum].name,dosmode | aARCH,&st);
- }
- }
- }
-
- return(write_data(Files[fnum].fd_ptr->fd,data,n));
-}
-
-
-/****************************************************************************
-load parameters specific to a connection/service
-****************************************************************************/
-BOOL become_service(int cnum,BOOL do_chdir)
-{
- extern char magic_char;
- static int last_cnum = -1;
- int snum;
-
- if (!OPEN_CNUM(cnum))
- {
- last_cnum = -1;
- return(False);
- }
-
- Connections[cnum].lastused = smb_last_time;
-
- snum = SNUM(cnum);
-
- if (do_chdir &&
- ChDir(Connections[cnum].connectpath) != 0 &&
- ChDir(Connections[cnum].origpath) != 0)
- {
- DEBUG(0,("%s chdir (%s) failed cnum=%d\n",timestring(),
- Connections[cnum].connectpath,cnum));
- return(False);
- }
-
- if (cnum == last_cnum)
- return(True);
-
- last_cnum = cnum;
-
- case_default = lp_defaultcase(snum);
- case_preserve = lp_preservecase(snum);
- short_case_preserve = lp_shortpreservecase(snum);
- case_mangle = lp_casemangle(snum);
- case_sensitive = lp_casesensitive(snum);
- magic_char = lp_magicchar(snum);
- use_mangled_map = (*lp_mangled_map(snum) ? True:False);
- return(True);
-}
-
-
-/****************************************************************************
- find a service entry
-****************************************************************************/
-int find_service(char *service)
-{
- int iService;
-
- string_sub(service,"\\","/");
-
- iService = lp_servicenumber(service);
-
- /* now handle the special case of a home directory */
- if (iService < 0)
- {
- char *phome_dir = get_home_dir(service);
- DEBUG(3,("checking for home directory %s gave %s\n",service,
- phome_dir?phome_dir:"(NULL)"));
- if (phome_dir)
- {
- int iHomeService;
- if ((iHomeService = lp_servicenumber(HOMES_NAME)) >= 0)
- {
- lp_add_home(service,iHomeService,phome_dir);
- iService = lp_servicenumber(service);
- }
- }
- }
-
- /* If we still don't have a service, attempt to add it as a printer. */
- if (iService < 0)
- {
- int iPrinterService;
-
- if ((iPrinterService = lp_servicenumber(PRINTERS_NAME)) >= 0)
- {
- char *pszTemp;
-
- DEBUG(3,("checking whether %s is a valid printer name...\n", service));
- pszTemp = PRINTCAP;
- if ((pszTemp != NULL) && pcap_printername_ok(service, pszTemp))
- {
- DEBUG(3,("%s is a valid printer name\n", service));
- DEBUG(3,("adding %s as a printer service\n", service));
- lp_add_printer(service,iPrinterService);
- iService = lp_servicenumber(service);
- if (iService < 0)
- DEBUG(0,("failed to add %s as a printer service!\n", service));
- }
- else
- DEBUG(3,("%s is not a valid printer name\n", service));
- }
- }
-
- /* just possibly it's a default service? */
- if (iService < 0)
- {
- char *defservice = lp_defaultservice();
- if (defservice && *defservice && !strequal(defservice,service)) {
- iService = find_service(defservice);
- if (iService >= 0) {
- string_sub(service,"_","/");
- iService = lp_add_service(service,iService);
- }
- }
- }
-
- if (iService >= 0)
- if (!VALID_SNUM(iService))
- {
- DEBUG(0,("Invalid snum %d for %s\n",iService,service));
- iService = -1;
- }
-
- if (iService < 0)
- DEBUG(3,("find_service() failed to find service %s\n", service));
-
- return (iService);
-}
-
-
-/****************************************************************************
- create an error packet from a cached error.
-****************************************************************************/
-int cached_error_packet(char *inbuf,char *outbuf,int fnum,int line)
-{
- write_bmpx_struct *wbmpx = Files[fnum].wbmpx_ptr;
-
- int32 eclass = wbmpx->wr_errclass;
- int32 err = wbmpx->wr_error;
-
- /* We can now delete the auxiliary struct */
- free((char *)wbmpx);
- Files[fnum].wbmpx_ptr = NULL;
- return error_packet(inbuf,outbuf,eclass,err,line);
-}
-
-
-struct
-{
- int unixerror;
- int smbclass;
- int smbcode;
-} unix_smb_errmap[] =
-{
- {EPERM,ERRDOS,ERRnoaccess},
- {EACCES,ERRDOS,ERRnoaccess},
- {ENOENT,ERRDOS,ERRbadfile},
- {ENOTDIR,ERRDOS,ERRbadpath},
- {EIO,ERRHRD,ERRgeneral},
- {EBADF,ERRSRV,ERRsrverror},
- {EINVAL,ERRSRV,ERRsrverror},
- {EEXIST,ERRDOS,ERRfilexists},
- {ENFILE,ERRDOS,ERRnofids},
- {EMFILE,ERRDOS,ERRnofids},
- {ENOSPC,ERRHRD,ERRdiskfull},
-#ifdef EDQUOT
- {EDQUOT,ERRHRD,ERRdiskfull},
-#endif
-#ifdef ENOTEMPTY
- {ENOTEMPTY,ERRDOS,ERRnoaccess},
-#endif
-#ifdef EXDEV
- {EXDEV,ERRDOS,ERRdiffdevice},
-#endif
- {EROFS,ERRHRD,ERRnowrite},
- {0,0,0}
-};
-
-/****************************************************************************
- create an error packet from errno
-****************************************************************************/
-int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line)
-{
- int eclass=def_class;
- int ecode=def_code;
- int i=0;
-
- if (unix_ERR_class != SUCCESS)
- {
- eclass = unix_ERR_class;
- ecode = unix_ERR_code;
- unix_ERR_class = SUCCESS;
- unix_ERR_code = 0;
- }
- else
- {
- while (unix_smb_errmap[i].smbclass != 0)
- {
- if (unix_smb_errmap[i].unixerror == errno)
- {
- eclass = unix_smb_errmap[i].smbclass;
- ecode = unix_smb_errmap[i].smbcode;
- break;
- }
- i++;
- }
- }
-
- return(error_packet(inbuf,outbuf,eclass,ecode,line));
-}
-
-
-/****************************************************************************
- create an error packet. Normally called using the ERROR() macro
-****************************************************************************/
-int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int line)
-{
- int outsize = set_message(outbuf,0,0,True);
- int cmd;
- cmd = CVAL(inbuf,smb_com);
-
- CVAL(outbuf,smb_rcls) = error_class;
- SSVAL(outbuf,smb_err,error_code);
-
- DEBUG(3,("%s error packet at line %d cmd=%d (%s) eclass=%d ecode=%d\n",
- timestring(),
- line,
- (int)CVAL(inbuf,smb_com),
- smb_fn_name(CVAL(inbuf,smb_com)),
- error_class,
- error_code));
-
- if (errno != 0)
- DEBUG(3,("error string = %s\n",strerror(errno)));
-
- return(outsize);
-}
-
-
-#ifndef SIGCLD_IGNORE
-/****************************************************************************
-this prevents zombie child processes
-****************************************************************************/
-static int sig_cld()
-{
- static int depth = 0;
- if (depth != 0)
- {
- DEBUG(0,("ERROR: Recursion in sig_cld? Perhaps you need `#define USE_WAITPID'?\n"));
- depth=0;
- return(0);
- }
- depth++;
-
- BlockSignals(True,SIGCLD);
- DEBUG(5,("got SIGCLD\n"));
-
-#ifdef USE_WAITPID
- while (sys_waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0);
-#endif
-
- /* Stop zombies */
- /* Stevens, Adv. Unix Prog. says that on system V you must call
- wait before reinstalling the signal handler, because the kernel
- calls the handler from within the signal-call when there is a
- child that has exited. This would lead to an infinite recursion
- if done vice versa. */
-
-#ifndef DONT_REINSTALL_SIG
-#ifdef SIGCLD_IGNORE
- signal(SIGCLD, SIG_IGN);
-#else
- signal(SIGCLD, SIGNAL_CAST sig_cld);
-#endif
-#endif
-
-#ifndef USE_WAITPID
- while (wait3(WAIT3_CAST1 NULL, WNOHANG, WAIT3_CAST2 NULL) > 0);
-#endif
- depth--;
- BlockSignals(False,SIGCLD);
- return 0;
-}
-#endif
-
-/****************************************************************************
- this is called when the client exits abruptly
- **************************************************************************/
-static int sig_pipe()
-{
- extern int password_client;
- BlockSignals(True,SIGPIPE);
-
- if (password_client != -1) {
- DEBUG(3,("lost connection to password server\n"));
- close(password_client);
- password_client = -1;
-#ifndef DONT_REINSTALL_SIG
- signal(SIGPIPE, SIGNAL_CAST sig_pipe);
-#endif
- BlockSignals(False,SIGPIPE);
- return 0;
- }
-
- exit_server("Got sigpipe\n");
- return(0);
-}
-
-/****************************************************************************
- open the socket communication
-****************************************************************************/
-static BOOL open_sockets(BOOL is_daemon,int port)
-{
- extern int Client;
-
- if (is_daemon)
- {
- int s;
- struct sockaddr addr;
- int in_addrlen = sizeof(addr);
-
- /* Stop zombies */
-#ifdef SIGCLD_IGNORE
- signal(SIGCLD, SIG_IGN);
-#else
- signal(SIGCLD, SIGNAL_CAST sig_cld);
-#endif
-
- /* open an incoming socket */
- s = open_socket_in(SOCK_STREAM, port, 0,interpret_addr(lp_socket_address()));
- if (s == -1)
- return(False);
-
- /* ready to listen */
- if (listen(s, 5) == -1)
- {
- DEBUG(0,("listen: %s\n",strerror(errno)));
- close(s);
- return False;
- }
-
- if(atexit_set == 0)
- atexit(killkids);
-
- /* now accept incoming connections - forking a new process
- for each incoming connection */
- DEBUG(2,("waiting for a connection\n"));
- while (1)
- {
- Client = accept(s,&addr,&in_addrlen);
-
- if (Client == -1 && errno == EINTR)
- continue;
-
- if (Client == -1)
- {
- DEBUG(0,("accept: %s\n",strerror(errno)));
- continue;
- }
-
-#ifdef NO_FORK_DEBUG
-#ifndef NO_SIGNAL_TEST
- signal(SIGPIPE, SIGNAL_CAST sig_pipe);
- signal(SIGCLD, SIGNAL_CAST SIG_DFL);
-#endif
- return True;
-#else
- if (Client != -1 && fork()==0)
- {
- /* Child code ... */
-#ifndef NO_SIGNAL_TEST
- signal(SIGPIPE, SIGNAL_CAST sig_pipe);
- signal(SIGCLD, SIGNAL_CAST SIG_DFL);
-#endif
- /* close the listening socket */
- close(s);
-
- /* close our standard file descriptors */
- close_low_fds();
- am_parent = 0;
-
- set_socket_options(Client,"SO_KEEPALIVE");
- set_socket_options(Client,user_socket_options);
-
- /* Reset global variables in util.c so that
- client substitutions will be done correctly
- in the process.
- */
- reset_globals_after_fork();
- return True;
- }
- close(Client); /* The parent doesn't need this socket */
-#endif
- }
- }
- else
- {
- /* We will abort gracefully when the client or remote system
- goes away */
-#ifndef NO_SIGNAL_TEST
- signal(SIGPIPE, SIGNAL_CAST sig_pipe);
-#endif
- Client = dup(0);
-
- /* close our standard file descriptors */
- close_low_fds();
-
- set_socket_options(Client,"SO_KEEPALIVE");
- set_socket_options(Client,user_socket_options);
- }
-
- return True;
-}
-
-/****************************************************************************
- process an smb from the client - split out from the process() code so
- it can be used by the oplock break code.
-****************************************************************************/
-
-static void process_smb(char *inbuf, char *outbuf)
-{
- extern int Client;
- static int trans_num;
- int msg_type = CVAL(inbuf,0);
- int32 len = smb_len(inbuf);
- int nread = len + 4;
-
- if (trans_num == 0) {
- /* on the first packet, check the global hosts allow/ hosts
- deny parameters before doing any parsing of the packet
- passed to us by the client. This prevents attacks on our
- parsing code from hosts not in the hosts allow list */
- if (!check_access(-1)) {
- /* send a negative session response "not listining on calling
- name" */
- static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
- DEBUG(1,("%s Connection denied from %s\n",
- timestring(),client_addr()));
- send_smb(Client,(char *)buf);
- exit_server("connection denied");
- }
- }
-
- DEBUG(6,("got message type 0x%x of len 0x%x\n",msg_type,len));
- DEBUG(3,("%s Transaction %d of length %d\n",timestring(),trans_num,nread));
-
-#ifdef WITH_VTP
- if(trans_num == 1 && VT_Check(inbuf))
- {
- VT_Process();
- return;
- }
-#endif
-
- if (msg_type == 0)
- show_msg(inbuf);
-
- nread = construct_reply(inbuf,outbuf,nread,max_send);
-
- if(nread > 0)
- {
- if (CVAL(outbuf,0) == 0)
- show_msg(outbuf);
-
- if (nread != smb_len(outbuf) + 4)
- {
- DEBUG(0,("ERROR: Invalid message response size! %d %d\n",
- nread, smb_len(outbuf)));
- }
- else
- send_smb(Client,outbuf);
- }
- trans_num++;
-}
-
-/****************************************************************************
- open the oplock IPC socket communication
-****************************************************************************/
-static BOOL open_oplock_ipc()
-{
- struct sockaddr_in sock_name;
- int len = sizeof(sock_name);
-
- DEBUG(3,("open_oplock_ipc: opening loopback UDP socket.\n"));
-
- /* Open a lookback UDP socket on a random port. */
- oplock_sock = open_socket_in(SOCK_DGRAM, 0, 0, htonl(INADDR_LOOPBACK));
- if (oplock_sock == -1)
- {
- DEBUG(0,("open_oplock_ipc: Failed to get local UDP socket for \
-address %x. Error was %s\n", htonl(INADDR_LOOPBACK), strerror(errno)));
- oplock_port = 0;
- return(False);
- }
-
- /* Find out the transient UDP port we have been allocated. */
- if(getsockname(oplock_sock, (struct sockaddr *)&sock_name, &len)<0)
- {
- DEBUG(0,("open_oplock_ipc: Failed to get local UDP port. Error was %s\n",
- strerror(errno)));
- close(oplock_sock);
- oplock_sock = -1;
- oplock_port = 0;
- return False;
- }
- oplock_port = ntohs(sock_name.sin_port);
-
- DEBUG(3,("open_oplock ipc: pid = %d, oplock_port = %u\n",
- getpid(), oplock_port));
-
- return True;
-}
-
-/****************************************************************************
- process an oplock break message.
-****************************************************************************/
-static BOOL process_local_message(int sock, char *buffer, int buf_size)
-{
- int32 msg_len;
- int16 from_port;
- char *msg_start;
-
- msg_len = IVAL(buffer,UDP_CMD_LEN_OFFSET);
- from_port = SVAL(buffer,UDP_CMD_PORT_OFFSET);
-
- msg_start = &buffer[UDP_CMD_HEADER_LEN];
-
- DEBUG(5,("process_local_message: Got a message of length %d from port (%d)\n",
- msg_len, from_port));
-
- /* Switch on message command - currently OPLOCK_BREAK_CMD is the
- only valid request. */
-
- switch(SVAL(msg_start,UDP_MESSAGE_CMD_OFFSET))
- {
- case OPLOCK_BREAK_CMD:
- /* Ensure that the msg length is correct. */
- if(msg_len != OPLOCK_BREAK_MSG_LEN)
- {
- DEBUG(0,("process_local_message: incorrect length for OPLOCK_BREAK_CMD (was %d, \
-should be %d).\n", msg_len, OPLOCK_BREAK_MSG_LEN));
- return False;
- }
- {
- uint32 remotepid = IVAL(msg_start,OPLOCK_BREAK_PID_OFFSET);
- uint32 dev = IVAL(msg_start,OPLOCK_BREAK_DEV_OFFSET);
- uint32 inode = IVAL(msg_start, OPLOCK_BREAK_INODE_OFFSET);
- struct timeval tval;
- struct sockaddr_in toaddr;
-
- tval.tv_sec = IVAL(msg_start, OPLOCK_BREAK_SEC_OFFSET);
- tval.tv_usec = IVAL(msg_start, OPLOCK_BREAK_USEC_OFFSET);
-
- DEBUG(5,("process_local_message: oplock break request from \
-pid %d, port %d, dev = %x, inode = %x\n", remotepid, from_port, dev, inode));
-
- /*
- * If we have no record of any currently open oplocks,
- * it's not an error, as a close command may have
- * just been issued on the file that was oplocked.
- * Just return success in this case.
- */
-
- if(global_oplocks_open != 0)
- {
- if(oplock_break(dev, inode, &tval) == False)
- {
- DEBUG(0,("process_local_message: oplock break failed - \
-not returning udp message.\n"));
- return False;
- }
- }
- else
- {
- DEBUG(3,("process_local_message: oplock break requested with no outstanding \
-oplocks. Returning success.\n"));
- }
-
- /* Send the message back after OR'ing in the 'REPLY' bit. */
- SSVAL(msg_start,UDP_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD | CMD_REPLY);
-
- bzero((char *)&toaddr,sizeof(toaddr));
- toaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- toaddr.sin_port = htons(from_port);
- toaddr.sin_family = AF_INET;
-
- if(sendto( sock, msg_start, OPLOCK_BREAK_MSG_LEN, 0,
- (struct sockaddr *)&toaddr, sizeof(toaddr)) < 0)
- {
- DEBUG(0,("process_local_message: sendto process %d failed. Errno was %s\n",
- remotepid, strerror(errno)));
- return False;
- }
-
- DEBUG(5,("process_local_message: oplock break reply sent to \
-pid %d, port %d, for file dev = %x, inode = %x\n", remotepid,
- from_port, dev, inode));
-
- }
- break;
- /*
- * Keep this as a debug case - eventually we can remove it.
- */
- case 0x8001:
- DEBUG(0,("process_local_message: Received unsolicited break \
-reply - dumping info.\n"));
-
- if(msg_len != OPLOCK_BREAK_MSG_LEN)
- {
- DEBUG(0,("process_local_message: ubr: incorrect length for reply \
-(was %d, should be %d).\n", msg_len, OPLOCK_BREAK_MSG_LEN));
- return False;
- }
-
- {
- uint32 remotepid = IVAL(msg_start,OPLOCK_BREAK_PID_OFFSET);
- uint32 dev = IVAL(msg_start,OPLOCK_BREAK_DEV_OFFSET);
- uint32 inode = IVAL(msg_start, OPLOCK_BREAK_INODE_OFFSET);
-
- DEBUG(0,("process_local_message: unsolicited oplock break reply from \
-pid %d, port %d, dev = %x, inode = %x\n", remotepid, from_port, dev, inode));
-
- }
- return False;
-
- default:
- DEBUG(0,("process_local_message: unknown UDP message command code (%x) - ignoring.\n",
- (unsigned int)SVAL(msg_start,0)));
- return False;
- }
- return True;
-}
-
-/****************************************************************************
- Process an oplock break directly.
-****************************************************************************/
-BOOL oplock_break(uint32 dev, uint32 inode, struct timeval *tval)
-{
- extern int Client;
- static char *inbuf = NULL;
- static char *outbuf = NULL;
- files_struct *fsp = NULL;
- int fnum;
- time_t start_time;
- BOOL shutdown_server = False;
-
- DEBUG(5,("oplock_break: called for dev = %x, inode = %x. Current \
-global_oplocks_open = %d\n", dev, inode, global_oplocks_open));
-
- if(inbuf == NULL)
- {
- inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if(inbuf == NULL) {
- DEBUG(0,("oplock_break: malloc fail for input buffer.\n"));
- return False;
- }
- outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if(outbuf == NULL) {
- DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
- free(inbuf);
- inbuf = NULL;
- return False;
- }
- }
-
- /* We need to search the file open table for the
- entry containing this dev and inode, and ensure
- we have an oplock on it. */
- for( fnum = 0; fnum < MAX_OPEN_FILES; fnum++)
- {
- if(OPEN_FNUM(fnum))
- {
- fsp = &Files[fnum];
- if((fsp->fd_ptr->dev == dev) && (fsp->fd_ptr->inode == inode) &&
- (fsp->open_time.tv_sec == tval->tv_sec) &&
- (fsp->open_time.tv_usec == tval->tv_usec))
- break;
- }
- }
-
- if(fsp == NULL)
- {
- /* The file could have been closed in the meantime - return success. */
- DEBUG(3,("oplock_break: cannot find open file with dev = %x, inode = %x (fnum = %d) \
-allowing break to succeed.\n", dev, inode, fnum));
- return True;
- }
-
- /* Ensure we have an oplock on the file */
-
- /* There is a potential race condition in that an oplock could
- have been broken due to another udp request, and yet there are
- still oplock break messages being sent in the udp message
- queue for this file. So return true if we don't have an oplock,
- as we may have just freed it.
- */
-
- if(!fsp->granted_oplock)
- {
- DEBUG(3,("oplock_break: file %s (fnum = %d, dev = %x, inode = %x) has no oplock. \
-Allowing break to succeed regardless.\n", fsp->name, fnum, dev, inode));
- return True;
- }
-
- /* Now comes the horrid part. We must send an oplock break to the client,
- and then process incoming messages until we get a close or oplock release.
- */
-
- /* Prepare the SMBlockingX message. */
- bzero(outbuf,smb_size);
- set_message(outbuf,8,0,True);
-
- SCVAL(outbuf,smb_com,SMBlockingX);
- SSVAL(outbuf,smb_tid,fsp->cnum);
- SSVAL(outbuf,smb_pid,0xFFFF);
- SSVAL(outbuf,smb_uid,0);
- SSVAL(outbuf,smb_mid,0xFFFF);
- SCVAL(outbuf,smb_vwv0,0xFF);
- SSVAL(outbuf,smb_vwv2,fnum);
- SCVAL(outbuf,smb_vwv3,LOCKING_ANDX_OPLOCK_RELEASE);
- /* Change this when we have level II oplocks. */
- SCVAL(outbuf,smb_vwv3+1,OPLOCKLEVEL_NONE);
-
- send_smb(Client, outbuf);
-
- global_oplock_break = True;
-
- /* Process incoming messages. */
-
- /* JRA - If we don't get a break from the client in OPLOCK_BREAK_TIMEOUT
- seconds we should just die.... */
-
- start_time = time(NULL);
-
- while(OPEN_FNUM(fnum) && fsp->granted_oplock)
- {
- if(receive_smb(Client,inbuf,OPLOCK_BREAK_TIMEOUT * 1000) == False)
- {
- /*
- * Die if we got an error.
- */
-
- if (smb_read_error == READ_EOF)
- DEBUG(0,("oplock_break: end of file from client\n"));
-
- if (smb_read_error == READ_ERROR)
- DEBUG(0,("oplock_break: receive_smb error (%s)\n",
- strerror(errno)));
-
- if (smb_read_error == READ_TIMEOUT)
- DEBUG(0,("oplock_break: receive_smb timed out after %d seconds.\n",
- OPLOCK_BREAK_TIMEOUT));
-
- DEBUG(0,("oplock_break failed for file %s (fnum = %d, dev = %x, \
-inode = %x).\n", fsp->name, fnum, dev, inode));
- shutdown_server = True;
- break;
- }
- process_smb(inbuf, outbuf);
-
- /* We only need this in case a readraw crossed on the wire. */
- if(global_oplock_break)
- global_oplock_break = False;
-
- /*
- * Die if we go over the time limit.
- */
-
- if((time(NULL) - start_time) > OPLOCK_BREAK_TIMEOUT)
- {
- DEBUG(0,("oplock_break: no break received from client within \
-%d seconds.\n", OPLOCK_BREAK_TIMEOUT));
- DEBUG(0,("oplock_break failed for file %s (fnum = %d, dev = %x, \
-inode = %x).\n", fsp->name, fnum, dev, inode));
- shutdown_server = True;
- break;
- }
- }
-
- /*
- * If the client did not respond we must die.
- */
-
- if(shutdown_server)
- {
- DEBUG(0,("oplock_break: client failure in break - shutting down this smbd.\n"));
- close_sockets();
- close(oplock_sock);
- exit_server("oplock break failure");
- }
-
- if(OPEN_FNUM(fnum))
- {
- /* The lockingX reply will have removed the oplock flag
- from the sharemode. */
- /* Paranoia.... */
- fsp->granted_oplock = False;
- }
-
- global_oplocks_open--;
-
- /* Santity check - remove this later. JRA */
- if(global_oplocks_open < 0)
- {
- DEBUG(0,("oplock_break: global_oplocks_open < 0 (%d). PANIC ERROR\n",
- global_oplocks_open));
- exit_server("oplock_break: global_oplocks_open < 0");
- }
-
- DEBUG(5,("oplock_break: returning success for fnum = %d, dev = %x, inode = %x. Current \
-global_oplocks_open = %d\n", fnum, dev, inode, global_oplocks_open));
-
- return True;
-}
-
-/****************************************************************************
-Send an oplock break message to another smbd process. If the oplock is held
-by the local smbd then call the oplock break function directly.
-****************************************************************************/
-
-BOOL request_oplock_break(min_share_mode_entry *share_entry,
- uint32 dev, uint32 inode)
-{
- char op_break_msg[OPLOCK_BREAK_MSG_LEN];
- struct sockaddr_in addr_out;
- int pid = getpid();
-
- if(pid == share_entry->pid)
- {
- /* We are breaking our own oplock, make sure it's us. */
- if(share_entry->op_port != oplock_port)
- {
- DEBUG(0,("request_oplock_break: corrupt share mode entry - pid = %d, port = %d \
-should be %d\n", pid, share_entry->op_port, oplock_port));
- return False;
- }
-
- DEBUG(5,("request_oplock_break: breaking our own oplock\n"));
-
- /* Call oplock break direct. */
- return oplock_break(dev, inode, &share_entry->time);
- }
-
- /* We need to send a OPLOCK_BREAK_CMD message to the
- port in the share mode entry. */
-
- SSVAL(op_break_msg,UDP_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD);
- SIVAL(op_break_msg,OPLOCK_BREAK_PID_OFFSET,pid);
- SIVAL(op_break_msg,OPLOCK_BREAK_DEV_OFFSET,dev);
- SIVAL(op_break_msg,OPLOCK_BREAK_INODE_OFFSET,inode);
- SIVAL(op_break_msg,OPLOCK_BREAK_SEC_OFFSET,(uint32)share_entry->time.tv_sec);
- SIVAL(op_break_msg,OPLOCK_BREAK_USEC_OFFSET,(uint32)share_entry->time.tv_usec);
-
- /* set the address and port */
- bzero((char *)&addr_out,sizeof(addr_out));
- addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- addr_out.sin_port = htons( share_entry->op_port );
- addr_out.sin_family = AF_INET;
-
- DEBUG(3,("request_oplock_break: sending a oplock break message to pid %d on port %d \
-for dev = %x, inode = %x\n", share_entry->pid, share_entry->op_port, dev, inode));
-
- if(sendto(oplock_sock,op_break_msg,OPLOCK_BREAK_MSG_LEN,0,
- (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0)
- {
- DEBUG(0,("request_oplock_break: failed when sending a oplock break message \
-to pid %d on port %d for dev = %x, inode = %x. Error was %s\n",
- share_entry->pid, share_entry->op_port, dev, inode,
- strerror(errno)));
- return False;
- }
-
- /*
- * Now we must await the oplock broken message coming back
- * from the target smbd process. Timeout if it fails to
- * return in OPLOCK_BREAK_TIMEOUT seconds.
- * While we get messages that aren't ours, loop.
- */
-
- while(1)
- {
- char op_break_reply[UDP_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
- int32 reply_msg_len;
- int16 reply_from_port;
- char *reply_msg_start;
-
- if(receive_local_message(oplock_sock, op_break_reply, sizeof(op_break_reply),
- OPLOCK_BREAK_TIMEOUT * 1000) == False)
- {
- if(smb_read_error == READ_TIMEOUT)
- DEBUG(0,("request_oplock_break: no response received to oplock break request to \
-pid %d on port %d for dev = %x, inode = %x\n", share_entry->pid,
- share_entry->op_port, dev, inode));
- else
- DEBUG(0,("request_oplock_break: error in response received to oplock break request to \
-pid %d on port %d for dev = %x, inode = %x. Error was (%s).\n", share_entry->pid,
- share_entry->op_port, dev, inode, strerror(errno)));
- return False;
- }
-
- /*
- * If the response we got was not an answer to our message, but
- * was a completely different request, push it onto the pending
- * udp message stack so that we can deal with it in the main loop.
- * It may be another oplock break request to us.
- */
-
- /*
- * Local note from JRA. There exists the possibility of a denial
- * of service attack here by allowing non-root processes running
- * on a local machine sending many of these pending messages to
- * a smbd port. Currently I'm not sure how to restrict the messages
- * I will queue (although I could add a limit to the queue) to
- * those received by root processes only. There should be a
- * way to make this bulletproof....
- */
-
- reply_msg_len = IVAL(op_break_reply,UDP_CMD_LEN_OFFSET);
- reply_from_port = SVAL(op_break_reply,UDP_CMD_PORT_OFFSET);
-
- reply_msg_start = &op_break_reply[UDP_CMD_HEADER_LEN];
-
- if(reply_msg_len != OPLOCK_BREAK_MSG_LEN)
- {
- /* Ignore it. */
- DEBUG(0,("request_oplock_break: invalid message length received. Ignoring\n"));
- continue;
- }
-
- if(((SVAL(reply_msg_start,UDP_MESSAGE_CMD_OFFSET) & CMD_REPLY) == 0) ||
- (reply_from_port != share_entry->op_port) ||
- (memcmp(&reply_msg_start[OPLOCK_BREAK_PID_OFFSET],
- &op_break_msg[OPLOCK_BREAK_PID_OFFSET],
- OPLOCK_BREAK_MSG_LEN - OPLOCK_BREAK_PID_OFFSET) != 0))
- {
- DEBUG(3,("request_oplock_break: received other message whilst awaiting \
-oplock break response from pid %d on port %d for dev = %x, inode = %x.\n",
- share_entry->pid, share_entry->op_port, dev, inode));
- if(push_local_message(op_break_reply, sizeof(op_break_reply)) == False)
- return False;
- continue;
- }
-
- break;
- }
-
- DEBUG(3,("request_oplock_break: broke oplock.\n"));
-
- return True;
-}
-
-/****************************************************************************
-check if a snum is in use
-****************************************************************************/
-BOOL snum_used(int snum)
-{
- int i;
- for (i=0;i<MAX_CONNECTIONS;i++)
- if (OPEN_CNUM(i) && (SNUM(i) == snum))
- return(True);
- return(False);
-}
-
-/****************************************************************************
- reload the services file
- **************************************************************************/
-BOOL reload_services(BOOL test)
-{
- BOOL ret;
-
- if (lp_loaded())
- {
- pstring fname;
- pstrcpy(fname,lp_configfile());
- if (file_exist(fname,NULL) && !strcsequal(fname,servicesf))
- {
- pstrcpy(servicesf,fname);
- test = False;
- }
- }
-
- reopen_logs();
-
- if (test && !lp_file_list_changed())
- return(True);
-
- lp_killunused(snum_used);
-
- ret = lp_load(servicesf,False);
-
- /* perhaps the config filename is now set */
- if (!test)
- reload_services(True);
-
- reopen_logs();
-
- load_interfaces();
-
- {
- extern int Client;
- if (Client != -1) {
- set_socket_options(Client,"SO_KEEPALIVE");
- set_socket_options(Client,user_socket_options);
- }
- }
-
- create_mangled_stack(lp_mangledstack());
-
- /* this forces service parameters to be flushed */
- become_service(-1,True);
-
- return(ret);
-}
-
-
-
-/****************************************************************************
-this prevents zombie child processes
-****************************************************************************/
-static int sig_hup()
-{
- BlockSignals(True,SIGHUP);
- DEBUG(0,("Got SIGHUP\n"));
- reload_services(False);
-#ifndef DONT_REINSTALL_SIG
- signal(SIGHUP,SIGNAL_CAST sig_hup);
-#endif
- BlockSignals(False,SIGHUP);
- return(0);
-}
-
-/****************************************************************************
-Setup the groups a user belongs to.
-****************************************************************************/
-int setup_groups(char *user, int uid, int gid, int *p_ngroups,
- int **p_igroups, gid_t **p_groups)
-{
- if (-1 == initgroups(user,gid))
- {
- if (getuid() == 0)
- {
- DEBUG(0,("Unable to initgroups!\n"));
- if (gid < 0 || gid > 16000 || uid < 0 || uid > 16000)
- DEBUG(0,("This is probably a problem with the account %s\n",user));
- }
- }
- else
- {
- int i,ngroups;
- int *igroups;
- gid_t grp = 0;
- ngroups = getgroups(0,&grp);
- if (ngroups <= 0)
- ngroups = 32;
- igroups = (int *)malloc(sizeof(int)*ngroups);
- for (i=0;i<ngroups;i++)
- igroups[i] = 0x42424242;
- ngroups = getgroups(ngroups,(gid_t *)igroups);
-
- if (igroups[0] == 0x42424242)
- ngroups = 0;
-
- *p_ngroups = ngroups;
-
- /* The following bit of code is very strange. It is due to the
- fact that some OSes use int* and some use gid_t* for
- getgroups, and some (like SunOS) use both, one in prototypes,
- and one in man pages and the actual code. Thus we detect it
- dynamically using some very ugly code */
- if (ngroups > 0)
- {
- /* does getgroups return ints or gid_t ?? */
- static BOOL groups_use_ints = True;
-
- if (groups_use_ints &&
- ngroups == 1 &&
- SVAL(igroups,2) == 0x4242)
- groups_use_ints = False;
-
- for (i=0;groups_use_ints && i<ngroups;i++)
- if (igroups[i] == 0x42424242)
- groups_use_ints = False;
-
- if (groups_use_ints)
- {
- *p_igroups = igroups;
- *p_groups = (gid_t *)igroups;
- }
- else
- {
- gid_t *groups = (gid_t *)igroups;
- igroups = (int *)malloc(sizeof(int)*ngroups);
- for (i=0;i<ngroups;i++)
- igroups[i] = groups[i];
- *p_igroups = igroups;
- *p_groups = (gid_t *)groups;
- }
- }
- DEBUG(3,("%s is in %d groups\n",user,ngroups));
- for (i=0;i<ngroups;i++)
- DEBUG(3,("%d ",igroups[i]));
- DEBUG(3,("\n"));
- }
- return 0;
-}
-
-/****************************************************************************
- make a connection to a service
-****************************************************************************/
-int make_connection(char *service,char *user,char *password, int pwlen, char *dev,uint16 vuid)
-{
- int cnum;
- int snum;
- struct passwd *pass = NULL;
- connection_struct *pcon;
- BOOL guest = False;
- BOOL force = False;
- static BOOL first_connection = True;
-
- strlower(service);
-
- snum = find_service(service);
- if (snum < 0)
- {
- if (strequal(service,"IPC$"))
- {
- DEBUG(3,("%s refusing IPC connection\n",timestring()));
- return(-3);
- }
-
- DEBUG(0,("%s couldn't find service %s\n",timestring(),service));
- return(-2);
- }
-
- if (strequal(service,HOMES_NAME))
- {
- if (*user && Get_Pwnam(user,True))
- return(make_connection(user,user,password,pwlen,dev,vuid));
-
- if (validated_username(vuid))
- {
- strcpy(user,validated_username(vuid));
- return(make_connection(user,user,password,pwlen,dev,vuid));
- }
- }
-
- if (!lp_snum_ok(snum) || !check_access(snum)) {
- return(-4);
- }
-
- /* you can only connect to the IPC$ service as an ipc device */
- if (strequal(service,"IPC$"))
- strcpy(dev,"IPC");
-
- if (*dev == '?' || !*dev)
- {
- if (lp_print_ok(snum))
- strcpy(dev,"LPT1:");
- else
- strcpy(dev,"A:");
- }
-
- /* if the request is as a printer and you can't print then refuse */
- strupper(dev);
- if (!lp_print_ok(snum) && (strncmp(dev,"LPT",3) == 0)) {
- DEBUG(1,("Attempt to connect to non-printer as a printer\n"));
- return(-6);
- }
-
- /* lowercase the user name */
- strlower(user);
-
- /* add it as a possible user name */
- add_session_user(service);
-
- /* shall we let them in? */
- if (!authorise_login(snum,user,password,pwlen,&guest,&force,vuid))
- {
- DEBUG(2,("%s invalid username/password for %s\n",timestring(),service));
- return(-1);
- }
-
- cnum = find_free_connection(str_checksum(service) + str_checksum(user));
- if (cnum < 0)
- {
- DEBUG(0,("%s couldn't find free connection\n",timestring()));
- return(-1);
- }
-
- pcon = &Connections[cnum];
- bzero((char *)pcon,sizeof(*pcon));
-
- /* find out some info about the user */
- pass = Get_Pwnam(user,True);
-
- if (pass == NULL)
- {
- DEBUG(0,("%s couldn't find account %s\n",timestring(),user));
- return(-7);
- }
-
- pcon->read_only = lp_readonly(snum);
-
- {
- pstring list;
- StrnCpy(list,lp_readlist(snum),sizeof(pstring)-1);
- string_sub(list,"%S",service);
-
- if (user_in_list(user,list))
- pcon->read_only = True;
-
- StrnCpy(list,lp_writelist(snum),sizeof(pstring)-1);
- string_sub(list,"%S",service);
-
- if (user_in_list(user,list))
- pcon->read_only = False;
- }
-
- /* admin user check */
-
- /* JRA - original code denied admin user if the share was
- marked read_only. Changed as I don't think this is needed,
- but old code left in case there is a problem here.
- */
- if (user_in_list(user,lp_admin_users(snum))
-#if 0
- && !pcon->read_only)
-#else
- )
-#endif
- {
- pcon->admin_user = True;
- DEBUG(0,("%s logged in as admin user (root privileges)\n",user));
- }
- else
- pcon->admin_user = False;
-
- pcon->force_user = force;
- pcon->vuid = vuid;
- pcon->uid = pass->pw_uid;
- pcon->gid = pass->pw_gid;
- pcon->num_files_open = 0;
- pcon->lastused = time(NULL);
- pcon->service = snum;
- pcon->used = True;
- pcon->printer = (strncmp(dev,"LPT",3) == 0);
- pcon->ipc = (strncmp(dev,"IPC",3) == 0);
- pcon->dirptr = NULL;
- pcon->veto_list = NULL;
- pcon->hide_list = NULL;
- string_set(&pcon->dirpath,"");
- string_set(&pcon->user,user);
-
-#if HAVE_GETGRNAM
- if (*lp_force_group(snum))
- {
- struct group *gptr;
- pstring gname;
-
- StrnCpy(gname,lp_force_group(snum),sizeof(pstring)-1);
- /* default service may be a group name */
- string_sub(gname,"%S",service);
- gptr = (struct group *)getgrnam(gname);
-
- if (gptr)
- {
- pcon->gid = gptr->gr_gid;
- DEBUG(3,("Forced group %s\n",gname));
- }
- else
- DEBUG(1,("Couldn't find group %s\n",gname));
- }
-#endif
-
- if (*lp_force_user(snum))
- {
- struct passwd *pass2;
- fstring fuser;
- fstrcpy(fuser,lp_force_user(snum));
- pass2 = (struct passwd *)Get_Pwnam(fuser,True);
- if (pass2)
- {
- pcon->uid = pass2->pw_uid;
- string_set(&pcon->user,fuser);
- fstrcpy(user,fuser);
- pcon->force_user = True;
- DEBUG(3,("Forced user %s\n",fuser));
- }
- else
- DEBUG(1,("Couldn't find user %s\n",fuser));
- }
-
- {
- pstring s;
- pstrcpy(s,lp_pathname(snum));
- standard_sub(cnum,s);
- string_set(&pcon->connectpath,s);
- DEBUG(3,("Connect path is %s\n",s));
- }
-
- /* groups stuff added by ih */
- pcon->ngroups = 0;
- pcon->groups = NULL;
-
- if (!IS_IPC(cnum))
- {
- /* Find all the groups this uid is in and store them. Used by become_user() */
- setup_groups(pcon->user,pcon->uid,pcon->gid,&pcon->ngroups,&pcon->igroups,&pcon->groups);
-
- /* check number of connections */
- if (!claim_connection(cnum,
- lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)),False))
- {
- DEBUG(1,("too many connections - rejected\n"));
- return(-8);
- }
-
- if (lp_status(SNUM(cnum)))
- claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection);
-
- first_connection = False;
- } /* IS_IPC */
-
- pcon->open = True;
-
- /* execute any "root preexec = " line */
- if (*lp_rootpreexec(SNUM(cnum)))
- {
- pstring cmd;
- pstrcpy(cmd,lp_rootpreexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
- DEBUG(5,("cmd=%s\n",cmd));
- smbrun(cmd,NULL,False);
- }
-
- if (!become_user(cnum,pcon->vuid))
- {
- DEBUG(0,("Can't become connected user!\n"));
- pcon->open = False;
- if (!IS_IPC(cnum)) {
- yield_connection(cnum,
- lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
- }
- return(-1);
- }
-
- if (ChDir(pcon->connectpath) != 0)
- {
- DEBUG(0,("Can't change directory to %s (%s)\n",
- pcon->connectpath,strerror(errno)));
- pcon->open = False;
- unbecome_user();
- if (!IS_IPC(cnum)) {
- yield_connection(cnum,
- lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
- if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
- }
- return(-5);
- }
-
- string_set(&pcon->origpath,pcon->connectpath);
-
-#if SOFTLINK_OPTIMISATION
- /* resolve any soft links early */
- {
- pstring s;
- pstrcpy(s,pcon->connectpath);
- GetWd(s);
- string_set(&pcon->connectpath,s);
- ChDir(pcon->connectpath);
- }
-#endif
-
- num_connections_open++;
- add_session_user(user);
-
- /* execute any "preexec = " line */
- if (*lp_preexec(SNUM(cnum)))
- {
- pstring cmd;
- pstrcpy(cmd,lp_preexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
- smbrun(cmd,NULL,False);
- }
-
- /* we've finished with the sensitive stuff */
- unbecome_user();
-
- /* Add veto/hide lists */
- if (!IS_IPC(cnum) && !IS_PRINT(cnum))
- {
- set_namearray( &pcon->veto_list, lp_veto_files(SNUM(cnum)));
- set_namearray( &pcon->hide_list, lp_hide_files(SNUM(cnum)));
- }
-
- {
- DEBUG(IS_IPC(cnum)?3:1,("%s %s (%s) connect to service %s as user %s (uid=%d,gid=%d) (pid %d)\n",
- timestring(),
- remote_machine,
- client_addr(),
- lp_servicename(SNUM(cnum)),user,
- pcon->uid,
- pcon->gid,
- (int)getpid()));
- }
-
- return(cnum);
-}
-
-
-/****************************************************************************
- find first available file slot
-****************************************************************************/
-int find_free_file(void )
-{
- int i;
- /* we start at 1 here for an obscure reason I can't now remember,
- but I think is important :-) */
- for (i=1;i<MAX_OPEN_FILES;i++)
- if (!Files[i].open)
- return(i);
- DEBUG(1,("ERROR! Out of file structures - perhaps increase MAX_OPEN_FILES?\n"));
- return(-1);
-}
-
-/****************************************************************************
- find first available connection slot, starting from a random position.
-The randomisation stops problems with the server dieing and clients
-thinking the server is still available.
-****************************************************************************/
-static int find_free_connection(int hash )
-{
- int i;
- BOOL used=False;
- hash = (hash % (MAX_CONNECTIONS-2))+1;
-
- again:
-
- for (i=hash+1;i!=hash;)
- {
- if (!Connections[i].open && Connections[i].used == used)
- {
- DEBUG(3,("found free connection number %d\n",i));
- return(i);
- }
- i++;
- if (i == MAX_CONNECTIONS)
- i = 1;
- }
-
- if (!used)
- {
- used = !used;
- goto again;
- }
-
- DEBUG(1,("ERROR! Out of connection structures\n"));
- return(-1);
-}
-
-
-/****************************************************************************
-reply for the core protocol
-****************************************************************************/
-int reply_corep(char *outbuf)
-{
- int outsize = set_message(outbuf,1,0,True);
-
- Protocol = PROTOCOL_CORE;
-
- return outsize;
-}
-
-
-/****************************************************************************
-reply for the coreplus protocol
-****************************************************************************/
-int reply_coreplus(char *outbuf)
-{
- int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
- int outsize = set_message(outbuf,13,0,True);
- SSVAL(outbuf,smb_vwv5,raw); /* tell redirector we support
- readbraw and writebraw (possibly) */
- CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
- SSVAL(outbuf,smb_vwv1,0x1); /* user level security, don't encrypt */
-
- Protocol = PROTOCOL_COREPLUS;
-
- return outsize;
-}
-
-
-/****************************************************************************
-reply for the lanman 1.0 protocol
-****************************************************************************/
-int reply_lanman1(char *outbuf)
-{
- int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
- int secword=0;
- BOOL doencrypt = SMBENCRYPT();
- time_t t = time(NULL);
- /* We need to save and restore this as it can be destroyed
- if we call another server if security=server
- Thanks to Paul Nelson @ Thursby for pointing this out.
- */
- uint16 mid = SVAL(outbuf, smb_mid);
-
- if (lp_security()>=SEC_USER) secword |= 1;
- if (doencrypt) secword |= 2;
-
- set_message(outbuf,13,doencrypt?8:0,True);
- SSVAL(outbuf,smb_vwv1,secword);
- /* Create a token value and add it to the outgoing packet. */
- if (doencrypt)
- generate_next_challenge(smb_buf(outbuf));
-
- Protocol = PROTOCOL_LANMAN1;
-
- if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
- DEBUG(3,("using password server validation\n"));
- if (doencrypt) set_challenge(smb_buf(outbuf));
- }
-
- CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
- SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
- SSVAL(outbuf,smb_vwv2,max_recv);
- SSVAL(outbuf,smb_vwv3,lp_maxmux()); /* maxmux */
- SSVAL(outbuf,smb_vwv4,1);
- SSVAL(outbuf,smb_vwv5,raw); /* tell redirector we support
- readbraw writebraw (possibly) */
- SIVAL(outbuf,smb_vwv6,getpid());
- SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
-
- put_dos_date(outbuf,smb_vwv8,t);
-
- return (smb_len(outbuf)+4);
-}
-
-
-/****************************************************************************
-reply for the lanman 2.0 protocol
-****************************************************************************/
-int reply_lanman2(char *outbuf)
-{
- int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
- int secword=0;
- BOOL doencrypt = SMBENCRYPT();
- time_t t = time(NULL);
- /* We need to save and restore this as it can be destroyed
- if we call another server if security=server
- Thanks to Paul Nelson @ Thursby for pointing this out.
- */
- uint16 mid = SVAL(outbuf, smb_mid);
-
- if (lp_security()>=SEC_USER) secword |= 1;
- if (doencrypt) secword |= 2;
-
- set_message(outbuf,13,doencrypt?8:0,True);
- SSVAL(outbuf,smb_vwv1,secword);
- /* Create a token value and add it to the outgoing packet. */
- if (doencrypt)
- generate_next_challenge(smb_buf(outbuf));
-
- SIVAL(outbuf,smb_vwv6,getpid());
-
- Protocol = PROTOCOL_LANMAN2;
-
- if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
- DEBUG(3,("using password server validation\n"));
- if (doencrypt) set_challenge(smb_buf(outbuf));
- }
-
- CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
- SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
- SSVAL(outbuf,smb_vwv2,max_recv);
- SSVAL(outbuf,smb_vwv3,lp_maxmux());
- SSVAL(outbuf,smb_vwv4,1);
- SSVAL(outbuf,smb_vwv5,raw); /* readbraw and/or writebraw */
- SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
- put_dos_date(outbuf,smb_vwv8,t);
-
- return (smb_len(outbuf)+4);
-}
-
-
-/****************************************************************************
-reply for the nt protocol
-****************************************************************************/
-int reply_nt1(char *outbuf)
-{
- /* dual names + lock_and_read + nt SMBs + remote API calls */
- int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ;
-/*
- other valid capabilities which we may support at some time...
- CAP_LARGE_FILES|CAP_NT_SMBS|CAP_RPC_REMOTE_APIS;
- CAP_LARGE_FILES|CAP_LARGE_READX|
- CAP_STATUS32|CAP_LEVEL_II_OPLOCKS;
- */
-
- int secword=0;
- BOOL doencrypt = SMBENCRYPT();
- time_t t = time(NULL);
- int data_len;
- int encrypt_len;
- char challenge_len = 8;
- /* We need to save and restore this as it can be destroyed
- if we call another server if security=server
- Thanks to Paul Nelson @ Thursby for pointing this out.
- */
- uint16 mid = SVAL(outbuf, smb_mid);
-
- if (lp_readraw() && lp_writeraw())
- {
- capabilities |= CAP_RAW_MODE;
- }
-
- if (lp_security()>=SEC_USER) secword |= 1;
- if (doencrypt) secword |= 2;
-
- /* decide where (if) to put the encryption challenge, and
- follow it with the OEM'd domain name
- */
- encrypt_len = doencrypt?challenge_len:0;
-#if UNICODE
- data_len = encrypt_len + 2*(strlen(myworkgroup)+1);
-#else
- data_len = encrypt_len + strlen(myworkgroup) + 1;
-#endif
-
- set_message(outbuf,17,data_len,True);
-
-#if UNICODE
- /* put the OEM'd domain name */
- PutUniCode(smb_buf(outbuf)+encrypt_len,myworkgroup);
-#else
- strcpy(smb_buf(outbuf)+encrypt_len, myworkgroup);
-#endif
-
- CVAL(outbuf,smb_vwv1) = secword;
- /* Create a token value and add it to the outgoing packet. */
- if (doencrypt)
- {
- generate_next_challenge(smb_buf(outbuf));
-
- /* Tell the nt machine how long the challenge is. */
- SSVALS(outbuf,smb_vwv16+1,challenge_len);
- }
-
- Protocol = PROTOCOL_NT1;
-
- if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
- DEBUG(3,("using password server validation\n"));
- if (doencrypt) set_challenge(smb_buf(outbuf));
- }
-
- SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
- SSVAL(outbuf,smb_vwv1+1,lp_maxmux()); /* maxmpx */
- SSVAL(outbuf,smb_vwv2+1,1); /* num vcs */
- SIVAL(outbuf,smb_vwv3+1,0xffff); /* max buffer. LOTS! */
- SIVAL(outbuf,smb_vwv5+1,0xffff); /* raw size. LOTS! */
- SIVAL(outbuf,smb_vwv7+1,getpid()); /* session key */
- SIVAL(outbuf,smb_vwv9+1,capabilities); /* capabilities */
- put_long_date(outbuf+smb_vwv11+1,t);
- SSVALS(outbuf,smb_vwv15+1,TimeDiff(t)/60);
- SSVAL(outbuf,smb_vwv17,data_len); /* length of challenge+domain strings */
-
- return (smb_len(outbuf)+4);
-}
-
-/* these are the protocol lists used for auto architecture detection:
-
-WinNT 3.51:
-protocol [PC NETWORK PROGRAM 1.0]
-protocol [XENIX CORE]
-protocol [MICROSOFT NETWORKS 1.03]
-protocol [LANMAN1.0]
-protocol [Windows for Workgroups 3.1a]
-protocol [LM1.2X002]
-protocol [LANMAN2.1]
-protocol [NT LM 0.12]
-
-Win95:
-protocol [PC NETWORK PROGRAM 1.0]
-protocol [XENIX CORE]
-protocol [MICROSOFT NETWORKS 1.03]
-protocol [LANMAN1.0]
-protocol [Windows for Workgroups 3.1a]
-protocol [LM1.2X002]
-protocol [LANMAN2.1]
-protocol [NT LM 0.12]
-
-OS/2:
-protocol [PC NETWORK PROGRAM 1.0]
-protocol [XENIX CORE]
-protocol [LANMAN1.0]
-protocol [LM1.2X002]
-protocol [LANMAN2.1]
-*/
-
-/*
- * Modified to recognize the architecture of the remote machine better.
- *
- * This appears to be the matrix of which protocol is used by which
- * MS product.
- Protocol WfWg Win95 WinNT OS/2
- PC NETWORK PROGRAM 1.0 1 1 1 1
- XENIX CORE 2 2
- MICROSOFT NETWORKS 3.0 2 2
- DOS LM1.2X002 3 3
- MICROSOFT NETWORKS 1.03 3
- DOS LANMAN2.1 4 4
- LANMAN1.0 4 3
- Windows for Workgroups 3.1a 5 5 5
- LM1.2X002 6 4
- LANMAN2.1 7 5
- NT LM 0.12 6 8
- *
- * tim@fsg.com 09/29/95
- */
-
-#define ARCH_WFWG 0x3 /* This is a fudge because WfWg is like Win95 */
-#define ARCH_WIN95 0x2
-#define ARCH_OS2 0xC /* Again OS/2 is like NT */
-#define ARCH_WINNT 0x8
-#define ARCH_SAMBA 0x10
-
-#define ARCH_ALL 0x1F
-
-/* List of supported protocols, most desired first */
-struct {
- char *proto_name;
- char *short_name;
- int (*proto_reply_fn)(char *);
- int protocol_level;
-} supported_protocols[] = {
- {"NT LANMAN 1.0", "NT1", reply_nt1, PROTOCOL_NT1},
- {"NT LM 0.12", "NT1", reply_nt1, PROTOCOL_NT1},
- {"LM1.2X002", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
- {"Samba", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
- {"DOS LM1.2X002", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
- {"LANMAN1.0", "LANMAN1", reply_lanman1, PROTOCOL_LANMAN1},
- {"MICROSOFT NETWORKS 3.0", "LANMAN1", reply_lanman1, PROTOCOL_LANMAN1},
- {"MICROSOFT NETWORKS 1.03", "COREPLUS", reply_coreplus, PROTOCOL_COREPLUS},
- {"PC NETWORK PROGRAM 1.0", "CORE", reply_corep, PROTOCOL_CORE},
- {NULL,NULL},
-};
-
-
-/****************************************************************************
- reply to a negprot
-****************************************************************************/
-static int reply_negprot(char *inbuf,char *outbuf)
-{
- int outsize = set_message(outbuf,1,0,True);
- int Index=0;
- int choice= -1;
- int protocol;
- char *p;
- int bcc = SVAL(smb_buf(inbuf),-2);
- int arch = ARCH_ALL;
-
- p = smb_buf(inbuf)+1;
- while (p < (smb_buf(inbuf) + bcc))
- {
- Index++;
- DEBUG(3,("Requested protocol [%s]\n",p));
- if (strcsequal(p,"Windows for Workgroups 3.1a"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 | ARCH_WINNT );
- else if (strcsequal(p,"DOS LM1.2X002"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 );
- else if (strcsequal(p,"DOS LANMAN2.1"))
- arch &= ( ARCH_WFWG | ARCH_WIN95 );
- else if (strcsequal(p,"NT LM 0.12"))
- arch &= ( ARCH_WIN95 | ARCH_WINNT );
- else if (strcsequal(p,"LANMAN2.1"))
- arch &= ( ARCH_WINNT | ARCH_OS2 );
- else if (strcsequal(p,"LM1.2X002"))
- arch &= ( ARCH_WINNT | ARCH_OS2 );
- else if (strcsequal(p,"MICROSOFT NETWORKS 1.03"))
- arch &= ARCH_WINNT;
- else if (strcsequal(p,"XENIX CORE"))
- arch &= ( ARCH_WINNT | ARCH_OS2 );
- else if (strcsequal(p,"Samba")) {
- arch = ARCH_SAMBA;
- break;
- }
-
- p += strlen(p) + 2;
- }
-
- switch ( arch ) {
- case ARCH_SAMBA:
- set_remote_arch(RA_SAMBA);
- break;
- case ARCH_WFWG:
- set_remote_arch(RA_WFWG);
- break;
- case ARCH_WIN95:
- set_remote_arch(RA_WIN95);
- break;
- case ARCH_WINNT:
- set_remote_arch(RA_WINNT);
- break;
- case ARCH_OS2:
- set_remote_arch(RA_OS2);
- break;
- default:
- set_remote_arch(RA_UNKNOWN);
- break;
- }
-
- /* possibly reload - change of architecture */
- reload_services(True);
-
- /* a special case to stop password server loops */
- if (Index == 1 && strequal(remote_machine,myhostname) &&
- lp_security()==SEC_SERVER)
- exit_server("Password server loop!");
-
- /* Check for protocols, most desirable first */
- for (protocol = 0; supported_protocols[protocol].proto_name; protocol++)
- {
- p = smb_buf(inbuf)+1;
- Index = 0;
- if (lp_maxprotocol() >= supported_protocols[protocol].protocol_level)
- while (p < (smb_buf(inbuf) + bcc))
- {
- if (strequal(p,supported_protocols[protocol].proto_name))
- choice = Index;
- Index++;
- p += strlen(p) + 2;
- }
- if(choice != -1)
- break;
- }
-
- SSVAL(outbuf,smb_vwv0,choice);
- if(choice != -1) {
- extern fstring remote_proto;
- fstrcpy(remote_proto,supported_protocols[protocol].short_name);
- reload_services(True);
- outsize = supported_protocols[protocol].proto_reply_fn(outbuf);
- DEBUG(3,("Selected protocol %s\n",supported_protocols[protocol].proto_name));
- }
- else {
- DEBUG(0,("No protocol supported !\n"));
- }
- SSVAL(outbuf,smb_vwv0,choice);
-
- DEBUG(5,("%s negprot index=%d\n",timestring(),choice));
-
- return(outsize);
-}
-
-
-/****************************************************************************
-close all open files for a connection
-****************************************************************************/
-static void close_open_files(int cnum)
-{
- int i;
- for (i=0;i<MAX_OPEN_FILES;i++)
- if( Files[i].cnum == cnum && Files[i].open) {
- close_file(i);
- }
-}
-
-
-
-/****************************************************************************
-close a cnum
-****************************************************************************/
-void close_cnum(int cnum, uint16 vuid)
-{
- DirCacheFlush(SNUM(cnum));
-
- unbecome_user();
-
- if (!OPEN_CNUM(cnum))
- {
- DEBUG(0,("Can't close cnum %d\n",cnum));
- return;
- }
-
- DEBUG(IS_IPC(cnum)?3:1,("%s %s (%s) closed connection to service %s\n",
- timestring(),
- remote_machine,client_addr(),
- lp_servicename(SNUM(cnum))));
-
- yield_connection(cnum,
- lp_servicename(SNUM(cnum)),
- lp_max_connections(SNUM(cnum)));
-
- if (lp_status(SNUM(cnum)))
- yield_connection(cnum,"STATUS.",MAXSTATUS);
-
- close_open_files(cnum);
- dptr_closecnum(cnum);
-
- /* execute any "postexec = " line */
- if (*lp_postexec(SNUM(cnum)) && become_user(cnum,vuid))
- {
- pstring cmd;
- strcpy(cmd,lp_postexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
- smbrun(cmd,NULL,False);
- unbecome_user();
- }
-
- unbecome_user();
- /* execute any "root postexec = " line */
- if (*lp_rootpostexec(SNUM(cnum)))
- {
- pstring cmd;
- strcpy(cmd,lp_rootpostexec(SNUM(cnum)));
- standard_sub(cnum,cmd);
- smbrun(cmd,NULL,False);
- }
-
- Connections[cnum].open = False;
- num_connections_open--;
- if (Connections[cnum].ngroups && Connections[cnum].groups)
- {
- if (Connections[cnum].igroups != (int *)Connections[cnum].groups)
- free(Connections[cnum].groups);
- free(Connections[cnum].igroups);
- Connections[cnum].groups = NULL;
- Connections[cnum].igroups = NULL;
- Connections[cnum].ngroups = 0;
- }
-
- free_namearray(Connections[cnum].veto_list);
- free_namearray(Connections[cnum].hide_list);
-
- string_set(&Connections[cnum].user,"");
- string_set(&Connections[cnum].dirpath,"");
- string_set(&Connections[cnum].connectpath,"");
-}
-
-
-/****************************************************************************
-simple routines to do connection counting
-****************************************************************************/
-BOOL yield_connection(int cnum,char *name,int max_connections)
-{
- struct connect_record crec;
- pstring fname;
- FILE *f;
- int mypid = getpid();
- int i;
-
- DEBUG(3,("Yielding connection to %d %s\n",cnum,name));
-
- if (max_connections <= 0)
- return(True);
-
- bzero(&crec,sizeof(crec));
-
- pstrcpy(fname,lp_lockdir());
- standard_sub(cnum,fname);
- trim_string(fname,"","/");
-
- strcat(fname,"/");
- strcat(fname,name);
- strcat(fname,".LCK");
-
- f = fopen(fname,"r+");
- if (!f)
- {
- DEBUG(2,("Couldn't open lock file %s (%s)\n",fname,strerror(errno)));
- return(False);
- }
-
- fseek(f,0,SEEK_SET);
-
- /* find a free spot */
- for (i=0;i<max_connections;i++)
- {
- if (fread(&crec,sizeof(crec),1,f) != 1)
- {
- DEBUG(2,("Entry not found in lock file %s\n",fname));
- fclose(f);
- return(False);
- }
- if (crec.pid == mypid && crec.cnum == cnum)
- break;
- }
-
- if (crec.pid != mypid || crec.cnum != cnum)
- {
- fclose(f);
- DEBUG(2,("Entry not found in lock file %s\n",fname));
- return(False);
- }
-
- bzero((void *)&crec,sizeof(crec));
-
- /* remove our mark */
- if (fseek(f,i*sizeof(crec),SEEK_SET) != 0 ||
- fwrite(&crec,sizeof(crec),1,f) != 1)
- {
- DEBUG(2,("Couldn't update lock file %s (%s)\n",fname,strerror(errno)));
- fclose(f);
- return(False);
- }
-
- DEBUG(3,("Yield successful\n"));
-
- fclose(f);
- return(True);
-}
-
-
-/****************************************************************************
-simple routines to do connection counting
-****************************************************************************/
-BOOL claim_connection(int cnum,char *name,int max_connections,BOOL Clear)
-{
- struct connect_record crec;
- pstring fname;
- FILE *f;
- int snum = SNUM(cnum);
- int i,foundi= -1;
- int total_recs;
-
- if (max_connections <= 0)
- return(True);
-
- DEBUG(5,("trying claim %s %s %d\n",lp_lockdir(),name,max_connections));
-
- pstrcpy(fname,lp_lockdir());
- standard_sub(cnum,fname);
- trim_string(fname,"","/");
-
- if (!directory_exist(fname,NULL))
- mkdir(fname,0755);
-
- strcat(fname,"/");
- strcat(fname,name);
- strcat(fname,".LCK");
-
- if (!file_exist(fname,NULL))
- {
- int oldmask = umask(022);
- f = fopen(fname,"w");
- if (f) fclose(f);
- umask(oldmask);
- }
-
- total_recs = file_size(fname) / sizeof(crec);
-
- f = fopen(fname,"r+");
-
- if (!f)
- {
- DEBUG(1,("couldn't open lock file %s\n",fname));
- return(False);
- }
-
- /* find a free spot */
- for (i=0;i<max_connections;i++)
- {
-
- if (i>=total_recs ||
- fseek(f,i*sizeof(crec),SEEK_SET) != 0 ||
- fread(&crec,sizeof(crec),1,f) != 1)
- {
- if (foundi < 0) foundi = i;
- break;
- }
-
- if (Clear && crec.pid && !process_exists(crec.pid))
- {
- fseek(f,i*sizeof(crec),SEEK_SET);
- bzero((void *)&crec,sizeof(crec));
- fwrite(&crec,sizeof(crec),1,f);
- if (foundi < 0) foundi = i;
- continue;
- }
- if (foundi < 0 && (!crec.pid || !process_exists(crec.pid)))
- {
- foundi=i;
- if (!Clear) break;
- }
- }
-
- if (foundi < 0)
- {
- DEBUG(3,("no free locks in %s\n",fname));
- fclose(f);
- return(False);
- }
-
- /* fill in the crec */
- bzero((void *)&crec,sizeof(crec));
- crec.magic = 0x280267;
- crec.pid = getpid();
- crec.cnum = cnum;
- crec.uid = Connections[cnum].uid;
- crec.gid = Connections[cnum].gid;
- StrnCpy(crec.name,lp_servicename(snum),sizeof(crec.name)-1);
- crec.start = time(NULL);
-
- StrnCpy(crec.machine,remote_machine,sizeof(crec.machine)-1);
- StrnCpy(crec.addr,client_addr(),sizeof(crec.addr)-1);
-
- /* make our mark */
- if (fseek(f,foundi*sizeof(crec),SEEK_SET) != 0 ||
- fwrite(&crec,sizeof(crec),1,f) != 1)
- {
- fclose(f);
- return(False);
- }
-
- fclose(f);
- return(True);
-}
-
-#if DUMP_CORE
-/*******************************************************************
-prepare to dump a core file - carefully!
-********************************************************************/
-static BOOL dump_core(void)
-{
- char *p;
- pstring dname;
- pstrcpy(dname,debugf);
- if ((p=strrchr(dname,'/'))) *p=0;
- strcat(dname,"/corefiles");
- mkdir(dname,0700);
- sys_chown(dname,getuid(),getgid());
- chmod(dname,0700);
- if (chdir(dname)) return(False);
- umask(~(0700));
-
-#ifndef NO_GETRLIMIT
-#ifdef RLIMIT_CORE
- {
- struct rlimit rlp;
- getrlimit(RLIMIT_CORE, &rlp);
- rlp.rlim_cur = MAX(4*1024*1024,rlp.rlim_cur);
- setrlimit(RLIMIT_CORE, &rlp);
- getrlimit(RLIMIT_CORE, &rlp);
- DEBUG(3,("Core limits now %d %d\n",rlp.rlim_cur,rlp.rlim_max));
- }
-#endif
-#endif
-
-
- DEBUG(0,("Dumping core in %s\n",dname));
- return(True);
-}
-#endif
-
-/****************************************************************************
-exit the server
-****************************************************************************/
-void exit_server(char *reason)
-{
- static int firsttime=1;
- int i;
-
- if (!firsttime) exit(0);
- firsttime = 0;
-
- unbecome_user();
- DEBUG(2,("Closing connections\n"));
- for (i=0;i<MAX_CONNECTIONS;i++)
- if (Connections[i].open)
- close_cnum(i,(uint16)-1);
-#ifdef DFS_AUTH
- if (dcelogin_atmost_once)
- dfs_unlogin();
-#endif
- if (!reason) {
- int oldlevel = DEBUGLEVEL;
- DEBUGLEVEL = 10;
- DEBUG(0,("Last message was %s\n",smb_fn_name(last_message)));
- if (last_inbuf)
- show_msg(last_inbuf);
- DEBUGLEVEL = oldlevel;
- DEBUG(0,("===============================================================\n"));
-#if DUMP_CORE
- if (dump_core()) return;
-#endif
- }
-
-#ifdef FAST_SHARE_MODES
- stop_share_mode_mgmt();
-#endif /* FAST_SHARE_MODES */
-
- DEBUG(3,("%s Server exit (%s)\n",timestring(),reason?reason:""));
- exit(0);
-}
-
-/****************************************************************************
-do some standard substitutions in a string
-****************************************************************************/
-void standard_sub(int cnum,char *str)
-{
- if (VALID_CNUM(cnum)) {
- char *p, *s, *home;
-
- for ( s=str ; (p=strchr(s, '%')) != NULL ; s=p ) {
- switch (*(p+1)) {
- case 'H' : if ((home = get_home_dir(Connections[cnum].user))!=NULL)
- string_sub(p,"%H",home);
- else
- p += 2;
- break;
- case 'P' : string_sub(p,"%P",Connections[cnum].connectpath); break;
- case 'S' : string_sub(p,"%S",lp_servicename(Connections[cnum].service)); break;
- case 'g' : string_sub(p,"%g",gidtoname(Connections[cnum].gid)); break;
- case 'u' : string_sub(p,"%u",Connections[cnum].user); break;
- case '\0' : p++; break; /* don't run off the end of the string */
- default : p+=2; break;
- }
- }
- }
- standard_sub_basic(str);
-}
-
-/*
-These flags determine some of the permissions required to do an operation
-
-Note that I don't set NEED_WRITE on some write operations because they
-are used by some brain-dead clients when printing, and I don't want to
-force write permissions on print services.
-*/
-#define AS_USER (1<<0)
-#define NEED_WRITE (1<<1)
-#define TIME_INIT (1<<2)
-#define CAN_IPC (1<<3)
-#define AS_GUEST (1<<5)
-
-
-/*
- define a list of possible SMB messages and their corresponding
- functions. Any message that has a NULL function is unimplemented -
- please feel free to contribute implementations!
-*/
-struct smb_message_struct
-{
- int code;
- char *name;
- int (*fn)();
- int flags;
-#if PROFILING
- unsigned long time;
-#endif
-}
- smb_messages[] = {
-
- /* CORE PROTOCOL */
-
- {SMBnegprot,"SMBnegprot",reply_negprot,0},
- {SMBtcon,"SMBtcon",reply_tcon,0},
- {SMBtdis,"SMBtdis",reply_tdis,0},
- {SMBexit,"SMBexit",reply_exit,0},
- {SMBioctl,"SMBioctl",reply_ioctl,0},
- {SMBecho,"SMBecho",reply_echo,0},
- {SMBsesssetupX,"SMBsesssetupX",reply_sesssetup_and_X,0},
- {SMBtconX,"SMBtconX",reply_tcon_and_X,0},
- {SMBulogoffX, "SMBulogoffX", reply_ulogoffX, 0}, /* ulogoff doesn't give a valid TID */
- {SMBgetatr,"SMBgetatr",reply_getatr,AS_USER},
- {SMBsetatr,"SMBsetatr",reply_setatr,AS_USER | NEED_WRITE},
- {SMBchkpth,"SMBchkpth",reply_chkpth,AS_USER},
- {SMBsearch,"SMBsearch",reply_search,AS_USER},
- {SMBopen,"SMBopen",reply_open,AS_USER},
-
- /* note that SMBmknew and SMBcreate are deliberately overloaded */
- {SMBcreate,"SMBcreate",reply_mknew,AS_USER},
- {SMBmknew,"SMBmknew",reply_mknew,AS_USER},
-
- {SMBunlink,"SMBunlink",reply_unlink,AS_USER | NEED_WRITE},
- {SMBread,"SMBread",reply_read,AS_USER},
- {SMBwrite,"SMBwrite",reply_write,AS_USER},
- {SMBclose,"SMBclose",reply_close,AS_USER | CAN_IPC},
- {SMBmkdir,"SMBmkdir",reply_mkdir,AS_USER | NEED_WRITE},
- {SMBrmdir,"SMBrmdir",reply_rmdir,AS_USER | NEED_WRITE},
- {SMBdskattr,"SMBdskattr",reply_dskattr,AS_USER},
- {SMBmv,"SMBmv",reply_mv,AS_USER | NEED_WRITE},
-
- /* this is a Pathworks specific call, allowing the
- changing of the root path */
- {pSETDIR,"pSETDIR",reply_setdir,AS_USER},
-
- {SMBlseek,"SMBlseek",reply_lseek,AS_USER},
- {SMBflush,"SMBflush",reply_flush,AS_USER},
- {SMBctemp,"SMBctemp",reply_ctemp,AS_USER},
- {SMBsplopen,"SMBsplopen",reply_printopen,AS_USER},
- {SMBsplclose,"SMBsplclose",reply_printclose,AS_USER},
- {SMBsplretq,"SMBsplretq",reply_printqueue,AS_USER|AS_GUEST},
- {SMBsplwr,"SMBsplwr",reply_printwrite,AS_USER},
- {SMBlock,"SMBlock",reply_lock,AS_USER},
- {SMBunlock,"SMBunlock",reply_unlock,AS_USER},
-
- /* CORE+ PROTOCOL FOLLOWS */
-
- {SMBreadbraw,"SMBreadbraw",reply_readbraw,AS_USER},
- {SMBwritebraw,"SMBwritebraw",reply_writebraw,AS_USER},
- {SMBwriteclose,"SMBwriteclose",reply_writeclose,AS_USER},
- {SMBlockread,"SMBlockread",reply_lockread,AS_USER},
- {SMBwriteunlock,"SMBwriteunlock",reply_writeunlock,AS_USER},
-
- /* LANMAN1.0 PROTOCOL FOLLOWS */
-
- {SMBreadBmpx,"SMBreadBmpx",reply_readbmpx,AS_USER},
- {SMBreadBs,"SMBreadBs",NULL,AS_USER},
- {SMBwriteBmpx,"SMBwriteBmpx",reply_writebmpx,AS_USER},
- {SMBwriteBs,"SMBwriteBs",reply_writebs,AS_USER},
- {SMBwritec,"SMBwritec",NULL,AS_USER},
- {SMBsetattrE,"SMBsetattrE",reply_setattrE,AS_USER | NEED_WRITE},
- {SMBgetattrE,"SMBgetattrE",reply_getattrE,AS_USER},
- {SMBtrans,"SMBtrans",reply_trans,AS_USER | CAN_IPC},
- {SMBtranss,"SMBtranss",NULL,AS_USER | CAN_IPC},
- {SMBioctls,"SMBioctls",NULL,AS_USER},
- {SMBcopy,"SMBcopy",reply_copy,AS_USER | NEED_WRITE},
- {SMBmove,"SMBmove",NULL,AS_USER | NEED_WRITE},
-
- {SMBopenX,"SMBopenX",reply_open_and_X,AS_USER | CAN_IPC},
- {SMBreadX,"SMBreadX",reply_read_and_X,AS_USER},
- {SMBwriteX,"SMBwriteX",reply_write_and_X,AS_USER},
- {SMBlockingX,"SMBlockingX",reply_lockingX,AS_USER},
-
- {SMBffirst,"SMBffirst",reply_search,AS_USER},
- {SMBfunique,"SMBfunique",reply_search,AS_USER},
- {SMBfclose,"SMBfclose",reply_fclose,AS_USER},
-
- /* LANMAN2.0 PROTOCOL FOLLOWS */
- {SMBfindnclose, "SMBfindnclose", reply_findnclose, AS_USER},
- {SMBfindclose, "SMBfindclose", reply_findclose,AS_USER},
- {SMBtrans2, "SMBtrans2", reply_trans2, AS_USER},
- {SMBtranss2, "SMBtranss2", reply_transs2, AS_USER},
-
- /* messaging routines */
- {SMBsends,"SMBsends",reply_sends,AS_GUEST},
- {SMBsendstrt,"SMBsendstrt",reply_sendstrt,AS_GUEST},
- {SMBsendend,"SMBsendend",reply_sendend,AS_GUEST},
- {SMBsendtxt,"SMBsendtxt",reply_sendtxt,AS_GUEST},
-
- /* NON-IMPLEMENTED PARTS OF THE CORE PROTOCOL */
-
- {SMBsendb,"SMBsendb",NULL,AS_GUEST},
- {SMBfwdname,"SMBfwdname",NULL,AS_GUEST},
- {SMBcancelf,"SMBcancelf",NULL,AS_GUEST},
- {SMBgetmac,"SMBgetmac",NULL,AS_GUEST}
- };
-
-/****************************************************************************
-return a string containing the function name of a SMB command
-****************************************************************************/
-char *smb_fn_name(int type)
-{
- static char *unknown_name = "SMBunknown";
- static int num_smb_messages =
- sizeof(smb_messages) / sizeof(struct smb_message_struct);
- int match;
-
- for (match=0;match<num_smb_messages;match++)
- if (smb_messages[match].code == type)
- break;
-
- if (match == num_smb_messages)
- return(unknown_name);
-
- return(smb_messages[match].name);
-}
-
-
-/****************************************************************************
-do a switch on the message type, and return the response size
-****************************************************************************/
-static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize)
-{
- static int pid= -1;
- int outsize = 0;
- static int num_smb_messages =
- sizeof(smb_messages) / sizeof(struct smb_message_struct);
- int match;
-
-#if PROFILING
- struct timeval msg_start_time;
- struct timeval msg_end_time;
- static unsigned long total_time = 0;
-
- GetTimeOfDay(&msg_start_time);
-#endif
-
- if (pid == -1)
- pid = getpid();
-
- errno = 0;
- last_message = type;
-
- /* make sure this is an SMB packet */
- if (strncmp(smb_base(inbuf),"\377SMB",4) != 0)
- {
- DEBUG(2,("Non-SMB packet of length %d\n",smb_len(inbuf)));
- return(-1);
- }
-
- for (match=0;match<num_smb_messages;match++)
- if (smb_messages[match].code == type)
- break;
-
- if (match == num_smb_messages)
- {
- DEBUG(0,("Unknown message type %d!\n",type));
- outsize = reply_unknown(inbuf,outbuf);
- }
- else
- {
- DEBUG(3,("switch message %s (pid %d)\n",smb_messages[match].name,pid));
- if (smb_messages[match].fn)
- {
- int cnum = SVAL(inbuf,smb_tid);
- int flags = smb_messages[match].flags;
- uint16 session_tag = SVAL(inbuf,smb_uid);
-
- /* does this protocol need to be run as root? */
- if (!(flags & AS_USER))
- unbecome_user();
-
- /* does this protocol need to be run as the connected user? */
- if ((flags & AS_USER) && !become_user(cnum,session_tag)) {
- if (flags & AS_GUEST)
- flags &= ~AS_USER;
- else
- return(ERROR(ERRSRV,ERRinvnid));
- }
- /* this code is to work around a bug is MS client 3 without
- introducing a security hole - it needs to be able to do
- print queue checks as guest if it isn't logged in properly */
- if (flags & AS_USER)
- flags &= ~AS_GUEST;
-
- /* does it need write permission? */
- if ((flags & NEED_WRITE) && !CAN_WRITE(cnum))
- return(ERROR(ERRSRV,ERRaccess));
-
- /* ipc services are limited */
- if (IS_IPC(cnum) && (flags & AS_USER) && !(flags & CAN_IPC))
- return(ERROR(ERRSRV,ERRaccess));
-
- /* load service specific parameters */
- if (OPEN_CNUM(cnum) && !become_service(cnum,(flags & AS_USER)?True:False))
- return(ERROR(ERRSRV,ERRaccess));
-
- /* does this protocol need to be run as guest? */
- if ((flags & AS_GUEST) && (!become_guest() || !check_access(-1)))
- return(ERROR(ERRSRV,ERRaccess));
-
- last_inbuf = inbuf;
-
- outsize = smb_messages[match].fn(inbuf,outbuf,size,bufsize);
- }
- else
- {
- outsize = reply_unknown(inbuf,outbuf);
- }
- }
-
-#if PROFILING
- GetTimeOfDay(&msg_end_time);
- if (!(smb_messages[match].flags & TIME_INIT))
- {
- smb_messages[match].time = 0;
- smb_messages[match].flags |= TIME_INIT;
- }
- {
- unsigned long this_time =
- (msg_end_time.tv_sec - msg_start_time.tv_sec)*1e6 +
- (msg_end_time.tv_usec - msg_start_time.tv_usec);
- smb_messages[match].time += this_time;
- total_time += this_time;
- }
- DEBUG(2,("TIME %s %d usecs %g pct\n",
- smb_fn_name(type),smb_messages[match].time,
- (100.0*smb_messages[match].time) / total_time));
-#endif
-
- return(outsize);
-}
-
-
-/****************************************************************************
- construct a chained reply and add it to the already made reply
- **************************************************************************/
-int chain_reply(char *inbuf,char *outbuf,int size,int bufsize)
-{
- static char *orig_inbuf;
- static char *orig_outbuf;
- int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0);
- unsigned smb_off2 = SVAL(inbuf,smb_vwv1);
- char *inbuf2, *outbuf2;
- int outsize2;
- char inbuf_saved[smb_wct];
- char outbuf_saved[smb_wct];
- extern int chain_size;
- int wct = CVAL(outbuf,smb_wct);
- int outsize = smb_size + 2*wct + SVAL(outbuf,smb_vwv0+2*wct);
-
- /* maybe its not chained */
- if (smb_com2 == 0xFF) {
- CVAL(outbuf,smb_vwv0) = 0xFF;
- return outsize;
- }
-
- if (chain_size == 0) {
- /* this is the first part of the chain */
- orig_inbuf = inbuf;
- orig_outbuf = outbuf;
- }
-
- /* we need to tell the client where the next part of the reply will be */
- SSVAL(outbuf,smb_vwv1,smb_offset(outbuf+outsize,outbuf));
- CVAL(outbuf,smb_vwv0) = smb_com2;
-
- /* remember how much the caller added to the chain, only counting stuff
- after the parameter words */
- chain_size += outsize - smb_wct;
-
- /* work out pointers into the original packets. The
- headers on these need to be filled in */
- inbuf2 = orig_inbuf + smb_off2 + 4 - smb_wct;
- outbuf2 = orig_outbuf + SVAL(outbuf,smb_vwv1) + 4 - smb_wct;
-
- /* remember the original command type */
- smb_com1 = CVAL(orig_inbuf,smb_com);
-
- /* save the data which will be overwritten by the new headers */
- memcpy(inbuf_saved,inbuf2,smb_wct);
- memcpy(outbuf_saved,outbuf2,smb_wct);
-
- /* give the new packet the same header as the last part of the SMB */
- memmove(inbuf2,inbuf,smb_wct);
-
- /* create the in buffer */
- CVAL(inbuf2,smb_com) = smb_com2;
-
- /* create the out buffer */
- bzero(outbuf2,smb_size);
- set_message(outbuf2,0,0,True);
- CVAL(outbuf2,smb_com) = CVAL(inbuf2,smb_com);
-
- memcpy(outbuf2+4,inbuf2+4,4);
- CVAL(outbuf2,smb_rcls) = SUCCESS;
- CVAL(outbuf2,smb_reh) = 0;
- CVAL(outbuf2,smb_flg) = 0x80 | (CVAL(inbuf2,smb_flg) & 0x8); /* bit 7 set
- means a reply */
- SSVAL(outbuf2,smb_flg2,1); /* say we support long filenames */
- SSVAL(outbuf2,smb_err,SUCCESS);
- SSVAL(outbuf2,smb_tid,SVAL(inbuf2,smb_tid));
- SSVAL(outbuf2,smb_pid,SVAL(inbuf2,smb_pid));
- SSVAL(outbuf2,smb_uid,SVAL(inbuf2,smb_uid));
- SSVAL(outbuf2,smb_mid,SVAL(inbuf2,smb_mid));
-
- DEBUG(3,("Chained message\n"));
- show_msg(inbuf2);
-
- /* process the request */
- outsize2 = switch_message(smb_com2,inbuf2,outbuf2,size-chain_size,
- bufsize-chain_size);
-
- /* copy the new reply and request headers over the old ones, but
- preserve the smb_com field */
- memmove(orig_outbuf,outbuf2,smb_wct);
- CVAL(orig_outbuf,smb_com) = smb_com1;
-
- /* restore the saved data, being careful not to overwrite any
- data from the reply header */
- memcpy(inbuf2,inbuf_saved,smb_wct);
- {
- int ofs = smb_wct - PTR_DIFF(outbuf2,orig_outbuf);
- if (ofs < 0) ofs = 0;
- memmove(outbuf2+ofs,outbuf_saved+ofs,smb_wct-ofs);
- }
-
- return outsize2;
-}
-
-
-
-/****************************************************************************
- construct a reply to the incoming packet
-****************************************************************************/
-int construct_reply(char *inbuf,char *outbuf,int size,int bufsize)
-{
- int type = CVAL(inbuf,smb_com);
- int outsize = 0;
- int msg_type = CVAL(inbuf,0);
- extern int chain_size;
-
- smb_last_time = time(NULL);
-
- chain_size = 0;
- chain_fnum = -1;
-
- bzero(outbuf,smb_size);
-
- if (msg_type != 0)
- return(reply_special(inbuf,outbuf));
-
- CVAL(outbuf,smb_com) = CVAL(inbuf,smb_com);
- set_message(outbuf,0,0,True);
-
- memcpy(outbuf+4,inbuf+4,4);
- CVAL(outbuf,smb_rcls) = SUCCESS;
- CVAL(outbuf,smb_reh) = 0;
- CVAL(outbuf,smb_flg) = 0x80 | (CVAL(inbuf,smb_flg) & 0x8); /* bit 7 set
- means a reply */
- SSVAL(outbuf,smb_flg2,1); /* say we support long filenames */
- SSVAL(outbuf,smb_err,SUCCESS);
- SSVAL(outbuf,smb_tid,SVAL(inbuf,smb_tid));
- SSVAL(outbuf,smb_pid,SVAL(inbuf,smb_pid));
- SSVAL(outbuf,smb_uid,SVAL(inbuf,smb_uid));
- SSVAL(outbuf,smb_mid,SVAL(inbuf,smb_mid));
-
- outsize = switch_message(type,inbuf,outbuf,size,bufsize);
-
- outsize += chain_size;
-
- if(outsize > 4)
- smb_setlen(outbuf,outsize - 4);
- return(outsize);
-}
-
-/****************************************************************************
- process commands from the client
-****************************************************************************/
-static void process(void)
-{
- extern int Client;
-
- InBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- OutBuffer = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
- if ((InBuffer == NULL) || (OutBuffer == NULL))
- return;
-
- InBuffer += SMB_ALIGNMENT;
- OutBuffer += SMB_ALIGNMENT;
-
-#if PRIME_NMBD
- DEBUG(3,("priming nmbd\n"));
- {
- struct in_addr ip;
- ip = *interpret_addr2("localhost");
- if (zero_ip(ip)) ip = *interpret_addr2("127.0.0.1");
- *OutBuffer = 0;
- send_one_packet(OutBuffer,1,ip,NMB_PORT,SOCK_DGRAM);
- }
-#endif
-
- while (True)
- {
- int deadtime = lp_deadtime()*60;
- int counter;
- int last_keepalive=0;
- int service_load_counter = 0;
- BOOL got_smb = False;
-
- if (deadtime <= 0)
- deadtime = DEFAULT_SMBD_TIMEOUT;
-
- if (lp_readprediction())
- do_read_prediction();
-
- errno = 0;
-
- for (counter=SMBD_SELECT_LOOP;
- !receive_message_or_smb(Client,oplock_sock,
- InBuffer,BUFFER_SIZE,SMBD_SELECT_LOOP*1000,&got_smb);
- counter += SMBD_SELECT_LOOP)
- {
- int i;
- time_t t;
- BOOL allidle = True;
- extern int keepalive;
-
- if (counter > 365 * 3600) /* big number of seconds. */
- {
- counter = 0;
- service_load_counter = 0;
- }
-
- if (smb_read_error == READ_EOF)
- {
- DEBUG(3,("end of file from client\n"));
- return;
- }
-
- if (smb_read_error == READ_ERROR)
- {
- DEBUG(3,("receive_smb error (%s) exiting\n",
- strerror(errno)));
- return;
- }
-
- t = time(NULL);
-
- /* become root again if waiting */
- unbecome_user();
-
- /* check for smb.conf reload */
- if (counter >= service_load_counter + SMBD_RELOAD_CHECK)
- {
- service_load_counter = counter;
-
- /* reload services, if files have changed. */
- reload_services(True);
- }
-
- /* automatic timeout if all connections are closed */
- if (num_connections_open==0 && counter >= IDLE_CLOSED_TIMEOUT)
- {
- DEBUG(2,("%s Closing idle connection\n",timestring()));
- return;
- }
-
- if (keepalive && (counter-last_keepalive)>keepalive)
- {
- extern int password_client;
- if (!send_keepalive(Client))
- {
- DEBUG(2,("%s Keepalive failed - exiting\n",timestring()));
- return;
- }
- /* also send a keepalive to the password server if its still
- connected */
- if (password_client != -1)
- send_keepalive(password_client);
- last_keepalive = counter;
- }
-
- /* check for connection timeouts */
- for (i=0;i<MAX_CONNECTIONS;i++)
- if (Connections[i].open)
- {
- /* close dirptrs on connections that are idle */
- if ((t-Connections[i].lastused)>DPTR_IDLE_TIMEOUT)
- dptr_idlecnum(i);
-
- if (Connections[i].num_files_open > 0 ||
- (t-Connections[i].lastused)<deadtime)
- allidle = False;
- }
-
- if (allidle && num_connections_open>0)
- {
- DEBUG(2,("%s Closing idle connection 2\n",timestring()));
- return;
- }
- }
-
- if(got_smb)
- process_smb(InBuffer, OutBuffer);
- else
- process_local_message(oplock_sock, InBuffer, BUFFER_SIZE);
- }
-}
-
-
-/****************************************************************************
- initialise connect, service and file structs
-****************************************************************************/
-static void init_structs(void )
-{
- int i;
- get_myname(myhostname,NULL);
-
- for (i=0;i<MAX_CONNECTIONS;i++)
- {
- Connections[i].open = False;
- Connections[i].num_files_open=0;
- Connections[i].lastused=0;
- Connections[i].used=False;
- string_init(&Connections[i].user,"");
- string_init(&Connections[i].dirpath,"");
- string_init(&Connections[i].connectpath,"");
- string_init(&Connections[i].origpath,"");
- }
-
- for (i=0;i<MAX_OPEN_FILES;i++)
- {
- Files[i].open = False;
- string_init(&Files[i].name,"");
-
- }
-
- for (i=0;i<MAX_OPEN_FILES;i++)
- {
- file_fd_struct *fd_ptr = &FileFd[i];
- fd_ptr->ref_count = 0;
- fd_ptr->dev = (int32)-1;
- fd_ptr->inode = (int32)-1;
- fd_ptr->fd = -1;
- fd_ptr->fd_readonly = -1;
- fd_ptr->fd_writeonly = -1;
- fd_ptr->real_open_flags = -1;
- }
-
- init_dptrs();
-}
-
-/****************************************************************************
-usage on the program
-****************************************************************************/
-static void usage(char *pname)
-{
- DEBUG(0,("Incorrect program usage - are you sure the command line is correct?\n"));
-
- printf("Usage: %s [-D] [-p port] [-d debuglevel] [-l log basename] [-s services file]\n",pname);
- printf("Version %s\n",VERSION);
- printf("\t-D become a daemon\n");
- printf("\t-p port listen on the specified port\n");
- printf("\t-d debuglevel set the debuglevel\n");
- printf("\t-l log basename. Basename for log/debug files\n");
- printf("\t-s services file. Filename of services file\n");
- printf("\t-P passive only\n");
- printf("\t-a overwrite log file, don't append\n");
- printf("\n");
-}
-
-
-/****************************************************************************
- main program
-****************************************************************************/
- int main(int argc,char *argv[])
-{
- extern BOOL append_log;
- /* shall I run as a daemon */
- BOOL is_daemon = False;
- int port = SMB_PORT;
- int opt;
- extern char *optarg;
- char pidFile[100] = { 0 };
-
-#ifdef NEED_AUTH_PARAMETERS
- set_auth_parameters(argc,argv);
-#endif
-
-#ifdef SecureWare
- setluid(0);
-#endif
-
- append_log = True;
-
- TimeInit();
-
- strcpy(debugf,SMBLOGFILE);
-
- setup_logging(argv[0],False);
-
- charset_initialise();
-
- /* make absolutely sure we run as root - to handle cases whre people
- are crazy enough to have it setuid */
-#ifdef USE_SETRES
- setresuid(0,0,0);
-#else
- setuid(0);
- seteuid(0);
- setuid(0);
- seteuid(0);
-#endif
-
- fault_setup(exit_server);
- signal(SIGTERM , SIGNAL_CAST dflt_sig);
-
- /* we want total control over the permissions on created files,
- so set our umask to 0 */
- umask(0);
-
- GetWd(OriginalDir);
-
- init_uid();
-
- /* this is for people who can't start the program correctly */
- while (argc > 1 && (*argv[1] != '-'))
- {
- argv++;
- argc--;
- }
-
- while ((opt = getopt(argc, argv, "O:i:l:s:d:Dp:hPaf:")) != EOF)
- switch (opt)
- {
- case 'f':
- strncpy(pidFile, optarg, sizeof(pidFile));
- break;
- case 'O':
- strcpy(user_socket_options,optarg);
- break;
- case 'i':
- strcpy(scope,optarg);
- break;
- case 'P':
- {
- extern BOOL passive;
- passive = True;
- }
- break;
- case 's':
- strcpy(servicesf,optarg);
- break;
- case 'l':
- strcpy(debugf,optarg);
- break;
- case 'a':
- {
- extern BOOL append_log;
- append_log = !append_log;
- }
- break;
- case 'D':
- is_daemon = True;
- break;
- case 'd':
- if (*optarg == 'A')
- DEBUGLEVEL = 10000;
- else
- DEBUGLEVEL = atoi(optarg);
- break;
- case 'p':
- port = atoi(optarg);
- break;
- case 'h':
- usage(argv[0]);
- exit(0);
- break;
- default:
- usage(argv[0]);
- exit(1);
- }
-
- reopen_logs();
-
- DEBUG(2,("%s smbd version %s started\n",timestring(),VERSION));
- DEBUG(2,("Copyright Andrew Tridgell 1992-1997\n"));
-
-#ifndef NO_GETRLIMIT
-#ifdef RLIMIT_NOFILE
- {
- struct rlimit rlp;
- getrlimit(RLIMIT_NOFILE, &rlp);
- rlp.rlim_cur = (MAX_OPEN_FILES>rlp.rlim_max)? rlp.rlim_max:MAX_OPEN_FILES;
- setrlimit(RLIMIT_NOFILE, &rlp);
- getrlimit(RLIMIT_NOFILE, &rlp);
- DEBUG(3,("Maximum number of open files per session is %d\n",rlp.rlim_cur));
- }
-#endif
-#endif
-
-
- DEBUG(2,("uid=%d gid=%d euid=%d egid=%d\n",
- getuid(),getgid(),geteuid(),getegid()));
-
- if (sizeof(uint16) < 2 || sizeof(uint32) < 4)
- {
- DEBUG(0,("ERROR: Samba is not configured correctly for the word size on your machine\n"));
- exit(1);
- }
-
- init_structs();
-
- if (!reload_services(False))
- return(-1);
-
- codepage_initialise(lp_client_code_page());
-
- strcpy(myworkgroup, lp_workgroup());
-
-#ifndef NO_SIGNAL_TEST
- signal(SIGHUP,SIGNAL_CAST sig_hup);
-#endif
-
- DEBUG(3,("%s loaded services\n",timestring()));
-
- if (!is_daemon && !is_a_socket(0))
- {
- DEBUG(0,("standard input is not a socket, assuming -D option\n"));
- is_daemon = True;
- }
-
- if (is_daemon)
- {
- DEBUG(3,("%s becoming a daemon\n",timestring()));
- become_daemon();
- }
-
- if (*pidFile)
- {
- int fd;
- char buf[20];
-
- if ((fd = open(pidFile,
-#ifdef O_NONBLOCK
- O_NONBLOCK |
-#endif
- O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0)
- {
- DEBUG(0,("ERROR: can't open %s: %s\n", pidFile, strerror(errno)));
- exit(1);
- }
- if(fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)==False)
- {
- DEBUG(0,("ERROR: smbd is already running\n"));
- exit(1);
- }
- sprintf(buf, "%u\n", (unsigned int) getpid());
- if (write(fd, buf, strlen(buf)) < 0)
- {
- DEBUG(0,("ERROR: can't write to %s: %s\n", pidFile, strerror(errno)));
- exit(1);
- }
- /* Leave pid file open & locked for the duration... */
- }
-
- if (!open_sockets(is_daemon,port))
- exit(1);
-
-#ifdef FAST_SHARE_MODES
- if (!start_share_mode_mgmt())
- exit(1);
-#endif /* FAST_SHARE_MODES */
-
- /* possibly reload the services file. */
- reload_services(True);
-
- max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
-
- if (*lp_rootdir())
- {
- if (sys_chroot(lp_rootdir()) == 0)
- DEBUG(2,("%s changed root to %s\n",timestring(),lp_rootdir()));
- }
-
- /* Setup the oplock IPC socket. */
- if(!open_oplock_ipc())
- exit(1);
-
- process();
- close_sockets();
-
- exit_server("normal exit");
- return(0);
-}
-
-
diff --git a/source/smbd/smbrun.c b/source/smbd/smbrun.c
deleted file mode 100644
index 42ce7f60ad0..00000000000
--- a/source/smbd/smbrun.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- external program running routine
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-
-/*******************************************************************
-close the low 3 fd's and open dev/null in their place
-********************************************************************/
-static void close_fds(void)
-{
- int fd;
- int i;
- close(0); close(1); close(2);
- /* try and use up these file descriptors, so silly
- library routines writing to stdout etc won't cause havoc */
- for (i=0;i<3;i++) {
- fd = open("/dev/null",O_RDWR,0);
- if (fd < 0) fd = open("/dev/null",O_WRONLY,0);
- if (fd != i) return;
- }
-}
-
-
-/*
-This is a wrapper around the system() call to allow commands to run correctly
-as non root from a program which is switching between root and non-root
-
-It takes 3 arguments as uid,gid,command and runs command after
-becoming a non-root user */
- int main(int argc,char *argv[])
-{
- int uid,gid;
-
- close_fds();
-
- if (argc != 4) exit(2);
-
- uid = atoi(argv[1]);
- gid = atoi(argv[2]);
-
- /* first become root - we may need to do this in order to lose
- our privilages! */
-#ifdef USE_SETRES
- setresgid(0,0,0);
- setresuid(0,0,0);
-#else
- setuid(0);
- seteuid(0);
-#endif
-
-#ifdef USE_SETFS
- setfsuid(uid);
- setfsgid(gid);
-#endif
-
-#ifdef USE_SETRES
- setresgid(gid,gid,gid);
- setresuid(uid,uid,uid);
-#else
- setgid(gid);
- setegid(gid);
- setuid(uid);
- seteuid(uid);
-#endif
-
-
- /* paranoia :-) */
- if (getuid() != uid)
- return(3);
-
- if (geteuid() != getuid())
- return(4);
-
- /* this is to make sure that the system() call doesn't run forever */
- alarm(30);
-
- return(system(argv[3]));
-}
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
deleted file mode 100644
index a56df9cb9cc..00000000000
--- a/source/smbd/trans2.c
+++ /dev/null
@@ -1,1794 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- SMB transaction2 handling
- Copyright (C) Jeremy Allison 1994-1997
-
- Extensively modified by Andrew Tridgell, 1995
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-#include "trans2.h"
-
-extern int DEBUGLEVEL;
-extern int Protocol;
-extern connection_struct Connections[];
-extern files_struct Files[];
-extern BOOL case_sensitive;
-extern int Client;
-
-/****************************************************************************
- Send the required number of replies back.
- We assume all fields other than the data fields are
- set correctly for the type of call.
- HACK ! Always assumes smb_setup field is zero.
-****************************************************************************/
-static int send_trans2_replies(char *outbuf, int bufsize, char *params,
- int paramsize, char *pdata, int datasize)
-{
- /* As we are using a protocol > LANMAN1 then the max_send
- variable must have been set in the sessetupX call.
- This takes precedence over the max_xmit field in the
- global struct. These different max_xmit variables should
- be merged as this is now too confusing */
-
- extern int max_send;
- int data_to_send = datasize;
- int params_to_send = paramsize;
- int useable_space;
- char *pp = params;
- char *pd = pdata;
- int params_sent_thistime, data_sent_thistime, total_sent_thistime;
- int alignment_offset = 1;
-
- /* Initially set the wcnt area to be 10 - this is true for all
- trans2 replies */
- set_message(outbuf,10,0,True);
-
- /* If there genuinely are no parameters or data to send just send
- the empty packet */
- if(params_to_send == 0 && data_to_send == 0)
- {
- send_smb(Client,outbuf);
- return 0;
- }
-
- /* Space is bufsize minus Netbios over TCP header minus SMB header */
- /* The alignment_offset is to align the param and data bytes on an even byte
- boundary. NT 4.0 Beta needs this to work correctly. */
- useable_space = bufsize - ((smb_buf(outbuf)+alignment_offset) - outbuf);
- /* useable_space can never be more than max_send minus the
- alignment offset. */
- useable_space = MIN(useable_space, max_send - alignment_offset);
-
- while( params_to_send || data_to_send)
- {
- /* Calculate whether we will totally or partially fill this packet */
- total_sent_thistime = params_to_send + data_to_send + alignment_offset;
- /* We can never send more than useable_space */
- total_sent_thistime = MIN(total_sent_thistime, useable_space);
-
- set_message(outbuf, 10, total_sent_thistime, True);
-
- /* Set total params and data to be sent */
- SSVAL(outbuf,smb_tprcnt,paramsize);
- SSVAL(outbuf,smb_tdrcnt,datasize);
-
- /* Calculate how many parameters and data we can fit into
- this packet. Parameters get precedence */
-
- params_sent_thistime = MIN(params_to_send,useable_space);
- data_sent_thistime = useable_space - params_sent_thistime;
- data_sent_thistime = MIN(data_sent_thistime,data_to_send);
-
- SSVAL(outbuf,smb_prcnt, params_sent_thistime);
- if(params_sent_thistime == 0)
- {
- SSVAL(outbuf,smb_proff,0);
- SSVAL(outbuf,smb_prdisp,0);
- } else {
- /* smb_proff is the offset from the start of the SMB header to the
- parameter bytes, however the first 4 bytes of outbuf are
- the Netbios over TCP header. Thus use smb_base() to subtract
- them from the calculation */
- SSVAL(outbuf,smb_proff,((smb_buf(outbuf)+alignment_offset) - smb_base(outbuf)));
- /* Absolute displacement of param bytes sent in this packet */
- SSVAL(outbuf,smb_prdisp,pp - params);
- }
-
- SSVAL(outbuf,smb_drcnt, data_sent_thistime);
- if(data_sent_thistime == 0)
- {
- SSVAL(outbuf,smb_droff,0);
- SSVAL(outbuf,smb_drdisp, 0);
- } else {
- /* The offset of the data bytes is the offset of the
- parameter bytes plus the number of parameters being sent this time */
- SSVAL(outbuf,smb_droff,((smb_buf(outbuf)+alignment_offset) -
- smb_base(outbuf)) + params_sent_thistime);
- SSVAL(outbuf,smb_drdisp, pd - pdata);
- }
-
- /* Copy the param bytes into the packet */
- if(params_sent_thistime)
- memcpy((smb_buf(outbuf)+alignment_offset),pp,params_sent_thistime);
- /* Copy in the data bytes */
- if(data_sent_thistime)
- memcpy(smb_buf(outbuf)+alignment_offset+params_sent_thistime,pd,data_sent_thistime);
-
- DEBUG(9,("t2_rep: params_sent_thistime = %d, data_sent_thistime = %d, useable_space = %d\n",
- params_sent_thistime, data_sent_thistime, useable_space));
- DEBUG(9,("t2_rep: params_to_send = %d, data_to_send = %d, paramsize = %d, datasize = %d\n",
- params_to_send, data_to_send, paramsize, datasize));
-
- /* Send the packet */
- send_smb(Client,outbuf);
-
- pp += params_sent_thistime;
- pd += data_sent_thistime;
-
- params_to_send -= params_sent_thistime;
- data_to_send -= data_sent_thistime;
-
- /* Sanity check */
- if(params_to_send < 0 || data_to_send < 0)
- {
- DEBUG(2,("send_trans2_replies failed sanity check pts = %d, dts = %d\n!!!",
- params_to_send, data_to_send));
- return -1;
- }
- }
-
- return 0;
-}
-
-
-/****************************************************************************
- reply to a TRANSACT2_OPEN
-****************************************************************************/
-static int call_trans2open(char *inbuf, char *outbuf, int bufsize, int cnum,
- char **pparams, char **ppdata)
-{
- char *params = *pparams;
- int16 open_mode = SVAL(params, 2);
- int16 open_attr = SVAL(params,6);
- BOOL oplock_request = (((SVAL(params,0)|(1<<1))>>1) | ((SVAL(params,0)|(1<<2))>>1));
-#if 0
- BOOL return_additional_info = BITSETW(params,0);
- int16 open_sattr = SVAL(params, 4);
- time_t open_time = make_unix_date3(params+8);
-#endif
- int16 open_ofun = SVAL(params,12);
- int32 open_size = IVAL(params,14);
- char *pname = &params[28];
- int16 namelen = strlen(pname)+1;
-
- pstring fname;
- int fnum = -1;
- int unixmode;
- int size=0,fmode=0,mtime=0,rmode;
- int32 inode = 0;
- struct stat sbuf;
- int smb_action = 0;
- BOOL bad_path = False;
-
- StrnCpy(fname,pname,namelen);
-
- DEBUG(3,("trans2open %s cnum=%d mode=%d attr=%d ofun=%d size=%d\n",
- fname,cnum,open_mode, open_attr, open_ofun, open_size));
-
- /* XXXX we need to handle passed times, sattr and flags */
-
- unix_convert(fname,cnum,0,&bad_path);
-
- fnum = find_free_file();
- if (fnum < 0)
- return(ERROR(ERRSRV,ERRnofids));
-
- if (!check_name(fname,cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- unixmode = unix_mode(cnum,open_attr | aARCH);
-
-
- open_file_shared(fnum,cnum,fname,open_mode,open_ofun,unixmode,
- oplock_request, &rmode,&smb_action);
-
- if (!Files[fnum].open)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- if (fstat(Files[fnum].fd_ptr->fd,&sbuf) != 0) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- size = sbuf.st_size;
- fmode = dos_mode(cnum,fname,&sbuf);
- mtime = sbuf.st_mtime;
- inode = sbuf.st_ino;
- if (fmode & aDIR) {
- close_file(fnum);
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- /* Realloc the size of parameters and data we will return */
- params = *pparams = Realloc(*pparams, 28);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- bzero(params,28);
- SSVAL(params,0,fnum);
- SSVAL(params,2,fmode);
- put_dos_date2(params,4, mtime);
- SIVAL(params,8, size);
- SSVAL(params,12,rmode);
-
- if (oplock_request && lp_fake_oplocks(SNUM(cnum))) {
- smb_action |= EXTENDED_OPLOCK_GRANTED;
- }
-
- SSVAL(params,18,smb_action);
- SIVAL(params,20,inode);
-
- /* Send the required number of replies */
- send_trans2_replies(outbuf, bufsize, params, 28, *ppdata, 0);
-
- return -1;
-}
-
-/****************************************************************************
- get a level dependent lanman2 dir entry.
-****************************************************************************/
-static int get_lanman2_dir_entry(int cnum,char *path_mask,int dirtype,int info_level,
- int requires_resume_key,
- BOOL dont_descend,char **ppdata,
- char *base_data, int space_remaining,
- BOOL *out_of_space,
- int *last_name_off)
-{
- char *dname;
- BOOL found = False;
- struct stat sbuf;
- pstring mask;
- pstring pathreal;
- pstring fname;
- BOOL matched;
- char *p, *pdata = *ppdata;
- int reskey=0, prev_dirpos=0;
- int mode=0;
- uint32 size=0,len;
- uint32 mdate=0, adate=0, cdate=0;
- char *nameptr;
- BOOL isrootdir = (strequal(Connections[cnum].dirpath,"./") ||
- strequal(Connections[cnum].dirpath,".") ||
- strequal(Connections[cnum].dirpath,"/"));
- BOOL was_8_3;
- int nt_extmode; /* Used for NT connections instead of mode */
- BOOL needslash = ( Connections[cnum].dirpath[strlen(Connections[cnum].dirpath) -1] != '/');
-
- *fname = 0;
- *out_of_space = False;
-
- if (!Connections[cnum].dirptr)
- return(False);
-
- p = strrchr(path_mask,'/');
- if(p != NULL)
- {
- if(p[1] == '\0')
- strcpy(mask,"*.*");
- else
- pstrcpy(mask, p+1);
- }
- else
- pstrcpy(mask, path_mask);
-
- while (!found)
- {
- /* Needed if we run out of space */
- prev_dirpos = TellDir(Connections[cnum].dirptr);
- dname = ReadDirName(Connections[cnum].dirptr);
-
- reskey = TellDir(Connections[cnum].dirptr);
-
- DEBUG(8,("get_lanman2_dir_entry:readdir on dirptr 0x%x now at offset %d\n",
- Connections[cnum].dirptr,TellDir(Connections[cnum].dirptr)));
-
- if (!dname)
- return(False);
-
- matched = False;
-
- pstrcpy(fname,dname);
-
- if(mask_match(fname, mask, case_sensitive, True))
- {
- BOOL isdots = (strequal(fname,"..") || strequal(fname,"."));
- if (dont_descend && !isdots)
- continue;
-
- if (isrootdir && isdots)
- continue;
-
- pstrcpy(pathreal,Connections[cnum].dirpath);
- if(needslash)
- strcat(pathreal,"/");
- strcat(pathreal,dname);
- if (sys_stat(pathreal,&sbuf) != 0)
- {
- DEBUG(5,("get_lanman2_dir_entry:Couldn't stat [%s] (%s)\n",pathreal,strerror(errno)));
- continue;
- }
-
- mode = dos_mode(cnum,pathreal,&sbuf);
-
- if (!dir_check_ftype(cnum,mode,&sbuf,dirtype)) {
- DEBUG(5,("[%s] attribs didn't match %x\n",fname,dirtype));
- continue;
- }
-
- size = sbuf.st_size;
- mdate = sbuf.st_mtime;
- adate = sbuf.st_atime;
- cdate = sbuf.st_ctime;
- if(mode & aDIR)
- size = 0;
-
- DEBUG(5,("get_lanman2_dir_entry found %s fname=%s\n",pathreal,fname));
-
- found = True;
- }
- }
-
- name_map_mangle(fname,False,SNUM(cnum));
-
- p = pdata;
- nameptr = p;
-
- nt_extmode = mode ? mode : NT_FILE_ATTRIBUTE_NORMAL;
-
- switch (info_level)
- {
- case 1:
- if(requires_resume_key) {
- SIVAL(p,0,reskey);
- p += 4;
- }
- put_dos_date2(p,l1_fdateCreation,cdate);
- put_dos_date2(p,l1_fdateLastAccess,adate);
- put_dos_date2(p,l1_fdateLastWrite,mdate);
- SIVAL(p,l1_cbFile,size);
- SIVAL(p,l1_cbFileAlloc,ROUNDUP(size,1024));
- SSVAL(p,l1_attrFile,mode);
- SCVAL(p,l1_cchName,strlen(fname));
- strcpy(p + l1_achName, fname);
- nameptr = p + l1_achName;
- p += l1_achName + strlen(fname) + 1;
- break;
-
- case 2:
- /* info_level 2 */
- if(requires_resume_key) {
- SIVAL(p,0,reskey);
- p += 4;
- }
- put_dos_date2(p,l2_fdateCreation,cdate);
- put_dos_date2(p,l2_fdateLastAccess,adate);
- put_dos_date2(p,l2_fdateLastWrite,mdate);
- SIVAL(p,l2_cbFile,size);
- SIVAL(p,l2_cbFileAlloc,ROUNDUP(size,1024));
- SSVAL(p,l2_attrFile,mode);
- SIVAL(p,l2_cbList,0); /* No extended attributes */
- SCVAL(p,l2_cchName,strlen(fname));
- strcpy(p + l2_achName, fname);
- nameptr = p + l2_achName;
- p += l2_achName + strlen(fname) + 1;
- break;
-
- case 3:
- SIVAL(p,0,reskey);
- put_dos_date2(p,4,cdate);
- put_dos_date2(p,8,adate);
- put_dos_date2(p,12,mdate);
- SIVAL(p,16,size);
- SIVAL(p,20,ROUNDUP(size,1024));
- SSVAL(p,24,mode);
- SIVAL(p,26,4);
- CVAL(p,30) = strlen(fname);
- strcpy(p+31, fname);
- nameptr = p+31;
- p += 31 + strlen(fname) + 1;
- break;
-
- case 4:
- if(requires_resume_key) {
- SIVAL(p,0,reskey);
- p += 4;
- }
- SIVAL(p,0,33+strlen(fname)+1);
- put_dos_date2(p,4,cdate);
- put_dos_date2(p,8,adate);
- put_dos_date2(p,12,mdate);
- SIVAL(p,16,size);
- SIVAL(p,20,ROUNDUP(size,1024));
- SSVAL(p,24,mode);
- CVAL(p,32) = strlen(fname);
- strcpy(p + 33, fname);
- nameptr = p+33;
- p += 33 + strlen(fname) + 1;
- break;
-
- case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
- was_8_3 = is_8_3(fname, True);
- len = 94+strlen(fname);
- len = (len + 3) & ~3;
- SIVAL(p,0,len); p += 4;
- SIVAL(p,0,reskey); p += 4;
- put_long_date(p,cdate); p += 8;
- put_long_date(p,adate); p += 8;
- put_long_date(p,mdate); p += 8;
- put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,nt_extmode); p += 4;
- SIVAL(p,0,strlen(fname)); p += 4;
- SIVAL(p,0,0); p += 4;
- if (!was_8_3) {
- strcpy(p+2,fname);
- if (!name_map_mangle(p+2,True,SNUM(cnum)))
- (p+2)[12] = 0;
- } else
- *(p+2) = 0;
- strupper(p+2);
- SSVAL(p,0,strlen(p+2));
- p += 2 + 24;
- /* nameptr = p; */
- strcpy(p,fname); p += strlen(p);
- p = pdata + len;
- break;
-
- case SMB_FIND_FILE_DIRECTORY_INFO:
- len = 64+strlen(fname);
- len = (len + 3) & ~3;
- SIVAL(p,0,len); p += 4;
- SIVAL(p,0,reskey); p += 4;
- put_long_date(p,cdate); p += 8;
- put_long_date(p,adate); p += 8;
- put_long_date(p,mdate); p += 8;
- put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,nt_extmode); p += 4;
- SIVAL(p,0,strlen(fname)); p += 4;
- strcpy(p,fname);
- p = pdata + len;
- break;
-
-
- case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
- len = 68+strlen(fname);
- len = (len + 3) & ~3;
- SIVAL(p,0,len); p += 4;
- SIVAL(p,0,reskey); p += 4;
- put_long_date(p,cdate); p += 8;
- put_long_date(p,adate); p += 8;
- put_long_date(p,mdate); p += 8;
- put_long_date(p,mdate); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,size); p += 8;
- SIVAL(p,0,nt_extmode); p += 4;
- SIVAL(p,0,strlen(fname)); p += 4;
- SIVAL(p,0,0); p += 4;
- strcpy(p,fname);
- p = pdata + len;
- break;
-
- case SMB_FIND_FILE_NAMES_INFO:
- len = 12+strlen(fname);
- len = (len + 3) & ~3;
- SIVAL(p,0,len); p += 4;
- SIVAL(p,0,reskey); p += 4;
- SIVAL(p,0,strlen(fname)); p += 4;
- strcpy(p,fname);
- p = pdata + len;
- break;
-
- default:
- return(False);
- }
-
-
- if (PTR_DIFF(p,pdata) > space_remaining) {
- /* Move the dirptr back to prev_dirpos */
- SeekDir(Connections[cnum].dirptr, prev_dirpos);
- *out_of_space = True;
- DEBUG(9,("get_lanman2_dir_entry: out of space\n"));
- return False; /* Not finished - just out of space */
- }
-
- /* Setup the last_filename pointer, as an offset from base_data */
- *last_name_off = PTR_DIFF(nameptr,base_data);
- /* Advance the data pointer to the next slot */
- *ppdata = p;
- return(found);
-}
-
-/****************************************************************************
- reply to a TRANS2_FINDFIRST
-****************************************************************************/
-static int call_trans2findfirst(char *inbuf, char *outbuf, int bufsize, int cnum,
- char **pparams, char **ppdata)
-{
- /* We must be careful here that we don't return more than the
- allowed number of data bytes. If this means returning fewer than
- maxentries then so be it. We assume that the redirector has
- enough room for the fixed number of parameter bytes it has
- requested. */
- uint32 max_data_bytes = SVAL(inbuf, smb_mdrcnt);
- char *params = *pparams;
- char *pdata = *ppdata;
- int dirtype = SVAL(params,0);
- int maxentries = SVAL(params,2);
- BOOL close_after_first = BITSETW(params+4,0);
- BOOL close_if_end = BITSETW(params+4,1);
- BOOL requires_resume_key = BITSETW(params+4,2);
- int info_level = SVAL(params,6);
- pstring directory;
- pstring mask;
- char *p, *wcard;
- int last_name_off=0;
- int dptr_num = -1;
- int numentries = 0;
- int i;
- BOOL finished = False;
- BOOL dont_descend = False;
- BOOL out_of_space = False;
- int space_remaining;
- BOOL bad_path = False;
-
- *directory = *mask = 0;
-
- DEBUG(3,("call_trans2findfirst: dirtype = %d, maxentries = %d, close_after_first=%d, close_if_end = %d requires_resume_key = %d level = %d, max_data_bytes = %d\n",
- dirtype, maxentries, close_after_first, close_if_end, requires_resume_key,
- info_level, max_data_bytes));
-
- switch (info_level)
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case SMB_FIND_FILE_DIRECTORY_INFO:
- case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
- case SMB_FIND_FILE_NAMES_INFO:
- case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
- break;
- default:
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
-
- pstrcpy(directory, params + 12); /* Complete directory path with
- wildcard mask appended */
-
- DEBUG(5,("path=%s\n",directory));
-
- unix_convert(directory,cnum,0,&bad_path);
- if(!check_name(directory,cnum)) {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
-
-#if 0
- /* Ugly - NT specific hack - maybe not needed ? (JRA) */
- if((errno == ENOTDIR) && (Protocol >= PROTOCOL_NT1) &&
- (get_remote_arch() == RA_WINNT))
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbaddirectory;
- }
-#endif
-
- return(ERROR(ERRDOS,ERRbadpath));
- }
-
- p = strrchr(directory,'/');
- if(p == NULL) {
- strcpy(mask,directory);
- strcpy(directory,"./");
- } else {
- strcpy(mask,p+1);
- *p = 0;
- }
-
- DEBUG(5,("dir=%s, mask = %s\n",directory, mask));
-
- pdata = *ppdata = Realloc(*ppdata, max_data_bytes + 1024);
- if(!*ppdata)
- return(ERROR(ERRDOS,ERRnomem));
- bzero(pdata,max_data_bytes);
-
- /* Realloc the params space */
- params = *pparams = Realloc(*pparams, 10);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- dptr_num = dptr_create(cnum,directory, True ,SVAL(inbuf,smb_pid));
- if (dptr_num < 0)
- {
- if(dptr_num == -2)
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
-
-#if 0
- /* Ugly - NT specific hack - maybe not needed ? (JRA) */
- if((errno == ENOTDIR) && (Protocol >= PROTOCOL_NT1) &&
- (get_remote_arch() == RA_WINNT))
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbaddirectory;
- }
-#endif
-
- return (UNIXERROR(ERRDOS,ERRbadpath));
- }
- return(ERROR(ERRDOS,ERRbadpath));
- }
-
- /* convert the formatted masks */
- {
- p = mask;
- while (*p) {
- if (*p == '<') *p = '*';
- if (*p == '>') *p = '?';
- if (*p == '"') *p = '.';
- p++;
- }
- }
-
- /* a special case for 16 bit apps */
- if (strequal(mask,"????????.???")) strcpy(mask,"*");
-
- /* handle broken clients that send us old 8.3 format */
- string_sub(mask,"????????","*");
- string_sub(mask,".???",".*");
-
- /* Save the wildcard match and attribs we are using on this directory -
- needed as lanman2 assumes these are being saved between calls */
-
- if(!(wcard = strdup(mask))) {
- dptr_close(dptr_num);
- return(ERROR(ERRDOS,ERRnomem));
- }
-
- dptr_set_wcard(dptr_num, wcard);
- dptr_set_attr(dptr_num, dirtype);
-
- DEBUG(4,("dptr_num is %d, wcard = %s, attr = %d\n",dptr_num, wcard, dirtype));
-
- /* We don't need to check for VOL here as this is returned by
- a different TRANS2 call. */
-
- DEBUG(8,("dirpath=<%s> dontdescend=<%s>\n",
- Connections[cnum].dirpath,lp_dontdescend(SNUM(cnum))));
- if (in_list(Connections[cnum].dirpath,lp_dontdescend(SNUM(cnum)),case_sensitive))
- dont_descend = True;
-
- p = pdata;
- space_remaining = max_data_bytes;
- out_of_space = False;
-
- for (i=0;(i<maxentries) && !finished && !out_of_space;i++)
- {
-
- /* this is a heuristic to avoid seeking the dirptr except when
- absolutely necessary. It allows for a filename of about 40 chars */
- if (space_remaining < DIRLEN_GUESS && numentries > 0)
- {
- out_of_space = True;
- finished = False;
- }
- else
- {
- finished =
- !get_lanman2_dir_entry(cnum,mask,dirtype,info_level,
- requires_resume_key,dont_descend,
- &p,pdata,space_remaining, &out_of_space,
- &last_name_off);
- }
-
- if (finished && out_of_space)
- finished = False;
-
- if (!finished && !out_of_space)
- numentries++;
- space_remaining = max_data_bytes - PTR_DIFF(p,pdata);
- }
-
- /* Check if we can close the dirptr */
- if(close_after_first || (finished && close_if_end))
- {
- dptr_close(dptr_num);
- DEBUG(5,("call_trans2findfirst - (2) closing dptr_num %d\n", dptr_num));
- dptr_num = -1;
- }
-
- /* At this point pdata points to numentries directory entries. */
-
- /* Set up the return parameter block */
- SSVAL(params,0,dptr_num);
- SSVAL(params,2,numentries);
- SSVAL(params,4,finished);
- SSVAL(params,6,0); /* Never an EA error */
- SSVAL(params,8,last_name_off);
-
- send_trans2_replies( outbuf, bufsize, params, 10, pdata, PTR_DIFF(p,pdata));
-
- if ((! *directory) && dptr_path(dptr_num))
- sprintf(directory,"(%s)",dptr_path(dptr_num));
-
- DEBUG(4,("%s %s mask=%s directory=%s cnum=%d dirtype=%d numentries=%d\n",
- timestring(),
- smb_fn_name(CVAL(inbuf,smb_com)),
- mask,directory,cnum,dirtype,numentries));
-
- return(-1);
-}
-
-
-/****************************************************************************
- reply to a TRANS2_FINDNEXT
-****************************************************************************/
-static int call_trans2findnext(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- /* We must be careful here that we don't return more than the
- allowed number of data bytes. If this means returning fewer than
- maxentries then so be it. We assume that the redirector has
- enough room for the fixed number of parameter bytes it has
- requested. */
- int max_data_bytes = SVAL(inbuf, smb_mdrcnt);
- char *params = *pparams;
- char *pdata = *ppdata;
- int16 dptr_num = SVAL(params,0);
- int maxentries = SVAL(params,2);
- uint16 info_level = SVAL(params,4);
- uint32 resume_key = IVAL(params,6);
- BOOL close_after_request = BITSETW(params+10,0);
- BOOL close_if_end = BITSETW(params+10,1);
- BOOL requires_resume_key = BITSETW(params+10,2);
- BOOL continue_bit = BITSETW(params+10,3);
- pstring mask;
- pstring directory;
- char *p;
- uint16 dirtype;
- int numentries = 0;
- int i, last_name_off=0;
- BOOL finished = False;
- BOOL dont_descend = False;
- BOOL out_of_space = False;
- int space_remaining;
-
- *mask = *directory = 0;
-
- DEBUG(3,("call_trans2findnext: dirhandle = %d, max_data_bytes = %d, maxentries = %d, close_after_request=%d, close_if_end = %d requires_resume_key = %d resume_key = %d continue=%d level = %d\n",
- dptr_num, max_data_bytes, maxentries, close_after_request, close_if_end,
- requires_resume_key, resume_key, continue_bit, info_level));
-
- switch (info_level)
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case SMB_FIND_FILE_DIRECTORY_INFO:
- case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
- case SMB_FIND_FILE_NAMES_INFO:
- case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
- break;
- default:
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
-
- pdata = *ppdata = Realloc( *ppdata, max_data_bytes + 1024);
- if(!*ppdata)
- return(ERROR(ERRDOS,ERRnomem));
- bzero(pdata,max_data_bytes);
-
- /* Realloc the params space */
- params = *pparams = Realloc(*pparams, 6*SIZEOFWORD);
- if(!params)
- return(ERROR(ERRDOS,ERRnomem));
-
- /* Check that the dptr is valid */
- if(!(Connections[cnum].dirptr = dptr_fetch_lanman2(params, dptr_num)))
- return(ERROR(ERRDOS,ERRnofiles));
-
- string_set(&Connections[cnum].dirpath,dptr_path(dptr_num));
-
- /* Get the wildcard mask from the dptr */
- if((p = dptr_wcard(dptr_num))== NULL) {
- DEBUG(2,("dptr_num %d has no wildcard\n", dptr_num));
- return (ERROR(ERRDOS,ERRnofiles));
- }
- strcpy(mask, p);
- strcpy(directory,Connections[cnum].dirpath);
-
- /* Get the attr mask from the dptr */
- dirtype = dptr_attr(dptr_num);
-
- DEBUG(3,("dptr_num is %d, mask = %s, attr = %x, dirptr=(0x%X,%d)\n",
- dptr_num, mask, dirtype,
- Connections[cnum].dirptr,
- TellDir(Connections[cnum].dirptr)));
-
- /* We don't need to check for VOL here as this is returned by
- a different TRANS2 call. */
-
- DEBUG(8,("dirpath=<%s> dontdescend=<%s>\n",Connections[cnum].dirpath,lp_dontdescend(SNUM(cnum))));
- if (in_list(Connections[cnum].dirpath,lp_dontdescend(SNUM(cnum)),case_sensitive))
- dont_descend = True;
-
- p = pdata;
- space_remaining = max_data_bytes;
- out_of_space = False;
-
- /* If we have a resume key - seek to the correct position. */
- if(requires_resume_key && !continue_bit)
- SeekDir(Connections[cnum].dirptr, resume_key);
-
- for (i=0;(i<(int)maxentries) && !finished && !out_of_space ;i++)
- {
- /* this is a heuristic to avoid seeking the dirptr except when
- absolutely necessary. It allows for a filename of about 40 chars */
- if (space_remaining < DIRLEN_GUESS && numentries > 0)
- {
- out_of_space = True;
- finished = False;
- }
- else
- {
- finished =
- !get_lanman2_dir_entry(cnum,mask,dirtype,info_level,
- requires_resume_key,dont_descend,
- &p,pdata,space_remaining, &out_of_space,
- &last_name_off);
- }
-
- if (finished && out_of_space)
- finished = False;
-
- if (!finished && !out_of_space)
- numentries++;
- space_remaining = max_data_bytes - PTR_DIFF(p,pdata);
- }
-
- /* Check if we can close the dirptr */
- if(close_after_request || (finished && close_if_end))
- {
- dptr_close(dptr_num); /* This frees up the saved mask */
- DEBUG(5,("call_trans2findnext: closing dptr_num = %d\n", dptr_num));
- dptr_num = -1;
- }
-
-
- /* Set up the return parameter block */
- SSVAL(params,0,numentries);
- SSVAL(params,2,finished);
- SSVAL(params,4,0); /* Never an EA error */
- SSVAL(params,6,last_name_off);
-
- send_trans2_replies( outbuf, bufsize, params, 8, pdata, PTR_DIFF(p,pdata));
-
- if ((! *directory) && dptr_path(dptr_num))
- sprintf(directory,"(%s)",dptr_path(dptr_num));
-
- DEBUG(3,("%s %s mask=%s directory=%s cnum=%d dirtype=%d numentries=%d\n",
- timestring(),
- smb_fn_name(CVAL(inbuf,smb_com)),
- mask,directory,cnum,dirtype,numentries));
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a TRANS2_QFSINFO (query filesystem info)
-****************************************************************************/
-static int call_trans2qfsinfo(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- char *pdata = *ppdata;
- char *params = *pparams;
- uint16 info_level = SVAL(params,0);
- int data_len;
- struct stat st;
- char *vname = volume_label(SNUM(cnum));
-
- DEBUG(3,("call_trans2qfsinfo: cnum = %d, level = %d\n", cnum, info_level));
-
- if(sys_stat(".",&st)!=0) {
- DEBUG(2,("call_trans2qfsinfo: stat of . failed (%s)\n", strerror(errno)));
- return (ERROR(ERRSRV,ERRinvdevice));
- }
-
- pdata = *ppdata = Realloc(*ppdata, 1024); bzero(pdata,1024);
-
- switch (info_level)
- {
- case 1:
- {
- int dfree,dsize,bsize;
- data_len = 18;
- sys_disk_free(".",&bsize,&dfree,&dsize);
- SIVAL(pdata,l1_idFileSystem,st.st_dev);
- SIVAL(pdata,l1_cSectorUnit,bsize/512);
- SIVAL(pdata,l1_cUnit,dsize);
- SIVAL(pdata,l1_cUnitAvail,dfree);
- SSVAL(pdata,l1_cbSector,512);
- DEBUG(5,("call_trans2qfsinfo : bsize=%d, id=%x, cSectorUnit=%d, cUnit=%d, cUnitAvail=%d, cbSector=%d\n",
- bsize, st.st_dev, bsize/512, dsize, dfree, 512));
- break;
- }
- case 2:
- {
- /* Return volume name */
- int volname_len = MIN(strlen(vname),11);
- data_len = l2_vol_szVolLabel + volname_len + 1;
- put_dos_date2(pdata,l2_vol_fdateCreation,st.st_ctime);
- SCVAL(pdata,l2_vol_cch,volname_len);
- StrnCpy(pdata+l2_vol_szVolLabel,vname,volname_len);
- DEBUG(5,("call_trans2qfsinfo : time = %x, namelen = %d, name = %s\n",st.st_ctime, volname_len,
- pdata+l2_vol_szVolLabel));
- break;
- }
- case SMB_QUERY_FS_ATTRIBUTE_INFO:
- data_len = 12 + 2*strlen(FSTYPE_STRING);
- SIVAL(pdata,0,0x4006); /* FS ATTRIBUTES == long filenames supported? */
- SIVAL(pdata,4,128); /* Max filename component length */
- SIVAL(pdata,8,2*strlen(FSTYPE_STRING));
- PutUniCode(pdata+12,FSTYPE_STRING);
- break;
- case SMB_QUERY_FS_LABEL_INFO:
- data_len = 4 + strlen(vname);
- SIVAL(pdata,0,strlen(vname));
- strcpy(pdata+4,vname);
- break;
- case SMB_QUERY_FS_VOLUME_INFO:
- data_len = 18 + 2*strlen(vname);
- SIVAL(pdata,12,2*strlen(vname));
- PutUniCode(pdata+18,vname);
- DEBUG(5,("call_trans2qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol = %s\n", strlen(vname),
- vname));
- break;
- case SMB_QUERY_FS_SIZE_INFO:
- {
- int dfree,dsize,bsize;
- data_len = 24;
- sys_disk_free(".",&bsize,&dfree,&dsize);
- SIVAL(pdata,0,dsize);
- SIVAL(pdata,8,dfree);
- SIVAL(pdata,16,bsize/512);
- SIVAL(pdata,20,512);
- }
- break;
- case SMB_QUERY_FS_DEVICE_INFO:
- data_len = 8;
- SIVAL(pdata,0,0); /* dev type */
- SIVAL(pdata,4,0); /* characteristics */
- break;
- default:
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
-
-
- send_trans2_replies( outbuf, bufsize, params, 0, pdata, data_len);
-
- DEBUG(4,("%s %s info_level =%d\n",timestring(),smb_fn_name(CVAL(inbuf,smb_com)), info_level));
-
- return -1;
-}
-
-/****************************************************************************
- reply to a TRANS2_SETFSINFO (set filesystem info)
-****************************************************************************/
-static int call_trans2setfsinfo(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- /* Just say yes we did it - there is nothing that
- can be set here so it doesn't matter. */
- int outsize;
- DEBUG(3,("call_trans2setfsinfo\n"));
-
- if (!CAN_WRITE(cnum))
- return(ERROR(ERRSRV,ERRaccess));
-
- outsize = set_message(outbuf,10,0,True);
-
- return outsize;
-}
-
-/****************************************************************************
- reply to a TRANS2_QFILEINFO (query file info by fileid)
-****************************************************************************/
-static int call_trans2qfilepathinfo(char *inbuf, char *outbuf, int length,
- int bufsize,int cnum,
- char **pparams,char **ppdata,
- int total_data)
-{
- char *params = *pparams;
- char *pdata = *ppdata;
- uint16 tran_call = SVAL(inbuf, smb_setup0);
- uint16 info_level;
- int mode=0;
- int size=0;
- unsigned int data_size;
- struct stat sbuf;
- pstring fname1;
- char *fname;
- char *p;
- int l,pos;
- BOOL bad_path = False;
-
- if (tran_call == TRANSACT2_QFILEINFO) {
- int16 fnum = SVALS(params,0);
- info_level = SVAL(params,2);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- fname = Files[fnum].name;
- if (fstat(Files[fnum].fd_ptr->fd,&sbuf) != 0) {
- DEBUG(3,("fstat of fnum %d failed (%s)\n",fnum, strerror(errno)));
- return(UNIXERROR(ERRDOS,ERRbadfid));
- }
- pos = lseek(Files[fnum].fd_ptr->fd,0,SEEK_CUR);
- } else {
- /* qpathinfo */
- info_level = SVAL(params,0);
- fname = &fname1[0];
- pstrcpy(fname,&params[6]);
- unix_convert(fname,cnum,0,&bad_path);
- if (!check_name(fname,cnum) || sys_stat(fname,&sbuf)) {
- DEBUG(3,("fileinfo of %s failed (%s)\n",fname,strerror(errno)));
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRbadpath));
- }
- pos = 0;
- }
-
-
- DEBUG(3,("call_trans2qfilepathinfo %s level=%d call=%d total_data=%d\n",
- fname,info_level,tran_call,total_data));
-
- p = strrchr(fname,'/');
- if (!p)
- p = fname;
- else
- p++;
- l = strlen(p);
- mode = dos_mode(cnum,fname,&sbuf);
- size = sbuf.st_size;
- if (mode & aDIR) size = 0;
-
- params = *pparams = Realloc(*pparams,2); bzero(params,2);
- data_size = 1024;
- pdata = *ppdata = Realloc(*ppdata, data_size);
-
- if (total_data > 0 && IVAL(pdata,0) == total_data) {
- /* uggh, EAs for OS2 */
- DEBUG(4,("Rejecting EA request with total_data=%d\n",total_data));
- return(ERROR(ERRDOS,ERROR_EAS_NOT_SUPPORTED));
- }
-
- bzero(pdata,data_size);
-
- switch (info_level)
- {
- case SMB_INFO_STANDARD:
- case SMB_INFO_QUERY_EA_SIZE:
- data_size = (info_level==1?22:26);
- put_dos_date2(pdata,l1_fdateCreation,sbuf.st_ctime); /* create = inode mod */
- put_dos_date2(pdata,l1_fdateLastAccess,sbuf.st_atime); /* access time */
- put_dos_date2(pdata,l1_fdateLastWrite,sbuf.st_mtime); /* write time */
- SIVAL(pdata,l1_cbFile,size);
- SIVAL(pdata,l1_cbFileAlloc,ROUNDUP(size,1024));
- SSVAL(pdata,l1_attrFile,mode);
- SIVAL(pdata,l1_attrFile+2,4); /* this is what OS2 does */
- break;
-
- case SMB_INFO_QUERY_EAS_FROM_LIST:
- data_size = 24;
- put_dos_date2(pdata,0,sbuf.st_ctime); /* create time = inode mod time */
- put_dos_date2(pdata,4,sbuf.st_atime);
- put_dos_date2(pdata,8,sbuf.st_mtime);
- SIVAL(pdata,12,size);
- SIVAL(pdata,16,ROUNDUP(size,1024));
- SIVAL(pdata,20,mode);
- break;
-
- case SMB_INFO_QUERY_ALL_EAS:
- data_size = 4;
- SIVAL(pdata,0,data_size);
- break;
-
- case 6:
- return(ERROR(ERRDOS,ERRbadfunc)); /* os/2 needs this */
-
- case SMB_QUERY_FILE_BASIC_INFO:
- data_size = 36; /* w95 returns 40 bytes not 36 - why ?. */
- put_long_date(pdata,sbuf.st_ctime); /* create time = inode mod time */
- put_long_date(pdata+8,sbuf.st_atime); /* access time */
- put_long_date(pdata+16,sbuf.st_mtime); /* write time */
- put_long_date(pdata+24,sbuf.st_mtime); /* change time */
- SIVAL(pdata,32,mode);
-
- DEBUG(5,("SMB_QFBI - "));
- DEBUG(5,("create: %s ", ctime(&sbuf.st_ctime)));
- DEBUG(5,("access: %s ", ctime(&sbuf.st_atime)));
- DEBUG(5,("write: %s ", ctime(&sbuf.st_mtime)));
- DEBUG(5,("change: %s ", ctime(&sbuf.st_mtime)));
- DEBUG(5,("mode: %x\n", mode));
-
- break;
-
- case SMB_QUERY_FILE_STANDARD_INFO:
- data_size = 22;
- SIVAL(pdata,0,size);
- SIVAL(pdata,8,size);
- SIVAL(pdata,16,sbuf.st_nlink);
- CVAL(pdata,20) = 0;
- CVAL(pdata,21) = (mode&aDIR)?1:0;
- break;
-
- case SMB_QUERY_FILE_EA_INFO:
- data_size = 4;
- break;
-
- /* Get the 8.3 name - used if NT SMB was negotiated. */
- case SMB_QUERY_FILE_ALT_NAME_INFO:
- {
- pstring short_name;
- pstrcpy(short_name,fname);
- /* Mangle if not already 8.3 */
- if(!is_8_3(short_name, True))
- {
- if(!name_map_mangle(short_name,True,SNUM(cnum)))
- *short_name = '\0';
- }
- strncpy(pdata + 4,short_name,12);
- (pdata + 4)[12] = 0;
- strupper(pdata + 4);
- l = strlen(pdata + 4);
- data_size = 4 + l;
- SIVAL(pdata,0,l);
- }
- break;
-
- case SMB_QUERY_FILE_NAME_INFO:
- data_size = 4 + l;
- SIVAL(pdata,0,l);
- pstrcpy(pdata+4,fname);
- break;
-
- case SMB_QUERY_FILE_ALLOCATION_INFO:
- case SMB_QUERY_FILE_END_OF_FILEINFO:
- data_size = 8;
- SIVAL(pdata,0,size);
- break;
-
- case SMB_QUERY_FILE_ALL_INFO:
- put_long_date(pdata,sbuf.st_ctime); /* create time = inode mod time */
- put_long_date(pdata+8,sbuf.st_atime); /* access time */
- put_long_date(pdata+16,sbuf.st_mtime); /* write time */
- put_long_date(pdata+24,sbuf.st_mtime); /* change time */
- SIVAL(pdata,32,mode);
- pdata += 40;
- SIVAL(pdata,0,size);
- SIVAL(pdata,8,size);
- SIVAL(pdata,16,sbuf.st_nlink);
- CVAL(pdata,20) = 0;
- CVAL(pdata,21) = (mode&aDIR)?1:0;
- pdata += 24;
- pdata += 8; /* index number */
- pdata += 4; /* EA info */
- if (mode & aRONLY)
- SIVAL(pdata,0,0xA9);
- else
- SIVAL(pdata,0,0xd01BF);
- pdata += 4;
- SIVAL(pdata,0,pos); /* current offset */
- pdata += 8;
- SIVAL(pdata,0,mode); /* is this the right sort of mode info? */
- pdata += 4;
- pdata += 4; /* alignment */
- SIVAL(pdata,0,l);
- pstrcpy(pdata+4,fname);
- pdata += 4 + l;
- data_size = PTR_DIFF(pdata,(*ppdata));
- break;
-
- case SMB_QUERY_FILE_STREAM_INFO:
- data_size = 24 + l;
- SIVAL(pdata,0,pos);
- SIVAL(pdata,4,size);
- SIVAL(pdata,12,size);
- SIVAL(pdata,20,l);
- pstrcpy(pdata+24,fname);
- break;
- default:
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
-
- send_trans2_replies( outbuf, bufsize, params, 2, *ppdata, data_size);
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a TRANS2_SETFILEINFO (set file info by fileid)
-****************************************************************************/
-static int call_trans2setfilepathinfo(char *inbuf, char *outbuf, int length,
- int bufsize, int cnum, char **pparams,
- char **ppdata, int total_data)
-{
- char *params = *pparams;
- char *pdata = *ppdata;
- uint16 tran_call = SVAL(inbuf, smb_setup0);
- uint16 info_level;
- int mode=0;
- int size=0;
- struct utimbuf tvs;
- struct stat st;
- pstring fname1;
- char *fname;
- int fd = -1;
- BOOL bad_path = False;
-
- if (!CAN_WRITE(cnum))
- return(ERROR(ERRSRV,ERRaccess));
-
- if (tran_call == TRANSACT2_SETFILEINFO) {
- int16 fnum = SVALS(params,0);
- info_level = SVAL(params,2);
-
- CHECK_FNUM(fnum,cnum);
- CHECK_ERROR(fnum);
-
- fname = Files[fnum].name;
- fd = Files[fnum].fd_ptr->fd;
-
- if(fstat(fd,&st)!=0) {
- DEBUG(3,("fstat of %s failed (%s)\n", fname, strerror(errno)));
- return(ERROR(ERRDOS,ERRbadpath));
- }
- } else {
- /* set path info */
- info_level = SVAL(params,0);
- fname = fname1;
- pstrcpy(fname,&params[6]);
- unix_convert(fname,cnum,0,&bad_path);
- if(!check_name(fname, cnum))
- {
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRbadpath));
- }
-
- if(sys_stat(fname,&st)!=0) {
- DEBUG(3,("stat of %s failed (%s)\n", fname, strerror(errno)));
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRbadpath));
- }
- }
-
- DEBUG(3,("call_trans2setfilepathinfo(%d) %s info_level=%d totdata=%d\n",
- tran_call,fname,info_level,total_data));
-
- /* Realloc the parameter and data sizes */
- params = *pparams = Realloc(*pparams,2); SSVAL(params,0,0);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- size = st.st_size;
- tvs.modtime = st.st_mtime;
- tvs.actime = st.st_atime;
- mode = dos_mode(cnum,fname,&st);
-
- if (total_data > 0 && IVAL(pdata,0) == total_data) {
- /* uggh, EAs for OS2 */
- DEBUG(4,("Rejecting EA request with total_data=%d\n",total_data));
- return(ERROR(ERRDOS,ERROR_EAS_NOT_SUPPORTED));
- }
-
- switch (info_level)
- {
- case SMB_INFO_STANDARD:
- case SMB_INFO_QUERY_EA_SIZE:
- {
- /* access time */
- tvs.actime = make_unix_date2(pdata+l1_fdateLastAccess);
-
- /* write time */
- tvs.modtime = make_unix_date2(pdata+l1_fdateLastWrite);
-
- mode = SVAL(pdata,l1_attrFile);
- size = IVAL(pdata,l1_cbFile);
- break;
- }
-
- /* XXXX um, i don't think this is right.
- it's also not in the cifs6.txt spec.
- */
- case SMB_INFO_QUERY_EAS_FROM_LIST:
- tvs.actime = make_unix_date2(pdata+8);
- tvs.modtime = make_unix_date2(pdata+12);
- size = IVAL(pdata,16);
- mode = IVAL(pdata,24);
- break;
-
- /* XXXX nor this. not in cifs6.txt, either. */
- case SMB_INFO_QUERY_ALL_EAS:
- tvs.actime = make_unix_date2(pdata+8);
- tvs.modtime = make_unix_date2(pdata+12);
- size = IVAL(pdata,16);
- mode = IVAL(pdata,24);
- break;
-
- case SMB_SET_FILE_BASIC_INFO:
- {
- /* Ignore create time at offset pdata. */
-
- /* access time */
- tvs.actime = interpret_long_date(pdata+8);
-
- /* write time + changed time, combined. */
- tvs.modtime=MAX(interpret_long_date(pdata+16),
- interpret_long_date(pdata+24));
-
-#if 0 /* Needs more testing... */
- /* Test from Luke to prevent Win95 from
- setting incorrect values here.
- */
- if (tvs.actime < tvs.modtime)
- return(ERROR(ERRDOS,ERRnoaccess));
-#endif /* Needs more testing... */
-
- /* attributes */
- mode = IVAL(pdata,32);
- break;
- }
-
- case SMB_SET_FILE_END_OF_FILE_INFO:
- {
- if (IVAL(pdata,4) != 0) /* more than 32 bits? */
- return(ERROR(ERRDOS,ERRunknownlevel));
- size = IVAL(pdata,0);
- break;
- }
-
- case SMB_SET_FILE_DISPOSITION_INFO: /* not supported yet */
- case SMB_SET_FILE_ALLOCATION_INFO: /* not supported yet */
- default:
- {
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
- }
-
- DEBUG(6,("actime: %s " , ctime(&tvs.actime)));
- DEBUG(6,("modtime: %s ", ctime(&tvs.modtime)));
- DEBUG(6,("size: %x " , size));
- DEBUG(6,("mode: %x\n" , mode));
-
- /* get some defaults (no modifications) if any info is zero. */
- if (!tvs.actime) tvs.actime = st.st_atime;
- if (!tvs.modtime) tvs.modtime = st.st_mtime;
- if (!size) size = st.st_size;
-
- /* Try and set the times, size and mode of this file -
- if they are different from the current values
- */
- if (st.st_mtime != tvs.modtime || st.st_atime != tvs.actime)
- {
- if(sys_utime(fname, &tvs)!=0)
- {
- return(ERROR(ERRDOS,ERRnoaccess));
- }
- }
-
- /* check the mode isn't different, before changing it */
- if (mode != dos_mode(cnum, fname, &st) && dos_chmod(cnum, fname, mode, NULL))
- {
- DEBUG(2,("chmod of %s failed (%s)\n", fname, strerror(errno)));
- return(ERROR(ERRDOS,ERRnoaccess));
- }
-
- if(size != st.st_size)
- {
- if (fd == -1)
- {
- fd = sys_open(fname,O_RDWR,0);
- if (fd == -1)
- {
- return(ERROR(ERRDOS,ERRbadpath));
- }
- set_filelen(fd, size);
- close(fd);
- }
- else
- {
- set_filelen(fd, size);
- }
- }
-
- SSVAL(params,0,0);
-
- send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0);
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a TRANS2_MKDIR (make directory with extended attributes).
-****************************************************************************/
-static int call_trans2mkdir(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- char *params = *pparams;
- pstring directory;
- int ret = -1;
- BOOL bad_path = False;
-
- if (!CAN_WRITE(cnum))
- return(ERROR(ERRSRV,ERRaccess));
-
- pstrcpy(directory, &params[4]);
-
- DEBUG(3,("call_trans2mkdir : name = %s\n", directory));
-
- unix_convert(directory,cnum,0,&bad_path);
- if (check_name(directory,cnum))
- ret = sys_mkdir(directory,unix_mode(cnum,aDIR));
-
- if(ret < 0)
- {
- DEBUG(5,("call_trans2mkdir error (%s)\n", strerror(errno)));
- if((errno == ENOENT) && bad_path)
- {
- unix_ERR_class = ERRDOS;
- unix_ERR_code = ERRbadpath;
- }
- return(UNIXERROR(ERRDOS,ERRnoaccess));
- }
-
- /* Realloc the parameter and data sizes */
- params = *pparams = Realloc(*pparams,2);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- SSVAL(params,0,0);
-
- send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0);
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a TRANS2_FINDNOTIFYFIRST (start monitoring a directory for changes)
- We don't actually do this - we just send a null response.
-****************************************************************************/
-static int call_trans2findnotifyfirst(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- static uint16 fnf_handle = 257;
- char *params = *pparams;
- uint16 info_level = SVAL(params,4);
-
- DEBUG(3,("call_trans2findnotifyfirst - info_level %d\n", info_level));
-
- switch (info_level)
- {
- case 1:
- case 2:
- break;
- default:
- return(ERROR(ERRDOS,ERRunknownlevel));
- }
-
- /* Realloc the parameter and data sizes */
- params = *pparams = Realloc(*pparams,6);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- SSVAL(params,0,fnf_handle);
- SSVAL(params,2,0); /* No changes */
- SSVAL(params,4,0); /* No EA errors */
-
- fnf_handle++;
-
- if(fnf_handle == 0)
- fnf_handle = 257;
-
- send_trans2_replies(outbuf, bufsize, params, 6, *ppdata, 0);
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a TRANS2_FINDNOTIFYNEXT (continue monitoring a directory for
- changes). Currently this does nothing.
-****************************************************************************/
-static int call_trans2findnotifynext(char *inbuf, char *outbuf, int length, int bufsize,
- int cnum, char **pparams, char **ppdata)
-{
- char *params = *pparams;
-
- DEBUG(3,("call_trans2findnotifynext\n"));
-
- /* Realloc the parameter and data sizes */
- params = *pparams = Realloc(*pparams,4);
- if(params == NULL)
- return(ERROR(ERRDOS,ERRnomem));
-
- SSVAL(params,0,0); /* No changes */
- SSVAL(params,2,0); /* No EA errors */
-
- send_trans2_replies(outbuf, bufsize, params, 4, *ppdata, 0);
-
- return(-1);
-}
-
-/****************************************************************************
- reply to a SMBfindclose (stop trans2 directory search)
-****************************************************************************/
-int reply_findclose(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int cnum;
- int outsize = 0;
- int16 dptr_num=SVALS(inbuf,smb_vwv0);
-
- cnum = SVAL(inbuf,smb_tid);
-
- DEBUG(3,("reply_findclose, cnum = %d, dptr_num = %d\n", cnum, dptr_num));
-
- dptr_close(dptr_num);
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s SMBfindclose cnum=%d, dptr_num = %d\n",timestring(),cnum,dptr_num));
-
- return(outsize);
-}
-
-/****************************************************************************
- reply to a SMBfindnclose (stop FINDNOTIFYFIRST directory search)
-****************************************************************************/
-int reply_findnclose(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int cnum;
- int outsize = 0;
- int dptr_num= -1;
-
- cnum = SVAL(inbuf,smb_tid);
- dptr_num = SVAL(inbuf,smb_vwv0);
-
- DEBUG(3,("reply_findnclose, cnum = %d, dptr_num = %d\n", cnum, dptr_num));
-
- /* We never give out valid handles for a
- findnotifyfirst - so any dptr_num is ok here.
- Just ignore it. */
-
- outsize = set_message(outbuf,0,0,True);
-
- DEBUG(3,("%s SMB_findnclose cnum=%d, dptr_num = %d\n",timestring(),cnum,dptr_num));
-
- return(outsize);
-}
-
-
-/****************************************************************************
- reply to a SMBtranss2 - just ignore it!
-****************************************************************************/
-int reply_transs2(char *inbuf,char *outbuf,int length,int bufsize)
-{
- DEBUG(4,("Ignoring transs2 of length %d\n",length));
- return(-1);
-}
-
-/****************************************************************************
- reply to a SMBtrans2
-****************************************************************************/
-int reply_trans2(char *inbuf,char *outbuf,int length,int bufsize)
-{
- int outsize = 0;
- int cnum = SVAL(inbuf,smb_tid);
- unsigned int total_params = SVAL(inbuf, smb_tpscnt);
- unsigned int total_data =SVAL(inbuf, smb_tdscnt);
-#if 0
- unsigned int max_param_reply = SVAL(inbuf, smb_mprcnt);
- unsigned int max_data_reply = SVAL(inbuf, smb_mdrcnt);
- unsigned int max_setup_fields = SVAL(inbuf, smb_msrcnt);
- BOOL close_tid = BITSETW(inbuf+smb_flags,0);
- BOOL no_final_response = BITSETW(inbuf+smb_flags,1);
- int32 timeout = IVALS(inbuf,smb_timeout);
-#endif
- unsigned int suwcnt = SVAL(inbuf, smb_suwcnt);
- unsigned int tran_call = SVAL(inbuf, smb_setup0);
- char *params = NULL, *data = NULL;
- int num_params, num_params_sofar, num_data, num_data_sofar;
-
- outsize = set_message(outbuf,0,0,True);
-
- /* All trans2 messages we handle have smb_sucnt == 1 - ensure this
- is so as a sanity check */
- if(suwcnt != 1 )
- {
- DEBUG(2,("Invalid smb_sucnt in trans2 call\n"));
- return(ERROR(ERRSRV,ERRerror));
- }
-
- /* Allocate the space for the maximum needed parameters and data */
- if (total_params > 0)
- params = (char *)malloc(total_params);
- if (total_data > 0)
- data = (char *)malloc(total_data);
-
- if ((total_params && !params) || (total_data && !data))
- {
- DEBUG(2,("Out of memory in reply_trans2\n"));
- return(ERROR(ERRDOS,ERRnomem));
- }
-
- /* Copy the param and data bytes sent with this request into
- the params buffer */
- num_params = num_params_sofar = SVAL(inbuf,smb_pscnt);
- num_data = num_data_sofar = SVAL(inbuf, smb_dscnt);
-
- if (num_params > total_params || num_data > total_data)
- exit_server("invalid params in reply_trans2");
-
- memcpy( params, smb_base(inbuf) + SVAL(inbuf, smb_psoff), num_params);
- memcpy( data, smb_base(inbuf) + SVAL(inbuf, smb_dsoff), num_data);
-
- if(num_data_sofar < total_data || num_params_sofar < total_params)
- {
- /* We need to send an interim response then receive the rest
- of the parameter/data bytes */
- outsize = set_message(outbuf,0,0,True);
- send_smb(Client,outbuf);
-
- while( num_data_sofar < total_data || num_params_sofar < total_params)
- {
- if(!receive_smb(Client,inbuf, SMB_SECONDARY_WAIT) ||
- CVAL(inbuf, smb_com) != SMBtranss2)
- {
- outsize = set_message(outbuf,0,0,True);
- DEBUG(2,("Invalid secondary trans2 packet\n"));
- free(params);
- free(data);
- return(ERROR(ERRSRV,ERRerror));
- }
-
- /* Revise total_params and total_data in case they have changed downwards */
- total_params = SVAL(inbuf, smb_tpscnt);
- total_data = SVAL(inbuf, smb_tdscnt);
- num_params_sofar += (num_params = SVAL(inbuf,smb_spscnt));
- num_data_sofar += ( num_data = SVAL(inbuf, smb_sdscnt));
- if (num_params_sofar > total_params || num_data_sofar > total_data)
- exit_server("data overflow in trans2");
-
- memcpy( &params[ SVAL(inbuf, smb_spsdisp)],
- smb_base(inbuf) + SVAL(inbuf, smb_spsoff), num_params);
- memcpy( &data[SVAL(inbuf, smb_sdsdisp)],
- smb_base(inbuf)+ SVAL(inbuf, smb_sdsoff), num_data);
- }
- }
-
- if (Protocol >= PROTOCOL_NT1) {
- uint16 flg2 = SVAL(outbuf,smb_flg2);
- SSVAL(outbuf,smb_flg2,flg2 | 0x40); /* IS_LONG_NAME */
- }
-
- /* Now we must call the relevant TRANS2 function */
- switch(tran_call)
- {
- case TRANSACT2_OPEN:
- outsize = call_trans2open(inbuf, outbuf, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_FINDFIRST:
- outsize = call_trans2findfirst(inbuf, outbuf, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_FINDNEXT:
- outsize = call_trans2findnext(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_QFSINFO:
- outsize = call_trans2qfsinfo(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_SETFSINFO:
- outsize = call_trans2setfsinfo(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_QPATHINFO:
- case TRANSACT2_QFILEINFO:
- outsize = call_trans2qfilepathinfo(inbuf, outbuf, length, bufsize, cnum, &params, &data, total_data);
- break;
- case TRANSACT2_SETPATHINFO:
- case TRANSACT2_SETFILEINFO:
- outsize = call_trans2setfilepathinfo(inbuf, outbuf, length, bufsize, cnum, &params, &data, total_data);
- break;
- case TRANSACT2_FINDNOTIFYFIRST:
- outsize = call_trans2findnotifyfirst(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_FINDNOTIFYNEXT:
- outsize = call_trans2findnotifynext(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- case TRANSACT2_MKDIR:
- outsize = call_trans2mkdir(inbuf, outbuf, length, bufsize, cnum, &params, &data);
- break;
- default:
- /* Error in request */
- DEBUG(2,("%s Unknown request %d in trans2 call\n",timestring(), tran_call));
- if(params)
- free(params);
- if(data)
- free(data);
- return (ERROR(ERRSRV,ERRerror));
- }
-
- /* As we do not know how many data packets will need to be
- returned here the various call_trans2xxxx calls
- must send their own. Thus a call_trans2xxx routine only
- returns a value other than -1 when it wants to send
- an error packet.
- */
-
- if(params)
- free(params);
- if(data)
- free(data);
- return outsize; /* If a correct response was needed the call_trans2xxx
- calls have already sent it. If outsize != -1 then it is
- returning an error packet. */
-}
diff --git a/source/smbd/uid.c b/source/smbd/uid.c
deleted file mode 100644
index cdc4e474c61..00000000000
--- a/source/smbd/uid.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- uid/user handling
- Copyright (C) Andrew Tridgell 1992-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-extern connection_struct Connections[];
-
-static int initial_uid;
-static int initial_gid;
-
-/* what user is current? */
-struct current_user current_user;
-
-extern pstring OriginalDir;
-
-/****************************************************************************
-initialise the uid routines
-****************************************************************************/
-void init_uid(void)
-{
- initial_uid = current_user.uid = geteuid();
- initial_gid = current_user.gid = getegid();
-
- if (initial_gid != 0 && initial_uid == 0)
- {
-#ifdef HPUX
- setresgid(0,0,0);
-#else
- setgid(0);
- setegid(0);
-#endif
- }
-
- initial_uid = geteuid();
- initial_gid = getegid();
-
- current_user.cnum = -1;
-
- ChDir(OriginalDir);
-}
-
-
-/****************************************************************************
- become the specified uid
-****************************************************************************/
-static BOOL become_uid(int uid)
-{
- if (initial_uid != 0)
- return(True);
-
- if (uid == -1 || uid == 65535) {
- DEBUG(1,("WARNING: using uid %d is a security risk\n",uid));
- }
-
-#ifdef AIX
- {
- /* AIX 3 stuff - inspired by a code fragment in wu-ftpd */
- priv_t priv;
-
- priv.pv_priv[0] = 0;
- priv.pv_priv[1] = 0;
- if (setpriv(PRIV_SET|PRIV_INHERITED|PRIV_EFFECTIVE|PRIV_BEQUEATH,
- &priv, sizeof(priv_t)) < 0 ||
- setuidx(ID_REAL|ID_EFFECTIVE, (uid_t)uid) < 0 ||
- seteuid((uid_t)uid) < 0)
- DEBUG(1,("Can't set uid (AIX3)\n"));
- }
-#endif
-
-#ifdef USE_SETRES
- if (setresuid(-1,uid,-1) != 0)
-#elif defined(USE_SETFS)
- if (setfsuid(uid) != 0)
-#else
- if ((seteuid(uid) != 0) &&
- (setuid(uid) != 0))
-#endif
- {
- DEBUG(0,("Couldn't set uid %d currently set to (%d,%d)\n",
- uid,getuid(), geteuid()));
- if (uid > 32000)
- DEBUG(0,("Looks like your OS doesn't like high uid values - try using a different account\n"));
- return(False);
- }
-
- if (((uid == -1) || (uid == 65535)) && geteuid() != uid) {
- DEBUG(0,("Invalid uid -1. perhaps you have a account with uid 65535?\n"));
- return(False);
- }
-
- current_user.uid = uid;
-
- return(True);
-}
-
-
-/****************************************************************************
- become the specified gid
-****************************************************************************/
-static BOOL become_gid(int gid)
-{
- if (initial_uid != 0)
- return(True);
-
- if (gid == -1 || gid == 65535) {
- DEBUG(1,("WARNING: using gid %d is a security risk\n",gid));
- }
-
-#ifdef USE_SETRES
- if (setresgid(-1,gid,-1) != 0)
-#elif defined(USE_SETFS)
- if (setfsgid(gid) != 0)
-#else
- if (setgid(gid) != 0)
-#endif
- {
- DEBUG(0,("Couldn't set gid %d currently set to (%d,%d)\n",
- gid,getgid(),getegid()));
- if (gid > 32000)
- DEBUG(0,("Looks like your OS doesn't like high gid values - try using a different account\n"));
- return(False);
- }
-
- current_user.gid = gid;
-
- return(True);
-}
-
-
-/****************************************************************************
- become the specified uid and gid
-****************************************************************************/
-static BOOL become_id(int uid,int gid)
-{
- return(become_gid(gid) && become_uid(uid));
-}
-
-/****************************************************************************
-become the guest user
-****************************************************************************/
-BOOL become_guest(void)
-{
- BOOL ret;
- static struct passwd *pass=NULL;
-
- if (initial_uid != 0)
- return(True);
-
- if (!pass)
- pass = Get_Pwnam(lp_guestaccount(-1),True);
- if (!pass) return(False);
-
- ret = become_id(pass->pw_uid,pass->pw_gid);
-
- if (!ret)
- DEBUG(1,("Failed to become guest. Invalid guest account?\n"));
-
- current_user.cnum = -2;
-
- return(ret);
-}
-
-/*******************************************************************
-check if a username is OK
-********************************************************************/
-static BOOL check_user_ok(int cnum,user_struct *vuser,int snum)
-{
- int i;
- for (i=0;i<Connections[cnum].uid_cache.entries;i++)
- if (Connections[cnum].uid_cache.list[i] == vuser->uid) return(True);
-
- if (!user_ok(vuser->name,snum)) return(False);
-
- i = Connections[cnum].uid_cache.entries % UID_CACHE_SIZE;
- Connections[cnum].uid_cache.list[i] = vuser->uid;
-
- if (Connections[cnum].uid_cache.entries < UID_CACHE_SIZE)
- Connections[cnum].uid_cache.entries++;
-
- return(True);
-}
-
-
-/****************************************************************************
- become the user of a connection number
-****************************************************************************/
-BOOL become_user(int cnum, uint16 vuid)
-{
- user_struct *vuser = get_valid_user_struct(vuid);
- int snum,gid;
- int uid;
-
- if (current_user.cnum == cnum && vuser != 0 && current_user.id == vuser->uid) {
- DEBUG(4,("Skipping become_user - already user\n"));
- return(True);
- }
-
- unbecome_user();
-
- if (!OPEN_CNUM(cnum)) {
- DEBUG(2,("Connection %d not open\n",cnum));
- return(False);
- }
-
- snum = Connections[cnum].service;
-
- if (Connections[cnum].force_user ||
- lp_security() == SEC_SHARE ||
- !(vuser) || (vuser->guest) ||
- !check_user_ok(cnum,vuser,snum)) {
- uid = Connections[cnum].uid;
- gid = Connections[cnum].gid;
- current_user.groups = Connections[cnum].groups;
- current_user.igroups = Connections[cnum].igroups;
- current_user.ngroups = Connections[cnum].ngroups;
- } else {
- if (!vuser) {
- DEBUG(2,("Invalid vuid used %d\n",vuid));
- return(False);
- }
- uid = vuser->uid;
- if(!*lp_force_group(snum))
- gid = vuser->gid;
- else
- gid = Connections[cnum].gid;
- current_user.groups = vuser->user_groups;
- current_user.igroups = vuser->user_igroups;
- current_user.ngroups = vuser->user_ngroups;
- }
-
- if (initial_uid == 0)
- {
- if (!become_gid(gid)) return(False);
-
-#ifndef NO_SETGROUPS
- if (!IS_IPC(cnum)) {
- /* groups stuff added by ih/wreu */
- if (current_user.ngroups > 0)
- if (setgroups(current_user.ngroups,current_user.groups)<0)
- DEBUG(0,("setgroups call failed!\n"));
- }
-#endif
-
- if (!Connections[cnum].admin_user && !become_uid(uid))
- return(False);
- }
-
- current_user.cnum = cnum;
- current_user.id = uid;
-
- DEBUG(5,("become_user uid=(%d,%d) gid=(%d,%d)\n",
- getuid(),geteuid(),getgid(),getegid()));
-
- return(True);
-}
-
-/****************************************************************************
- unbecome the user of a connection number
-****************************************************************************/
-BOOL unbecome_user(void )
-{
- if (current_user.cnum == -1)
- return(False);
-
- ChDir(OriginalDir);
-
- if (initial_uid == 0)
- {
-#ifdef USE_SETRES
- setresuid(-1,getuid(),-1);
- setresgid(-1,getgid(),-1);
-#elif defined(USE_SETFS)
- setfsuid(initial_uid);
- setfsgid(initial_gid);
-#else
- if (seteuid(initial_uid) != 0)
- setuid(initial_uid);
- setgid(initial_gid);
-#endif
- }
-#ifdef NO_EID
- if (initial_uid == 0)
- DEBUG(2,("Running with no EID\n"));
- initial_uid = getuid();
- initial_gid = getgid();
-#else
- if (geteuid() != initial_uid)
- {
- DEBUG(0,("Warning: You appear to have a trapdoor uid system\n"));
- initial_uid = geteuid();
- }
- if (getegid() != initial_gid)
- {
- DEBUG(0,("Warning: You appear to have a trapdoor gid system\n"));
- initial_gid = getegid();
- }
-#endif
-
- current_user.uid = initial_uid;
- current_user.gid = initial_gid;
-
- if (ChDir(OriginalDir) != 0)
- DEBUG(0,("%s chdir(%s) failed in unbecome_user\n",
- timestring(),OriginalDir));
-
- DEBUG(5,("unbecome_user now uid=(%d,%d) gid=(%d,%d)\n",
- getuid(),geteuid(),getgid(),getegid()));
-
- current_user.cnum = -1;
-
- return(True);
-}
-
-
-/****************************************************************************
-This is a utility function of smbrun(). It must be called only from
-the child as it may leave the caller in a privilaged state.
-****************************************************************************/
-static BOOL setup_stdout_file(char *outfile,BOOL shared)
-{
- int fd;
- struct stat st;
- mode_t mode = S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH;
- int flags = O_RDWR|O_CREAT|O_TRUNC|O_EXCL;
-
- close(1);
-
- if (shared) {
- /* become root - unprivilaged users can't delete these files */
-#ifdef USE_SETRES
- setresgid(0,0,0);
- setresuid(0,0,0);
-#else
- setuid(0);
- seteuid(0);
-#endif
- }
-
- if(stat(outfile, &st) == 0) {
- /* Check we're not deleting a device file. */
- if(st.st_mode & S_IFREG)
- unlink(outfile);
- else
- flags = O_RDWR;
- }
- /* now create the file */
- fd = open(outfile,flags,mode);
-
- if (fd == -1) return False;
-
- if (fd != 1) {
- if (dup2(fd,1) != 0) {
- DEBUG(2,("Failed to create stdout file descriptor\n"));
- close(fd);
- return False;
- }
- close(fd);
- }
- return True;
-}
-
-
-/****************************************************************************
-run a command being careful about uid/gid handling and putting the output in
-outfile (or discard it if outfile is NULL).
-
-if shared is True then ensure the file will be writeable by all users
-but created such that its owned by root. This overcomes a security hole.
-
-if shared is not set then open the file with O_EXCL set
-****************************************************************************/
-int smbrun(char *cmd,char *outfile,BOOL shared)
-{
- int fd,pid;
- int uid = current_user.uid;
- int gid = current_user.gid;
-
-#if USE_SYSTEM
- int ret;
- pstring syscmd;
- char *path = lp_smbrun();
-
- /* in the old method we use system() to execute smbrun which then
- executes the command (using system() again!). This involves lots
- of shell launches and is very slow. It also suffers from a
- potential security hole */
- if (!file_exist(path,NULL))
- {
- DEBUG(0,("SMBRUN ERROR: Can't find %s. Installation problem?\n",path));
- return(1);
- }
-
- sprintf(syscmd,"%s %d %d \"(%s 2>&1) > %s\"",
- path,uid,gid,cmd,
- outfile?outfile:"/dev/null");
-
- DEBUG(5,("smbrun - running %s ",syscmd));
- ret = system(syscmd);
- DEBUG(5,("gave %d\n",ret));
- return(ret);
-#else
- /* in this newer method we will exec /bin/sh with the correct
- arguments, after first setting stdout to point at the file */
-
- if ((pid=fork())) {
- int status=0;
- /* the parent just waits for the child to exit */
- if (sys_waitpid(pid,&status,0) != pid) {
- DEBUG(2,("waitpid(%d) : %s\n",pid,strerror(errno)));
- return -1;
- }
- return status;
- }
-
-
- /* we are in the child. we exec /bin/sh to do the work for us. we
- don't directly exec the command we want because it may be a
- pipeline or anything else the config file specifies */
-
- /* point our stdout at the file we want output to go into */
- if (outfile && !setup_stdout_file(outfile,shared)) {
- exit(80);
- }
-
- /* now completely lose our privilages. This is a fairly paranoid
- way of doing it, but it does work on all systems that I know of */
-#ifdef USE_SETRES
- setresgid(0,0,0);
- setresuid(0,0,0);
- setresgid(gid,gid,gid);
- setresuid(uid,uid,uid);
-#else
- setuid(0);
- seteuid(0);
- setgid(gid);
- setegid(gid);
- setuid(uid);
- seteuid(uid);
-#endif
-
- if (getuid() != uid || geteuid() != uid ||
- getgid() != gid || getegid() != gid) {
- /* we failed to lose our privilages - do not execute the command */
- exit(81); /* we can't print stuff at this stage, instead use exit codes
- for debugging */
- }
-
- /* close all other file descriptors, leaving only 0, 1 and 2. 0 and
- 2 point to /dev/null from the startup code */
- for (fd=3;fd<256;fd++) close(fd);
-
- execl("/bin/sh","sh","-c",cmd,NULL);
-
- /* not reached */
- exit(82);
-#endif
- return 1;
-}
diff --git a/source/smbd/vt_mode.c b/source/smbd/vt_mode.c
deleted file mode 100644
index 07558274a52..00000000000
--- a/source/smbd/vt_mode.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* vt_mode.c */
-/*
-support vtp-sessions
-
-written by Christian A. Lademann <cal@zls.com>
-*/
-
-/*
-02.05.95:cal:ported to samba-1.9.13
-*/
-
-#define __vt_mode_c__
-
-
-/* #include <stdio.h> */
-/* #include <fcntl.h> */
-/* #include <sys/types.h> */
-/* #include <unistd.h> */
-/* #include <signal.h> */
-/* #include <errno.h> */
-/* #include <ctype.h> */
-/* #include <utmp.h> */
-/* #include <sys/param.h> */
-/* #include <sys/ioctl.h> */
-/* #include <stdlib.h> */
-/* #include <string.h> */
-
-#include "includes.h"
-#include "vt_mode.h"
-#include <utmp.h>
-
-#ifdef SCO
- extern char *strdup();
-#endif
-
-extern int Client;
-
-#ifdef LINUX
-# define HAS_VTY
-#endif
-
-#ifdef SCO
-# define HAS_PTY
-# define HAS_VTY
-
-# include <sys/tty.h>
-#endif
-
-extern int DEBUGLEVEL;
-extern char *InBuffer, *OutBuffer;
-extern int done_become_user;
-
-char master_name [64], slave_name [64];
-int master, slave, i, o, e;
-
-int ms_type = MS_NONE,
- ms_poll = 0;
-
-
-/*
-VT_Check: test incoming packet for "vtp" or "iVT1\0"
-*/
-int VT_Check(char *buffer)
-{
- DEBUG(3,("Checking packet: <%10s...>\n", buffer+4));
- if((strncmp(buffer+4, "vtp", 3) == 0 && smb_len(buffer) == 3) || (strncmp(buffer+4, "iVT1\0", 5) == 0 && smb_len(buffer) == 5))
- return(1);
- else
- return(0);
-}
-
-
-/*
-VT_Start_utmp: prepare /etc/utmp for /bin/login
-*/
-int VT_Start_utmp(void)
-{
- struct utmp u, *v;
- char *tt;
-
-
- setutent();
-
- fstrcpy(u.ut_line, VT_Line);
-
- if((v = getutline(&u)) == NULL) {
- if(strncmp(VT_Line, "tty", 3) == 0)
- tt = VT_Line + 3;
- else if(strlen(VT_Line) > 4)
- tt = VT_Line + strlen(VT_Line) - 4;
- else
- tt = VT_Line;
-
- fstrcpy(u.ut_id, tt);
- u.ut_time = time((time_t*)0);
- }
-
- fstrcpy(u.ut_user, "LOGIN");
- fstrcpy(u.ut_line, VT_Line);
- u.ut_pid = getpid();
- u.ut_type = LOGIN_PROCESS;
- pututline(&u);
-
- endutent();
-
- return(0);
-}
-
-
-/*
-VT_Stop_utmp: prepare /etc/utmp for other processes
-*/
-int VT_Stop_utmp(void)
-{
- struct utmp u, *v;
-
-
- if(VT_Line != NULL) {
- setutent();
-
- fstrcpy(u.ut_line, VT_Line);
-
- if((v = getutline(&u)) != NULL) {
- fstrcpy(v->ut_user, "");
- v->ut_type = DEAD_PROCESS;
- v->ut_time = time((time_t*)0);
- pututline(v);
- }
-
- endutent();
- }
-
- return(0);
-}
-
-
-/*
-VT_AtExit: Things to do when the program exits
-*/
-void VT_AtExit(void)
-{
- if(VT_ChildPID > 0) {
- kill(VT_ChildPID, SIGHUP);
- (void)wait(NULL);
- }
-
- VT_Stop_utmp();
-}
-
-
-/*
-VT_SigCLD: signalhandler for SIGCLD: set flag if child-process died
-*/
-void VT_SigCLD(int sig)
-{
- if(wait(NULL) == VT_ChildPID)
- VT_ChildDied = True;
- else
- signal(SIGCLD, VT_SigCLD);
-}
-
-
-/*
-VT_SigEXIT: signalhandler for signals that cause the process to exit
-*/
-void VT_SigEXIT(int sig)
-{
- VT_AtExit();
-
- exit(1);
-}
-
-
-/*
-VT_Start: initialize vt-specific data, alloc pty, spawn shell and send ACK
-*/
-int VT_Start(void)
-{
- char OutBuf [64], *X, *Y;
-
-
- ms_type = MS_NONE;
- master = slave = -1;
-
-#ifdef HAS_VTY
-#ifdef LINUX
-# define MASTER_TMPL "/dev/pty "
-# define SLAVE_TMPL "/dev/tty "
-# define LETTER1 "pqrs"
-# define POS1 8
-# define LETTER2 "0123456789abcdef"
-# define POS2 9
-#endif
-
-#ifdef SCO
-# define MASTER_TMPL "/dev/ptyp_ "
-# define SLAVE_TMPL "/dev/ttyp_ "
-# define LETTER1 "0123456"
-# define POS1 10
-# define LETTER2 "0123456789abcdef"
-# define POS2 11
-#endif
-
- if(ms_poll == MS_VTY || ms_poll == 0) {
- strcpy(master_name, MASTER_TMPL);
- strcpy(slave_name, SLAVE_TMPL);
-
- for(X = LETTER1; *X && master < 0; X++)
- for(Y = LETTER2; *Y && master < 0; Y++) {
- master_name [POS1] = *X;
- master_name [POS2] = *Y;
- if((master = open(master_name, O_RDWR)) >= 0) {
- slave_name [POS1] = *X;
- slave_name [POS2] = *Y;
- if((slave = open(slave_name, O_RDWR)) < 0)
- close(master);
- }
- }
-
- if(master >= 0 && slave >= 0)
- ms_type = MS_VTY;
- }
-
-# undef MASTER_TMPL
-# undef SLAVE_TMPL
-# undef LETTER1
-# undef LETTER2
-# undef POS1
-# undef POS2
-#endif
-
-
-#ifdef HAS_PTY
-#ifdef SCO
-# define MASTER_TMPL "/dev/ptyp%d"
-# define SLAVE_TMPL "/dev/ttyp%d"
-# define MIN_I 0
-# define MAX_I 63
-#endif
-
- if(ms_poll == MS_PTY || ms_poll == 0) {
- int i;
-
- for(i = MIN_I; i <= MAX_I && master < 0; i++) {
- sprintf(master_name, MASTER_TMPL, i);
- if((master = open(master_name, O_RDWR)) >= 0) {
- sprintf(slave_name, SLAVE_TMPL, i);
- if((slave = open(slave_name, O_RDWR)) < 0)
- close(master);
- }
- }
-
- if(master >= 0 && slave >= 0)
- ms_type = MS_PTY;
- }
-
-# undef MASTER_TMPL
-# undef SLAVE_TMPL
-# undef MIN_I
-# undef MAX_I
-#endif
-
-
- if(! ms_type)
- return(-1);
-
- VT_Line = strdup(strrchr(slave_name, '/') + 1);
-
- switch((VT_ChildPID = fork())) {
- case -1:
- return(-1);
- break;
-
- case 0:
-#ifdef SCO
- setsid();
-#endif
- close(0);
- close(1);
- close(2);
-
- i = open(slave_name, O_RDWR);
- o = open(slave_name, O_RDWR);
- e = open(slave_name, O_RDWR);
-
-#ifdef LINUX
- setsid();
- if (ioctl(slave, TIOCSCTTY, (char *)NULL) == -1)
- exit(1);
-#endif
-#ifdef SCO
- tcsetpgrp(0, getpid());
-#endif
-
- VT_Start_utmp();
-
- system("stty sane");
- execlp("/bin/login", "login", "-c", (char*)0);
- exit(1);
- break;
-
- default:
- VT_Mode = True;
- VT_Status = VT_OPEN;
- VT_ChildDied = False;
- VT_Fd = master;
-
- signal(SIGCLD, VT_SigCLD);
-
- signal(SIGHUP, VT_SigEXIT);
- signal(SIGTERM, VT_SigEXIT);
- signal(SIGINT, VT_SigEXIT);
- signal(SIGQUIT, VT_SigEXIT);
-
- memset(OutBuf, 0, sizeof(OutBuf));
- OutBuf [4] = 0x06;
- _smb_setlen(OutBuf, 1);
-
- send_smb(Client,OutBuf);
-
- return(0);
- break;
- }
-}
-
-
-/*
-VT_Output: transport data from socket to pty
-*/
-int VT_Output(char *Buffer)
-{
- int i, len, nb;
-
-
- if(VT_Status != VT_OPEN)
- return(-1);
-
- len = smb_len(Buffer);
-
- nb = write(VT_Fd, Buffer + 4, len);
-
- return((nb == len) ? 0 : -1);
-}
-
-
-/*
-VT_Input: transport data from pty to socket
-*/
-int VT_Input(char *Buffer,int Size)
-{
- int len;
-
-
- if(VT_Status != VT_OPEN)
- return(-1);
-
- memset(Buffer, 0, Size);
- len = read(VT_Fd, Buffer + 4, MIN(VT_MAXREAD, Size));
-
- _smb_setlen(Buffer, len);
-
- return(len + 4);
-}
-
-
-/*
-VT_Process: main loop while in vt-mode
-*/
-void VT_Process(void)
-{
- static int trans_num = 0;
- extern int Client;
- int nread;
-
-
- VT_Start();
-
- atexit(VT_AtExit);
-
- while (True) {
- int32 len;
- int msg_type;
- int msg_flags;
- int counter;
- int last_keepalive=0;
- struct fd_set si;
- struct timeval to, *top;
- int n, ret, t;
-
-
- errno = 0;
- t = SMBD_SELECT_LOOP*1000;
-
-
- FD_ZERO(&si);
- FD_SET(Client, &si);
-
- FD_SET(VT_Fd, &si);
-
- if(t >= 0) {
- to.tv_sec = t / 1000;
- to.tv_usec = t - (to.tv_sec * 1000);
-
- top = &to;
- } else
- top = NULL;
-
- if(VT_ChildDied)
- goto leave_VT_Process;
-
- n = select(MAX(VT_Fd, Client) + 1, &si, NULL, NULL, top);
-
- if(VT_ChildDied)
- goto leave_VT_Process;
-
- if(n == 0) {
- int i;
- time_t t;
- BOOL allidle = True;
- extern int keepalive;
-
- counter += SMBD_SELECT_LOOP;
-
- t = time(NULL);
-
- if (keepalive && (counter-last_keepalive)>keepalive) {
- if (!send_keepalive(Client))
- goto leave_VT_Process;
- last_keepalive = counter;
- }
- } else if(n > 0) {
- counter = 0;
-
- if(FD_ISSET(VT_Fd, &si)) {
- /* got input from vt */
- nread = VT_Input(OutBuffer, MIN(BUFFER_SIZE,lp_maxxmit()));
-
- if(nread > 0)
- send_smb(Client,OutBuffer);
- }
-
- if(FD_ISSET(Client, &si)) {
- /* got input from socket */
-
- if(receive_smb(Client,InBuffer, 0)) {
- msg_type = CVAL(InBuffer,0);
- msg_flags = CVAL(InBuffer,1);
-
- len = smb_len(InBuffer);
-
- DEBUG(6,("got message type 0x%x of len 0x%x\n",msg_type,len));
-
- nread = len + 4;
-
- DEBUG(3,("%s Transaction %d of length %d\n",timestring(),trans_num,nread));
-
- if(msg_type == 0)
- VT_Output(InBuffer);
- else {
- nread = construct_reply(InBuffer,OutBuffer,nread,MIN(BUFFER_SIZE,lp_maxxmit()));
-
- if(nread > 0) {
- if (nread != smb_len(OutBuffer) + 4) {
- DEBUG(0,("ERROR: Invalid message response size! %d %d\n",
- nread,
- smb_len(OutBuffer)));
- } else
- send_smb(Client,OutBuffer);
- }
- }
- } else
- if(errno == EBADF)
- goto leave_VT_Process;
- }
- }
-
- trans_num++;
- }
-
- leave_VT_Process:
-/*
- if(VT_ChildPID > 0)
- kill(VT_ChildPID, SIGHUP);
-
- VT_Stop_utmp(VT_Line);
- return;
-*/
- close_sockets();
- exit(0);
-}
diff --git a/source/smbparse.c b/source/smbparse.c
deleted file mode 100644
index 01438281ef1..00000000000
--- a/source/smbparse.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Samba utility functions
- Copyright (C) Luke Leighton 1996 - 1997 Paul Ashton 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-
-/*******************************************************************
-reads or writes a UTIME type.
-********************************************************************/
-char* smb_io_utime(BOOL io, UTIME *t, char *q, char *base, int align)
-{
- if (t == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL (io, q, t->time, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an NTTIME structure.
-********************************************************************/
-char* smb_io_time(BOOL io, NTTIME *nttime, char *q, char *base, int align)
-{
- if (nttime == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, nttime->low , 0); q += 4; /* low part */
- RW_IVAL(io, q, nttime->high, 0); q += 4; /* high part */
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_SID structure.
-********************************************************************/
-char* smb_io_dom_sid(BOOL io, DOM_SID *sid, char *q, char *base, int align)
-{
- int i;
-
- if (sid == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_CVAL(io, q, sid->sid_no, 0); q++;
- RW_CVAL(io, q, sid->num_auths, 0); q++;
-
- for (i = 0; i < 6; i++)
- {
- RW_CVAL(io, q, sid->id_auth[i], 0); q++;
- }
-
- /* oops! XXXX should really issue a warning here... */
- if (sid->num_auths > MAXSUBAUTHS) sid->num_auths = MAXSUBAUTHS;
-
- RW_PSVAL(io, q, sid->sub_auths, sid->num_auths); q += sid->num_auths * 2;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a UNIHDR structure.
-********************************************************************/
-char* smb_io_unihdr(BOOL io, UNIHDR *hdr, char *q, char *base, int align)
-{
- if (hdr == NULL) return NULL;
-
- /* should be value 4, so enforce it. */
- hdr->undoc = 4;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, hdr->uni_max_len, 0); q += 4;
- RW_IVAL(io, q, hdr->uni_str_len, 0); q += 4;
- RW_IVAL(io, q, hdr->undoc , 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a UNIHDR2 structure.
-********************************************************************/
-char* smb_io_unihdr2(BOOL io, UNIHDR2 *hdr2, char *q, char *base, int align)
-{
- if (hdr2 == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_unihdr(io, &(hdr2->unihdr), q, base, align);
- RW_IVAL(io, q, hdr2->undoc_buffer, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a UNISTR structure.
-XXXX NOTE: UNISTR structures NEED to be null-terminated.
-********************************************************************/
-char* smb_io_unistr(BOOL io, UNISTR *uni, char *q, char *base, int align)
-{
- if (uni == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- if (io)
- {
- /* io True indicates read _from_ the SMB buffer into the string */
- q += 2 * unistrcpy((char*)uni->buffer, q);
- }
- else
- {
- /* io True indicates copy _from_ the string into SMB buffer */
- q += 2 * unistrcpy(q, (char*)uni->buffer);
- }
- return q;
-}
-
-/*******************************************************************
-reads or writes a UNISTR2 structure.
-XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
- the uni_str_len member tells you how long the string is;
- the uni_max_len member tells you how large the buffer is.
-********************************************************************/
-char* smb_io_unistr2(BOOL io, UNISTR2 *uni2, char *q, char *base, int align)
-{
- if (uni2 == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- /* should be value 0, so enforce it. */
- uni2->undoc = 0;
-
- RW_IVAL(io, q, uni2->uni_max_len, 0); q += 4;
- RW_IVAL(io, q, uni2->undoc , 0); q += 4;
- RW_IVAL(io, q, uni2->uni_str_len, 0); q += 4;
-
- /* oops! XXXX maybe issue a warning that this is happening... */
- if (uni2->uni_max_len > MAX_UNISTRLEN) uni2->uni_max_len = MAX_UNISTRLEN;
- if (uni2->uni_str_len > MAX_UNISTRLEN) uni2->uni_str_len = MAX_UNISTRLEN;
-
- /* buffer advanced by indicated length of string
- NOT by searching for null-termination */
- RW_PSVAL(io, q, uni2->buffer, uni2->uni_max_len); q += uni2->uni_max_len * 2;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_SID2 structure.
-********************************************************************/
-char* smb_io_dom_sid2(BOOL io, DOM_SID2 *sid2, char *q, char *base, int align)
-{
- if (sid2 == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- /* should be value 5, so enforce it */
- sid2->type = 5;
-
- /* should be value 0, so enforce it */
- sid2->undoc = 0;
-
- RW_IVAL(io, q, sid2->type , 0); q += 4;
- RW_IVAL(io, q, sid2->undoc, 0); q += 4;
-
- q = smb_io_unihdr2(io, &(sid2->hdr), q, base, align);
- q = smb_io_unistr (io, &(sid2->str), q, base, align);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_RID2 structure.
-********************************************************************/
-char* smb_io_dom_rid2(BOOL io, DOM_RID2 *rid2, char *q, char *base, int align)
-{
- if (rid2 == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- /* should be value 5, so enforce it */
- rid2->type = 5;
-
- /* should be value 5, so enforce it */
- rid2->undoc = 5;
-
- RW_IVAL(io, q, rid2->type, 0); q += 4;
- RW_IVAL(io, q, rid2->undoc , 0); q += 4;
- RW_IVAL(io, q, rid2->rid , 0); q += 4;
- RW_IVAL(io, q, rid2->rid_idx , 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_LOG_INFO structure.
-********************************************************************/
-char* smb_io_log_info(BOOL io, DOM_LOG_INFO *log, char *q, char *base, int align)
-{
- if (log == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, log->undoc_buffer, 0); q += 4;
-
- q = smb_io_unistr2(io, &(log->uni_logon_srv), q, base, align);
- q = smb_io_unistr2(io, &(log->uni_acct_name), q, base, align);
-
- RW_SVAL(io, q, log->sec_chan, 0); q += 2;
-
- /* XXXX no alignment required between sec_chan and uni_comp_name */
- q = smb_io_unistr2(io, &(log->uni_comp_name), q, base, 0);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_CHAL structure.
-********************************************************************/
-char* smb_io_chal(BOOL io, DOM_CHAL *chal, char *q, char *base, int align)
-{
- if (chal == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_PCVAL(io, q, chal->data, 8); q += 8;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_CRED structure.
-********************************************************************/
-char* smb_io_cred(BOOL io, DOM_CRED *cred, char *q, char *base, int align)
-{
- if (cred == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_chal (io, &(cred->challenge), q, base, align);
- q = smb_io_utime(io, &(cred->timestamp), q, base, align);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_CLNT_INFO structure.
-********************************************************************/
-char* smb_io_clnt_info(BOOL io, DOM_CLNT_INFO *clnt, char *q, char *base, int align)
-{
- if (clnt == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_log_info(io, &(clnt->login), q, base, align);
- q = smb_io_cred (io, &(clnt->cred ), q, base, align);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_LOGON_ID structure.
-********************************************************************/
-char* smb_io_logon_id(BOOL io, DOM_LOGON_ID *log, char *q, char *base, int align)
-{
- if (log == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, log->low , 0); q += 4;
- RW_IVAL(io, q, log->high, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an ARC4_OWF structure.
-********************************************************************/
-char* smb_io_arc4_owf(BOOL io, ARC4_OWF *hash, char *q, char *base, int align)
-{
- if (hash == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_PCVAL(io, q, hash->data, 16); q += 16;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an DOM_ID_INFO_1 structure.
-********************************************************************/
-char* smb_io_id_info1(BOOL io, DOM_ID_INFO_1 *id, char *q, char *base, int align)
-{
- if (id == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_unihdr(io, &(id->hdr_domain_name ), q, base, align);
-
- RW_IVAL(io, q, id->param, 0); q += 4;
- q = smb_io_logon_id(io, &(id->logon_id), q, base, align);
-
- q = smb_io_unihdr(io, &(id->hdr_user_name ), q, base, align);
- q = smb_io_unihdr(io, &(id->hdr_workgroup_name), q, base, align);
-
- q = smb_io_arc4_owf(io, &(id->arc4_lm_owf), q, base, align);
- q = smb_io_arc4_owf(io, &(id->arc4_nt_owf), q, base, align);
-
- q = smb_io_unistr2(io, &(id->uni_domain_name ), q, base, align);
- q = smb_io_unistr2(io, &(id->uni_user_name ), q, base, align);
- q = smb_io_unistr2(io, &(id->uni_workgroup_name), q, base, align);
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_SAM_INFO structure.
-********************************************************************/
-char* smb_io_sam_info(BOOL io, DOM_SAM_INFO *sam, char *q, char *base, int align)
-{
- if (sam == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- q = smb_io_clnt_info(io, &(sam->client ), q, base, align);
- q = smb_io_cred (io, &(sam->rtn_cred), q, base, align);
-
- RW_IVAL(io, q, sam->logon_level, 0); q += 4;
- RW_SVAL(io, q, sam->auth_level , 0); q += 4;
-
- switch (sam->auth_level)
- {
- case 1:
- {
- q = smb_io_id_info1(io, &(sam->auth.id1), q, base, align);
- break;
- }
- default:
- {
- /* PANIC! */
- break;
- }
- }
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_GID structure.
-********************************************************************/
-char* smb_io_gid(BOOL io, DOM_GID *gid, char *q, char *base, int align)
-{
- if (gid == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, gid->gid , 0); q += 4;
- RW_IVAL(io, q, gid->attr, 0); q += 4;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an RPC_HDR structure.
-********************************************************************/
-char* smb_io_rpc_hdr(BOOL io, RPC_HDR *rpc, char *q, char *base, int align)
-{
- if (rpc == NULL) return NULL;
-
- /* reserved should be zero: enforce it */
- rpc->reserved = 0;
-
- RW_CVAL(io, q, rpc->major, 0); q++;
- RW_CVAL(io, q, rpc->minor, 0); q++;
- RW_CVAL(io, q, rpc->pkt_type, 0); q++;
- RW_CVAL(io, q, rpc->frag, 0); q++;
- RW_IVAL(io, q, rpc->pack_type, 0); q += 4;
- RW_SVAL(io, q, rpc->frag_len, 0); q += 2;
- RW_SVAL(io, q, rpc->auth_len, 0); q += 2;
- RW_IVAL(io, q, rpc->call_id, 0); q += 4;
- RW_SVAL(io, q, rpc->alloc_hint, 0); q += 2;
- RW_CVAL(io, q, rpc->context_id, 0); q++;
- RW_CVAL(io, q, rpc->reserved, 0); q++;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes an LSA_POL_HND structure.
-********************************************************************/
-char* smb_io_pol_hnd(BOOL io, LSA_POL_HND *pol, char *q, char *base, int align)
-{
- if (pol == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_PCVAL(io, q, pol->data, POL_HND_SIZE); q += POL_HND_SIZE;
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a dom query structure.
-********************************************************************/
-char* smb_io_dom_query_3(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align)
-{
- return smb_io_dom_query(io, d_q, q, base, align);
-}
-
-/*******************************************************************
-reads or writes a dom query structure.
-********************************************************************/
-char* smb_io_dom_query_5(BOOL io, DOM_QUERY_3 *d_q, char *q, char *base, int align)
-{
- return smb_io_dom_query(io, d_q, q, base, align);
-}
-
-/*******************************************************************
-reads or writes a dom query structure.
-********************************************************************/
-char* smb_io_dom_query(BOOL io, DOM_QUERY *d_q, char *q, char *base, int align)
-{
- if (d_q == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
-
- RW_SVAL(io, q, d_q->uni_dom_max_len, 0); q += 2; /* domain name string length * 2 */
- RW_SVAL(io, q, d_q->padding , 0); q += 2; /* 2 padding bytes */
- RW_SVAL(io, q, d_q->uni_dom_str_len, 0); q += 2; /* domain name string length * 2 */
-
- RW_IVAL(io, q, d_q->buffer_dom_name, 0); q += 4; /* undocumented domain name string buffer pointer */
- RW_IVAL(io, q, d_q->buffer_dom_sid , 0); q += 4; /* undocumented domain SID string buffer pointer */
-
- if (d_q->buffer_dom_name != 0)
- {
- q = smb_io_unistr2(io, &(d_q->uni_domain_name), q, base, align); /* domain name (unicode string) */
- }
- if (d_q->buffer_dom_sid != 0)
- {
- q = smb_io_dom_sid(io, &(d_q->dom_sid), q, base, align); /* domain SID */
- }
-
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_R_REF structure.
-********************************************************************/
-char* smb_io_dom_r_ref(BOOL io, DOM_R_REF *r_r, char *q, char *base, int align)
-{
- int i;
-
- if (r_r == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, r_r->undoc_buffer, 0); q += 4; /* undocumented buffer pointer. */
- RW_IVAL(io, q, r_r->num_ref_doms_1, 0); q += 4; /* num referenced domains? */
- RW_IVAL(io, q, r_r->buffer_dom_name, 0); q += 4; /* undocumented domain name buffer pointer. */
- RW_IVAL(io, q, r_r->max_entries, 0); q += 4; /* 32 - max number of entries */
- RW_IVAL(io, q, r_r->num_ref_doms_2, 0); q += 4; /* 4 - num referenced domains? */
-
- q = smb_io_unihdr2(io, &(r_r->hdr_dom_name), q, base, align); /* domain name unicode string header */
-
- for (i = 0; i < r_r->num_ref_doms_1-1; i++)
- {
- q = smb_io_unihdr2(io, &(r_r->hdr_ref_dom[i]), q, base, align);
- }
-
- q = smb_io_unistr(io, &(r_r->uni_dom_name), q, base, align); /* domain name unicode string */
-
- for (i = 0; i < r_r->num_ref_doms_2; i++)
- {
- q = smb_io_dom_sid(io, &(r_r->ref_dom[i]), q, base, align); /* referenced domain SIDs */
- }
- return q;
-}
-
-/*******************************************************************
-reads or writes a DOM_NAME structure.
-********************************************************************/
-char* smb_io_dom_name(BOOL io, DOM_NAME *name, char *q, char *base, int align)
-{
- if (name == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, name->uni_str_len, 0); q += 4;
-
- /* don't know if len is specified by uni_str_len member... */
- /* assume unicode string is unicode-null-terminated, instead */
-
- q = smb_io_unistr(io, &(name->str), q, base, align);
-
- return q;
-}
-
-
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
-char* smb_io_neg_flags(BOOL io, NEG_FLAGS *neg, char *q, char *base, int align)
-{
- if (neg == NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, neg->neg_flags, 0); q += 4;
-
- return q;
-}
-
-
-#if 0
-/*******************************************************************
-reads or writes a structure.
-********************************************************************/
- char* smb_io_(BOOL io, *, char *q, char *base, int align)
-{
- if (== NULL) return NULL;
-
- q = align_offset(q, base, align);
-
- RW_IVAL(io, q, , 0); q += 4;
-
- return q;
-}
-#endif
diff --git a/source/utils/make_smbcodepage.c b/source/utils/make_smbcodepage.c
deleted file mode 100644
index b4cb1523349..00000000000
--- a/source/utils/make_smbcodepage.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Create codepage files from codepage_def.XXX files.
-
- Copyright (C) Jeremy Allison 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-static char *prog_name = NULL;
-
-/*
- * Print program usage and die.
- */
-
-void codepage_usage(char *progname)
-{
- fprintf(stderr, "Usage is : %s [c|d] <codepage> <inputfile> <outputfile>\n",
- progname);
- exit(1);
-}
-
-/*
- * Read a line from a buffer into a line buffer. Ensure null
- * terminated.
- */
-
-void read_line( char **buf, char *line_buf, int size)
-{
- char *p = *buf;
- int num = 0;
-
- for(; *p && (*p != '\n'); p++)
- {
- if(num < (size - 1))
- line_buf[num++] = *p;
- }
- if(*p)
- p++; /* Go past the '\n' */
- line_buf[num] = '\0';
- *buf = p;
-}
-
-/*
- * Strip comment lines and blank lines from the data.
- * Copies into a new buffer and frees the old.
- * Returns the number of lines copied.
- */
-
-int clean_data( char **buf, uint32 *size)
-{
- char linebuf[512];
- char *p = *buf;
- int num_lines = 0;
- char *newbuf = (char *)malloc( *size + 1);
- char *newbuf_p = NULL;
-
- if(newbuf == NULL)
- {
- fprintf(stderr, "%s: malloc fail for size %d.\n", prog_name, *size + 1);
- exit(1);
- }
-
- newbuf_p = newbuf;
- *newbuf_p = '\0';
-
- while( *p )
- {
- char *cp;
-
- read_line( &p, linebuf, sizeof(linebuf));
- /* Null terminate after comment. */
- if((cp = strchr( linebuf, '#'))!= NULL)
- *cp = '\0';
-
- for(cp = linebuf;*cp && isspace(*cp); cp++)
- ;
-
- if(*cp == '\0')
- continue;
-
- strcpy(newbuf_p, cp);
- num_lines++;
- newbuf_p += (strlen(newbuf_p) + 1);
- }
-
- free(*buf);
- *buf = newbuf;
- return num_lines;
-}
-
-/*
- * Parse a byte from a codepage file.
- */
-
-BOOL parse_byte(char *buf, unsigned char *bp)
-{
- unsigned int b;
- char *endptr = NULL;
-
- b = (unsigned int)strtol(buf, &endptr, 0);
- if(endptr == buf || b > 255)
- return False;
-
- *bp = (unsigned char)b;
- return True;
-}
-
-/*
- * Parse a bool from a codepage file.
- */
-
-BOOL parse_bool(char *buf, unsigned char *bp)
-{
- if(isdigit(*buf))
- {
- char *endptr = NULL;
-
- *bp = (unsigned char)strtol(buf, &endptr, 0);
- if(endptr == buf )
- return False;
- if(*bp != 0)
- *bp = 1;
- } else {
- if(strcasecmp(buf, "True") && strcasecmp(buf, "False"))
- return False;
- if(strcasecmp(buf, "True")==0)
- *bp = 1;
- else
- *bp = 0;
- }
- return True;
-}
-
-/*
- * Print a parse error and exit.
- */
-
-void parse_error(char *buf, char *msg)
-{
- fprintf(stderr, "%s: %s whilst parsing line \n%s\n", prog_name,
- msg, buf);
- exit(1);
-}
-
-/*
- * Create a compiled codepage file from a codepage definition file.
- */
-
-int do_compile(int codepage, char *input_file, char *output_file)
-{
- FILE *fp = NULL;
- uint32 size = 0;
- char *buf = NULL;
- char output_buf[CODEPAGE_HEADER_SIZE + 512];
- int num_lines = 0;
- int i = 0;
- struct stat st;
-
- /* Get the size of the input file. Read the entire thing into memory. */
- if(stat((char *)input_file, &st)!= 0)
- {
- fprintf(stderr, "%s: failed to get the file size for file %s. Error was %s\n",
- prog_name, input_file, strerror(errno));
- exit(1);
- }
-
- size = (uint32)st.st_size;
-
- /* I don't believe these things should be bigger than 100k :-) */
- if(size > 100*1024)
- {
- fprintf(stderr, "%s: filesize %d is too large for a codepage definition file. \
-The maximum size I will believe is 100k.\n", prog_name, size);
- exit(1);
- }
-
- if((fp = fopen(input_file, "r")) == NULL)
- {
- fprintf(stderr, "%s: cannot open file %s for input.\n", prog_name, input_file);
- exit(1);
- }
-
- /* As we will be reading text, allocate one more byte for a '\0' */
- if((buf = (char *)malloc( size + 1 )) == NULL)
- {
- fprintf(stderr, "%s: malloc fail for size %d.\n", prog_name, size + 1);
- fclose(fp);
- exit(1);
- }
-
- if(fread( buf, 1, size, fp) != size)
- {
- fprintf(stderr, "%s: read failed for file %s. Error was %s.\n", prog_name,
- input_file, strerror(errno));
- free((char *)buf);
- fclose(fp);
- exit(1);
- }
-
- /* Null terminate the text read. */
- buf[size] = '\0';
-
- /* Go through the data line by line, strip out comments (anything
- after a '#' to end-of-line) and blank lines. The rest should be
- the codepage data.
- */
-
- num_lines = clean_data( &buf, &size);
-
- /* There can be a maximum of 128 lines. */
- if(num_lines > 128)
- {
- fprintf(stderr, "%s: There can be a maximum 128 lines of data in a codepage \
-definition file. File %s has %d.\n", prog_name, input_file, num_lines);
- exit(1);
- }
-
- /* Setup the output file header. */
- SSVAL(output_buf,CODEPAGE_VERSION_OFFSET,CODEPAGE_FILE_VERSION_ID);
- SSVAL(output_buf,CODEPAGE_CLIENT_CODEPAGE_OFFSET,(uint16)codepage);
- SIVAL(output_buf,CODEPAGE_LENGTH_OFFSET,(num_lines * 4));
-
- /* Now convert the lines into the compiled form. */
- for(i = 0; i < num_lines; i++)
- {
- char token_buf[512];
- char *p = buf;
- unsigned char b = 0;
-
- /* Get the 'lower' value. */
- if(!next_token(&p, token_buf, NULL))
- parse_error(buf, "cannot parse first value");
- if(!parse_byte( token_buf, &b))
- parse_error(buf, "first value doesn't resolve to a byte");
-
- /* Add this to the output buffer. */
- SCVAL(output_buf,CODEPAGE_HEADER_SIZE+(i*4),b);
-
- /* Get the 'upper' value. */
- if(!next_token(&p, token_buf, NULL))
- parse_error(buf, "cannot parse second value");
- if(!parse_byte( token_buf, &b))
- parse_error(buf, "second value doesn't resolve to a byte");
-
- /* Add this to the output buffer. */
- SCVAL(output_buf,CODEPAGE_HEADER_SIZE+(i*4) + 1,b);
-
- /* Get the 'upper to lower' value. */
- if(!next_token(&p, token_buf, NULL))
- parse_error(buf, "cannot parse third value");
- if(!parse_bool( token_buf, &b))
- parse_error(buf, "third value doesn't resolve to a boolean");
-
- /* Add this to the output buffer. */
- SCVAL(output_buf,CODEPAGE_HEADER_SIZE+(i*4) + 2,b);
-
- /* Get the 'lower to upper' value. */
- if(!next_token(&p, token_buf, NULL))
- parse_error(buf, "cannot parse fourth value");
- if(!parse_bool( token_buf, &b))
- parse_error(buf, "fourth value doesn't resolve to a boolean");
-
- /* Add this to the output buffer. */
- SCVAL(output_buf,CODEPAGE_HEADER_SIZE+(i*4) + 3,b);
-
- buf += (strlen(buf) + 1);
- }
-
- /* Now write out the output_buf. */
- if((fp = fopen(output_file, "w"))==NULL)
- {
- fprintf(stderr, "%s: Cannot open output file %s. Error was %s.\n",
- prog_name, output_file, strerror(errno));
- exit(1);
- }
-
- if(fwrite(output_buf, 1, CODEPAGE_HEADER_SIZE + (num_lines*4), fp) !=
- CODEPAGE_HEADER_SIZE + (num_lines*4))
- {
- fprintf(stderr, "%s: Cannot write output file %s. Error was %s.\n",
- prog_name, output_file, strerror(errno));
- exit(1);
- }
-
- fclose(fp);
-
- return 0;
-}
-
-/*
- * Placeholder for now.
- */
-
-int do_decompile( int codepage, char *input_file, char *output_file)
-{
- uint32 size = 0;
- struct stat st;
- char header_buf[CODEPAGE_HEADER_SIZE];
- char *buf = NULL;
- FILE *fp = NULL;
- int num_lines = 0;
- int i = 0;
-
- /* Get the size of the input file. Read the entire thing into memory. */
- if(stat((char *)input_file, &st)!= 0)
- {
- fprintf(stderr, "%s: failed to get the file size for file %s. Error was %s\n",
- prog_name, input_file, strerror(errno));
- exit(1);
- }
-
- size = (uint32)st.st_size;
-
- if( size < CODEPAGE_HEADER_SIZE || size > (CODEPAGE_HEADER_SIZE + 256))
- {
- fprintf(stderr, "%s: file %s is an incorrect size for a \
-code page file.\n", prog_name, input_file);
- exit(1);
- }
-
- /* Read the first 8 bytes of the codepage file - check
- the version number and code page number. All the data
- is held in little endian format.
- */
-
- if((fp = fopen( input_file, "r")) == NULL)
- {
- fprintf(stderr, "%s: cannot open file %s. Error was %s\n",
- prog_name, input_file, strerror(errno));
- exit(1);
- }
-
- if(fread( header_buf, 1, CODEPAGE_HEADER_SIZE, fp)!=CODEPAGE_HEADER_SIZE)
- {
- fprintf(stderr, "%s: cannot read header from file %s. Error was %s\n",
- prog_name, input_file, strerror(errno));
- exit(1);
- }
-
- /* Check the version value */
- if(SVAL(header_buf,CODEPAGE_VERSION_OFFSET) != CODEPAGE_FILE_VERSION_ID)
- {
- fprintf(stderr, "%s: filename %s has incorrect version id. \
-Needed %hu, got %hu.\n",
- prog_name, input_file, (uint16)CODEPAGE_FILE_VERSION_ID,
- SVAL(header_buf,CODEPAGE_VERSION_OFFSET));
- exit(1);
- }
-
- /* Check the codepage matches */
- if(SVAL(header_buf,CODEPAGE_CLIENT_CODEPAGE_OFFSET) != (uint16)codepage)
- {
- fprintf(stderr, "%s: filename %s has incorrect codepage. \
-Needed %hu, got %hu.\n",
- prog_name, input_file, (uint16)codepage,
- SVAL(header_buf,CODEPAGE_CLIENT_CODEPAGE_OFFSET));
- exit(1);
- }
-
- /* Check the length is correct. */
- if(IVAL(header_buf,CODEPAGE_LENGTH_OFFSET) !=
- (unsigned int)(size - CODEPAGE_HEADER_SIZE))
- {
- fprintf(stderr, "%s: filename %s has incorrect size headers. \
-Needed %u, got %u.\n", prog_name, input_file, size - CODEPAGE_HEADER_SIZE,
- IVAL(header_buf,CODEPAGE_LENGTH_OFFSET));
- exit(1);
- }
-
- size -= CODEPAGE_HEADER_SIZE; /* Remove header */
-
- /* Make sure the size is a multiple of 4. */
- if((size % 4 ) != 0)
- {
- fprintf(stderr, "%s: filename %s has a codepage size not a \
-multiple of 4.\n", prog_name, input_file);
- exit(1);
- }
-
- /* Allocate space for the code page file and read it all in. */
- if((buf = (char *)malloc( size )) == NULL)
- {
- fprintf (stderr, "%s: malloc fail for size %d.\n",
- prog_name, size );
- exit(1);
- }
-
- if(fread( buf, 1, size, fp)!=size)
- {
- fprintf(stderr, "%s: read fail on file %s. Error was %s.\n",
- prog_name, input_file, strerror(errno));
- exit(1);
- }
-
- fclose(fp);
-
- /* Now dump the codepage into an ascii file. */
- if((fp = fopen(output_file, "w")) == NULL)
- {
- fprintf(stderr, "%s: cannot open file %s. Error was %s\n",
- prog_name, output_file, strerror(errno));
- exit(1);
- }
-
- fprintf(fp, "#\n# Codepage definition file for IBM Code Page %d.\n#\n",
- codepage);
- fprintf(fp, "# This file was automatically generated.\n#\n");
- fprintf(fp, "# defines lower->upper mapping.\n");
- fprintf(fp, "#\n#The columns are :\n# lower\tupper\tu-t-l\tl-t-u\n#\n");
-
- num_lines = size / 4;
- for( i = 0; i < num_lines; i++)
- {
- fprintf(fp, "0x%02X\t0x%02X\t%s\t%s\n", CVAL(buf, (i*4)), CVAL(buf, (i*4)+1),
- CVAL(buf, (i*4)+2) ? "True" : "False",
- CVAL(buf, (i*4)+3) ? "True" : "False");
- }
- fclose(fp);
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- int codepage = 0;
- char *input_file = NULL;
- char *output_file = NULL;
- BOOL compile = False;
-
- prog_name = argv[0];
-
- if(argc != 5)
- codepage_usage(prog_name);
-
- if(argv[1][0] != 'c' && argv[1][0] != 'C' && argv[1][0] != 'd' &&
- argv[1][0] != 'D')
- codepage_usage(prog_name);
-
- input_file = argv[3];
- output_file = argv[4];
-
- /* Are we compiling or decompiling. */
- if(argv[1][0] == 'c' || argv[1][0] == 'C')
- compile = True;
-
- /* Convert the second argument into a client codepage value. */
- if((codepage = atoi(argv[2])) == 0)
- {
- fprintf(stderr, "%s: %s is not a valid codepage.\n", prog_name, argv[2]);
- exit(1);
- }
-
- if(compile)
- return do_compile( codepage, input_file, output_file);
- else
- return do_decompile( codepage, input_file, output_file);
-}
diff --git a/source/utils/nmblookup.c b/source/utils/nmblookup.c
deleted file mode 100644
index 63ca156449f..00000000000
--- a/source/utils/nmblookup.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- NBT client - used to lookup netbios names
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-
-extern pstring myhostname;
-extern struct in_addr ipzero;
-
-int ServerFD= -1;
-
-int RootPort = 0;
-
-/****************************************************************************
- open the socket communication
- **************************************************************************/
-static BOOL open_sockets(void)
-{
- struct hostent *hp;
-
- /* get host info */
- if ((hp = Get_Hostbyname(myhostname)) == 0)
- {
- DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",myhostname));
- return False;
- }
-
- ServerFD = open_socket_in( SOCK_DGRAM,
- (RootPort ? 137 :0),
- 3,
- interpret_addr(lp_socket_address()) );
-
- if (ServerFD == -1)
- return(False);
-
- set_socket_options(ServerFD,"SO_BROADCAST");
-
- DEBUG(3, ("Socket opened.\n"));
- return True;
-}
-
-
-/****************************************************************************
- initialise connect, service and file structs
-****************************************************************************/
-static BOOL init_structs(void )
-{
- if (!get_myname(myhostname,NULL))
- return(False);
-
- return True;
-}
-
-/****************************************************************************
-usage on the program
-****************************************************************************/
-static void usage(void)
-{
- printf("Usage: nmblookup [-M] [-B bcast address] [-d debuglevel] name\n");
- printf("Version %s\n",VERSION);
- printf("\t-d debuglevel set the debuglevel\n");
- printf("\t-B broadcast address the address to use for broadcasts\n");
- printf("\t-M searches for a master browser\n");
- printf("\t-S lookup node status as well\n");
- printf("\t-r Use root port 137 (Win95 only replies to this)\n");
- printf("\t-A Do a node status on <name> as an IP Address\n");
- printf("\n");
-}
-
-
-/****************************************************************************
- main program
-****************************************************************************/
-int main(int argc,char *argv[])
-{
- int opt;
- unsigned int lookup_type = 0x0;
- pstring lookup;
- extern int optind;
- extern char *optarg;
- BOOL find_master=False;
- BOOL find_status=False;
- int i;
- static pstring servicesf = CONFIGFILE;
- struct in_addr bcast_addr;
- BOOL got_bcast = False;
- BOOL lookup_by_ip = False;
-
- DEBUGLEVEL = 1;
- *lookup = 0;
-
- TimeInit();
-
- setup_logging(argv[0],True);
-
- charset_initialise();
-
- while ((opt = getopt(argc, argv, "d:B:i:s:SMrhA")) != EOF)
- switch (opt)
- {
- case 'B':
- iface_set_default(NULL,optarg,NULL);
- bcast_addr = *interpret_addr2(optarg);
- got_bcast = True;
- break;
- case 'i':
- fstrcpy(scope,optarg);
- strupper(scope);
- break;
- case 'M':
- find_master = True;
- break;
- case 'S':
- find_status = True;
- break;
- case 'd':
- DEBUGLEVEL = atoi(optarg);
- break;
- case 's':
- pstrcpy(servicesf, optarg);
- break;
- case 'r':
- RootPort = -1;
- break;
- case 'h':
- usage();
- exit(0);
- break;
- case 'A':
- lookup_by_ip = True;
- break;
- default:
- usage();
- exit(1);
- }
-
- if (argc < 2) {
- usage();
- exit(1);
- }
-
- if (!lp_load(servicesf,True)) {
- fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf);
- }
-
- load_interfaces();
- init_structs();
- if (!open_sockets()) return(1);
-
- if (!got_bcast)
- bcast_addr = *iface_bcast(ipzero);
-
- DEBUG(1,("Sending queries to %s\n",inet_ntoa(bcast_addr)));
-
-
- for (i=optind;i<argc;i++)
- {
- BOOL bcast = True;
- int retries = 2;
- char *p;
- struct in_addr ip;
-
- fstrcpy(lookup,argv[i]);
-
- if(lookup_by_ip)
- {
- strcpy(lookup,"*");
- ip = *interpret_addr2(argv[i]);
- printf("Looking up status of %s\n",inet_ntoa(ip));
- name_status(ServerFD,lookup,lookup_type,True,ip,NULL,NULL,NULL);
- printf("\n");
- continue;
- }
-
- if (find_master) {
- if (*lookup == '-') {
- strcpy(lookup,"\01\02__MSBROWSE__\02");
- lookup_type = 1;
- } else {
- lookup_type = 0x1d;
- }
- }
-
- p = strchr(lookup,'#');
-
- if (p) {
- *p = 0;
- sscanf(p+1,"%x",&lookup_type);
- bcast = False;
- retries = 1;
- }
-
- if (name_query(ServerFD,lookup,lookup_type,bcast,True,
- bcast_addr,&ip,NULL))
- {
- printf("%s %s\n",inet_ntoa(ip),lookup);
-
- /* We can only do find_status if the ip address returned
- was valid - ie. name_query returned true.
- */
- if (find_status)
- {
- printf("Looking up status of %s\n",inet_ntoa(ip));
- name_status(ServerFD,lookup,lookup_type,True,ip,NULL,NULL,NULL);
- printf("\n");
- }
- }
- else
- {
- printf("name_query failed to find name %s\n", lookup);
- }
- }
-
- return(0);
-}
diff --git a/source/utils/smbpasswd.c b/source/utils/smbpasswd.c
deleted file mode 100644
index d20ff42c0e8..00000000000
--- a/source/utils/smbpasswd.c
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Unix SMB/Netbios implementation. Version 1.9. smbpasswd module. Copyright
- * (C) Jeremy Allison 1995-1997.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 675
- * Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "includes.h"
-
-/* Static buffers we will return. */
-static struct smb_passwd pw_buf;
-static pstring user_name;
-static unsigned char smbpwd[16];
-static unsigned char smbntpwd[16];
-
-static int gethexpwd(char *p, char *pwd)
-{
- int i;
- unsigned char lonybble, hinybble;
- char *hexchars = "0123456789ABCDEF";
- char *p1, *p2;
- for (i = 0; i < 32; i += 2) {
- hinybble = toupper(p[i]);
- lonybble = toupper(p[i + 1]);
-
- p1 = strchr(hexchars, hinybble);
- p2 = strchr(hexchars, lonybble);
- if (!p1 || !p2)
- return (False);
-
- hinybble = PTR_DIFF(p1, hexchars);
- lonybble = PTR_DIFF(p2, hexchars);
-
- pwd[i / 2] = (hinybble << 4) | lonybble;
- }
- return (True);
-}
-
-struct smb_passwd *
-_my_get_smbpwnam(FILE * fp, char *name, BOOL * valid_old_pwd,
- BOOL *got_valid_nt_entry, long *pwd_seekpos)
-{
- char linebuf[256];
- unsigned char c;
- unsigned char *p;
- long uidval;
- long linebuf_len;
-
- /*
- * Scan the file, a line at a time and check if the name matches.
- */
- while (!feof(fp)) {
- linebuf[0] = '\0';
- *pwd_seekpos = ftell(fp);
-
- fgets(linebuf, 256, fp);
- if (ferror(fp))
- return NULL;
-
- /*
- * Check if the string is terminated with a newline - if not
- * then we must keep reading and discard until we get one.
- */
- linebuf_len = strlen(linebuf);
- if (linebuf[linebuf_len - 1] != '\n') {
- c = '\0';
- while (!ferror(fp) && !feof(fp)) {
- c = fgetc(fp);
- if (c == '\n')
- break;
- }
- } else
- linebuf[linebuf_len - 1] = '\0';
-
- if ((linebuf[0] == 0) && feof(fp))
- break;
- /*
- * The line we have should be of the form :-
- *
- * username:uid:[32hex bytes]:....other flags presently
- * ignored....
- *
- * or,
- *
- * username:uid:[32hex bytes]:[32hex bytes]:....ignored....
- *
- * if Windows NT compatible passwords are also present.
- */
-
- if (linebuf[0] == '#' || linebuf[0] == '\0')
- continue;
- p = (unsigned char *) strchr(linebuf, ':');
- if (p == NULL)
- continue;
- /*
- * As 256 is shorter than a pstring we don't need to check
- * length here - if this ever changes....
- */
- strncpy(user_name, linebuf, PTR_DIFF(p, linebuf));
- user_name[PTR_DIFF(p, linebuf)] = '\0';
- if (!strequal(user_name, name))
- continue;
-
- /* User name matches - get uid and password */
- p++; /* Go past ':' */
- if (!isdigit(*p))
- return (False);
-
- uidval = atoi((char *) p);
- while (*p && isdigit(*p))
- p++;
-
- if (*p != ':')
- return (False);
-
- /*
- * Now get the password value - this should be 32 hex digits
- * which are the ascii representations of a 16 byte string.
- * Get two at a time and put them into the password.
- */
- p++;
- *pwd_seekpos += PTR_DIFF(p, linebuf); /* Save exact position
- * of passwd in file -
- * this is used by
- * smbpasswd.c */
- if (*p == '*' || *p == 'X') {
- /* Password deliberately invalid - end here. */
- *valid_old_pwd = False;
- *got_valid_nt_entry = False;
- pw_buf.smb_nt_passwd = NULL; /* No NT password (yet)*/
-
- /* Now check if the NT compatible password is
- available. */
- p += 33; /* Move to the first character of the line after
- the lanman password. */
- if ((linebuf_len >= (PTR_DIFF(p, linebuf) + 33)) && (p[32] == ':')) {
- /* NT Entry was valid - even if 'X' or '*', can be overwritten */
- *got_valid_nt_entry = True;
- if (*p != '*' && *p != 'X') {
- if (gethexpwd((char *)p,(char *)smbntpwd))
- pw_buf.smb_nt_passwd = smbntpwd;
- }
- }
- pw_buf.smb_name = user_name;
- pw_buf.smb_userid = uidval;
- pw_buf.smb_passwd = NULL; /* No password */
- return (&pw_buf);
- }
- if (linebuf_len < (PTR_DIFF(p, linebuf) + 33))
- return (False);
-
- if (p[32] != ':')
- return (False);
-
- if (!strncasecmp((char *)p, "NO PASSWORD", 11)) {
- pw_buf.smb_passwd = NULL; /* No password */
- } else {
- if(!gethexpwd((char *)p,(char *)smbpwd))
- return False;
- pw_buf.smb_passwd = smbpwd;
- }
-
- pw_buf.smb_name = user_name;
- pw_buf.smb_userid = uidval;
- pw_buf.smb_nt_passwd = NULL;
- *got_valid_nt_entry = False;
- *valid_old_pwd = True;
-
- /* Now check if the NT compatible password is
- available. */
- p += 33; /* Move to the first character of the line after
- the lanman password. */
- if ((linebuf_len >= (PTR_DIFF(p, linebuf) + 33)) && (p[32] == ':')) {
- /* NT Entry was valid - even if 'X' or '*', can be overwritten */
- *got_valid_nt_entry = True;
- if (*p != '*' && *p != 'X') {
- if (gethexpwd((char *)p,(char *)smbntpwd))
- pw_buf.smb_nt_passwd = smbntpwd;
- }
- }
- return &pw_buf;
- }
- return NULL;
-}
-
-/*
- * Print command usage on stderr and die.
- */
-static void usage(char *name)
-{
- fprintf(stderr, "Usage is : %s [-add] [username] [password]\n", name);
- exit(1);
-}
-
- int main(int argc, char **argv)
-{
- int real_uid;
- struct passwd *pwd;
- fstring old_passwd;
- uchar old_p16[16];
- uchar old_nt_p16[16];
- fstring new_passwd;
- uchar new_p16[16];
- uchar new_nt_p16[16];
- char *p;
- struct smb_passwd *smb_pwent;
- FILE *fp;
- BOOL valid_old_pwd = False;
- BOOL got_valid_nt_entry = False;
- BOOL add_user = False;
- int add_pass = 0;
- long seekpos;
- int pwfd;
- char ascii_p16[66];
- char c;
- int ret, i, err, writelen;
- int lockfd = -1;
- char *pfile = SMB_PASSWD_FILE;
- char readbuf[16 * 1024];
-
- TimeInit();
-
- setup_logging(argv[0],True);
-
- charset_initialise();
-
-#ifndef DEBUG_PASSWORD
- /* Check the effective uid */
- if (geteuid() != 0) {
- fprintf(stderr, "%s: Must be setuid root.\n", argv[0]);
- exit(1);
- }
-#endif
-
- /* Get the real uid */
- real_uid = getuid();
-
- /* Deal with usage problems */
- if (real_uid == 0)
- {
- /* As root we can change anothers password and add a user. */
- if (argc > 4 )
- usage(argv[0]);
- }
- else if (argc == 2 || argc > 3)
- {
- fprintf(stderr, "%s: Only root can set anothers password.\n", argv[0]);
- usage(argv[0]);
- }
-
- if (real_uid == 0 && (argc > 1))
- {
- /* We are root - check if we should add the user */
- if ((argv[1][0] == '-') && (argv[1][1] == 'a'))
- add_user = True;
-
- if(add_user && (argc <= 2 || argc > 4))
- usage(argv[0]);
-
- /* root can specify password on command-line */
- if (argc == (add_user ? 4 : 3))
- {
- /* -a argument (add_user): new password is 3rd argument. */
- /* no -a argument (add_user): new password is 2nd argument */
-
- add_pass = add_user ? 3 : 2;
- }
-
- /* If we are root we can change another's password. */
- strncpy(user_name, add_user ? argv[2] : argv[1], sizeof(user_name) - 1);
- user_name[sizeof(user_name) - 1] = '\0';
-
- pwd = getpwnam(user_name);
- }
- else
- {
- /* non-root can specify old pass / new pass on command-line */
- if (argc == 3)
- {
- /* non-root specifies new password as 2nd argument */
- add_pass = 2;
- }
-
- pwd = getpwuid(real_uid);
- }
-
- if (pwd == 0) {
- fprintf(stderr, "%s: Unable to get UNIX password entry for user.\n", argv[0]);
- exit(1);
- }
-
- /* If we are root we don't ask for the old password. */
- old_passwd[0] = '\0';
- if (real_uid != 0)
- {
- if (add_pass)
- {
- /* old password, as non-root, is 1st argument */
- strncpy(old_passwd, argv[1], sizeof(fstring));
- }
- else
- {
- p = getpass("Old SMB password:");
- strncpy(old_passwd, p, sizeof(fstring));
- }
- old_passwd[sizeof(fstring)-1] = '\0';
- }
-
- if (add_pass)
- {
- /* new password is specified on the command line */
- strncpy(new_passwd, argv[add_user ? 3 : 2], sizeof(new_passwd) - 1);
- new_passwd[sizeof(new_passwd) - 1] = '\0';
- }
- else
- {
- new_passwd[0] = '\0';
-
- p = getpass("New SMB password:");
-
- strncpy(new_passwd, p, sizeof(fstring));
- new_passwd[sizeof(fstring)-1] = '\0';
-
- p = getpass("Retype new SMB password:");
-
- if (strncmp(p, new_passwd, sizeof(fstring)-1))
- {
- fprintf(stderr, "%s: Mismatch - password unchanged.\n", argv[0]);
- exit(1);
- }
- }
-
- if (new_passwd[0] == '\0')
- {
- printf("Password not set\n");
- exit(0);
- }
-
- /* Calculate the MD4 hash (NT compatible) of the old and new passwords */
- memset(old_nt_p16, '\0', 16);
- E_md4hash((uchar *)old_passwd, old_nt_p16);
-
- memset(new_nt_p16, '\0', 16);
- E_md4hash((uchar *) new_passwd, new_nt_p16);
-
- /* Mangle the passwords into Lanman format */
- old_passwd[14] = '\0';
- strupper(old_passwd);
- new_passwd[14] = '\0';
- strupper(new_passwd);
-
- /*
- * Calculate the SMB (lanman) hash functions of both old and new passwords.
- */
-
- memset(old_p16, '\0', 16);
- E_P16((uchar *) old_passwd, old_p16);
-
- memset(new_p16, '\0', 16);
- E_P16((uchar *) new_passwd, new_p16);
-
- /*
- * Open the smbpaswd file XXXX - we need to parse smb.conf to get the
- * filename
- */
- fp = fopen(pfile, "r+");
- if (!fp && errno == ENOENT) {
- fp = fopen(pfile, "w");
- if (fp) {
- fprintf(fp, "# Samba SMB password file\n");
- fclose(fp);
- fp = fopen(pfile, "r+");
- }
- }
- if (!fp) {
- err = errno;
- fprintf(stderr, "%s: Failed to open password file %s.\n",
- argv[0], pfile);
- errno = err;
- perror(argv[0]);
- exit(err);
- }
-
- /* Set read buffer to 16k for effiecient reads */
- setvbuf(fp, readbuf, _IOFBF, sizeof(readbuf));
-
- /* make sure it is only rw by the owner */
- chmod(pfile, 0600);
-
- /* Lock the smbpasswd file for write. */
- if ((lockfd = pw_file_lock(pfile, F_WRLCK, 5)) < 0) {
- err = errno;
- fprintf(stderr, "%s: Failed to lock password file %s.\n",
- argv[0], pfile);
- fclose(fp);
- errno = err;
- perror(argv[0]);
- exit(err);
- }
- /* Get the smb passwd entry for this user */
- smb_pwent = _my_get_smbpwnam(fp, pwd->pw_name, &valid_old_pwd,
- &got_valid_nt_entry, &seekpos);
- if (smb_pwent == NULL) {
- if(add_user == False) {
- fprintf(stderr, "%s: Failed to find entry for user %s in file %s.\n",
- argv[0], pwd->pw_name, pfile);
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
-
- /* Create a new smb passwd entry and set it to the given password. */
- {
- int fd;
- int new_entry_length;
- char *new_entry;
- long offpos;
-
- /* The add user write needs to be atomic - so get the fd from
- the fp and do a raw write() call.
- */
- fd = fileno(fp);
-
- if((offpos = lseek(fd, 0, SEEK_END)) == -1) {
- fprintf(stderr, "%s: Failed to add entry for user %s to file %s. \
-Error was %s\n", argv[0], pwd->pw_name, pfile, strerror(errno));
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
-
- new_entry_length = strlen(pwd->pw_name) + 1 + 15 + 1 +
- 32 + 1 + 32 + 1 + strlen(pwd->pw_gecos) +
- 1 + strlen(pwd->pw_dir) + 1 +
- strlen(pwd->pw_shell) + 1;
- if((new_entry = (char *)malloc( new_entry_length )) == 0) {
- fprintf(stderr, "%s: Failed to add entry for user %s to file %s. \
-Error was %s\n", argv[0], pwd->pw_name, pfile, strerror(errno));
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
-
- sprintf(new_entry, "%s:%u:", pwd->pw_name, pwd->pw_uid);
- p = &new_entry[strlen(new_entry)];
- for( i = 0; i < 16; i++)
- sprintf(&p[i*2], "%02X", new_p16[i]);
- p += 32;
- *p++ = ':';
- for( i = 0; i < 16; i++)
- sprintf(&p[i*2], "%02X", new_nt_p16[i]);
- p += 32;
- *p++ = ':';
- sprintf(p, "%s:%s:%s\n", pwd->pw_gecos,
- pwd->pw_dir, pwd->pw_shell);
- if(write(fd, new_entry, strlen(new_entry)) != strlen(new_entry)) {
- fprintf(stderr, "%s: Failed to add entry for user %s to file %s. \
-Error was %s\n", argv[0], pwd->pw_name, pfile, strerror(errno));
- /* Remove the entry we just wrote. */
- if(ftruncate(fd, offpos) == -1) {
- fprintf(stderr, "%s: ERROR failed to ftruncate file %s. \
-Error was %s. Password file may be corrupt ! Please examine by hand !\n",
- argv[0], pwd->pw_name, strerror(errno));
- }
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
-
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(0);
- }
- } else {
- /* the entry already existed */
- add_user = False;
- }
-
- /* If we are root or the password is 'NO PASSWORD' then
- we don't need to check the old password. */
- if (real_uid != 0) {
- if (valid_old_pwd == False) {
- fprintf(stderr, "%s: User %s has no old SMB password.\n", argv[0], pwd->pw_name);
- }
- /* Check the old Lanman password - NULL means 'NO PASSWORD' */
- if (smb_pwent->smb_passwd != NULL) {
- if (memcmp(old_p16, smb_pwent->smb_passwd, 16)) {
- fprintf(stderr, "%s: Couldn't change password.\n", argv[0]);
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
- }
- /* Check the NT password if it exists */
- if (smb_pwent->smb_nt_passwd != NULL) {
- if (memcmp(old_nt_p16, smb_pwent->smb_nt_passwd, 16)) {
- fprintf(stderr, "%s: Couldn't change password.\n", argv[0]);
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
- }
- }
- /*
- * If we get here either we were root or the old password checked out
- * ok.
- */
- /* Create the 32 byte representation of the new p16 */
- for (i = 0; i < 16; i++) {
- sprintf(&ascii_p16[i * 2], "%02X", (uchar) new_p16[i]);
- }
- if(got_valid_nt_entry) {
- /* Add on the NT md4 hash */
- ascii_p16[32] = ':';
- for (i = 0; i < 16; i++) {
- sprintf(&ascii_p16[(i * 2)+33], "%02X", (uchar) new_nt_p16[i]);
- }
- }
- /*
- * Do an atomic write into the file at the position defined by
- * seekpos.
- */
- pwfd = fileno(fp);
- ret = lseek(pwfd, seekpos - 1, SEEK_SET);
- if (ret != seekpos - 1) {
- err = errno;
- fprintf(stderr, "%s: seek fail on file %s.\n",
- argv[0], pfile);
- fclose(fp);
- errno = err;
- perror(argv[0]);
- pw_file_unlock(lockfd);
- exit(1);
- }
- /* Sanity check - ensure the character is a ':' */
- if (read(pwfd, &c, 1) != 1) {
- err = errno;
- fprintf(stderr, "%s: read fail on file %s.\n",
- argv[0], pfile);
- fclose(fp);
- errno = err;
- perror(argv[0]);
- pw_file_unlock(lockfd);
- exit(1);
- }
- if (c != ':') {
- fprintf(stderr, "%s: sanity check on passwd file %s failed.\n",
- argv[0], pfile);
- fclose(fp);
- pw_file_unlock(lockfd);
- exit(1);
- }
- writelen = (got_valid_nt_entry) ? 65 : 32;
- if (write(pwfd, ascii_p16, writelen) != writelen) {
- err = errno;
- fprintf(stderr, "%s: write fail in file %s.\n",
- argv[0], pfile);
- fclose(fp);
- errno = err;
- perror(argv[0]);
- pw_file_unlock(lockfd);
- exit(err);
- }
- fclose(fp);
- pw_file_unlock(lockfd);
- printf("Password changed\n");
- return 0;
-}
-
diff --git a/source/utils/status.c b/source/utils/status.c
deleted file mode 100644
index 4143244ab4d..00000000000
--- a/source/utils/status.c
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- status reporting
- Copyright (C) Andrew Tridgell 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Revision History:
-
- 12 aug 96: Erik.Devriendt@te6.siemens.be
- added support for shared memory implementation of share mode locking
-*/
-
-/*
- * This program reports current SMB connections
- */
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-
-struct connect_record crec;
-
-struct session_record{
- int pid;
- int uid;
- char machine[31];
- time_t start;
- struct session_record *next;
-} *srecs;
-
-extern int DEBUGLEVEL;
-extern FILE *dbf;
-extern pstring myhostname;
-
-static pstring Ucrit_username = ""; /* added by OH */
-int Ucrit_pid[100]; /* Ugly !!! */ /* added by OH */
-int Ucrit_MaxPid=0; /* added by OH */
-unsigned int Ucrit_IsActive = 0; /* added by OH */
-
-#ifndef FAST_SHARE_MODES
-static char *read_share_file(int fd, char *fname, char *progname)
-{
- struct stat sb;
- char *buf;
- int size;
-
- if(fstat(fd, &sb) != 0)
- {
- printf("%s: ERROR: read_share_file: Failed to do stat on share file %s (%s)\n",
- progname, fname, strerror(errno));
- return 0;
- }
-
- if(sb.st_size == 0)
- {
- return 0;
- }
-
- /* Allocate space for the file */
- if((buf = (char *)malloc(sb.st_size)) == NULL)
- {
- printf("%s: read_share_file: malloc for file size %d fail !\n",
- progname, (int)sb.st_size);
- return 0;
- }
-
- if(lseek(fd, 0, SEEK_SET) != 0)
- {
- printf("%s: ERROR: read_share_file: Failed to reset position to 0 \
-for share file %s (%s)\n", progname, fname, strerror(errno));
- if(buf)
- free(buf);
- return 0;
- }
-
- if (read(fd,buf,sb.st_size) != sb.st_size)
- {
- printf("%s: ERROR: read_share_file: Failed to read share file %s (%s)\n",
- progname, fname, strerror(errno));
- if(buf)
- free(buf);
- return 0;
- }
-
- if (IVAL(buf,SMF_VERSION_OFFSET) != LOCKING_VERSION) {
- printf("%s: ERROR: read_share_file: share file %s has incorrect \
-locking version (was %d, should be %d).\n",fname,
- progname, IVAL(buf,SMF_VERSION_OFFSET), LOCKING_VERSION);
- if(buf)
- free(buf);
- return 0;
- }
-
- /* Sanity check for file contents */
- size = sb.st_size;
- size -= SMF_HEADER_LENGTH; /* Remove the header */
-
- /* Remove the filename component. */
- size -= SVAL(buf, SMF_FILENAME_LEN_OFFSET);
-
- /* The remaining size must be a multiple of SMF_ENTRY_LENGTH - error if not. */
- if((size % SMF_ENTRY_LENGTH) != 0)
- {
- printf("%s: ERROR: read_share_file: share file %s is an incorrect length.\n",
- progname, fname);
- if(buf)
- free(buf);
- return 0;
- }
-
- return buf;
-}
-#endif /* FAST_SHARE_MODES */
-
- int main(int argc, char *argv[])
-{
- FILE *f;
- pstring fname;
- int uid, c;
- static pstring servicesf = CONFIGFILE;
- extern char *optarg;
- int verbose = 0, brief =0;
- BOOL firstopen=True;
- BOOL processes_only=False;
- int last_pid=0;
-#ifdef FAST_SHARE_MODES
- pstring shmem_file_name;
- share_mode_record *file_scanner_p;
- smb_shm_offset_t *mode_array;
- int bytes_free, bytes_used, bytes_overhead, bytes_total;
-#else /* FAST_SHARE_MODES */
- void *dir;
- char *s;
-#endif /* FAST_SHARE_MODES */
- int oplock_type;
- int i;
- struct session_record *ptr;
-
-
- TimeInit();
- setup_logging(argv[0],True);
-
- charset_initialise();
-
- DEBUGLEVEL = 0;
- dbf = fopen("/dev/null","w");
-
- if (getuid() != geteuid()) {
- printf("smbstatus should not be run setuid\n");
- return(1);
- }
-
- while ((c = getopt(argc, argv, "pds:u:b")) != EOF) {
- switch (c) {
- case 'b':
- brief = 1;
- break;
- case 'd':
- verbose = 1;
- break;
- case 'p':
- processes_only = 1;
- break;
- case 's':
- strcpy(servicesf, optarg);
- break;
- case 'u': /* added by OH */
- Ucrit_addUsername(optarg); /* added by OH */
- break;
- default:
- fprintf(stderr, "Usage: %s [-d] [-p] [-s configfile] [-u username]\n", *argv); /* changed by OH */
- return (-1);
- }
- }
-
- get_myname(myhostname, NULL);
-
- if (!lp_load(servicesf,False)) {
- fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf);
- return (-1);
- }
-
- if (verbose) {
- printf("using configfile = %s\n", servicesf);
- printf("lockdir = %s\n", *lp_lockdir() ? lp_lockdir() : "NULL");
- }
-
- strcpy(fname,lp_lockdir());
- standard_sub_basic(fname);
- trim_string(fname,"","/");
- strcat(fname,"/STATUS..LCK");
-
- f = fopen(fname,"r");
- if (!f) {
- printf("Couldn't open status file %s\n",fname);
- if (!lp_status(-1))
- printf("You need to have status=yes in your smb config file\n");
- return(0);
- }
- else if (verbose) {
- printf("Opened status file %s\n", fname);
- }
-
- uid = getuid();
-
- if (!processes_only) {
- printf("\nSamba version %s\n",VERSION);
-
- if (brief)
- {
- printf("PID Username Machine Time logged in\n");
- printf("-------------------------------------------------------------------\n");
- }
- else
- {
- printf("Service uid gid pid machine\n");
- printf("----------------------------------------------\n");
- }
- }
-
- while (!feof(f))
- {
- if (fread(&crec,sizeof(crec),1,f) != 1)
- break;
- if ( crec.magic == 0x280267 && process_exists(crec.pid)
- && Ucrit_checkUsername(uidtoname(crec.uid)) /* added by OH */
- )
- {
- if (brief)
- {
- ptr=srecs;
- while (ptr!=NULL)
- {
- if ((ptr->pid==crec.pid)&&(strncmp(ptr->machine,crec.machine,30)==0))
- {
- if (ptr->start > crec.start)
- ptr->start=crec.start;
- break;
- }
- ptr=ptr->next;
- }
- if (ptr==NULL)
- {
- ptr=(struct session_record *) malloc(sizeof(struct session_record));
- ptr->uid=crec.uid;
- ptr->pid=crec.pid;
- ptr->start=crec.start;
- strncpy(ptr->machine,crec.machine,30);
- ptr->machine[30]='\0';
- ptr->next=srecs;
- srecs=ptr;
- }
- }
- else
- {
- Ucrit_addPid(crec.pid); /* added by OH */
- if (processes_only) {
- if (last_pid != crec.pid)
- printf("%d\n",crec.pid);
- last_pid = crec.pid; /* XXXX we can still get repeats, have to
- add a sort at some time */
- }
- else
- printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s",
- crec.name,uidtoname(crec.uid),gidtoname(crec.gid),crec.pid,
- crec.machine,crec.addr,
- asctime(LocalTime(&crec.start)));
- }
- }
- }
- fclose(f);
-
- if (processes_only) exit(0);
-
- if (brief)
- {
- ptr=srecs;
- while (ptr!=NULL)
- {
- printf("%-8d%-10.10s%-30.30s%s",ptr->pid,uidtoname(ptr->uid),ptr->machine,asctime(LocalTime(&(ptr->start))));
- ptr=ptr->next;
- }
- printf("\n");
- exit(0);
- }
-
- printf("\n");
-
-#ifdef FAST_SHARE_MODES
- /*******************************************************************
- initialize the shared memory for share_mode management
- ******************************************************************/
-
- strcpy(shmem_file_name,lp_lockdir());
- trim_string(shmem_file_name,"","/");
- if (!*shmem_file_name) exit(-1);
- strcat(shmem_file_name, "/SHARE_MEM_FILE");
- if(!smb_shm_open(shmem_file_name, lp_shmem_size())) exit(-1);
-
- mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
- if(mode_array == NULL)
- {
- printf("%s: base of shared memory hash array == 0! Exiting.\n", argv[0]);
- smb_shm_close();
- exit(-1);
- }
-
- for( i = 0; i < lp_shmem_hash_size(); i++)
- {
- smb_shm_lock_hash_entry(i);
- if(mode_array[i] == NULL_OFFSET)
- {
- smb_shm_unlock_hash_entry(i);
- continue;
- }
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[i]);
- while((file_scanner_p != 0) && (file_scanner_p->num_share_mode_entries != 0))
- {
- share_mode_entry *entry_scanner_p =
- (share_mode_entry *)smb_shm_offset2addr(
- file_scanner_p->share_mode_entries);
-
- while(entry_scanner_p != 0)
- {
- struct timeval t;
- int pid = entry_scanner_p->pid;
- int mode = entry_scanner_p->share_mode;
-
- t.tv_sec = entry_scanner_p->time.tv_sec;
- t.tv_usec = entry_scanner_p->time.tv_usec;
- strcpy(fname, file_scanner_p->file_name);
- oplock_type = entry_scanner_p->op_type;
-
-#else /* FAST_SHARE_MODES */
-
- /* For slow share modes go through all the files in
- the share mode directory and read the entries in
- each.
- */
-
- dir = opendir(lp_lockdir());
- if (!dir)
- {
- printf("%s: Unable to open lock directory %s.\n", argv[0], lp_lockdir());
- return(0);
- }
- while ((s=readdirname(dir))) {
- char *buf;
- char *base;
- int fd;
- pstring lname;
- uint32 dev,inode;
-
- if (sscanf(s,"share.%u.%u",&dev,&inode)!=2) continue;
-
- strcpy(lname,lp_lockdir());
- trim_string(lname,NULL,"/");
- strcat(lname,"/");
- strcat(lname,s);
-
- fd = open(lname,O_RDWR,0);
- if (fd < 0)
- {
- printf("%s: Unable to open share file %s.\n", argv[0], lname);
- continue;
- }
-
- /* Lock the share mode file while we read it. */
- if(fcntl_lock(fd, F_SETLKW, 0, 1, F_WRLCK) == False)
- {
- printf("%s: Unable to lock open share file %s.\n", argv[0], lname);
- close(fd);
- continue;
- }
-
- if(( buf = read_share_file( fd, lname, argv[0] )) == NULL)
- {
- close(fd);
- continue;
- }
- strcpy( fname, &buf[10]);
- close(fd);
-
- base = buf + SMF_HEADER_LENGTH + SVAL(buf,SMF_FILENAME_LEN_OFFSET);
- for( i = 0; i < IVAL(buf, SMF_NUM_ENTRIES_OFFSET); i++)
- {
- char *p = base + (i*SMF_ENTRY_LENGTH);
- struct timeval t;
- int pid = IVAL(p,SME_PID_OFFSET);
- int mode = IVAL(p,SME_SHAREMODE_OFFSET);
-
- t.tv_sec = IVAL(p,SME_SEC_OFFSET);
- t.tv_usec = IVAL(p,SME_USEC_OFFSET);
- oplock_type = SVAL(p,SME_OPLOCK_TYPE_OFFSET);
-#endif /* FAST_SHARE_MODES */
-
- fname[sizeof(fname)-1] = 0;
-
- if (firstopen) {
- firstopen=False;
- printf("Locked files:\n");
- printf("Pid DenyMode R/W Oplock Name\n");
- printf("--------------------------------------------------\n");
- }
-
-
- printf("%-5d ",pid);
- switch ((mode>>4)&0xF)
- {
- case DENY_NONE: printf("DENY_NONE "); break;
- case DENY_ALL: printf("DENY_ALL "); break;
- case DENY_DOS: printf("DENY_DOS "); break;
- case DENY_READ: printf("DENY_READ "); break;
- case DENY_WRITE:printf("DENY_WRITE "); break;
- }
- switch (mode&0xF)
- {
- case 0: printf("RDONLY "); break;
- case 1: printf("WRONLY "); break;
- case 2: printf("RDWR "); break;
- }
-
- if((oplock_type & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) == (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
- printf("EXCLUSIVE+BATCH ");
- else if (oplock_type & EXCLUSIVE_OPLOCK)
- printf("EXCLUSIVE ");
- else if (oplock_type & BATCH_OPLOCK)
- printf("BATCH ");
- else
- printf("NONE ");
-
- printf(" %s %s",fname,asctime(LocalTime((time_t *)&t.tv_sec)));
-
-#ifdef FAST_SHARE_MODES
-
- entry_scanner_p = (share_mode_entry *)smb_shm_offset2addr(
- entry_scanner_p->next_share_mode_entry);
- } /* end while entry_scanner_p */
- file_scanner_p = (share_mode_record *)smb_shm_offset2addr(
- file_scanner_p->next_offset);
- } /* end while file_scanner_p */
- smb_shm_unlock_hash_entry(i);
- } /* end for */
-
- smb_shm_get_usage(&bytes_free, &bytes_used, &bytes_overhead);
- bytes_total = bytes_free + bytes_used + bytes_overhead;
-
- /*******************************************************************
- deinitialize the shared memory for share_mode management
- ******************************************************************/
- smb_shm_close();
-
-#else /* FAST_SHARE_MODES */
- } /* end for i */
-
- if(buf)
- free(buf);
- base = 0;
- } /* end while */
- closedir(dir);
-
-#endif /* FAST_SHARE_MODES */
- if (firstopen)
- printf("No locked files\n");
-#ifdef FAST_SHARE_MODES
- printf("\nShare mode memory usage (bytes):\n");
- printf(" %d(%d%%) free + %d(%d%%) used + %d(%d%%) overhead = %d(100%%) total\n",
- bytes_free, (bytes_free * 100)/bytes_total,
- bytes_used, (bytes_used * 100)/bytes_total,
- bytes_overhead, (bytes_overhead * 100)/bytes_total,
- bytes_total);
-
-#endif /* FAST_SHARE_MODES */
-
- return (0);
-}
-
-/* added by OH */
-void Ucrit_addUsername(pstring username)
-{
- strcpy(Ucrit_username, username);
- if(strlen(Ucrit_username) > 0)
- Ucrit_IsActive = 1;
-}
-
-unsigned int Ucrit_checkUsername(pstring username)
-{
- if ( !Ucrit_IsActive) return 1;
- if (strcmp(Ucrit_username,username) ==0) return 1;
- return 0;
-}
-
-void Ucrit_addPid(int pid)
-{
- int i;
- if ( !Ucrit_IsActive) return;
- for (i=0;i<Ucrit_MaxPid;i++)
- if( pid == Ucrit_pid[i] ) return;
- Ucrit_pid[Ucrit_MaxPid++] = pid;
-}
-
-unsigned int Ucrit_checkPid(int pid)
-{
- int i;
- if ( !Ucrit_IsActive) return 1;
- for (i=0;i<Ucrit_MaxPid;i++)
- if( pid == Ucrit_pid[i] ) return 1;
- return 0;
-}
-
diff --git a/source/utils/testparm.c b/source/utils/testparm.c
deleted file mode 100644
index ca364cb8c94..00000000000
--- a/source/utils/testparm.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- Test validity of smb.conf
- Copyright (C) Karl Auer 1993, 1994-1997
-
- Extensively modified by Andrew Tridgell, 1995
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- * Testbed for loadparm.c/params.c
- *
- * This module simply loads a specified configuration file and
- * if successful, dumps it's contents to stdout. Note that the
- * operation is performed with DEBUGLEVEL at 3.
- *
- * Useful for a quick 'syntax check' of a configuration file.
- *
- */
-
-#include "includes.h"
-#include "smb.h"
-
-/* these live in util.c */
-extern FILE *dbf;
-extern int DEBUGLEVEL;
-
- int main(int argc, char *argv[])
-{
- pstring configfile;
- int s;
-
- TimeInit();
-
- setup_logging(argv[0],True);
-
- charset_initialise();
-
- if (argc < 2)
- strcpy(configfile,CONFIGFILE);
- else
- strcpy(configfile,argv[1]);
-
- dbf = stdout;
- DEBUGLEVEL = 2;
-
- printf("Load smb config files from %s\n",configfile);
-
- if (!lp_load(configfile,False))
- {
- printf("Error loading services.\n");
- return(1);
- }
-
-
- printf("Loaded services file OK.\n");
-
- for (s=0;s<1000;s++)
- if (VALID_SNUM(s))
- if (strlen(lp_servicename(s)) > 8) {
- printf("WARNING: You have some share names that are longer than 8 chars\n");
- printf("These may give errors while browsing or may not be accessible\nto some older clients\n");
- break;
- }
-
- if (argc < 4)
- {
- printf("Press enter to see a dump of your service definitions\n");
- fflush(stdout);
- getc(stdin);
- lp_dump(stdout);
- }
-
- if (argc == 4)
- {
- char *cname = argv[2];
- char *caddr = argv[3];
-
- /* this is totally ugly, a real `quick' hack */
- for (s=0;s<1000;s++)
- if (VALID_SNUM(s))
- {
- if (allow_access(lp_hostsdeny(s),lp_hostsallow(s),cname,caddr))
- {
- printf("Allow connection from %s (%s) to %s\n",
- cname,caddr,lp_servicename(s));
- }
- else
- {
- printf("Deny connection from %s (%s) to %s\n",
- cname,caddr,lp_servicename(s));
- }
- }
- }
- return(0);
-}
-
-
diff --git a/source/utils/testprns.c b/source/utils/testprns.c
deleted file mode 100644
index 4a2ddb7c635..00000000000
--- a/source/utils/testprns.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- test printer setup
- Copyright (C) Karl Auer 1993, 1994-1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*
- * Testbed for pcap.c
- *
- * This module simply checks a given printer name against the compiled-in
- * printcap file.
- *
- * The operation is performed with DEBUGLEVEL at 3.
- *
- * Useful for a quick check of a printcap file.
- *
- */
-
-#include "includes.h"
-#include "smb.h"
-
-/* these live in util.c */
-extern FILE *dbf;
-extern int DEBUGLEVEL;
-
-int main(int argc, char *argv[])
-{
- char *pszTemp;
-
- TimeInit();
-
- setup_logging(argv[0],True);
-
- charset_initialise();
-
- if (argc < 2 || argc > 3)
- printf("Usage: testprns printername [printcapfile]\n");
- else
- {
- dbf = fopen("test.log", "w");
- if (dbf == NULL) {
- printf("Unable to open logfile.\n");
- } else {
- DEBUGLEVEL = 3;
- pszTemp = (argc < 3) ? PRINTCAP_NAME : argv[2];
- printf("Looking for printer %s in printcap file %s\n",
- argv[1], pszTemp);
- if (!pcap_printername_ok(argv[1], pszTemp))
- printf("Printer name %s is not valid.\n", argv[1]);
- else
- printf("Printer name %s is valid.\n", argv[1]);
- fclose(dbf);
- }
- }
- return (0);
-}
-
diff --git a/source/web/cgi.c b/source/web/cgi.c
deleted file mode 100644
index 56c293985d6..00000000000
--- a/source/web/cgi.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- some simple CGI helper routines
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-#include "includes.h"
-
-#define MAX_VARIABLES 512
-
-struct var {
- char *name;
- char *value;
-};
-
-static struct var variables[MAX_VARIABLES];
-static int num_variables;
-
-
-static int grab_line(int *cl, char *line, int maxsize)
-{
- int i = 0;
-
- while ((*cl)) {
- int c = fgetc(stdin);
- (*cl)--;
-
- if (c == EOF) {
- (*cl) = 0;
- break;
- }
-
- if (c == '+') {
- c = ' ';
- }
-
- if (c == '\r') continue;
-
- if (strchr("\n&", c)) break;
-
- if (c == '%' && (*cl) >= 2) {
- int c1, c2;
- c1 = fgetc(stdin);
- c2 = fgetc(stdin);
- (*cl) -= 2;
- if (c1 == EOF || c2 == EOF) break;
- if (c1 >= '0' && c1 <= '9')
- c1 = c1 - '0';
- else if (c1 >= 'A' && c1 <= 'F')
- c1 = 10 + c1 - 'A';
- else if (c1 >= 'a' && c1 <= 'f')
- c1 = 10 + c1 - 'a';
- else break;
-
- if (c2 >= '0' && c2 <= '9')
- c2 = c2 - '0';
- else if (c2 >= 'A' && c2 <= 'F')
- c2 = 10 + c2 - 'A';
- else if (c2 >= 'a' && c2 <= 'f')
- c2 = 10 + c2 - 'a';
- else break;
-
- c = (c1<<4) | c2;
- }
-
- line[i++] = c;
-
- if (i == maxsize) break;
- }
-
- /* now unescape the line */
-
-
- line[i] = 0;
- return 1;
-}
-
-
-/***************************************************************************
- load all the variables passed to the CGI program
- ***************************************************************************/
-void cgi_load_variables(void)
-{
- static pstring line;
- char *p;
- int len;
-
- if (!(p=getenv("CONTENT_LENGTH"))) return;
-
- len = atoi(p);
-
- if (len <= 0) return;
-
-
-
- while (len && grab_line(&len, line, sizeof(line)-1)) {
- p = strchr(line,'=');
- if (!p) continue;
-
- *p = 0;
-
- variables[num_variables].name = strdup(line);
- variables[num_variables].value = strdup(p+1);
-
- if (!variables[num_variables].name ||
- !variables[num_variables].value)
- continue;
-
-#if 0
- printf("%s=%s<br>\n",
- variables[num_variables].name,
- variables[num_variables].value);
-#endif
-
- num_variables++;
- if (num_variables == MAX_VARIABLES) break;
- }
-
- fclose(stdin);
-}
-
-
-/***************************************************************************
- find a variable passed via CGI
- ***************************************************************************/
-char *cgi_variable(char *name)
-{
- int i;
-
- for (i=0;i<num_variables;i++)
- if (strcmp(variables[i].name, name) == 0)
- return variables[i].value;
- return NULL;
-}
-
-
-/***************************************************************************
- return the value of a CGI boolean variable.
- ***************************************************************************/
-int cgi_boolean(char *name, int def)
-{
- char *p = cgi_variable(name);
-
- if (!p) return def;
-
- return strcmp(p, "1") == 0;
-}
diff --git a/source/wsmbconf.c b/source/wsmbconf.c
deleted file mode 100644
index 203952c204f..00000000000
--- a/source/wsmbconf.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- html smb.conf editing - prototype only
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-#include "smb.h"
-
-#define SDEFAULTS "Service defaults"
-#define SGLOBAL "Global Parameters"
-#define GLOBALS_SNUM -2
-#define DEFAULTS_SNUM -1
-
-
-/* start the page with standard stuff */
-static void print_header(void)
-{
- printf("Content-type: text/html\n\n");
- printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
- printf("<HTML>\n<HEAD>\n<TITLE>smb.conf</TITLE>\n</HEAD>\n<BODY>\n\n");
-}
-
-
-/* finish off the page */
-static void print_footer(void)
-{
- printf("\n</BODY>\n</HTML>\n");
-}
-
-/* setup persisant variables */
-static void set_persistent(char *name)
-{
- char *p;
- p = cgi_variable(name);
- if (!p) return;
- printf("<input type=hidden name=%s value=%s>\n", name, p);
-}
-
-/* display a servce, ready for editing */
-static void show_service(int snum, int allparameters)
-{
- int i = 0;
- pstring label, value;
- char *sname;
-
- if (snum == GLOBALS_SNUM)
- sname = SGLOBAL;
- else if (snum == DEFAULTS_SNUM)
- sname = SDEFAULTS;
- else sname = lp_servicename(snum);
-
- printf("\n<p><table border=0>\n<tr>\n<td></td><td>\n\n");
- printf("<form method=POST>\n");
- printf("<H3>%s</H3>\n", sname);
- printf("<input type=hidden name=service value=\"%s\">\n", sname);
- printf("<input type=submit name=request value=Change>\n");
- printf("<input type=submit name=request value=Rename>\n");
- printf("<input type=submit name=request value=Copy>\n");
- printf("<input type=submit name=request value=Remove>\n");
- printf("<br><input name=newvalue><br>\n");
- printf("<select name=parameter size=5>\n");
-
- while (lp_next_parameter(snum, &i, label, value, allparameters)) {
- printf("<option value=\"%s\">%s = %s\n",
- label, label, value);
- }
-
- printf("</select>\n");
- printf("</form>\n</td>\n</tr>\n</table>\n");
-
- printf("<p>\n");
-}
-
-
-/* loop over all services, displaying them one after the other */
-static void show_services(void)
-{
- int i;
- int n;
- int allparameters = cgi_boolean("allparameters", 0);
-
- printf("<FORM METHOD=POST>\n");
- printf("<p>Show all parameters?\n");
- printf("<INPUT NAME=allparameters TYPE=checkbox VALUE=1 %s>\n",
- allparameters?"CHECKED":"");
-
- printf("<INPUT TYPE=submit NAME=reload VALUE=Reload>\n");
-
- printf("</FORM>\n");
-
- n = lp_numservices();
-
- show_service(GLOBALS_SNUM, allparameters);
- show_service(DEFAULTS_SNUM, allparameters);
-
- for (i=0;i<n;i++)
- if (VALID_SNUM(i))
- show_service(i, allparameters);
-}
-
-
-/* load the smb.conf file into loadparm. this also does the chroot
- to the config directory. This must be called _BEFORE_ any client
- supplied data is parsed */
-static int load_config(void)
-{
- static pstring servicesf = CONFIGFILE;
- char *p;
-
- p = strrchr(servicesf,'/');
- if (!p) return 0;
-
- *p = 0;
-
- setuid(0);
-
- if (chdir(servicesf) || chroot(servicesf)) {
- printf("wsmbconf is not configured correctly\n");
- return 0;
- }
-
- *p = '/';
-
- if (!lp_load(p,False)) {
- printf("<b>Can't load %s - using defaults</b><p>\n",
- servicesf);
- }
- return 1;
-}
-
-
-static int save_reload(void)
-{
- static pstring servicesf = CONFIGFILE;
- char *p;
- FILE *f;
-
- p = strrchr(servicesf,'/');
- if (!p) return 0;
-
- f = fopen(p,"w");
- if (!f) {
- printf("failed to open %s for writing\n", servicesf);
- return 0;
- }
-
- fprintf(f, "# Samba config file created using wsmbconf\n");
-
- lp_dump(f);
-
- fclose(f);
-
- lp_killunused(NULL);
-
- if (!lp_load(p,False)) {
- printf("Can't reload %s\n", servicesf);
- return 0;
- }
-
- return 1;
-}
-
-static void process_requests(void)
-{
- char *req = cgi_variable("request");
- char *newvalue = cgi_variable("newvalue");
- char *parameter = cgi_variable("parameter");
- char *service = cgi_variable("service");
- int snum=0;
-
- if (!req) return;
-
- if (service) {
- /* work out what service it is */
- if (strcmp(service,SGLOBAL) == 0) {
- snum = GLOBALS_SNUM;
- } else if (strcmp(service,SDEFAULTS) == 0) {
- snum = DEFAULTS_SNUM;
- } else {
- snum = lp_servicenumber(service);
- if (snum < 0) return;
- }
- }
-
- if (!newvalue)
- newvalue = "";
-
- if (strcmp(req,"Change") == 0) {
- /* change the value of a parameter */
- if (!parameter || !service) return;
-
- lp_do_parameter(snum, parameter, newvalue);
- } else if (strcmp(req,"Rename") == 0) {
- /* rename a service */
- if (!newvalue || !service) return;
-
- lp_rename_service(snum, newvalue);
- } else if (strcmp(req,"Remove") == 0) {
- /* remove a service */
- if (!service) return;
-
- lp_remove_service(snum);
- } else if (strcmp(req,"Copy") == 0) {
- /* copy a service */
- if (!service || !newvalue) return;
-
- lp_copy_service(snum, newvalue);
- }
-
- save_reload();
-}
-
-
-int main(int argc, char *argv[])
-{
- extern FILE *dbf;
-
- print_header();
-
- dbf = stderr;
-
- charset_initialise();
-
- if (load_config()) {
- cgi_load_variables();
- process_requests();
- show_services();
- }
- print_footer();
- return 0;
-}
diff --git a/source/wsmbstatus.c b/source/wsmbstatus.c
deleted file mode 100644
index 2762b8610e7..00000000000
--- a/source/wsmbstatus.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- Unix SMB/Netbios implementation.
- Version 1.9.
- html status reporting
- Copyright (C) Andrew Tridgell 1997
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifdef SYSLOG
-#undef SYSLOG
-#endif
-
-#include "includes.h"
-
-static void print_header(void)
-{
- printf("Content-type: text/html\n\n");
- printf("<HTML>\n<HEAD>\n<TITLE>smbstatus</TITLE>\n</HEAD>\n<BODY>\n\n");
-}
-
-static void print_footer(void)
-{
- printf("\n</BODY>\n</HTML>\n");
-}
-
-static void show_connections(void)
-{
- static pstring servicesf = CONFIGFILE;
- pstring fname;
- FILE *f;
- struct connect_record crec;
-
- if (!lp_load(servicesf,False)) {
- printf("Can't load %s - run testparm to debug it\n", servicesf);
- return;
- }
-
- strcpy(fname,lp_lockdir());
- standard_sub_basic(fname);
- trim_string(fname,"","/");
- strcat(fname,"/STATUS..LCK");
-
- f = fopen(fname,"r");
- if (!f) {
- printf("Couldn't open status file %s\n",fname);
- if (!lp_status(-1))
- printf("You need to have status=yes in your smb config file\n");
- return;
- }
-
-
- printf("\nSamba version %s\n<p>",VERSION);
-
- while (!feof(f)) {
- if (fread(&crec,sizeof(crec),1,f) != 1)
- break;
- if (crec.magic == 0x280267 && process_exists(crec.pid)) {
- printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s<br>",
- crec.name,uidtoname(crec.uid),
- gidtoname(crec.gid),crec.pid,
- crec.machine,crec.addr,
- asctime(LocalTime(&crec.start)));
- }
- }
- fclose(f);
-}
-
-int main(int argc, char *argv[])
-{
- print_header();
- show_connections();
- print_footer();
- return 0;
-}