This commit was manufactured by cvs2svn to create branch 'SAMBA_3_0'.(This used to...
authorcvs2svn Import User <samba-bugs@samba.org>
Thu, 1 May 2003 11:47:49 +0000 (11:47 +0000)
committercvs2svn Import User <samba-bugs@samba.org>
Thu, 1 May 2003 11:47:49 +0000 (11:47 +0000)
262 files changed:
docs/docbook/devdoc/CodingSuggestions.xml [new file with mode: 0644]
docs/docbook/devdoc/NetBIOS.xml [new file with mode: 0644]
docs/docbook/devdoc/Tracing.xml [new file with mode: 0644]
docs/docbook/devdoc/architecture.xml [new file with mode: 0644]
docs/docbook/devdoc/cifsntdomain.xml [new file with mode: 0644]
docs/docbook/devdoc/debug.xml [new file with mode: 0644]
docs/docbook/devdoc/dev-doc.xml [new file with mode: 0644]
docs/docbook/devdoc/encryption.xml [new file with mode: 0644]
docs/docbook/devdoc/gencache.xml [new file with mode: 0644]
docs/docbook/devdoc/internals.xml [new file with mode: 0644]
docs/docbook/devdoc/modules.xml [new file with mode: 0644]
docs/docbook/devdoc/packagers.xml [new file with mode: 0644]
docs/docbook/devdoc/parsing.xml [new file with mode: 0644]
docs/docbook/devdoc/printing.xml [new file with mode: 0644]
docs/docbook/devdoc/rpc_plugin.xml [new file with mode: 0644]
docs/docbook/devdoc/sam.xml [new file with mode: 0644]
docs/docbook/devdoc/unix-smb.xml [new file with mode: 0644]
docs/docbook/devdoc/wins.xml [new file with mode: 0644]
docs/docbook/faq/clientapp.xml [new file with mode: 0644]
docs/docbook/faq/config.xml [new file with mode: 0644]
docs/docbook/faq/errors.xml [new file with mode: 0644]
docs/docbook/faq/features.xml [new file with mode: 0644]
docs/docbook/faq/general.xml [new file with mode: 0644]
docs/docbook/faq/install.xml [new file with mode: 0644]
docs/docbook/faq/printing.xml [new file with mode: 0644]
docs/docbook/faq/sambafaq.xml [new file with mode: 0644]
docs/docbook/manpages/.cvsignore [new file with mode: 0644]
docs/docbook/manpages/editreg.1.xml [new file with mode: 0644]
docs/docbook/manpages/findsmb.1.xml [new file with mode: 0644]
docs/docbook/manpages/lmhosts.5.xml [new file with mode: 0644]
docs/docbook/manpages/net.8.xml [new file with mode: 0644]
docs/docbook/manpages/nmbd.8.xml [new file with mode: 0644]
docs/docbook/manpages/nmblookup.1.xml [new file with mode: 0644]
docs/docbook/manpages/ntlm_auth.1.xml [new file with mode: 0644]
docs/docbook/manpages/pdbedit.8.xml [new file with mode: 0644]
docs/docbook/manpages/profiles.1.xml [new file with mode: 0644]
docs/docbook/manpages/rpcclient.1.xml [new file with mode: 0644]
docs/docbook/manpages/samba.7.xml [new file with mode: 0644]
docs/docbook/manpages/smbcacls.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbclient.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbcontrol.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbcquotas.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbd.8.xml [new file with mode: 0644]
docs/docbook/manpages/smbmnt.8.xml [new file with mode: 0644]
docs/docbook/manpages/smbmount.8.xml [new file with mode: 0644]
docs/docbook/manpages/smbpasswd.5.xml [new file with mode: 0644]
docs/docbook/manpages/smbpasswd.8.xml [new file with mode: 0644]
docs/docbook/manpages/smbsh.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbspool.8.xml [new file with mode: 0644]
docs/docbook/manpages/smbstatus.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbtar.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbtree.1.xml [new file with mode: 0644]
docs/docbook/manpages/smbumount.8.xml [new file with mode: 0644]
docs/docbook/manpages/swat.8.xml [new file with mode: 0644]
docs/docbook/manpages/tdbbackup.8.xml [new file with mode: 0644]
docs/docbook/manpages/testparm.1.xml [new file with mode: 0644]
docs/docbook/manpages/testprns.1.xml [new file with mode: 0644]
docs/docbook/manpages/vfstest.1.xml [new file with mode: 0644]
docs/docbook/manpages/wbinfo.1.xml [new file with mode: 0644]
docs/docbook/manpages/winbindd.8.xml [new file with mode: 0644]
docs/docbook/projdoc/ADS-HOWTO.xml [new file with mode: 0644]
docs/docbook/projdoc/AdvancedNetworkAdmin.xml [new file with mode: 0644]
docs/docbook/projdoc/Bugs.xml [new file with mode: 0644]
docs/docbook/projdoc/CUPS-printing.xml [new file with mode: 0644]
docs/docbook/projdoc/Compiling.xml [new file with mode: 0644]
docs/docbook/projdoc/DOMAIN_MEMBER.xml [new file with mode: 0644]
docs/docbook/projdoc/Diagnosis.xml [new file with mode: 0644]
docs/docbook/projdoc/GROUP-MAPPING-HOWTO.xml [new file with mode: 0644]
docs/docbook/projdoc/Integrating-with-Windows.xml [new file with mode: 0644]
docs/docbook/projdoc/InterdomainTrusts.xml [new file with mode: 0644]
docs/docbook/projdoc/IntroSMB.xml [new file with mode: 0644]
docs/docbook/projdoc/NT4Migration.xml [new file with mode: 0644]
docs/docbook/projdoc/NT_Security.xml [new file with mode: 0644]
docs/docbook/projdoc/NetworkBrowsing.xml [new file with mode: 0644]
docs/docbook/projdoc/Other-Clients.xml [new file with mode: 0644]
docs/docbook/projdoc/PAM-Authentication-And-Samba.xml [new file with mode: 0644]
docs/docbook/projdoc/PolicyMgmt.xml [new file with mode: 0644]
docs/docbook/projdoc/Portability.xml [new file with mode: 0644]
docs/docbook/projdoc/Problems.xml [new file with mode: 0644]
docs/docbook/projdoc/ProfileMgmt.xml [new file with mode: 0644]
docs/docbook/projdoc/SWAT.xml [new file with mode: 0644]
docs/docbook/projdoc/Samba-BDC-HOWTO.xml [new file with mode: 0644]
docs/docbook/projdoc/Samba-PDC-HOWTO.xml [new file with mode: 0644]
docs/docbook/projdoc/ServerType.xml [new file with mode: 0644]
docs/docbook/projdoc/Speed.xml [new file with mode: 0644]
docs/docbook/projdoc/UNIX_INSTALL.xml [new file with mode: 0644]
docs/docbook/projdoc/VFS.xml [new file with mode: 0644]
docs/docbook/projdoc/locking.xml [new file with mode: 0644]
docs/docbook/projdoc/msdfs_setup.xml [new file with mode: 0644]
docs/docbook/projdoc/passdb.xml [new file with mode: 0644]
docs/docbook/projdoc/printer_driver2.xml [new file with mode: 0644]
docs/docbook/projdoc/samba-doc.xml [new file with mode: 0644]
docs/docbook/projdoc/securing-samba.xml [new file with mode: 0644]
docs/docbook/projdoc/security_level.xml [new file with mode: 0644]
docs/docbook/projdoc/unicode.xml [new file with mode: 0644]
docs/docbook/projdoc/upgrading-to-3.0.xml [new file with mode: 0644]
docs/docbook/projdoc/winbind.xml [new file with mode: 0644]
docs/docbook/smbdotconf/.cvsignore [new file with mode: 0644]
docs/docbook/smbdotconf/expand-smb.conf.xsl [new file with mode: 0644]
docs/docbook/smbdotconf/printing/maxreportedprintjobs.xml [new file with mode: 0644]
docs/docbook/smbdotconf/security/restrictanonymous.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/VERSION.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/abstract.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/admonition.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/authorgroup.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/biblio.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/block.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/book-article.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/bridgehead.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/callout.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/citation.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/ca.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/common.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/cs.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/da.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/de.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/el.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/en.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/es.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/et.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/fi.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/fr.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/hu.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/id.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/it.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/ja.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/ko.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/l10n.dtd [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/l10n.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/l10n.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/nl.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/no.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/pl.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/pt.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/pt_br.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/ro.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/ru.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/sk.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/sl.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/sv.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/zh_cn.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/common/zh_tw.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/component.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/dedication.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/dingbat.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/docbook.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/email.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/errors.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/example.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/figure.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/font.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/footnote.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/formal.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/glossary.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/graphic.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/html.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/index.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/info.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/inline.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/keywords.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/labelid.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/latex.mapping.dtd [new file with mode: 0644]
docs/docbook/xslt/db2latex/latex.mapping.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/latex.mapping.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/lists.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathelem.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamsa.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamsb.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamsc.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamsn.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamso.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isoamsr.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isobox.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isocyr1.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isocyr2.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isodia.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isogrk1.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isogrk2.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isogrk3.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isogrk4.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isolat1.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isolat2.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isomfrk.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isomopf.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isomscr.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isonum.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isopub.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/isotech.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/mmlalias.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/ent/mmlextra.ent [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/latex.entities.dtd [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/latex.entities.xml [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.content.constsymb.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.content.functions.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.content.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.content.token.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mathml/mathml.presentation.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/mediaobject.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/msgset.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/normalize-scape.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/para.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/part-chap-app.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/pi.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/preamble.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/preface.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/procedure.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/qandaset.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/refentry.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/revision.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/sections.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/set.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/sgmltag.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/synop-oop.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/synop-struct.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/table.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/texmath.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/vars.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/verbatim.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/db2latex/xref.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/figures/caution.eps [new file with mode: 0644]
docs/docbook/xslt/figures/caution.pdf [new file with mode: 0644]
docs/docbook/xslt/figures/important.eps [new file with mode: 0644]
docs/docbook/xslt/figures/important.pdf [new file with mode: 0644]
docs/docbook/xslt/figures/note.eps [new file with mode: 0644]
docs/docbook/xslt/figures/note.pdf [new file with mode: 0644]
docs/docbook/xslt/figures/tip.eps [new file with mode: 0644]
docs/docbook/xslt/figures/tip.pdf [new file with mode: 0644]
docs/docbook/xslt/figures/warning.eps [new file with mode: 0644]
docs/docbook/xslt/figures/warning.pdf [new file with mode: 0644]
docs/docbook/xslt/html-chunk.xsl [new file with mode: 0644]
docs/docbook/xslt/html-common.xsl [new file with mode: 0644]
docs/docbook/xslt/html.xsl [new file with mode: 0644]
docs/docbook/xslt/html/samba.css [new file with mode: 0644]
docs/docbook/xslt/latex.xsl [new file with mode: 0644]
docs/docbook/xslt/latex/sambadoc.cls [new file with mode: 0644]
docs/docbook/xslt/lists.mod.xsl [new file with mode: 0644]
docs/docbook/xslt/man.xsl [new file with mode: 0644]
docs/docbook/xslt/table.mod.xsl [new file with mode: 0644]
docs/faq/FAQ-ClientApp.html [new file with mode: 0644]
docs/faq/FAQ-Install.html [new file with mode: 0644]
docs/faq/FAQ-errors.html [new file with mode: 0644]
docs/faq/FAQ-features.html [new file with mode: 0644]
docs/faq/FAQ-general.html [new file with mode: 0644]
docs/htmldocs/compiling.html [new file with mode: 0644]
docs/htmldocs/domain-member.html [new file with mode: 0644]
docs/htmldocs/editreg.1.html [new file with mode: 0644]
docs/htmldocs/ntlm_auth.1.html [new file with mode: 0644]
docs/htmldocs/passdb.html [new file with mode: 0644]
docs/htmldocs/problems.html [new file with mode: 0644]
docs/htmldocs/profiles.1.html [new file with mode: 0644]
docs/htmldocs/securing-samba.html [new file with mode: 0644]
docs/htmldocs/smbcquotas.1.html [new file with mode: 0644]
docs/htmldocs/smbtree.1.html [new file with mode: 0644]
docs/htmldocs/unicode.html [new file with mode: 0644]
docs/manpages/editreg.1 [new file with mode: 0644]
docs/manpages/ntlm_auth.1 [new file with mode: 0644]
docs/manpages/profiles.1 [new file with mode: 0644]
docs/manpages/smbcquotas.1 [new file with mode: 0644]
docs/manpages/smbtree.1 [new file with mode: 0644]
source3/sam/idmap.c [new file with mode: 0644]
source3/sam/idmap_tdb.c [new file with mode: 0644]

diff --git a/docs/docbook/devdoc/CodingSuggestions.xml b/docs/docbook/devdoc/CodingSuggestions.xml
new file mode 100644 (file)
index 0000000..bdf6d3d
--- /dev/null
@@ -0,0 +1,237 @@
+<chapter id="CodingSuggestions">
+<chapterinfo>
+       <author>
+               <firstname>Steve</firstname><surname>French</surname>
+       </author>
+       <author>
+               <firstname>Simo</firstname><surname>Sorce</surname>
+       </author>
+       <author>
+               <firstname>Andrew</firstname><surname>Bartlett</surname>
+       </author>
+       <author>
+               <firstname>Tim</firstname><surname>Potter</surname>
+       </author>
+       <author>
+               <firstname>Martin</firstname><surname>Pool</surname>
+       </author>
+</chapterinfo>
+
+<title>Coding Suggestions</title>
+
+<para>
+So you want to add code to Samba ...
+</para>
+
+<para>
+One of the daunting tasks facing a programmer attempting to write code for
+Samba is understanding the various coding conventions used by those most
+active in the project.  These conventions were mostly unwritten and helped
+improve either the portability, stability or consistency of the code. This
+document will attempt to document a few of the more important coding
+practices used at this time on the Samba project.  The coding practices are
+expected to change slightly over time, and even to grow as more is learned
+about obscure portability considerations.  Two existing documents
+<filename>samba/source/internals.doc</filename> and 
+<filename>samba/source/architecture.doc</filename> provide
+additional information.
+</para>
+
+<para>
+The loosely related question of coding style is very personal and this
+document does not attempt to address that subject, except to say that I
+have observed that eight character tabs seem to be preferred in Samba
+source.  If you are interested in the topic of coding style, two oft-quoted
+documents are:
+</para>
+
+<para>
+<ulink url="http://lxr.linux.no/source/Documentation/CodingStyle">http://lxr.linux.no/source/Documentation/CodingStyle</ulink>
+</para>
+
+<para>
+<ulink url="http://www.fsf.org/prep/standards_toc.html">http://www.fsf.org/prep/standards_toc.html</ulink>
+</para>
+
+<para>
+But note that coding style in Samba varies due to the many different
+programmers who have contributed.
+</para>
+
+<para>
+Following are some considerations you should use when adding new code to
+Samba.  First and foremost remember that:
+</para>
+
+<para>
+Portability is a primary consideration in adding function, as is network
+compatability with de facto, existing, real world CIFS/SMB implementations.
+There are lots of platforms that Samba builds on so use caution when adding
+a call to a library function that is not invoked in existing Samba code.
+Also note that there are many quite different SMB/CIFS clients that Samba
+tries to support, not all of which follow the SNIA CIFS Technical Reference
+(or the earlier Microsoft reference documents or the X/Open book on the SMB
+Standard) perfectly.
+</para>
+
+<para>
+Here are some other suggestions:
+</para>
+
+<orderedlist>
+
+<listitem><para>
+       use d_printf instead of printf for display text
+       reason: enable auto-substitution of translated language text 
+</para></listitem>
+
+<listitem><para>
+       use SAFE_FREE instead of free
+       reason: reduce traps due to null pointers
+</para></listitem>
+
+<listitem><para>
+       don't use bzero use memset, or ZERO_STRUCT and ZERO_STRUCTP macros
+       reason: not POSIX
+</para></listitem>
+
+<listitem><para>
+       don't use strcpy and strlen (use safe_* equivalents)
+       reason: to avoid traps due to buffer overruns
+</para></listitem>
+
+<listitem><para>
+       don't use getopt_long, use popt functions instead
+       reason: portability
+</para></listitem>
+
+<listitem><para>
+       explicitly add const qualifiers on parm passing in functions where parm
+       is input only (somewhat controversial but const can be #defined away)
+</para></listitem>
+
+<listitem><para>
+       when passing a va_list as an arg, or assigning one to another
+       please use the VA_COPY() macro
+       reason: on some platforms, va_list is a struct that must be 
+       initialized in each function...can SEGV if you don't.
+</para></listitem>
+
+<listitem><para>
+       discourage use of threads
+       reason: portability (also see architecture.doc)
+</para></listitem>
+
+<listitem><para>
+       don't explicitly include new header files in C files - new h files 
+       should be included by adding them once to includes.h
+       reason: consistency
+</para></listitem>
+
+<listitem><para>
+       don't explicitly extern functions (they are autogenerated by 
+       "make proto" into proto.h)
+       reason: consistency
+</para></listitem>
+
+<listitem><para>
+       use endian safe macros when unpacking SMBs (see byteorder.h and
+       internals.doc)
+       reason: not everyone uses Intel
+</para></listitem>
+
+<listitem><para>
+       Note Unicode implications of charset handling (see internals.doc).  See
+       pull_*  and push_* and convert_string functions.
+       reason: Internationalization
+</para></listitem>
+
+<listitem><para>
+       Don't assume English only
+       reason: See above
+</para></listitem>
+
+<listitem><para>
+       Try to avoid using in/out parameters (functions that return data which
+       overwrites input parameters)
+       reason: Can cause stability problems
+</para></listitem>
+
+<listitem><para>
+       Ensure copyright notices are correct, don't append Tridge's name to code
+       that he didn't write.  If you did not write the code, make sure that it
+       can coexist with the rest of the Samba GPLed code.
+</para></listitem>
+
+<listitem><para>
+       Consider usage of DATA_BLOBs for length specified byte-data.
+       reason: stability
+</para></listitem>
+
+<listitem><para>
+       Take advantage of tdbs for database like function
+       reason: consistency
+</para></listitem>
+
+<listitem><para>
+       Don't access the SAM_ACCOUNT structure directly, they should be accessed
+       via pdb_get...() and pdb_set...() functions.
+       reason: stability, consistency
+</para></listitem>
+
+<listitem><para>
+       Don't check a password directly against the passdb, always use the
+       check_password() interface.
+       reason: long term pluggability
+</para></listitem>
+
+<listitem><para>
+       Try to use asprintf rather than pstrings and fstrings where possible
+</para></listitem>
+
+<listitem><para>
+       Use normal C comments / * instead of C++ comments // like
+       this.  Although the C++ comment format is part of the C99
+       standard, some older vendor C compilers do not accept it.
+</para></listitem>
+
+<listitem><para>
+       Try to write documentation for API functions and structures
+       explaining the point of the code, the way it should be used, and
+       any special conditions or results.  Mark these with a double-star
+       comment start / ** so that they can be picked up by Doxygen, as in
+       this file.
+</para></listitem>
+
+<listitem><para>
+       Keep the scope narrow. This means making functions/variables
+       static whenever possible. We don't want our namespace
+       polluted. Each module should have a minimal number of externally
+       visible functions or variables.
+</para></listitem>
+
+<listitem><para>
+       Use function pointers to keep knowledge about particular pieces of
+       code isolated in one place. We don't want a particular piece of
+       functionality to be spread out across lots of places - that makes
+       for fragile, hand to maintain code. Instead, design an interface
+       and use tables containing function pointers to implement specific
+       functionality. This is particularly important for command
+       interpreters. 
+</para></listitem>
+
+<listitem><para>
+       Think carefully about what it will be like for someone else to add
+       to and maintain your code. If it would be hard for someone else to
+       maintain then do it another way. 
+</para></listitem>
+
+</orderedlist>
+
+<para>
+The suggestions above are simply that, suggestions, but the information may
+help in reducing the routine rework done on new code.  The preceeding list
+is expected to change routinely as new support routines and macros are
+added.
+</para>
+</chapter>
diff --git a/docs/docbook/devdoc/NetBIOS.xml b/docs/docbook/devdoc/NetBIOS.xml
new file mode 100644 (file)
index 0000000..6b4eb34
--- /dev/null
@@ -0,0 +1,154 @@
+<chapter id="netbios">
+<chapterinfo>
+       <author>
+               <firstname>Luke</firstname><surname>Leighton</surname>
+       </author>
+       <pubdate>12 June 1997</pubdate>
+</chapterinfo>
+
+<title>Definition of NetBIOS Protocol and Name Resolution Modes</title>
+
+<sect1>
+<title>NETBIOS</title>
+
+<para>
+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.
+</para>
+
+<para> 
+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.
+</para>
+
+<para> 
+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'.
+</para>
+
+<para>
+[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].
+</para>
+
+<para> 
+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.
+</para>
+
+<para> 
+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.
+</para>
+
+<para> 
+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.
+</para>
+
+<para> 
+NetBIOS names are either UNIQUE or GROUP.  Only one application can claim a
+UNIQUE NetBIOS name on a network.
+</para>
+
+<para>
+There are two kinds of NetBIOS Name resolution: Broadcast and Point-to-Point.
+</para>
+
+</sect1>
+
+<sect1>
+<title>BROADCAST NetBIOS</title>
+
+<para> 
+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.
+</para>
+
+<para> 
+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!].
+</para>
+
+</sect1>
+
+<sect1>
+<title>NBNS NetBIOS</title>
+
+<para>
+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 &lt;1c&gt; &lt;1d&gt; &lt;1e&gt; names all in different ways.
+I recommend the reading of the Microsoft WINS Server Help files for full
+details).
+</para>
+
+<para> 
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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].
+</para>
+
+<para>
+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.
+</para>
+
+<para> 
+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.
+</para>
+
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/devdoc/Tracing.xml b/docs/docbook/devdoc/Tracing.xml
new file mode 100644 (file)
index 0000000..ccf1e1c
--- /dev/null
@@ -0,0 +1,129 @@
+<chapter id="tracing">
+<chapterinfo>
+       <author>
+               <firstname>Andrew</firstname><surname>Tridgell</surname>
+               <affiliation>
+                       <orgname>Samba Team</orgname>
+               </affiliation>
+       </author>
+</chapterinfo>
+
+<title>Tracing samba system calls</title>
+
+<para>
+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.
+</para>
+
+<para>
+Actually its not as bad as the the above makes it sound, just don't
+expect the output to be very pretty :-)
+</para>
+
+<para>
+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. 
+</para>
+
+<para>
+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. 
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+Next, try using strace on some simple commands. For example, <command>strace
+ls</command> or <command>strace echo hello</command>.
+</para>
+
+<para> 
+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!)
+</para>
+
+<para>
+For example, the only line that really matters in the <command>strace echo
+hello</command> output is:
+</para>
+
+<para><programlisting>
+write(1, "hello\n", 6)                  = 6
+</programlisting></para>
+
+<para>all the rest is just setting up to run the program.</para>
+
+<para>
+Ok, now you're familiar 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
+<command>strace -p PID</command> 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:
+</para>
+
+<para><command>strace -f -p 3872 &gt;&amp; strace.out</command></para>
+
+<para>or with a sh style shell:</para>
+
+<para><command>strace -f -p 3872 > strace.out 2&gt;&amp;1</command></para>
+
+<para>
+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.
+</para>
+
+<para>
+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. 
+</para>
+
+<para>
+So how do you interpret the results? Generally I search through 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.
+</para>
+
+<para>
+Beyond this you will have to use your initiative. To give you an idea
+of what you are looking for here is a piece of strace output that
+shows that <filename>/dev/null</filename> is not world writeable, which
+causes printing to fail with Samba:
+</para>
+
+<para><programlisting>
+[pid 28268] open("/dev/null", O_RDWR)   = -1 EACCES (Permission denied)
+[pid 28268] open("/dev/null", O_WRONLY) = -1 EACCES (Permission denied)
+</programlisting></para>
+
+<para>
+The process is trying to first open <filename>/dev/null</filename> read-write 
+then read-only. Both fail. This means <filename>/dev/null</filename> has 
+incorrect permissions.
+</para>
+
+</chapter>
diff --git a/docs/docbook/devdoc/architecture.xml b/docs/docbook/devdoc/architecture.xml
new file mode 100644 (file)
index 0000000..312a63a
--- /dev/null
@@ -0,0 +1,184 @@
+<chapter id="architecture">
+<chapterinfo>
+       <author>
+               <firstname>Dan</firstname><surname>Shearer</surname>
+       </author>
+       <pubdate> November 1997</pubdate>
+</chapterinfo>
+
+<title>Samba Architecture</title>
+
+<sect1>
+<title>Introduction</title>
+
+<para>
+This document gives a general overview of how Samba works
+internally. The Samba Team has tried to come up with a model which is
+the best possible compromise between elegance, portability, security
+and the constraints imposed by the very messy SMB and CIFS
+protocol. 
+</para>
+
+<para>
+It also tries to answer some of the frequently asked questions such as:
+</para>
+
+<orderedlist>
+<listitem><para>
+       Is Samba secure when running on Unix? The xyz platform?
+       What about the root priveliges issue?
+</para></listitem>
+
+<listitem><para>Pros and cons of multithreading in various parts of Samba</para></listitem>
+
+<listitem><para>Why not have a separate process for name resolution, WINS, and browsing?</para></listitem>
+
+</orderedlist>
+
+</sect1>
+
+<sect1>
+<title>Multithreading and Samba</title>
+
+<para>
+People sometimes tout threads as a uniformly good thing. They are very
+nice in their place but are quite inappropriate for smbd. nmbd is
+another matter, and multi-threading it would be very nice. 
+</para>
+
+<para>
+The short version is that smbd is not multithreaded, and alternative
+servers that take this approach under Unix (such as Syntax, at the
+time of writing) suffer tremendous performance penalties and are less
+robust. nmbd is not threaded either, but this is because it is not
+possible to do it while keeping code consistent and portable across 35
+or more platforms. (This drawback also applies to threading smbd.)
+</para>
+
+<para>
+The longer versions is that there are very good reasons for not making
+smbd multi-threaded.  Multi-threading would actually make Samba much
+slower, less scalable, less portable and much less robust. The fact
+that we use a separate process for each connection is one of Samba's
+biggest advantages.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Threading smbd</title>
+
+<para>
+A few problems that would arise from a threaded smbd are:
+</para>
+
+<orderedlist>
+<listitem><para>
+       It's not only to create threads instead of processes, but you
+       must care about all variables if they have to be thread specific
+       (currently they would be global).
+</para></listitem>
+
+<listitem><para>
+       if one thread dies (eg. a seg fault) then all threads die. We can
+       immediately throw robustness out the window.
+</para></listitem>
+
+<listitem><para>
+       many of the system calls we make are blocking. Non-blocking
+       equivalents of many calls are either not available or are awkward (and
+       slow) to use. So while we block in one thread all clients are
+       waiting. Imagine if one share is a slow NFS filesystem and the others 
+       are fast, we will end up slowing all clients to the speed of NFS.
+</para></listitem>
+
+<listitem><para>
+       you can't run as a different uid in different threads. This means
+       we would have to switch uid/gid on _every_ SMB packet. It would be
+       horrendously slow.
+</para></listitem>
+
+<listitem><para>
+       the per process file descriptor limit would mean that we could only
+       support a limited number of clients.
+</para></listitem>
+
+<listitem><para>
+       we couldn't use the system locking calls as the locking context of
+       fcntl() is a process, not a thread.
+</para></listitem>
+
+</orderedlist>
+
+</sect1>
+
+<sect1>
+<title>Threading nmbd</title>
+
+<para>
+This would be ideal, but gets sunk by portability requirements.
+</para>
+
+<para>
+Andrew tried to write a test threads library for nmbd that used only
+ansi-C constructs (using setjmp and longjmp). Unfortunately some OSes
+defeat this by restricting longjmp to calling addresses that are
+shallower than the current address on the stack (apparently AIX does
+this). This makes a truly portable threads library impossible. So to
+support all our current platforms we would have to code nmbd both with
+and without threads, and as the real aim of threads is to make the
+code clearer we would not have gained anything. (it is a myth that
+threads make things faster. threading is like recursion, it can make
+things clear but the same thing can always be done faster by some
+other method)
+</para>
+
+<para>
+Chris tried to spec out a general design that would abstract threading
+vs separate processes (vs other methods?) and make them accessible
+through some general API. This doesn't work because of the data
+sharing requirements of the protocol (packets in the future depending
+on packets now, etc.) At least, the code would work but would be very
+clumsy, and besides the fork() type model would never work on Unix. (Is there an OS that it would work on, for nmbd?)
+</para>
+
+<para>
+A fork() is cheap, but not nearly cheap enough to do on every UDP
+packet that arrives. Having a pool of processes is possible but is
+nasty to program cleanly due to the enormous amount of shared data (in
+complex structures) between the processes. We can't rely on each
+platform having a shared memory system.
+</para>
+
+</sect1>
+
+<sect1>
+<title>nbmd Design</title>
+
+<para>
+Originally Andrew used recursion to simulate a multi-threaded
+environment, which use the stack enormously and made for really
+confusing debugging sessions. Luke Leighton rewrote it to use a
+queuing system that keeps state information on each packet.  The
+first version used a single structure which was used by all the
+pending states.  As the initialisation of this structure was
+done by adding arguments, as the functionality developed, it got
+pretty messy.  So, it was replaced with a higher-order function
+and a pointer to a user-defined memory block.  This suddenly
+made things much simpler: large numbers of functions could be
+made static, and modularised.  This is the same principle as used
+in NT's kernel, and achieves the same effect as threads, but in
+a single process.
+</para>
+
+<para>
+Then Jeremy rewrote nmbd. The packet data in nmbd isn't what's on the
+wire. It's a nice format that is very amenable to processing but still
+keeps the idea of a distinct packet. See "struct packet_struct" in
+nameserv.h.  It has all the detail but none of the on-the-wire
+mess. This makes it ideal for using in disk or memory-based databases
+for browsing and WINS support. 
+</para>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/cifsntdomain.xml b/docs/docbook/devdoc/cifsntdomain.xml
new file mode 100644 (file)
index 0000000..7c3c22d
--- /dev/null
@@ -0,0 +1,2932 @@
+<chapter id="ntdomain">
+<chapterinfo>
+       <author>
+               <firstname>Luke</firstname><surname>Leighton</surname>
+               <affiliation><address><email>lkcl@switchboard.net</email></address></affiliation>
+       </author>
+       <author>
+               <firstname>Paul</firstname><surname>Ashton</surname>
+               <affiliation><address><email>paul@argo.demon.co.uk</email></address></affiliation>
+       </author>
+       <author>
+               <firstname>Duncan</firstname><surname>Stansfield</surname>
+               <affiliation><address><email>duncans@sco.com</email></address></affiliation>
+       </author>
+
+       <pubdate>01 November 97(version 0.0.24)</pubdate>
+</chapterinfo>
+
+<title>NT Domain RPC's</title>
+
+<sect1>
+<title>Introduction</title>
+
+
+<para>
+This document contains information to provide an NT workstation with login
+services, without the need for an NT server. It is the sgml version of <ulink url="http://mailhost.cb1.com/~lkcl/cifsntdomain.txt">http://mailhost.cb1.com/~lkcl/cifsntdomain.txt</ulink>, controlled by Luke.
+</para>
+
+<para>
+It should be possible to select a domain instead of a workgroup (in the NT
+workstation's TCP/IP settings) and after the obligatory reboot, type in a
+username, password, select a domain and successfully log in.  I would
+appreciate any feedback on your experiences with this process, and any
+comments, corrections and additions to this document.
+</para>
+
+<para>
+The packets described here can be easily derived from (and are probably
+better understood using) Netmon.exe.  You will need to use the version
+of Netmon that matches your system, in order to correctly decode the
+NETLOGON, lsarpc and srvsvc Transact pipes.  This document is derived from
+NT Service Pack 1 and its corresponding version of Netmon.  It is intended
+that an annotated packet trace be produced, which will likely be more
+instructive than this document.
+</para>
+
+<para>
+Also needed, to fully implement NT Domain Login Services, is the 
+document describing the cryptographic part of the NT authentication.
+This document is available from comp.protocols.smb; from the ntsecurity.net
+digest and from the samba digest, amongst other sources.
+</para>
+
+<para>
+A copy is available from:
+</para>
+
+<para><ulink url="http://ntbugtraq.rc.on.ca/SCRIPTS/WA.EXE?A2=ind9708;L=ntbugtraq;O=A;P=2935">http://ntbugtraq.rc.on.ca/SCRIPTS/WA.EXE?A2=ind9708;L=ntbugtraq;O=A;P=2935</ulink></para>
+
+<para><ulink url="http://mailhost.cb1.com/~lkcl/crypt.html">http://mailhost.cb1.com/~lkcl/crypt.html</ulink></para>
+
+<para>
+A c-code implementation, provided by <ulink url="mailto:linus@incolumitas.se">Linus Nordberg</ulink>
+of this protocol is available from:
+</para>
+
+<para><ulink url="http://samba.org/cgi-bin/mfs/01/digest/1997/97aug/0391.html">http://samba.org/cgi-bin/mfs/01/digest/1997/97aug/0391.html</ulink></para>
+<para><ulink url="http://mailhost.cb1.com/~lkcl/crypt.txt">http://mailhost.cb1.com/~lkcl/crypt.txt</ulink></para>
+
+<para>
+Also used to provide debugging information is the Check Build version of
+NT workstation, and enabling full debugging in NETLOGON.  This is
+achieved by setting the following REG_SZ registry key to 0x1ffffff:
+</para>
+
+<para><filename>HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters</filename></para>
+
+<para><emphasis>Incorrect direct editing of the registry can cause your
+machine to fail. Then again, so can incorrect implementation of this 
+protocol. See "Liability:" above.</emphasis></para>
+
+<para>
+Bear in mind that each packet over-the-wire will have its origin in an
+API call.  Therefore, there are likely to be structures, enumerations
+and defines that are usefully documented elsewhere.
+</para>
+
+<para>
+This document is by no means complete or authoritative.  Missing sections
+include, but are not limited to:
+</para>
+
+
+<orderedlist>
+
+<listitem><para>Mappings of RIDs to usernames (and vice-versa).</para></listitem>
+
+<listitem><para>What a User ID is and what a Group ID is.</para></listitem>
+
+<listitem><para>The exact meaning/definition of various magic constants or enumerations.</para></listitem>
+
+<listitem><para>The reply error code and use of that error code when a
+workstation becomes a member of a domain (to be described later).  
+Failure to return this error code will make the workstation report 
+that it is already a member of the domain.</para></listitem>
+
+<listitem><para>the cryptographic side of the NetrServerPasswordSet command, 
+which would allow the workstation to change its password.  This password is
+used to generate the long-term session key.  [It is possible to reject this
+command, and keep the default workstation password].</para></listitem>
+
+</orderedlist>
+
+<sect2>
+<title>Sources</title>
+
+<simplelist>
+<member>cket Traces from Netmonitor (Service Pack 1 and above)</member>
+<member>ul Ashton and Luke Leighton's other "NT Domain" doc.</member>
+<member>FS documentation - cifs6.txt</member>
+<member>FS documentation - cifsrap2.txt</member>
+</simplelist>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<simplelist> 
+<member>Paul Ashton: loads of work with Net Monitor; understanding the NT authentication system; reference implementation of the NT domain support on which this document is originally based.</member>
+<member>Duncan Stansfield: low-level analysis of MSRPC Pipes.</member>
+<member>Linus Nordberg: producing c-code from Paul's crypto spec.</member>
+<member>Windows Sourcer development team</member>
+</simplelist>
+
+</sect2>
+
+</sect1>
+
+<sect1>
+<title>Notes and Structures</title>
+
+<sect2>
+<title>Notes</title>
+
+<orderedlist>
+<listitem><para>
+In the SMB Transact pipes, some "Structures", described here, appear to be
+4-byte aligned with the SMB header, at their start.  Exactly which
+"Structures" need aligning is not precisely known or documented.
+</para></listitem>
+
+<listitem><para>
+In the UDP NTLOGON Mailslots, some "Structures", described here, appear to be
+2-byte aligned with the start of the mailslot, at their start.
+</para></listitem>
+
+<listitem><para>
+Domain SID is of the format S-revision-version-auth1-auth2...authN.
+e.g S-1-5-123-456-789-123-456.  the 5 could be a sub-revision.
+</para></listitem>
+
+<listitem><para>
+any undocumented buffer pointers must be non-zero if the string buffer it
+refers to contains characters.  exactly what value they should be is unknown.
+0x0000 0002 seems to do the trick to indicate that the buffer exists.  a
+NULL buffer pointer indicates that the string buffer is of zero length.
+If the buffer pointer is NULL, then it is suspected that the structure it
+refers to is NOT put into (or taken out of) the SMB data stream.  This is
+empirically derived from, for example, the LSA SAM Logon response packet,
+where if the buffer pointer is NULL, the user information is not inserted
+into the data stream.  Exactly what happens with an array of buffer pointers
+is not known, although an educated guess can be made.
+</para></listitem>
+
+<listitem><para>
+an array of structures (a container) appears to have a count and a pointer.
+if the count is zero, the pointer is also zero.  no further data is put
+into or taken out of the SMB data stream.  if the count is non-zero, then
+the pointer is also non-zero.  immediately following the pointer is the
+count again, followed by an array of container sub-structures.  the count
+appears a third time after the last sub-structure.
+</para></listitem>
+</orderedlist>
+
+</sect2>
+
+<sect2>
+<title>Enumerations</title>
+
+<sect3>
+<title>MSRPC Header type</title>
+<para>command number in the msrpc packet header</para>
+
+<variablelist>
+<varlistentry>
+       <term>MSRPC_Request:</term>
+       <listitem><para>0x00</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>MSRPC_Response:</term>
+       <listitem><para>0x02</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>MSRPC_Bind:</term>
+       <listitem><para>0x0B</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>MSRPC_BindAck:</term>
+       <listitem><para>0x0C</para></listitem>
+</varlistentry>
+</variablelist>
+</sect3>
+
+<sect3>
+<title>MSRPC Packet info</title>
+
+<para>The meaning of these flags is undocumented</para>
+
+<variablelist>
+<varlistentry>
+       <term>FirstFrag:</term>
+       <listitem><para>0x01 </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LastFrag:</term>
+       <listitem><para>0x02 </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NotaFrag:</term>
+       <listitem><para>0x04  </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>RecRespond:</term>
+       <listitem><para>0x08  </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NoMultiplex:</term>
+       <listitem><para>0x10  </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NotForIdemp:</term>
+       <listitem><para>0x20  </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NotforBcast:</term>
+       <listitem><para>0x40  </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NoUuid:</term>
+       <listitem><para>0x80 </para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>Structures</title>
+
+<sect3><title>VOID *</title>
+<para>sizeof VOID* is 32 bits.</para>
+</sect3>
+
+<sect3><title>char</title>
+<para>sizeof char is 8 bits.</para>
+</sect3>
+
+<sect3><title>UTIME</title>
+<para>UTIME is 32 bits, indicating time in seconds since 01jan1970.  documented in cifs6.txt (section 3.5 page, page 30).</para>
+</sect3>
+
+<sect3><title>NTTIME</title>
+<para>NTTIME is 64 bits.  documented in cifs6.txt (section 3.5 page, page 30).</para>
+</sect3>
+
+<sect3>
+<title>DOM_SID (domain SID structure)</title>
+
+<variablelist>
+
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num of sub-authorities in domain SID</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>UINT8</term>
+       <listitem><para>SID revision number</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8</term>
+       <listitem><para>num of sub-authorities in domain SID</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[6]</term>
+       <listitem><para>6 bytes for domain SID - Identifier Authority.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>UINT16[n_subauths]</term>
+       <listitem><para>domain SID sub-authorities</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<para><emphasis>Note: the domain SID is documented elsewhere.</emphasis>
+</para>
+
+</sect3>
+
+<sect3>
+<title>STR (string)</title>
+
+<para>STR (string) is a char[] : a null-terminated string of ascii characters.</para>
+
+</sect3>
+
+<sect3>
+<title>UNIHDR (unicode string header) </title>
+
+<variablelist>
+
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>length of unicode string</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>max length of unicode string</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>4 - undocumented.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>UNIHDR2 (unicode string header plus buffer pointer)</title>
+
+<variablelist>
+
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>unicode string header</para></listitem>
+</varlistentry>
+
+
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>UNISTR (unicode string)</title>
+
+<variablelist>
+
+<varlistentry>
+       <term>UINT16[]</term>
+       <listitem><para>null-terminated string of unicode characters.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>NAME (length-indicated unicode string)</title>
+
+<variablelist>
+
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>length of unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16[]</term>
+       <listitem><para>null-terminated string of unicode characters.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>UNISTR2 (aligned unicode string)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to get unicode string 4-byte aligned with the start of the SMB header.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>max length of unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>length of unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16[]</term>
+       <listitem><para>string of uncode characters</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>OBJ_ATTR (object attributes)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>0x18 - length (in bytes) including the length field.</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>0 - root directory (pointer)</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>0 - object name (pointer)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>0 - attributes (undocumented)</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>0 - security descriptior (pointer)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - security quality of service</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>POL_HND (LSA policy handle)</title>
+
+<variablelist>
+<varlistentry>
+       <term>char[20]</term>
+       <listitem><para>policy handle</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>DOM_SID2 (domain SID structure, SIDS stored in unicode)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>5 - SID type</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR2</term>
+       <listitem><para>domain SID unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>domain SID unicode string</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para><emphasis>Note:  there is a conflict between the unicode string header and the unicode string itself as to which to use to indicate string length.  this will need to be resolved.</emphasis></para>
+
+<para><emphasis>Note:  the SID type indicates, for example, an alias; a well-known group etc. this is documented somewhere.</emphasis></para>
+
+</sect3>
+
+<sect3>
+<title>DOM_RID (domain RID structure)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>5 - well-known SID.  1 - user SID (see ShowACLs)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>5 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>domain RID </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - domain index out of above reference domains</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>LOG_INFO (server, account, client structure)</title>
+
+<para><emphasis>Note:  logon server name starts with two '\' characters and is upper case.</emphasis></para>
+
+<para><emphasis>Note:  account name is the logon client name from the LSA Request Challenge, with a $ on the end of it, in upper case.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon server unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>account name unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>sec_chan - security channel type</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon client machine unicode string</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>CLNT_SRV (server, client names structure)</title>
+
+<para><emphasis>Note:  logon server name starts with two '\' characters and is upper case.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon server unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon client machine unicode string</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>CREDS (credentials + time stamp)</title>
+
+<variablelist>
+<varlistentry>
+       <term>char[8]</term>
+       <listitem><para>credentials</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UTIME</term>
+       <listitem><para>time stamp</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>CLNT_INFO2 (server, client structure, client credentials)</title>
+
+<para><emphasis>Note: whenever this structure appears in a request, you must take a copy of the client-calculated credentials received, because they will beused in subsequent credential checks.  the presumed intention is to
+       maintain an authenticated request/response trail.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>CLNT_SRV</term>
+       <listitem><para>client and server names</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>???? padding, for 4-byte alignment with SMB header.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to client credentials.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>CREDS</term>
+       <listitem><para>client-calculated credentials + client time</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>CLNT_INFO (server, account, client structure, client credentials)</title>
+<para><emphasis>Note: whenever this structure appears in a request, you must take a copy of the client-calculated credentials received, because they will be used in subsequent credential checks.  the presumed intention is to maintain an authenticated request/response trail.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>LOG_INFO</term>
+       <listitem><para>logon account info</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>CREDS</term>
+       <listitem><para>client-calculated credentials + client time</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>ID_INFO_1 (id info structure, auth level 1)</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>ptr_id_info_1</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>domain name unicode header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>param control</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT64</term>
+       <listitem><para>logon ID</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>user name unicode header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>workgroup name unicode header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[16]</term>
+       <listitem><para>arc4 LM OWF Password</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[16]</term>
+       <listitem><para>arc4 NT OWF Password</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>domain name unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>user name unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>workstation name unicode string</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>SAM_INFO (sam logon/logoff id info structure)</title>
+
+<para><emphasis>Note: presumably, the return credentials is supposedly for the server to verify that the credential chain hasn't been compromised.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>CLNT_INFO2</term>
+       <listitem><para>client identification/authentication info</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to return credentials.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>CRED</term>
+       <listitem><para>return credentials - ignored.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>logon level</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>switch value</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<para><programlisting>
+        switch (switch_value)
+        case 1:
+        {
+            ID_INFO_1     id_info_1;
+        }
+</programlisting></para>
+
+</sect3>
+
+<sect3>
+<title>GID (group id info)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>group id</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>user attributes (only used by NT 3.1 and 3.51)</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>DOM_REF (domain reference info)</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num referenced domains?</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain name buffer pointer.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>32 - max number of entries</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>4 - num referenced domains?</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR2</term>
+       <listitem><para>domain name unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR2[num_ref_doms-1]</term>
+       <listitem><para>referenced domain unicode string headers</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>domain name unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>DOM_SID[num_ref_doms]</term>
+       <listitem><para>referenced domain SIDs</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>DOM_INFO (domain info, levels 3 and 5 are the same))</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>??? padding to get 4-byte alignment with start of SMB header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>domain name string length * 2</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>domain name string length * 2</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain name string buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>undocumented domain SID string buffer pointer</para></listitem></varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+<listitem><para>domain name (unicode string)</para></listitem></varlistentry>
+<varlistentry>
+       <term>DOM_SID</term>
+       <listitem><para>domain SID</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>USER_INFO (user logon info)</title>
+
+<para><emphasis>Note: it would be nice to know what the 16 byte user session key is for.</emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>logon time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>logoff time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>kickoff time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>password last set time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>password can change time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NTTIME</term>
+       <listitem><para>password must change time</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>username unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>user's full name unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>logon script unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>profile path unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>home directory unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>home directory drive unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>logon count</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>bad password count</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>User ID</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>Group ID</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num groups</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer to groups.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>user flags</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[16]</term>
+       <listitem><para>user session key</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>logon server unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNIHDR</term>
+       <listitem><para>logon domain unicode string header</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented logon domain id pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[40]</term>
+       <listitem><para>40 undocumented padding bytes.  future expansion?</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - num_other_sids?</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>NULL - undocumented pointer to other domain SIDs.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>username unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>user's full name unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon script unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>profile path unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>home directory unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>home directory drive unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num groups</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>GID[num_groups]</term>
+       <listitem><para>group info</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon server unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon domain unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>DOM_SID</term>
+       <listitem><para>domain SID</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>DOM_SID[num_sids]</term>
+       <listitem><para>other domain SIDs?</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>SH_INFO_1_PTR (pointers to level 1 share info strings)</title>
+
+<para><emphasis>Note:  see cifsrap2.txt section5, page 10.</emphasis></para>
+
+<simplelist>
+<member>0 for shi1_type indicates a  Disk.</member>
+<member>1 for shi1_type indicates a  Print Queue.</member>
+<member>2 for shi1_type indicates a  Device.</member>
+<member>3 for shi1_type indicates an IPC pipe.</member>
+<member>0x8000 0000 (top bit set in shi1_type) indicates a hidden share.</member>
+</simplelist>
+
+<variablelist>
+
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>shi1_netname - pointer to net name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>shi1_type    - type of share.  0 - undocumented.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>shi1_remark  - pointer to comment.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>SH_INFO_1_STR (level 1 share info strings)</title>
+
+<variablelist>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>shi1_netname - unicode string of net name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>shi1_remark  - unicode string of comment.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>SHARE_INFO_1_CTR</title>
+
+<para>share container with 0 entries:</para>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - EntriesRead</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - Buffer</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>share container with > 0 entries:</para>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>EntriesRead</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>non-zero - Buffer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>EntriesRead</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SH_INFO_1_PTR[EntriesRead]</term>
+       <listitem><para>share entry pointers</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SH_INFO_1_STR[EntriesRead]</term>
+       <listitem><para>share entry strings</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to get unicode string 4-byte aligned with start of the SMB header.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>EntriesRead</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - padding</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>SERVER_INFO_101</title>
+
+<para><emphasis>Note:  see cifs6.txt section 6.4 - the fields described therein will be of assistance here.  for example, the type listed below is the         same as fServerType, which is described in 6.4.1. </emphasis></para>
+
+<variablelist>
+<varlistentry>
+       <term>SV_TYPE_WORKSTATION</term>
+       <listitem><para>0x00000001  All workstations</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_SERVER</term>
+       <listitem><para>0x00000002  All servers</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_SQLSERVER</term>
+       <listitem><para>0x00000004  Any server running with SQL server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DOMAIN_CTRL</term>
+       <listitem><para>0x00000008  Primary domain controller</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DOMAIN_BAKCTRL</term>
+       <listitem><para>0x00000010  Backup domain controller</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_TIME_SOURCE</term>
+       <listitem><para>0x00000020  Server running the timesource service</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_AFP</term>
+       <listitem><para>0x00000040  Apple File Protocol servers</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_NOVELL</term>
+       <listitem><para>0x00000080  Novell servers</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DOMAIN_MEMBER</term>
+       <listitem><para>0x00000100  Domain Member</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_PRINTQ_SERVER</term>
+       <listitem><para>0x00000200  Server sharing print queue</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DIALIN_SERVER</term>
+       <listitem><para>0x00000400  Server running dialin service.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_XENIX_SERVER</term>
+       <listitem><para>0x00000800  Xenix server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_NT</term>
+       <listitem><para>0x00001000  NT server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_WFW</term>
+       <listitem><para>0x00002000  Server running Windows for </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_SERVER_NT</term>
+       <listitem><para>0x00008000  Windows NT non DC server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_POTENTIAL_BROWSER</term>
+       <listitem><para>0x00010000  Server that can run the browser service</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_BACKUP_BROWSER</term>
+       <listitem><para>0x00020000  Backup browser server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_MASTER_BROWSER</term>
+       <listitem><para>0x00040000  Master browser server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DOMAIN_MASTER</term>
+       <listitem><para>0x00080000  Domain Master Browser server</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_LOCAL_LIST_ONLY</term>
+       <listitem><para>0x40000000  Enumerate only entries marked "local"</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SV_TYPE_DOMAIN_ENUM</term>
+       <listitem><para>0x80000000  Enumerate Domains. The pszServer and pszDomain parameters must be NULL.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>500 - platform_id</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>5 - major version</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>4 - minor version</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>type (SV_TYPE_... bit field)</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to comment</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>sv101_name - unicode string of server name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>sv_101_comment  - unicode string of server comment.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to get unicode string 4-byte aligned with start of the SMB header.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1>
+<title>MSRPC over Transact Named Pipe</title>
+
+<para>For details on the SMB Transact Named Pipe, see cifs6.txt</para>
+
+<sect2>
+<title>MSRPC Pipes</title>
+
+<para>
+The MSRPC is conducted over an SMB Transact Pipe with a name of 
+<filename>\PIPE\</filename>.  You must first obtain a 16 bit file handle, by
+sending a SMBopenX with the pipe name <filename>\PIPE\srvsvc</filename> for
+example.  You can then perform an SMB Trans,
+and must carry out an SMBclose on the file handle once you are finished.
+</para>
+
+<para>
+Trans Requests must be sent with two setup UINT16s, no UINT16 params (none
+known about), and UINT8 data parameters sufficient to contain the MSRPC
+header, and MSRPC data.  The first UINT16 setup parameter must be either
+0x0026 to indicate an RPC, or 0x0001 to indicate Set Named Pipe Handle
+state.  The second UINT16 parameter must be the file handle for the pipe,
+obtained above.
+</para>
+
+<para>
+The Data section for an API Command of 0x0026 (RPC pipe) in the Trans
+Request is the RPC Header, followed by the RPC Data.  The Data section for
+an API Command of 0x0001 (Set Named Pipe Handle state) is two bytes.  The
+only value seen for these two bytes is 0x00 0x43.
+</para>
+
+<para>
+MSRPC Responses are sent as response data inside standard SMB Trans
+responses, with the MSRPC Header, MSRPC Data and MSRPC tail.
+</para>
+
+<para>
+It is suspected that the Trans Requests will need to be at least 2-byte
+aligned (probably 4-byte).  This is standard practice for SMBs.  It is also
+independent of the observed 4-byte alignments with the start of the MSRPC
+header, including the 4-byte alignment between the MSRPC header and the
+MSRPC data.
+</para>
+
+<para>
+First, an SMBtconX connection is made to the IPC$ share.  The connection
+must be made using encrypted passwords, not clear-text.  Then, an SMBopenX
+is made on the pipe.  Then, a Set Named Pipe Handle State must be sent,
+after which the pipe is ready to accept API commands.  Lastly, and SMBclose
+is sent.
+</para>
+
+<para>
+To be resolved:
+</para>
+
+<para>
+lkcl/01nov97 there appear to be two additional bytes after the null-terminated \PIPE\ name for the RPC pipe.  Values seen so far are
+listed below:</para>
+
+<para><programlisting>
+        initial SMBopenX request:         RPC API command 0x26 params:
+        "\\PIPE\\lsarpc"                  0x65 0x63; 0x72 0x70; 0x44 0x65;
+        "\\PIPE\\srvsvc"                  0x73 0x76; 0x4E 0x00; 0x5C 0x43;
+</programlisting></para>
+
+</sect2>
+
+<sect2>
+<title>Header</title>
+
+<para>[section to be rewritten, following receipt of work by Duncan Stansfield]</para>
+
+<para>Interesting note: if you set packed data representation to 0x0100 0000
+then all 4-byte and 2-byte word ordering is turned around!</para>
+
+<para>The start of each of the NTLSA and NETLOGON named pipes begins with:</para>
+
+<segmentedlist>
+<segtitle>offset</segtitle><segtitle>Variable type</segtitle><segtitle>Variable data</segtitle>
+<seglistitem><seg>00</seg><seg>UINT8</seg><seg>5 - RPC major version</seg></seglistitem>
+<seglistitem><seg>01</seg><seg>UINT8</seg><seg>0 - RPC minor version</seg></seglistitem>
+<seglistitem><seg>02</seg><seg>UINT8</seg><seg>2 - RPC response packet</seg></seglistitem>
+<seglistitem><seg>03</seg><seg>UINT8</seg><seg>3 - (FirstFrag bit-wise or with LastFrag)</seg></seglistitem>
+<seglistitem><seg>04</seg><seg>UINT32</seg><seg>0x1000 0000 - packed data representation</seg></seglistitem>
+<seglistitem><seg>08</seg><seg>UINT16</seg><seg>fragment length - data size (bytes) inc header and tail.</seg></seglistitem>
+<seglistitem><seg>0A</seg><seg>UINT16</seg><seg>0 - authentication length </seg></seglistitem>
+<seglistitem><seg>0C</seg><seg>UINT32</seg><seg>call identifier. matches 12th UINT32 of incoming RPC data.</seg></seglistitem>
+<seglistitem><seg>10</seg><seg>UINT32</seg><seg>allocation hint - data size (bytes) minus header and tail.</seg></seglistitem>
+<seglistitem><seg>14</seg><seg>UINT16</seg><seg>0 - presentation context identifier</seg></seglistitem>
+<seglistitem><seg>16</seg><seg>UINT8</seg><seg>0 - cancel count</seg></seglistitem>
+<seglistitem><seg>17</seg><seg>UINT8</seg><seg>in replies: 0 - reserved; in requests: opnum - see #defines.</seg></seglistitem>
+<seglistitem><seg>18</seg><seg>......</seg><seg>start of data (goes on for allocation_hint bytes)</seg></seglistitem>
+</segmentedlist>
+
+<sect3>
+<title>RPC_Packet for request, response, bind and bind acknowledgement</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT8 versionmaj</term>
+<listitem><para>reply same as request (0x05)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 versionmin</term>
+<listitem><para>reply same as request (0x00)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 type</term>
+<listitem><para>one of the MSRPC_Type enums</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 flags</term>
+<listitem><para>reply same as request (0x00 for Bind, 0x03 for Request)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32 representation</term>
+<listitem><para>reply same as request (0x00000010)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 fraglength</term>
+<listitem><para>the length of the data section of the SMB trans packet</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 authlength</term>
+       <listitem><para></para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32 callid</term>
+<listitem><para>call identifier. (e.g. 0x00149594)</para></listitem></varlistentry>
+<varlistentry>
+       <term>* stub USE TvPacket</term>
+<listitem><para>the remainder of the packet depending on the "type"</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Interface identification</title>
+
+<para>the interfaces are numbered. as yet I haven't seen more than one interface used on the same pipe name srvsvc</para>
+
+<para><programlisting>
+abstract (0x4B324FC8, 0x01D31670, 0x475A7812, 0x88E16EBF, 0x00000003)
+transfer (0x8A885D04, 0x11C91CEB, 0x0008E89F, 0x6048102B, 0x00000002)
+</programlisting></para>
+
+</sect3>
+
+<sect3>
+<title>RPC_Iface RW</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT8 byte[16]</term>
+<listitem><para>16 bytes of number</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32 version</term>
+<listitem><para>the interface number</para></listitem></varlistentry>
+</variablelist>
+
+
+</sect3>
+
+<sect3>
+<title>RPC_ReqBind RW</title>
+
+<para>the remainder of the packet after the header if "type" was Bind in the response header, "type" should be BindAck</para>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16 maxtsize</term>
+<listitem><para>maximum transmission fragment size (0x1630)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 maxrsize</term>
+<listitem><para>max receive fragment size (0x1630)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32 assocgid</term>
+<listitem><para>associated group id (0x0)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32 numelements</term>
+<listitem><para>the number of elements (0x1)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 contextid</term>
+<listitem><para>presentation context identifier (0x0)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 numsyntaxes</term>
+<listitem><para>the number of syntaxes (has always been 1?)(0x1)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+<listitem><para>4-byte alignment padding, against SMB header</para></listitem></varlistentry>
+<varlistentry>
+       <term>* abstractint USE RPC_Iface</term>
+<listitem><para>num and vers. of interface client is using</para></listitem></varlistentry>
+<varlistentry>
+       <term>* transferint USE RPC_Iface</term>
+       <listitem><para>num and vers. of interface to use for replies</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>RPC_Address RW</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16 length</term>
+<listitem><para>length of the string including null terminator</para></listitem></varlistentry>
+<varlistentry>
+       <term>* port USE string</term>
+<listitem><para>the string above in single byte, null terminated form</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>RPC_ResBind RW</title>
+
+<para>the response to place after the header in the reply packet</para>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16 maxtsize</term>
+<listitem><para>same as request</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 maxrsize</term>
+<listitem><para>same as request</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32 assocgid</term>
+<listitem><para>zero</para></listitem></varlistentry>
+<varlistentry>
+       <term>* secondaddr USE RPC_Address</term>
+<listitem><para>the address string, as described earlier</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+<listitem><para>4-byte alignment padding, against SMB header</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 numresults</term>
+<listitem><para>the number of results (0x01)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+<listitem><para>4-byte alignment padding, against SMB header</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 result</term>
+<listitem><para>result (0x00 = accept)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 reason</term>
+<listitem><para>reason (0x00 = no reason specified)</para></listitem></varlistentry>
+<varlistentry>
+       <term>* transfersyntax USE RPC_Iface</term>
+<listitem><para>the transfer syntax from the request</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>RPC_ReqNorm RW</title>
+
+<para>the remainder of the packet after the header for every other other request</para>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32 allochint</term>
+<listitem><para>the size of the stub data in bytes</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 prescontext</term>
+<listitem><para>presentation context identifier (0x0)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 opnum</term>
+<listitem><para>operation number (0x15)</para></listitem></varlistentry>
+<varlistentry>
+       <term>* stub USE TvPacket</term>
+<listitem><para>a packet dependent on the pipe name (probably the interface) and the op number)</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>RPC_ResNorm RW</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32 allochint</term>
+<listitem><para># size of the stub data in bytes</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16 prescontext</term>
+<listitem><para># presentation context identifier (same as request)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 cancelcount</term>
+<listitem><para># cancel count? (0x0)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8 reserved</term>
+<listitem><para># 0 - one byte padding</para></listitem></varlistentry>
+<varlistentry>
+       <term>* stub USE TvPacket</term>
+<listitem><para># the remainder of the reply</para></listitem></varlistentry>
+</variablelist>
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>Tail</title>
+
+<para>The end of each of the NTLSA and NETLOGON named pipes ends with:</para>
+
+<variablelist>
+<varlistentry>
+       <term>......</term>
+       <listitem><para>end of data</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>return code</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>RPC Bind / Bind Ack</title>
+
+<para>
+RPC Binds are the process of associating an RPC pipe (e.g \PIPE\lsarpc)
+with a "transfer syntax" (see RPC_Iface structure).  The purpose for doing
+this is unknown.
+</para>
+
+<para><emphasis>Note: The RPC_ResBind SMB Transact request is sent with two uint16 setup parameters.  The first is 0x0026; the second is the file handle
+       returned by the SMBopenX Transact response.</emphasis></para>
+
+<para><emphasis>Note:  The RPC_ResBind members maxtsize, maxrsize and assocgid are the same in the response as the same members in the RPC_ReqBind.  The
+       RPC_ResBind member transfersyntax is the same in the response as
+       the</emphasis></para>
+
+<para><emphasis>Note:  The RPC_ResBind response member secondaddr contains the name of what is presumed to be the service behind the RPC pipe.  The
+       mapping identified so far is:</emphasis></para>
+
+<variablelist>
+
+<varlistentry>
+       <term>initial SMBopenX request:</term>
+       <listitem><para>RPC_ResBind response:</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>"\\PIPE\\srvsvc"</term>
+       <listitem><para>"\\PIPE\\ntsvcs"</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>"\\PIPE\\samr"</term>
+       <listitem><para>"\\PIPE\\lsass"</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>"\\PIPE\\lsarpc"</term>
+       <listitem><para>"\\PIPE\\lsass"</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>"\\PIPE\\wkssvc"</term>
+       <listitem><para>"\\PIPE\\wksvcs"</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>"\\PIPE\\NETLOGON"</term>
+       <listitem><para>"\\PIPE\\NETLOGON"</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para><emphasis>Note:  The RPC_Packet fraglength member in both the Bind Request and Bind Acknowledgment must contain the length of the entire RPC data, including the RPC_Packet header.</emphasis></para>
+
+<para>Request:</para>
+
+<simplelist>
+<member>RPC_Packet</member>
+<member>RPC_ReqBind</member>
+</simplelist>
+
+<para>Response:</para>
+<simplelist>
+<member>RPC_Packet</member>
+<member>RPC_ResBind</member>
+</simplelist>
+
+</sect2>
+
+<sect2>
+<title>NTLSA Transact Named Pipe</title>
+
+<para>The sequence of actions taken on this pipe are:</para>
+
+<simplelist>
+<member>Establish a connection to the IPC$ share (SMBtconX).  use encrypted passwords.</member>
+<member>Open an RPC Pipe with the name "\\PIPE\\lsarpc".  Store the file handle.</member>
+<member>Using the file handle, send a Set Named Pipe Handle state to 0x4300.</member>
+<member>Send an LSA Open Policy request.  Store the Policy Handle.</member>
+<member>Using the Policy Handle, send LSA Query Info Policy requests, etc.</member>
+<member>Using the Policy Handle, send an LSA Close.</member>
+<member>Close the IPC$ share.</member>
+</simplelist>
+
+<para>Defines for this pipe, identifying the query are:</para>
+<variablelist>
+<varlistentry>
+       <term>LSA Open Policy:</term>
+       <listitem><para>0x2c</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Query Info Policy:</term>
+       <listitem><para>0x07</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Enumerate Trusted Domains:</term>
+       <listitem><para>0x0d</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Open Secret:</term>
+       <listitem><para>0xff</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Lookup SIDs:</term>
+       <listitem><para>0xfe</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Lookup Names:</term>
+       <listitem><para>0xfd</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Close:</term>
+       <listitem><para>0x00</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>LSA Open Policy</title>
+
+<para><emphasis>Note:  The policy handle can be anything you like.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>server name - unicode string starting with two '\'s</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>OBJ_ATTR</term>
+       <listitem><para>object attributes</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>1 - desired access</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+
+<varlistentry>
+       <term>POL_HND</term>
+       <listitem><para>LSA policy handle</para></listitem>
+</varlistentry>
+
+<varlistentry>
+       <term>return</term>
+       <listitem><para>0 - indicates success</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Query Info Policy</title>
+
+<para><emphasis>Note:  The info class in response must be the same as that in the request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>POL_HND</term>
+<listitem><para>LSA policy handle</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+<listitem><para>info class (also a policy handle?)</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>info class (same as info class in request).</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<para><programlisting>
+switch (info class)
+case 3:
+case 5:
+{
+DOM_INFO domain info, levels 3 and 5 (are the same).
+}
+
+return    0 - indicates success
+</programlisting></para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Enumerate Trusted Domains</title>
+
+<sect3>
+<title>Request</title>
+
+<para>no extra data</para>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - enumeration context</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - entries read</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - trust information</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>return</term>
+       <listitem><para>0x8000 001a - "no trusted domains" success code</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>LSA Open Secret</title>
+
+<sect3>
+<title>Request</title>
+
+<para>no extra data</para>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>0 - undocumented</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>return    0x0C00 0034 - "no such secret" success code</para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Close</title>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>POL_HND</term>
+       <listitem><para>policy handle to be closed</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>POL_HND</term>
+<listitem><para>0s - closed policy handle (all zeros)</para></listitem></varlistentry>
+</variablelist>
+
+<para>return    0 - indicates success</para>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>LSA Lookup SIDS</title>
+
+<para><emphasis>Note:  num_entries in response must be same as num_entries in request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>POL_HND</term>
+       <listitem><para>LSA policy handle</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num_entries</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain SID buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain name buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*[num_entries] undocumented domain SID pointers to be looked up.
+</term>
+<listitem><para>DOM_SID[num_entries] domain SIDs to be looked up.</para></listitem></varlistentry>
+<varlistentry>
+       <term>char[16]</term>
+       <listitem><para>completely undocumented 16 bytes.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>DOM_REF</term>
+<listitem><para>domain reference response</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>undocumented buffer pointer</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+<varlistentry>
+       <term>DOM_SID2[num_entries]</term>
+<listitem><para>domain SIDs (from Request, listed above).</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+</variablelist>
+
+<para>return                0 - indicates success</para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Lookup Names</title>
+
+<para><emphasis>Note:  num_entries in response must be same as num_entries in request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>POL_HND</term>
+       <listitem><para>LSA policy handle</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num_entries</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>num_entries</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain SID buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented domain name buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>NAME[num_entries]</term>
+       <listitem><para>names to be looked up.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[]</term>
+       <listitem><para>undocumented bytes - falsely translated SID structure?</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>DOM_REF</term>
+<listitem><para>domain reference response</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>undocumented buffer pointer</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+<varlistentry>
+       <term>DOM_RID[num_entries]</term>
+<listitem><para>domain SIDs (from Request, listed above).</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>num_entries (listed above)</para></listitem></varlistentry>
+</variablelist>
+
+<para>return                0 - indicates success</para>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1>
+<title>NETLOGON rpc Transact Named Pipe</title>
+
+<para>The sequence of actions taken on this pipe are:</para>
+
+<simplelist>
+<member>tablish a connection to the IPC$ share (SMBtconX).  use encrypted passwords.</member>
+<member>en an RPC Pipe with the name "\\PIPE\\NETLOGON".  Store the file handle.</member>
+<member>ing the file handle, send a Set Named Pipe Handle state to 0x4300.</member>
+<member>eate Client Challenge. Send LSA Request Challenge.  Store Server Challenge.</member>
+<member>lculate Session Key.  Send an LSA Auth 2 Challenge.  Store Auth2 Challenge.</member>
+<member>lc/Verify Client Creds.  Send LSA Srv PW Set.  Calc/Verify Server Creds.</member>
+<member>lc/Verify Client Creds.  Send LSA SAM Logon .  Calc/Verify Server Creds.</member>
+<member>lc/Verify Client Creds.  Send LSA SAM Logoff.  Calc/Verify Server Creds.</member>
+<member>ose the IPC$ share.</member>
+</simplelist>
+
+<para>Defines for this pipe, identifying the query are</para>
+
+<variablelist>
+<varlistentry>
+       <term>LSA Request Challenge:</term>
+       <listitem><para>0x04</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Server Password Set:</term>
+       <listitem><para>0x06</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA SAM Logon:</term>
+       <listitem><para>0x02</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA SAM Logoff:</term>
+       <listitem><para>0x03</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Auth 2:</term>
+       <listitem><para>0x0f</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>LSA Logon Control:</term>
+       <listitem><para>0x0e</para></listitem>
+</varlistentry>
+</variablelist>
+
+<sect2>
+<title>LSA Request Challenge</title>
+
+<para><emphasis>Note:  logon server name starts with two '\' characters and is upper case.</emphasis></para>
+
+<para><emphasis>Note:  logon client is the machine, not the user.</emphasis></para>
+
+<para><emphasis>Note:  the initial LanManager password hash, against which the challenge is issued, is the machine name itself (lower case).  there will becalls issued (LSA Server Password Set) which will change this, later. refusing these calls allows you to always deal with the same password (i.e the LM# of the machine name in lower case).</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon server unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>logon client unicode string</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[8]</term>
+       <listitem><para>client challenge</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>char[8]</term>
+       <listitem><para>server challenge</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>return    0 - indicates success</para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Authenticate 2</title>
+
+<para><emphasis>Note:  in between request and response, calculate the client credentials, and check them against the client-calculated credentials (this process uses the previously received client credentials).</emphasis></para>
+
+<para><emphasis>Note:  neg_flags in the response is the same as that in the request.</emphasis></para>
+
+<para><emphasis>Note:  you must take a copy of the client-calculated credentials received      here, because they will be used in subsequent authentication packets.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>LOG_INFO</term>
+       <listitem><para>client identification info</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[8]</term>
+       <listitem><para>client-calculated credentials</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+<listitem><para>padding to 4-byte align with start of SMB header.</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>neg_flags - negotiated flags (usual value is 0x0000 01ff)</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>char[8]</term>
+       <listitem><para>server credentials.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>neg_flags - same as neg_flags in request.</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>return    0 - indicates success.  failure value unknown.</para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA Server Password Set</title>
+
+<para><emphasis>Note: the new password is suspected to be a DES encryption using the old password to generate the key.</emphasis></para>
+
+<para><emphasis>Note: in between request and response, calculate the client credentials, and check them against the client-calculated credentials (this process uses the previously received client credentials).</emphasis></para>
+
+<para><emphasis>Note: the server credentials are constructed from the client-calculated credentials and the client time + 1 second.</emphasis></para>
+
+<para><emphasis>Note: you must take a copy of the client-calculated credentials received here, because they will be used in subsequent authentication packets.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>CLNT_INFO</term>
+       <listitem><para>client identification/authentication info</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[]</term>
+       <listitem><para>new password - undocumented.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>CREDS</term>
+       <listitem><para>server credentials.  server time stamp appears to be ignored.</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>return    0 - indicates success; 0xC000 006a indicates failure</para>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>LSA SAM Logon</title>
+
+<para><emphasis>
+Note:  valid_user is True iff the username and password hash are valid for
+       the requested domain.
+</emphasis></para>
+
+<sect3>
+<title>Request</title>
+<variablelist>
+<varlistentry>
+       <term>SAM_INFO</term>
+       <listitem><para>sam_id structure</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>CREDS</term>
+       <listitem><para>server credentials.  server time stamp appears to be ignored.</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para><programlisting>
+if (valid_user)
+{
+       UINT16      3 - switch value indicating USER_INFO structure.
+    VOID*     non-zero - pointer to USER_INFO structure
+    USER_INFO user logon information
+
+    UINT32    1 - Authoritative response; 0 - Non-Auth?
+
+    return    0 - indicates success
+}
+else
+{
+       UINT16    0 - switch value.  value to indicate no user presumed.
+    VOID*     0x0000 0000 - indicates no USER_INFO structure.
+
+    UINT32    1 - Authoritative response; 0 - Non-Auth?
+
+    return    0xC000 0064 - NT_STATUS_NO_SUCH_USER.
+}
+</programlisting></para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>LSA SAM Logoff</title>
+
+<para><emphasis>
+Note:  presumably, the SAM_INFO structure is validated, and a (currently
+       undocumented) error code returned if the Logoff is invalid.
+</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>SAM_INFO</term>
+       <listitem><para>sam_id structure</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>undocumented buffer pointer</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>CREDS</term>
+       <listitem><para>server credentials.  server time stamp appears to be ignored.</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>return      0 - indicates success.  undocumented failure indication.</para>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1>
+<title>\\MAILSLOT\NET\NTLOGON</title>
+
+<para><emphasis>
+Note:  mailslots will contain a response mailslot, to which the response
+       should be sent.  the target NetBIOS name is REQUEST_NAME&lt;20&gt;, where
+       REQUEST_NAME is the name of the machine that sent the request.
+</emphasis></para>
+
+<sect2>
+<title>Query for PDC</title>
+
+<para><emphasis>Note:  NTversion, LMNTtoken, LM20token in response are the same as those       given in the request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>0x0007 - Query for PDC</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>STR</term>
+       <listitem><para>machine name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>STR</term>
+       <listitem><para>response mailslot</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to 2-byte align with start of mailslot.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>machine name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>NTversion</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LMNTtoken</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LM20token</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16</term>
+<listitem><para>0x000A - Respose to Query for PDC</para></listitem></varlistentry>
+<varlistentry>
+       <term>STR</term>
+<listitem><para>machine name (in uppercase)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to 2-byte align with start of mailslot.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>machine name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+<listitem><para>domain name</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>NTversion (same as received in request)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+<listitem><para>LMNTtoken (same as received in request)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+<listitem><para>LM20token (same as received in request)</para></listitem></varlistentry>
+</variablelist>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>SAM Logon</title>
+
+<para><emphasis>Note: machine name in response is preceded by two '\' characters.</emphasis></para>
+
+<para><emphasis>Note:  NTversion, LMNTtoken, LM20token in response are the same as those given in the request.</emphasis></para>
+
+<para><emphasis>Note:  user name in the response is presumably the same as that in the request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>0x0012 - SAM Logon</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>request count</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>machine name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>user name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>STR</term>
+       <listitem><para>response mailslot</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>alloweable account</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>domain SID size</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>char[sid_size]</term>
+       <listitem><para>domain SID, of sid_size bytes.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>???? padding to 4? 2? -byte align with start of mailslot.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>NTversion</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LMNTtoken</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LM20token</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>0x0013 - Response to SAM Logon</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>machine name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>user name - workstation trust account</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UNISTR</term>
+       <listitem><para>domain name </para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>NTversion</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LMNTtoken</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT16</term>
+       <listitem><para>LM20token</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1>
+<title>SRVSVC Transact Named Pipe</title>
+
+<para>Defines for this pipe, identifying the query are:</para>
+
+<variablelist>
+<varlistentry>
+       <term>Net Share Enum</term>
+       <listitem><para>0x0f</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Net Server Get Info</term>
+       <listitem><para>0x15</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<sect2>
+<title>Net Share Enum</title>
+
+<para><emphasis>Note:  share level and switch value in the response are presumably the same as those in the request.</emphasis></para>
+
+<para><emphasis>Note:  cifsrap2.txt (section 5) may be of limited assistance here.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>pointer (to server name?)</para></listitem></varlistentry>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>server name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT8[]</term>
+       <listitem><para>padding to get unicode string 4-byte aligned with the start of the SMB header.</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>share level</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>switch value</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to SHARE_INFO_1_CTR</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SHARE_INFO_1_CTR</term>
+       <listitem><para>share info with 0 entries</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+<listitem><para>preferred maximum length (0xffff ffff)</para></listitem></varlistentry>
+</variablelist>
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>share level</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>switch value</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+<listitem><para>pointer to SHARE_INFO_1_CTR</para></listitem></varlistentry>
+<varlistentry>
+       <term>SHARE_INFO_1_CTR</term>
+<listitem><para>share info (only added if share info ptr is non-zero)</para></listitem></varlistentry>
+</variablelist>
+
+<para>return            0 - indicates success</para>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>Net Server Get Info</title>
+
+<para><emphasis>Note:  level is the same value as in the request.</emphasis></para>
+
+<sect3>
+<title>Request</title>
+
+<variablelist>
+<varlistentry>
+       <term>UNISTR2</term>
+       <listitem><para>server name</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>switch level</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>Response</title>
+
+<variablelist>
+<varlistentry>
+       <term>UINT32</term>
+       <listitem><para>switch level</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>VOID*</term>
+       <listitem><para>pointer to SERVER_INFO_101</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>SERVER_INFO_101</term>
+<listitem><para>server info (only added if server info ptr is non-zero)</para></listitem></varlistentry>
+</variablelist>
+
+<para>return            0 - indicates success</para>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1>
+<title>Cryptographic side of NT Domain Authentication</title>
+
+<sect2>
+<title>Definitions</title>
+
+<variablelist>
+<varlistentry>
+<term>Add(A1,A2)</term>
+<listitem><para>Intel byte ordered addition of corresponding 4 byte words in arrays A1 and A2</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>E(K,D)</term>
+<listitem><para>DES ECB encryption of 8 byte data D using 7 byte key K</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>lmowf()</term>
+<listitem><para>Lan man hash</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>ntowf()</term>
+<listitem><para>NT hash</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>PW</term>
+<listitem><para>md4(machine_password) == md4(lsadump $machine.acc) ==
+pwdump(machine$) (initially) == md4(lmowf(unicode(machine)))
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>ARC4(K,Lk,D,Ld)</term>
+<listitem><para>ARC4 encryption of data D of length Ld with key K of length Lk</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>v[m..n(,l)]</term>
+<listitem><para>subset of v from bytes m to n, optionally padded with zeroes to length l</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>Cred(K,D)</term>
+<listitem><para>E(K[7..7,7],E(K[0..6],D)) computes a credential</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>Time()</term>
+<listitem><para>4 byte current time</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>Cc,Cs</term>
+<listitem><para>8 byte client and server challenges Rc,Rs: 8 byte client and server credentials</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>Protocol</title>
+
+<programlisting>
+C-&gt;S ReqChal,Cc
+S-&gt;C Cs
+</programlisting>
+
+<programlisting>
+C &amp; S compute session key Ks = E(PW[9..15],E(PW[0..6],Add(Cc,Cs)))
+</programlisting>
+
+<programlisting>
+C: Rc = Cred(Ks,Cc)
+C-&gt;S Authenticate,Rc
+S: Rs = Cred(Ks,Cs), assert(Rc == Cred(Ks,Cc))
+S-&gt;C Rs
+C: assert(Rs == Cred(Ks,Cs))
+</programlisting>
+
+<para>
+On joining the domain the client will optionally attempt to change its
+password and the domain controller may refuse to update it depending
+on registry settings. This will also occur weekly afterwards.
+</para>
+
+<programlisting>
+C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc)
+C-&gt;S ServerPasswordSet,Rc',Tc,arc4(Ks[0..7,16],lmowf(randompassword())
+C: Rc = Cred(Ks,Rc+Tc+1)
+S: assert(Rc' == Cred(Ks,Rc+Tc)), Ts = Time()
+S: Rs' = Cred(Ks,Rs+Tc+1)
+S-&gt;C Rs',Ts
+C: assert(Rs' == Cred(Ks,Rs+Tc+1))
+S: Rs = Rs'
+</programlisting>
+
+<para>
+User: U with password P wishes to login to the domain (incidental data
+such as workstation and domain omitted)
+</para>
+
+<programlisting>
+C: Tc = Time(), Rc' = Cred(Ks,Rc+Tc)
+C-&gt;S NetLogonSamLogon,Rc',Tc,U,arc4(Ks[0..7,16],16,ntowf(P),16), arc4(Ks[0..7,16],16,lmowf(P),16)
+S: assert(Rc' == Cred(Ks,Rc+Tc)) assert(passwords match those in SAM)
+S: Ts = Time()
+</programlisting>
+
+<programlisting>
+S-&gt;C Cred(Ks,Cred(Ks,Rc+Tc+1)),userinfo(logon script,UID,SIDs,etc)
+C: assert(Rs == Cred(Ks,Cred(Rc+Tc+1))
+C: Rc = Cred(Ks,Rc+Tc+1)
+</programlisting>
+
+</sect2>
+
+<sect2>
+<title>Comments</title>
+
+<para>
+On first joining the domain the session key could be computed by
+anyone listening in on the network as the machine password has a well
+known value. Until the machine is rebooted it will use this session
+key to encrypt NT and LM one way functions of passwords which are
+password equivalents. Any user who logs in before the machine has been
+rebooted a second time will have their password equivalent exposed. Of
+course the new machine password is exposed at this time anyway.
+</para>
+
+<para>
+None of the returned user info such as logon script, profile path and
+SIDs *appear* to be protected by anything other than the TCP checksum.
+</para>
+
+<para>
+The server time stamps appear to be ignored.
+</para>
+
+<para>
+The client sends a ReturnAuthenticator in the SamLogon request which I
+can't find a use for.  However its time is used as the timestamp
+returned by the server.
+</para>
+
+<para>
+The password OWFs should NOT be sent over the network reversibly
+encrypted. They should be sent using ARC4(Ks,md4(owf)) with the server
+computing the same function using the owf values in the SAM.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>SIDs and RIDs</title>
+
+<para>
+SIDs and RIDs are well documented elsewhere.
+</para>
+
+<para>
+A SID is an NT Security ID (see DOM_SID structure).  They are of the form:
+</para>
+
+<simplelist>
+<member>revision-NN-SubAuth1-SubAuth2-SubAuth3... </member>
+<member>revision-0xNNNNNNNNNNNN-SubAuth1-SubAuth2-SubAuth3...</member>
+</simplelist>
+
+<para>
+currently, the SID revision is 1.
+The Sub-Authorities are known as Relative IDs (RIDs).
+</para>
+
+<sect2>
+<title>Well-known SIDs</title>
+
+<sect3>
+<title>Universal well-known SIDs</title>
+
+<variablelist>
+<varlistentry>
+       <term>Null SID</term>
+       <listitem><para>S-1-0-0</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>World</term>
+       <listitem><para>S-1-1-0</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Local</term>
+       <listitem><para>S-1-2-0</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Creator Owner ID</term>
+       <listitem><para>S-1-3-0</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Creator Group ID</term>
+       <listitem><para>S-1-3-1</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Creator Owner Server ID</term>
+       <listitem><para>S-1-3-2</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Creator Group Server ID</term>
+       <listitem><para>S-1-3-3</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>(Non-unique IDs)</term>
+       <listitem><para>S-1-4</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+
+<sect3>
+<title>NT well-known SIDs</title>
+
+<variablelist>
+<varlistentry>
+       <term>NT Authority</term>
+       <listitem><para>S-1-5</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Dialup</term>
+       <listitem><para>S-1-5-1</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Network</term>
+       <listitem><para>S-1-5-2</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Batch</term>
+       <listitem><para>S-1-5-3</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Interactive</term>
+       <listitem><para>S-1-5-4</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Service</term>
+<listitem><para>S-1-5-6</para></listitem></varlistentry>
+<varlistentry>
+       <term>AnonymousLogon(aka null logon session)</term>
+       <listitem><para>S-1-5-7</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>Proxy</term>
+<listitem><para>S-1-5-8</para></listitem></varlistentry>
+<varlistentry>
+       <term>ServerLogon(aka domain controller account)</term>
+       <listitem><para>S-1-5-8</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>(Logon IDs)</term>
+       <listitem><para>S-1-5-5-X-Y</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>(NT non-unique IDs)</term>
+       <listitem><para>S-1-5-0x15-...</para></listitem>
+</varlistentry>
+<varlistentry>
+       <term>(Built-in domain)</term>
+       <listitem><para>s-1-5-0x20</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect3>
+</sect2>
+
+<sect2>
+<title>Well-known RIDS</title>
+
+<para>
+A RID is a sub-authority value, as part of either a SID, or in the case
+of Group RIDs, part of the DOM_GID structure, in the USER_INFO_1
+structure, in the LSA SAM Logon response.
+</para>
+
+<sect3>
+<title>Well-known RID users</title>
+
+<segmentedlist>
+<segtitle>Groupname</segtitle>
+<segtitle>????</segtitle>
+<segtitle>RID</segtitle>
+<seglistitem><seg>DOMAIN_USER_RID_ADMIN</seg><seg>0x0000</seg><seg>01F4</seg></seglistitem>
+<seglistitem><seg>DOMAIN_USER_RID_GUEST</seg><seg>0x0000</seg><seg>01F5</seg></seglistitem>
+</segmentedlist>
+
+</sect3>
+
+<sect3>
+<title>Well-known RID groups</title>
+
+<segmentedlist>
+<segtitle>Groupname</segtitle>
+<segtitle>????</segtitle>
+<segtitle>RID</segtitle>
+<seglistitem><seg>     DOMAIN_GROUP_RID_ADMINS</seg><seg>0x0000</seg><seg>0200</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_GROUP_RID_USERS</seg><seg>0x0000</seg><seg>0201</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_GROUP_RID_GUESTS</seg><seg>0x0000</seg><seg>0202</seg></seglistitem>
+</segmentedlist>
+
+</sect3>
+
+<sect3>
+<title>Well-known RID aliases</title>
+
+<segmentedlist>
+<segtitle>Groupname</segtitle>
+<segtitle>????</segtitle>
+<segtitle>RID</segtitle>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_ADMINS</seg><seg>0x0000</seg><seg>0220</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_USERS</seg><seg>0x0000</seg><seg>0221</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_GUESTS</seg><seg>0x0000</seg><seg>0222</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_POWER_USERS</seg><seg>0x0000</seg><seg>0223</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_ACCOUNT_OPS</seg><seg>0x0000</seg><seg>0224</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_SYSTEM_OPS</seg><seg>0x0000</seg><seg>0225</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_PRINT_OPS</seg><seg>0x0000</seg><seg>0226</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_BACKUP_OPS</seg><seg>0x0000</seg><seg>0227</seg></seglistitem>
+<seglistitem><seg>     DOMAIN_ALIAS_RID_REPLICATOR</seg><seg>0x0000</seg><seg>0228</seg></seglistitem>
+</segmentedlist>
+
+</sect3>
+</sect2>
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/debug.xml b/docs/docbook/devdoc/debug.xml
new file mode 100644 (file)
index 0000000..7e81cc8
--- /dev/null
@@ -0,0 +1,321 @@
+<chapter id="debug">
+<chapterinfo>
+       <author>
+               <firstname>Chris</firstname><surname>Hertel</surname>
+       </author>
+       <pubdate>July 1998</pubdate>
+</chapterinfo>
+
+<title>The samba DEBUG system</title>
+
+<sect1>
+<title>New Output Syntax</title>
+
+<para>
+   The syntax of a debugging log file is represented as:
+</para>
+
+<para><programlisting>
+  &gt;debugfile&lt; :== { &gt;debugmsg&lt; }
+
+  &gt;debugmsg&lt;  :== &gt;debughdr&lt; '\n' &gt;debugtext&lt;
+
+  &gt;debughdr&lt;  :== '[' TIME ',' LEVEL ']' FILE ':' [FUNCTION] '(' LINE ')'
+
+  &gt;debugtext&lt; :== { &gt;debugline&lt; }
+
+  &gt;debugline&lt; :== TEXT '\n'
+</programlisting></para>
+
+<para>
+TEXT is a string of characters excluding the newline character.
+</para>
+
+<para>
+LEVEL is the DEBUG level of the message (an integer in the range
+               0..10).
+</para>
+
+<para>
+TIME is a timestamp.
+</para>
+
+<para>
+FILE is the name of the file from which the debug message was
+generated.
+</para>
+
+<para>
+FUNCTION is the function from which the debug message was generated.
+</para>
+
+<para>
+LINE is the line number of the debug statement that generated the
+message.
+</para>
+
+<para>Basically, what that all means is:</para>
+<orderedlist>
+<listitem><para>
+A debugging log file is made up of debug messages.
+</para></listitem>
+<listitem><para>
+Each debug message is made up of a header and text. The header is
+separated from the text by a newline.
+</para></listitem>
+<listitem><para>
+The header begins with the timestamp and debug level of the
+message enclosed in brackets. The filename, function, and line
+number at which the message was generated follow. The filename is
+terminated by a colon, and the function name is terminated by the
+parenthesis which contain the line number. Depending upon the
+compiler, the function name may be missing (it is generated by the
+__FUNCTION__ macro, which is not universally implemented, dangit).
+</para></listitem>
+<listitem><para>
+The message text is made up of zero or more lines, each terminated
+by a newline.
+</para></listitem>
+</orderedlist>
+
+<para>Here's some example output:</para>
+
+<para><programlisting>
+    [1998/08/03 12:55:25, 1] nmbd.c:(659)
+      Netbios nameserver version 1.9.19-prealpha started.
+      Copyright Andrew Tridgell 1994-1997
+    [1998/08/03 12:55:25, 3] loadparm.c:(763)
+      Initializing global parameters
+</programlisting></para>
+
+<para>
+Note that in the above example the function names are not listed on
+the header line. That's because the example above was generated on an
+SGI Indy, and the SGI compiler doesn't support the __FUNCTION__ macro.
+</para>
+
+</sect1>
+
+<sect1>
+<title>The DEBUG() Macro</title>
+
+<para>
+Use of the DEBUG() macro is unchanged. DEBUG() takes two parameters.
+The first is the message level, the second is the body of a function
+call to the Debug1() function.
+</para>
+
+<para>That's confusing.</para>
+
+<para>Here's an example which may help a bit. If you would write</para>
+
+<para><programlisting>
+printf( "This is a %s message.\n", "debug" );
+</programlisting></para>
+
+<para>
+to send the output to stdout, then you would write
+</para>
+
+<para><programlisting>
+DEBUG( 0, ( "This is a %s message.\n", "debug" ) );
+</programlisting></para>
+
+<para>
+to send the output to the debug file.  All of the normal printf()
+formatting escapes work.
+</para>
+
+<para>
+Note that in the above example the DEBUG message level is set to 0.
+Messages at level 0 always print.  Basically, if the message level is
+less than or equal to the global value DEBUGLEVEL, then the DEBUG
+statement is processed.
+</para>
+
+<para>
+The output of the above example would be something like:
+</para>
+
+<para><programlisting>
+    [1998/07/30 16:00:51, 0] file.c:function(128)
+      This is a debug message.
+</programlisting></para>
+
+<para>
+Each call to DEBUG() creates a new header *unless* the output produced
+by the previous call to DEBUG() did not end with a '\n'. Output to the
+debug file is passed through a formatting buffer which is flushed
+every time a newline is encountered. If the buffer is not empty when
+DEBUG() is called, the new input is simply appended.
+</para>
+
+<para>
+...but that's really just a Kludge. It was put in place because
+DEBUG() has been used to write partial lines. Here's a simple (dumb)
+example of the kind of thing I'm talking about:
+</para>
+
+<para><programlisting>
+    DEBUG( 0, ("The test returned " ) );
+    if( test() )
+      DEBUG(0, ("True") );
+    else
+      DEBUG(0, ("False") );
+    DEBUG(0, (".\n") );
+</programlisting></para>
+
+<para>
+Without the format buffer, the output (assuming test() returned true)
+would look like this:
+</para>
+
+<para><programlisting>
+    [1998/07/30 16:00:51, 0] file.c:function(256)
+      The test returned
+    [1998/07/30 16:00:51, 0] file.c:function(258)
+      True
+    [1998/07/30 16:00:51, 0] file.c:function(261)
+      .
+</programlisting></para>
+
+<para>Which isn't much use. The format buffer kludge fixes this problem.
+</para>
+
+</sect1>
+
+<sect1>
+<title>The DEBUGADD() Macro</title>
+
+<para>
+In addition to the kludgey solution to the broken line problem
+described above, there is a clean solution. The DEBUGADD() macro never
+generates a header. It will append new text to the current debug
+message even if the format buffer is empty. The syntax of the
+DEBUGADD() macro is the same as that of the DEBUG() macro.
+</para>
+
+<para><programlisting>
+    DEBUG( 0, ("This is the first line.\n" ) );
+    DEBUGADD( 0, ("This is the second line.\nThis is the third line.\n" ) );
+</programlisting></para>
+
+<para>Produces</para>
+
+<para><programlisting>
+    [1998/07/30 16:00:51, 0] file.c:function(512)
+      This is the first line.
+      This is the second line.
+      This is the third line.
+</programlisting></para>
+
+</sect1>
+
+<sect1>
+<title>The DEBUGLVL() Macro</title>
+
+<para>
+One of the problems with the DEBUG() macro was that DEBUG() lines
+tended to get a bit long. Consider this example from
+nmbd_sendannounce.c:
+</para>
+
+<para><programlisting>
+  DEBUG(3,("send_local_master_announcement: type %x for name %s on subnet %s for workgroup %s\n",
+            type, global_myname, subrec->subnet_name, work->work_group));
+</programlisting></para>
+
+<para>
+One solution to this is to break it down using DEBUG() and DEBUGADD(),
+as follows:
+</para>
+
+<para><programlisting>
+  DEBUG( 3, ( "send_local_master_announcement: " ) );
+  DEBUGADD( 3, ( "type %x for name %s ", type, global_myname ) );
+  DEBUGADD( 3, ( "on subnet %s ", subrec->subnet_name ) );
+  DEBUGADD( 3, ( "for workgroup %s\n", work->work_group ) );
+</programlisting></para>
+
+<para>
+A similar, but arguably nicer approach is to use the DEBUGLVL() macro.
+This macro returns True if the message level is less than or equal to
+the global DEBUGLEVEL value, so:
+</para>
+
+<para><programlisting>
+  if( DEBUGLVL( 3 ) )
+    {
+    dbgtext( "send_local_master_announcement: " );
+    dbgtext( "type %x for name %s ", type, global_myname );
+    dbgtext( "on subnet %s ", subrec->subnet_name );
+    dbgtext( "for workgroup %s\n", work->work_group );
+    }
+</programlisting></para>
+
+<para>(The dbgtext() function is explained below.)</para>
+
+<para>There are a few advantages to this scheme:</para>
+<orderedlist>
+<listitem><para>
+The test is performed only once.
+</para></listitem>
+<listitem><para>
+You can allocate variables off of the stack that will only be used
+within the DEBUGLVL() block.
+</para></listitem>
+<listitem><para>
+Processing that is only relevant to debug output can be contained
+within the DEBUGLVL() block.
+</para></listitem>
+</orderedlist>
+
+</sect1>
+
+<sect1>
+<title>New Functions</title>
+
+<sect2>
+<title>dbgtext()</title>
+<para>
+This function prints debug message text to the debug file (and
+possibly to syslog) via the format buffer. The function uses a
+variable argument list just like printf() or Debug1(). The
+input is printed into a buffer using the vslprintf() function,
+and then passed to format_debug_text().
+
+If you use DEBUGLVL() you will probably print the body of the
+message using dbgtext(). 
+</para>
+</sect2>
+
+<sect2>
+<title>dbghdr()</title>
+<para>
+This is the function that writes a debug message header.
+Headers are not processed via the format buffer. Also note that
+if the format buffer is not empty, a call to dbghdr() will not
+produce any output. See the comments in dbghdr() for more info.
+</para>
+
+<para>
+It is not likely that this function will be called directly. It
+is used by DEBUG() and DEBUGADD().
+</para>
+</sect2>
+
+<sect2>
+<title>format_debug_text()</title>
+<para>
+This is a static function in debug.c. It stores the output text
+for the body of the message in a buffer until it encounters a
+newline. When the newline character is found, the buffer is
+written to the debug file via the Debug1() function, and the
+buffer is reset. This allows us to add the indentation at the
+beginning of each line of the message body, and also ensures
+that the output is written a line at a time (which cleans up
+syslog output).
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/dev-doc.xml b/docs/docbook/devdoc/dev-doc.xml
new file mode 100644 (file)
index 0000000..26374f7
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE book SYSTEM "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY NetBIOS SYSTEM "NetBIOS.xml">
+<!ENTITY Architecture SYSTEM "architecture.xml">
+<!ENTITY debug SYSTEM "debug.xml">
+<!ENTITY internals SYSTEM "internals.xml">
+<!ENTITY parsing SYSTEM "parsing.xml">
+<!ENTITY unix-smb SYSTEM "unix-smb.xml">
+<!ENTITY CodingSuggestions SYSTEM "CodingSuggestions.xml">
+<!ENTITY Tracing SYSTEM "Tracing.xml">
+<!ENTITY cifsntdomain SYSTEM "cifsntdomain.xml">
+<!ENTITY printing SYSTEM "printing.xml">
+<!ENTITY wins SYSTEM "wins.xml">
+<!ENTITY sam SYSTEM "sam.xml">
+<!ENTITY encryption SYSTEM "encryption.xml">
+<!ENTITY rpc-plugin SYSTEM "rpc_plugin.xml">
+<!ENTITY modules SYSTEM "modules.xml">
+<!ENTITY packagers SYSTEM "packagers.xml">
+]>
+
+<book id="Samba-Developers-Guide">
+
+<title>SAMBA Developers Guide</title>
+
+<bookinfo>
+       <author>
+               <surname>SAMBA Team</surname>
+       </author>
+       <address><email>samba@samba.org</email></address>
+</bookinfo>
+
+<dedication>
+<title>Abstract</title>
+
+<para>
+<emphasis>Last Update</emphasis> : Mon Sep 30 15:23:53 CDT 2002
+</para>
+
+<para>
+This book is a collection of documents that might be useful for 
+people developing samba or those interested in doing so.
+It's nothing more than a collection of documents written by samba developers about 
+the internals of various parts of samba and the SMB protocol. It's still incomplete.
+The most recent version of this document
+can be found at <ulink url="http://devel.samba.org/">http://devel.samba.org/</ulink>.
+Please send updates to <ulink 
+url="mailto:jelmer@samba.org">Jelmer Veenrooij</ulink>.
+</para>
+
+<para>
+This documentation is distributed under the GNU General Public License (GPL) 
+version 2.  A copy of the license is included with the Samba source
+distribution.  A copy can be found on-line at <ulink 
+url="http://www.fsf.org/licenses/gpl.txt">http://www.fsf.org/licenses/gpl.txt</ulink>
+</para>
+
+</dedication>
+
+<!-- Contents -->
+<toc/>
+
+<!-- Chapters -->
+&NetBIOS;
+&Architecture;
+&debug;
+&CodingSuggestions;
+&internals;
+&parsing;
+&unix-smb;
+&Tracing;
+&cifsntdomain;
+&printing;
+&wins;
+&sam;
+&encryption;
+&modules;
+&rpc-plugin;
+&packagers;
+
+</book>
diff --git a/docs/docbook/devdoc/encryption.xml b/docs/docbook/devdoc/encryption.xml
new file mode 100644 (file)
index 0000000..56a1d10
--- /dev/null
@@ -0,0 +1,197 @@
+<chapter id="pwencrypt">
+
+
+<chapterinfo>
+       <author>
+               <firstname>Jeremy</firstname><surname>Allison</surname>
+               <affiliation>
+                       <orgname>Samba Team</orgname>
+                       <address>
+                               <email>samba@samba.org</email>
+                       </address>
+               </affiliation>
+       </author>
+
+       <pubdate>19 Apr 1999</pubdate>
+</chapterinfo>
+       
+<title>LanMan and NT Password Encryption</title>
+
+<sect1>
+       <title>Introduction</title>
+       
+       <para>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.</para>
+
+       <para>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.</para>
+       
+</sect1>
+
+<sect1>
+       <title>How does it work?</title>
+
+       <para>LanManager encryption is somewhat similar to UNIX 
+       password encryption. The server uses a file containing a 
+       hashed value of a user's password.  This is created by taking 
+       the user's plaintext 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".</para>
+       
+       <para>Windows NT encryption is a higher quality mechanism, 
+       consisting of doing an MD4 hash on a Unicode version of the user's 
+       password. This also produces a 16 byte hash value that is 
+       non-reversible.</para>
+
+       <para>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.</para>
+
+       <para>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".</para>
+
+       <para>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 user's password and both responses are 
+       returned in the SMB call, giving two 24 byte values.</para>
+
+       <para>The Samba server then reproduces the above calculation, using 
+       its own stored value of the 16 byte hashed password (read from the 
+       <filename>smbpasswd</filename> 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.</para>
+
+       <para>If these values match exactly, then the client knew the 
+       correct password (or the 16 byte hashed value - see security note 
+       below) and is thus allowed access. If not, then the client did not 
+       know the correct password and is denied access.</para>
+
+       <para>Note that the Samba server never knows or stores the cleartext 
+       of the user's 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.</para>
+</sect1>
+
+<sect1>
+       <title>The smbpasswd file</title>
+       <anchor id="SMBPASSWDFILEFORMAT"/>
+       <para>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 user's
+       password given the UNIX hash of it), 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 <filename>
+       /etc/passwd</filename> and the <filename>smbpasswd</filename> file, 
+       a utility, <command>mksmbpasswd.sh</command>, is provided to generate
+       a smbpasswd file from a UNIX <filename>/etc/passwd</filename> file.
+       </para>
+
+
+       <para>To generate the smbpasswd file from your <filename>/etc/passwd
+       </filename> file use the following command:</para>
+       
+       <para><prompt>$ </prompt><userinput>cat /etc/passwd | mksmbpasswd.sh
+       &gt; /usr/local/samba/private/smbpasswd</userinput></para>
+       
+       <para>If you are running on a system that uses NIS, use</para>
+
+       <para><prompt>$ </prompt><userinput>ypcat passwd | mksmbpasswd.sh
+       &gt; /usr/local/samba/private/smbpasswd</userinput></para>
+       
+       <para>The <command>mksmbpasswd.sh</command> program is found in 
+       the Samba source directory. By default, the smbpasswd file is 
+       stored in :</para>
+
+       <para><filename>/usr/local/samba/private/smbpasswd</filename></para>
+
+       <para>The owner of the <filename>/usr/local/samba/private/</filename> 
+       directory should be set to root, and the permissions on it should 
+       be set to 0500 (<command>chmod 500 /usr/local/samba/private</command>).
+       </para>
+
+       <para>Likewise, the smbpasswd file inside the private directory should 
+       be owned by root and the permissions on is should be set to 0600
+       (<command>chmod 600 smbpasswd</command>).</para>
+
+
+       <para>The format of the smbpasswd file is (The line has been 
+       wrapped here. It should appear as one entry per line in 
+       your smbpasswd file.)</para>
+       
+       <para><programlisting>
+username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:
+       [Account type]:LCT-&lt;last-change-time&gt;:Long name
+       </programlisting></para>
+       
+       <para>Although only the <replaceable>username</replaceable>, 
+       <replaceable>uid</replaceable>, <replaceable>
+       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</replaceable>,
+       [<replaceable>Account type</replaceable>] and <replaceable>
+       last-change-time</replaceable> sections are significant 
+       and are looked at in the Samba code.</para>
+
+       <para>It is <emphasis>VITALLY</emphasis> 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.</para>
+
+       <para>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 user's password.</para>
+
+       <para>To set a user to have no password (not recommended), edit the file
+       using vi, and replace the first 11 characters with the ascii text
+       <constant>"NO PASSWORD"</constant> (minus the quotes).</para>
+
+       <para>For example, to clear the password for user bob, his smbpasswd file 
+       entry would look like :</para>
+
+       <para><programlisting>
+bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:
+       [U          ]:LCT-00000000:Bob's full name:/bobhome:/bobshell
+       </programlisting></para>
+       
+       <para>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). In order for you to allow this the
+       <command>smbpasswd</command> program must be able to connect to the 
+       <command>smbd</command> daemon as that user with no password. Enable this 
+       by adding the line :</para>
+
+       <para><command>null passwords = yes</command></para>
+       
+       <para>to the [global] section of the smb.conf file (this is why 
+       the above scenario is not recommended). Preferably, allocate your
+       users a default password to begin with, so you do not have
+       to enable this on your server.</para>
+
+       <para><emphasis>Note : </emphasis>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 <filename>/etc/passwd</filename> file.</para>
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/devdoc/gencache.xml b/docs/docbook/devdoc/gencache.xml
new file mode 100644 (file)
index 0000000..1ba2f77
--- /dev/null
@@ -0,0 +1,119 @@
+<chapter id="gencache">
+<chapterinfo>
+       <author>
+               <firstname>Rafal</firstname><surname>Szczesniak</surname>
+       </author>
+       <pubdate>April 2003</pubdate>
+</chapterinfo>
+
+<title>General cache mechanism and API</title>
+
+<sect1>
+<title>Abstract</title>
+<para>
+General cache (gencache) was designed to combine various kinds of caching
+mechanisms into one, defined by a simple API. This way, anyone can use it
+to create their own caching layer on top of gencache. An example of
+such approach is the netbios name cache.
+</para>
+</sect1>
+
+<sect1>
+<title>The mechanism</title>
+<para>
+Gencache utilises <emphasise>tdb</emphasise> database, like many other
+parts of Samba. As its origins are in Berkeley DB implementation, it
+uses key/value pairs stored in binary file. The values gencache
+operates on are string-based, however. This makes very easy to use it
+in command line environment eg. to quickly take a look at what's in
+the cache or set some value.
+</para>
+
+<para>
+All the data is stored in <filename>gencache.tdb</filename>
+file. Records put there are in key/value format as mentioned below,
+but as it's a cache, the timeout plays also important role and has a
+special place in the key/value pair, as well as API.
+</para>
+</sect1>
+
+
+<sect1>
+<title>The data structure</title>
+<para>
+The record stored in <filename>gencache.tdb</filename> file consists
+of the key, the value and the expiration timeout. While the first part
+is stored completely independent from the others, the last two are
+kept together. The form the record has is:
+</para>
+
+<para><programlisting>
+key:     &lt;string&bt;
+value:   &lt;12-digit timeout&bt;/&lt;string&gt;
+</programlisting></para>
+
+<para>The timeout part is the ASCII representation of
+<emphasis>time_t</emphasis> value of the time when the cache entry
+expires. Obviously the API, the programmer is provided with, hides this detail,
+so that you don't have to care about checking it. Simply watch
+carefully the return status of the function.
+</para>
+</sect1>
+
+<sect1>
+<title>The API</title>
+
+<para><programlisting>
+BOOL gencache_init()
+</programlisting></para>
+
+<para>This is used to initialise to whole caching mechanism. It means
+opening the file or creating it if non-existing. If it's already been
+opened earlier, then the routine just does nothing and returns
+<constant>true</constant>. If something goes wrong, say the user
+doesn't have necessary rights, the function returns
+<constant>false</constant>.</para>
+
+<para><programlisting>
+BOOL gencache_shutdown()
+</programlisting></para>
+
+<para>This is the proper way to close the cache file. It simply
+returns <constant>true</constant> after successful closing file and
+<constant>false</constant> upon a failure.</para>
+
+<para><programlisting>
+BOOL gencache_set(const char* keystr, const char* value, time_t timeout)
+</programlisting></para>
+
+<para>This is one of the most basic functions. What it allows you to
+do is to set some particular cache entry. If the entry haven't
+existed yet, the function will act just as it was "gencache_add"
+function. If it's already been in the cache, the entry will be set to
+the new value. In either case, the cache entry will be set with given
+key, value and timeout. Thus it is comfortable way to just set the
+entry and not care about the details.</para>
+
+<para><programlisting>
+BOOL gencache_set_only(const char* keystr, const char* value, time_t timeout)
+</programlisting></para>
+
+<para><programlisting>
+BOOL gencache_del(const char* keystr)
+</programlisting></para>
+
+<para><programlisting>
+BOOL gencache_get(const char* keystr, char** valstr, time_t* timeout)
+</programlisting></para>
+
+<para><programlisting>
+void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
+                      void* data, const char* keystr_pattern)
+
+</programlisting></para>
+
+<sect1>
+<title>Writing your own caching layer</title>
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/devdoc/internals.xml b/docs/docbook/devdoc/internals.xml
new file mode 100644 (file)
index 0000000..982cfd2
--- /dev/null
@@ -0,0 +1,440 @@
+<chapter id="internals">
+<chapterinfo>
+       <author>
+               <firstname>David</firstname><surname>Chappell</surname>
+               <affiliation>
+                       <address><email>David.Chappell@mail.trincoll.edu</email></address>
+               </affiliation>
+       </author>
+       <pubdate>8 May 1996</pubdate>
+</chapterinfo>
+
+<title>Samba Internals</title>
+
+<sect1>
+<title>Character Handling</title>
+<para>
+This section describes character set handling in Samba, as implemented in
+Samba 3.0 and above
+</para>
+
+<para>
+In the past Samba had very ad-hoc character set handling. Scattered
+throughout the code were numerous calls which converted particular
+strings to/from DOS codepages. The problem is that there was no way of
+telling if a particular char* is in dos codepage or unix
+codepage. This led to a nightmare of code that tried to cope with
+particular cases without handlingt the general case.
+</para>
+</sect1>
+
+<sect1>
+<title>The new functions</title>
+
+<para>
+The new system works like this:
+</para>
+
+<orderedlist>
+<listitem><para>
+       all char* strings inside Samba are "unix" strings. These are
+       multi-byte strings that are in the charset defined by the "unix
+       charset" option in smb.conf. 
+</para></listitem>
+
+<listitem><para>
+       there is no single fixed character set for unix strings, but any
+       character set that is used does need the following properties:
+       </para>
+       <orderedlist>
+       
+       <listitem><para>
+               must not contain NULLs except for termination
+       </para></listitem>
+
+       <listitem><para>
+               must be 7-bit compatible with C strings, so that a constant
+               string or character in C will be byte-for-byte identical to the
+               equivalent string in the chosen character set. 
+       </para></listitem>
+       
+       <listitem><para>
+               when you uppercase or lowercase a string it does not become
+               longer than the original string
+       </para></listitem>
+
+       <listitem><para>
+               must be able to correctly hold all characters that your client
+               will throw at it
+       </para></listitem>
+       </orderedlist>
+       
+       <para>
+       For example, UTF-8 is fine, and most multi-byte asian character sets
+       are fine, but UCS2 could not be used for unix strings as they
+       contain nulls.
+       </para>
+</listitem>
+
+<listitem><para>
+       when you need to put a string into a buffer that will be sent on the
+       wire, or you need a string in a character set format that is
+       compatible with the clients character set then you need to use a
+       pull_ or push_ function. The pull_ functions pull a string from a
+       wire buffer into a (multi-byte) unix string. The push_ functions
+       push a string out to a wire buffer. 
+</para></listitem>
+
+<listitem><para>
+       the two main pull_ and push_ functions you need to understand are
+       pull_string and push_string. These functions take a base pointer
+       that should point at the start of the SMB packet that the string is
+       in. The functions will check the flags field in this packet to
+       automatically determine if the packet is marked as a unicode packet,
+       and they will choose whether to use unicode for this string based on
+       that flag. You may also force this decision using the STR_UNICODE or
+       STR_ASCII flags. For use in smbd/ and libsmb/ there are wrapper
+       functions clistr_ and srvstr_ that call the pull_/push_ functions
+       with the appropriate first argument.
+       </para>
+       
+       <para>
+       You may also call the pull_ascii/pull_ucs2 or push_ascii/push_ucs2
+       functions if you know that a particular string is ascii or
+       unicode. There are also a number of other convenience functions in
+       charcnv.c that call the pull_/push_ functions with particularly
+       common arguments, such as pull_ascii_pstring()
+       </para>
+</listitem>
+
+<listitem><para>
+       The biggest thing to remember is that internal (unix) strings in Samba
+       may now contain multi-byte characters. This means you cannot assume
+       that characters are always 1 byte long. Often this means that you will
+       have to convert strings to ucs2 and back again in order to do some
+       (seemingly) simple task. For examples of how to do this see functions
+       like strchr_m(). I know this is very slow, and we will eventually
+       speed it up but right now we want this stuff correct not fast.
+</para></listitem>
+
+<listitem><para>
+       all lp_ functions now return unix strings. The magic "DOS" flag on
+       parameters is gone.
+</para></listitem>
+
+<listitem><para>
+       all vfs functions take unix strings. Don't convert when passing to them
+</para></listitem>
+
+</orderedlist>
+
+</sect1>
+
+<sect1>
+<title>Macros in byteorder.h</title>
+
+<para>
+This section describes the macros defined in byteorder.h.  These macros 
+are used extensively in the Samba code.
+</para>
+
+<sect2>
+<title>CVAL(buf,pos)</title>
+
+<para>
+returns the byte at offset pos within buffer buf as an unsigned character.
+</para>
+</sect2>
+
+<sect2>
+<title>PVAL(buf,pos)</title>
+<para>returns the value of CVAL(buf,pos) cast to type unsigned integer.</para>
+</sect2>
+
+<sect2>
+<title>SCVAL(buf,pos,val)</title>
+<para>sets the byte at offset pos within buffer buf to value val.</para>
+</sect2>
+
+<sect2>
+<title>SVAL(buf,pos)</title>
+<para>
+       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".
+</para>
+</sect2>
+
+<sect2>
+<title>IVAL(buf,pos)</title>
+<para>returns the value of the unsigned 32 bit little-endian integer at offset 
+pos within buffer buf.</para>
+</sect2>
+
+<sect2>
+<title>SVALS(buf,pos)</title>
+<para>returns the value of the signed short (16 bit) little-endian integer at 
+offset pos within buffer buf.</para>
+</sect2>
+
+<sect2>
+<title>IVALS(buf,pos)</title>
+<para>returns the value of the signed 32 bit little-endian integer at offset pos
+within buffer buf.</para>
+</sect2>
+
+<sect2>
+<title>SSVAL(buf,pos,val)</title>
+<para>sets the unsigned short (16 bit) little-endian integer at offset pos within 
+buffer buf to value val.</para>
+</sect2>
+
+<sect2>
+<title>SIVAL(buf,pos,val)</title>
+<para>sets the unsigned 32 bit little-endian integer at offset pos within buffer 
+buf to the value val.</para>
+</sect2>
+
+<sect2>
+<title>SSVALS(buf,pos,val)</title>
+<para>sets the short (16 bit) signed little-endian integer at offset pos within 
+buffer buf to the value val.</para>
+</sect2>
+
+<sect2>
+<title>SIVALS(buf,pos,val)</title>
+<para>sets the signed 32 bit little-endian integer at offset pos withing buffer
+buf to the value val.</para>
+</sect2>
+
+<sect2>
+<title>RSVAL(buf,pos)</title>
+<para>returns the value of the unsigned short (16 bit) big-endian integer at 
+offset pos within buffer buf.</para>
+</sect2>
+
+<sect2>
+<title>RIVAL(buf,pos)</title>
+<para>returns the value of the unsigned 32 bit big-endian integer at offset 
+pos within buffer buf.</para>
+</sect2>
+
+<sect2>
+<title>RSSVAL(buf,pos,val)</title>
+<para>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".</para>
+</sect2>
+
+<sect2>
+<title>RSIVAL(buf,pos,val)</title>
+<para>sets the value of the unsigned 32 bit big-endian integer at offset 
+pos within buffer buf to value val.</para>
+</sect2>
+
+</sect1>
+
+
+<sect1>
+<title>LAN Manager Samba API</title>
+
+<para>
+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.
+</para>
+
+<para>
+<programlisting>
+call_api(int prcnt, int drcnt, int mprcnt, int mdrcnt, 
+       char *param, char *data, char **rparam, char **rdata);
+</programlisting>
+</para>
+
+<para>
+This function is defined in client.c.  It uses an SMB transaction to call a
+remote api.
+</para>
+
+<sect2>
+<title>Parameters</title>
+
+<para>The parameters are as follows:</para>
+
+<orderedlist>
+<listitem><para>
+       prcnt: the number of bytes of parameters begin sent.
+</para></listitem>
+<listitem><para>
+       drcnt:   the number of bytes of data begin sent.
+</para></listitem>
+<listitem><para>
+       mprcnt:  the maximum number of bytes of parameters which should be returned
+</para></listitem>
+<listitem><para>
+       mdrcnt:  the maximum number of bytes of data which should be returned
+</para></listitem>
+<listitem><para>
+       param:   a pointer to the parameters to be sent.
+</para></listitem>
+<listitem><para>
+       data:    a pointer to the data to be sent.
+</para></listitem>
+<listitem><para>
+       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.
+</para></listitem>
+<listitem><para>
+       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.
+</para></listitem>
+</orderedlist>
+
+<para>
+These are the parameters which you ought to send, in the order of their
+appearance in the parameter block:
+</para>
+
+<orderedlist>
+
+<listitem><para>
+An unsigned 16 bit integer API number.  You should set this value with
+SSVAL().  I do not know where these numbers are described.
+</para></listitem>
+
+<listitem><para>
+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.
+</para></listitem>
+
+<listitem><para>
+An ASCIIZ string describing the data structure which ought to be returned.
+</para></listitem>
+
+<listitem><para>
+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.
+</para></listitem>
+
+<listitem><para>
+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().
+</para></listitem>
+
+<listitem><para>
+An ASCIIZ string describing substructures which should be returned.  If no 
+substructures apply, this string is of zero length.
+</para></listitem>
+
+</orderedlist>
+
+<para>
+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.
+</para>
+
+</sect2>
+
+<sect2>
+<title>Return value</title>
+
+<para>
+The returned parameters (pointed to by rparam), in their order of appearance
+are:</para>
+
+<orderedlist>
+
+<listitem><para>
+An unsigned 16 bit integer which contains the API function's return code. 
+This value should be read with SVAL().
+</para></listitem>
+
+<listitem><para>
+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.
+</para></listitem>
+
+<listitem><para>
+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.
+</para></listitem>
+</orderedlist>
+
+<para>
+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)".
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>Code character table</title>
+<para>
+Certain data structures are described by means of ASCIIz strings containing
+code characters.  These are the code characters:
+</para>
+
+<orderedlist>
+<listitem><para>
+W      a type byte little-endian unsigned integer
+</para></listitem>
+<listitem><para>
+N      a count of substructures which follow
+</para></listitem>
+<listitem><para>
+D      a four byte little-endian unsigned integer
+</para></listitem>
+<listitem><para>
+B      a byte (with optional count expressed as trailing ASCII digits)
+</para></listitem>
+<listitem><para>
+z      a four byte offset to a NULL terminated string
+</para></listitem>
+<listitem><para>
+l      a four byte offset to non-string user data
+</para></listitem>
+<listitem><para>
+b      an offset to data (with count expressed as trailing ASCII digits)
+</para></listitem>
+<listitem><para>
+r      pointer to returned data buffer???
+</para></listitem>
+<listitem><para>
+L      length in bytes of returned data buffer???
+</para></listitem>
+<listitem><para>
+h      number of bytes of information available???
+</para></listitem>
+</orderedlist>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/modules.xml b/docs/docbook/devdoc/modules.xml
new file mode 100644 (file)
index 0000000..0bcdadc
--- /dev/null
@@ -0,0 +1,156 @@
+<chapter id="modules">
+<chapterinfo>
+       <author>
+               <firstname>Jelmer</firstname><surname>Vernooij</surname>
+               <affiliation>
+                       <orgname>Samba Team</orgname>
+                       <address><email>jelmer@samba.org</email></address>
+               </affiliation>
+       </author>
+       <pubdate> 19 March 2003 </pubdate>
+</chapterinfo>
+
+<title>Modules</title>
+
+<sect1>
+<title>Advantages</title>
+
+<para>
+The new modules system has the following advantages:
+</para>
+
+<simplelist>
+<member>Transparent loading of static and shared modules (no need 
+for a subsystem to know about modules)</member>
+<member>Simple selection between shared and static modules at configure time</member>
+<member>"preload modules" option for increasing performance for stable modules</member>
+<member>No nasty #define stuff anymore</member>
+<member>All backends are available as plugin now (including pdb_ldap and pdb_tdb)</member>
+</simplelist>
+</sect1>
+
+<sect1>
+<title>Loading modules</title>
+
+<para>
+Some subsystems in samba use different backends. These backends can be 
+either statically linked in to samba or available as a plugin. A subsystem 
+should have a function that allows a module to register itself. For example, 
+the passdb subsystem has: 
+</para>
+
+<para><programlisting>
+BOOL smb_register_passdb(const char *name, pdb_init_function init, int version);
+</programlisting></para>
+
+<para>
+This function will be called by the initialisation function of the module to 
+register itself. 
+</para>
+
+<sect2>
+<title>Static modules</title>
+
+<para>
+The modules system compiles a list of initialisation functions for the 
+static modules of each subsystem. This is a define. For example, 
+it is here currently (from <filename>include/config.h</filename>): 
+</para>
+
+<para><programlisting>
+/* Static init functions */
+#define static_init_pdb { pdb_mysql_init(); pdb_ldap_init(); pdb_smbpasswd_init(); pdb_tdbsam_init(); pdb_guest_init();}
+</programlisting></para>
+
+<para>
+These functions should be called before the subsystem is used. That 
+should be done when the subsystem is initialised or first used. 
+</para>
+
+</sect2>
+
+<sect2>
+<title>Shared modules</title>
+
+<para>
+If a subsystem needs a certain backend, it should check if it has 
+already been registered. If the backend hasn't been registered already, 
+the subsystem should call smb_probe_module(char *subsystem, char *backend).
+This function tries to load the correct module from a certain path
+($LIBDIR/subsystem/backend.so). If the first character in 'backend' 
+is a slash, smb_probe_module() tries to load the module from the 
+absolute path specified in 'backend'.
+</para>
+
+<para>After smb_probe_module() has been executed, the subsystem 
+should check again if the module has been registered. 
+</para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>Writing modules</title>
+
+<para>
+Each module has an initialisation function. For modules that are 
+included with samba this name is '<replaceable>subsystem</replaceable>_<replaceable>backend</replaceable>_init'. For external modules (that will never be built-in, but only available as a module) this name is always 'init_module'. (In the case of modules included with samba, the configure system will add a #define subsystem_backend_init() init_module()).
+The prototype for these functions is:
+</para>
+
+<para><programlisting>
+int init_module(void);
+</programlisting></para>
+
+<para>This function should call one or more 
+registration functions. The function should return non-zero on success and zero on 
+failure.</para>
+
+<para>For example, pdb_ldap_init() contains: </para>
+
+<para><programlisting>
+int pdb_ldap_init(void)
+{
+    smb_register_passdb("ldapsam", pdb_init_ldapsam, PASSDB_INTERFACE_VERSION);
+    smb_register_passdb("ldapsam_nua", pdb_init_ldapsam_nua, PASSDB_INTERFACE_VERSION);
+       return TRUE;
+}
+</programlisting></para>
+
+<sect2>
+<title>Static/Shared selection in configure.in</title>
+
+<para>
+Some macros in configure.in generate the various defines and substs that 
+are necessary for the system to work correct. All modules that should 
+be built by default have to be added to the variable 'default_modules'. 
+For example, if ldap is found, pdb_ldap is added to this variable.
+</para>
+
+<para>
+On the bottom of configure.in, SMB_MODULE() should be called 
+for each module and SMB_SUBSYSTEM() for each subsystem.
+</para>
+
+<para>Syntax:</para>
+
+<para><programlisting>
+SMB_MODULE(<replaceable>subsystem</replaceable>_<replaceable>backend</replaceable>, <replaceable>object files</replaceable>, <replaceable>plugin name</replaceable>, <replaceable>subsystem name</replaceable>, <replaceable>static_action</replaceable>, <replaceable>shared_action</replaceable>)
+SMB_SUBSYSTEM(<replaceable>subsystem</replaceable>)
+</programlisting></para>
+
+<para>Also, make sure to add the correct directives to 
+<filename>Makefile.in</filename>. <replaceable>@SUBSYSTEM_STATIC@</replaceable>
+will be replaced with a list of objects files of the modules that need to 
+be linked in statically. <replaceable>@SUBSYSTEM_MODULES@</replaceable> will 
+be replaced with the names of the plugins to build.
+</para>
+
+<para>You must make sure all .c files that contain defines that can 
+be changed by ./configure are rebuilded in the 'modules_clean' make target. 
+Practically, this means all c files that contain <command>static_init_subsystem;</command> calls need to be rebuilded.
+</para>
+
+</sect2>
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/packagers.xml b/docs/docbook/devdoc/packagers.xml
new file mode 100644 (file)
index 0000000..fb47c73
--- /dev/null
@@ -0,0 +1,40 @@
+<chapter id="Packaging">
+<chapterinfo>
+       <author>
+               <firstname>Jelmer</firstname><surname>Vernooij</surname>
+       </author>
+</chapterinfo>
+
+<title>Notes to packagers</title>
+
+<sect1>
+<title>Versioning</title>
+
+<para>Please, please update the version number in 
+<filename>source/include/version.h</filename> to include the versioning of your package. This makes it easier to distinguish standard samba builds
+from custom-build samba builds (distributions often patch packages). For 
+example, a good version would be: </para>
+
+<para><programlisting>
+Version 2.999+3.0.alpha21-5 for Debian
+</programlisting></para>
+
+</sect1>
+
+<sect1>
+<title>Modules</title>
+
+<para>Samba now has support for building parts of samba as plugins. This 
+makes it possible to, for example, put ldap or mysql support in a seperate 
+package, thus making it possible to have a normal samba package not 
+depending on ldap or mysql. To build as much parts of samba 
+as a plugin, run: </para>
+
+<para><programlisting>
+./configure --with-shared-modules=rpc,vfs,auth,pdb,charset
+</programlisting></para>
+
+</sect1>
+
+
+</chapter>
diff --git a/docs/docbook/devdoc/parsing.xml b/docs/docbook/devdoc/parsing.xml
new file mode 100644 (file)
index 0000000..8d92961
--- /dev/null
@@ -0,0 +1,239 @@
+<chapter id="parsing">
+<chapterinfo>
+       <author>
+               <firstname>Chris</firstname><surname>Hertel</surname>
+       </author>
+       <pubdate>November 1997</pubdate>
+</chapterinfo>
+
+<title>The smb.conf file</title>
+
+<sect1>
+<title>Lexical Analysis</title>
+
+<para>
+Basically, the file is processed on a line by line basis.  There are
+four types of lines that are recognized by the lexical analyzer
+(params.c):
+</para>
+
+<orderedlist>
+<listitem><para>
+Blank lines - Lines containing only whitespace.
+</para></listitem>
+<listitem><para>
+Comment lines - Lines beginning with either a semi-colon or a
+pound sign (';' or '#').
+</para></listitem>
+<listitem><para>
+Section header lines - Lines beginning with an open square bracket ('[').
+</para></listitem>
+<listitem><para>
+Parameter lines - Lines beginning with any other character.
+(The default line type.)
+</para></listitem>
+</orderedlist>
+
+<para>
+The first two are handled exclusively by the lexical analyzer, which
+ignores them.  The latter two line types are scanned for
+</para>
+
+<orderedlist>
+<listitem><para>
+  - Section names
+</para></listitem>
+<listitem><para>
+  - Parameter names
+</para></listitem>
+<listitem><para>
+  - Parameter values
+</para></listitem>
+</orderedlist>
+
+<para>
+These are the only tokens passed to the parameter loader
+(loadparm.c).  Parameter names and values are divided from one
+another by an equal sign: '='.
+</para>
+
+<sect2>
+<title>Handling of Whitespace</title>
+
+<para>
+Whitespace is defined as all characters recognized by the isspace()
+function (see ctype(3C)) except for the newline character ('\n')
+The newline is excluded because it identifies the end of the line.
+</para>
+
+<orderedlist>
+<listitem><para>
+The lexical analyzer scans past white space at the beginning of a line.
+</para></listitem>
+
+<listitem><para>
+Section and parameter names may contain internal white space.  All
+whitespace within a name is compressed to a single space character. 
+</para></listitem>
+
+<listitem><para>
+Internal whitespace within a parameter value is kept verbatim with 
+the exception of carriage return characters ('\r'), all of which
+are removed.
+</para></listitem>
+
+<listitem><para>
+Leading and trailing whitespace is removed from names and values.
+</para></listitem>
+
+</orderedlist>
+
+</sect2>
+
+<sect2>
+<title>Handling of Line Continuation</title>
+
+<para>
+Long section header and parameter lines may be extended across
+multiple lines by use of the backslash character ('\\').  Line
+continuation is ignored for blank and comment lines.
+</para>
+
+<para>
+If the last (non-whitespace) character within a section header or on
+a parameter line is a backslash, then the next line will be
+(logically) concatonated with the current line by the lexical
+analyzer.  For example:
+</para>
+
+<para><programlisting>
+       param name = parameter value string \
+       with line continuation.
+</programlisting></para>
+
+<para>Would be read as</para>
+
+<para><programlisting>
+    param name = parameter value string     with line continuation.
+</programlisting></para>
+
+<para>
+Note that there are five spaces following the word 'string',
+representing the one space between 'string' and '\\' in the top
+line, plus the four preceeding the word 'with' in the second line.
+(Yes, I'm counting the indentation.)
+</para>
+
+<para>
+Line continuation characters are ignored on blank lines and at the end
+of comments.  They are *only* recognized within section and parameter
+lines.
+</para>
+
+</sect2>
+
+<sect2>
+<title>Line Continuation Quirks</title>
+
+<para>Note the following example:</para>
+
+<para><programlisting>
+       param name = parameter value string \
+    \
+    with line continuation.
+</programlisting></para>
+
+<para>
+The middle line is *not* parsed as a blank line because it is first
+concatonated with the top line.  The result is
+</para>
+
+<para><programlisting>
+param name = parameter value string         with line continuation.
+</programlisting></para>
+
+<para>The same is true for comment lines.</para>
+
+<para><programlisting>
+       param name = parameter value string \
+       ; comment \
+    with a comment.
+</programlisting></para>
+
+<para>This becomes:</para>
+
+<para><programlisting>
+param name = parameter value string     ; comment     with a comment.
+</programlisting></para>
+
+<para>
+On a section header line, the closing bracket (']') is considered a
+terminating character, and the rest of the line is ignored.  The lines
+</para>
+
+<para><programlisting>
+       [ section   name ] garbage \
+    param  name  = value
+</programlisting></para>
+
+<para>are read as</para>
+
+<para><programlisting>
+       [section name]
+    param name = value
+</programlisting></para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>Syntax</title>
+
+<para>The syntax of the smb.conf file is as follows:</para>
+
+<para><programlisting>
+  &lt;file&gt;            :==  { &lt;section&gt; } EOF
+  &lt;section&gt;         :==  &lt;section header&gt; { &lt;parameter line&gt; }
+  &lt;section header&gt;  :==  '[' NAME ']'
+  &lt;parameter line&gt;  :==  NAME '=' VALUE NL
+</programlisting></para>
+
+<para>Basically, this means that</para>
+
+<orderedlist>
+<listitem><para>
+       a file is made up of zero or more sections, and is terminated by
+       an EOF (we knew that).
+</para></listitem>
+
+<listitem><para>
+       A section is made up of a section header followed by zero or more
+       parameter lines.
+</para></listitem>
+
+<listitem><para>
+       A section header is identified by an opening bracket and
+       terminated by the closing bracket.  The enclosed NAME identifies
+       the section.
+</para></listitem>
+
+<listitem><para>
+       A parameter line is divided into a NAME and a VALUE.  The *first*
+       equal sign on the line separates the NAME from the VALUE.  The
+       VALUE is terminated by a newline character (NL = '\n').
+</para></listitem>
+
+</orderedlist>
+
+<sect2>
+<title>About params.c</title>
+
+<para>
+The parsing of the config file is a bit unusual if you are used to
+lex, yacc, bison, etc.  Both lexical analysis (scanning) and parsing
+are performed by params.c.  Values are loaded via callbacks to
+loadparm.c.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/printing.xml b/docs/docbook/devdoc/printing.xml
new file mode 100644 (file)
index 0000000..363b9fb
--- /dev/null
@@ -0,0 +1,393 @@
+<chapter id="printing">
+<chapterinfo>
+       <author>
+               <firstname>Gerald</firstname><surname>Carter</surname>
+       </author>
+       <pubdate>October 2002</pubdate>
+</chapterinfo>
+
+
+<title>Samba Printing Internals</title>
+
+
+<sect1>
+<title>Abstract</title>
+<para>
+The purpose of this document is to provide some insight into
+Samba's printing functionality and also to describe the semantics
+of certain features of Windows client printing.
+</para>
+</sect1>
+
+
+
+<sect1>
+<title>
+Printing Interface to Various Back ends
+</title>
+
+<para>
+Samba uses a table of function pointers to seven functions.  The
+function prototypes are defined in the <varname>printif</varname> structure declared
+in <filename>printing.h</filename>.
+</para>
+
+<itemizedlist>
+       <listitem><para>retrieve the contents of a print queue</para></listitem>
+       <listitem><para>pause the print queue</para></listitem>
+       <listitem><para>resume a paused print queue</para></listitem>
+       <listitem><para>delete a job from the queue</para></listitem>
+       <listitem><para>pause a job in the print queue</para></listitem>
+       <listitem><para>result a paused print job in the queue</para></listitem>
+       <listitem><para>submit a job to the print queue</para></listitem>
+</itemizedlist>
+
+<para>
+Currently there are only two printing back end implementations
+defined.
+</para>
+
+<itemizedlist>
+       <listitem><para>a generic set of functions for working with standard UNIX
+       printing subsystems</para></listitem>
+
+       <listitem><para>a set of CUPS specific functions (this is only enabled if
+       the CUPS libraries were located at compile time).</para></listitem>
+</itemizedlist>
+
+</sect1>
+
+
+
+
+<sect1>
+<title>
+Print Queue TDB's
+</title>
+
+
+<para>
+Samba provides periodic caching of the output from the "lpq command"
+for performance reasons.  This cache time is configurable in seconds.
+Obviously the longer the cache time the less often smbd will be
+required to exec a copy of lpq.  However, the accuracy of the print
+queue contents displayed to clients will be diminished as well.
+</para>
+
+<para>
+The list of currently opened print queue TDB's can be found
+be examining the list of tdb_print_db structures ( see print_db_head
+in printing.c ). A queue TDB is opened using the wrapper function
+printing.c:get_print_db_byname().  The function ensures that smbd
+does not open more than MAX_PRINT_DBS_OPEN in an effort to prevent
+a large print server from exhausting all available file descriptors.
+If the number of open queue TDB's exceeds the MAX_PRINT_DBS_OPEN
+limit, smbd falls back to a most recently used algorithm for maintaining
+a list of open TDB's.
+</para>
+
+<para>
+There are two ways in which a a print job can be entered into
+a print queue's TDB.  The first is to submit the job from a Windows
+client which will insert the job information directly into the TDB.
+The second method is to have the print job picked up by executing the
+"lpq command".
+</para>
+
+<para><programlisting>
+/* included from printing.h */
+struct printjob {
+       pid_t pid; /* which process launched the job */
+       int sysjob; /* the system (lp) job number */
+       int fd; /* file descriptor of open file if open */
+       time_t starttime; /* when the job started spooling */
+       int status; /* the status of this job */
+       size_t size; /* the size of the job so far */
+       int page_count; /* then number of pages so far */
+       BOOL spooled; /* has it been sent to the spooler yet? */
+       BOOL smbjob; /* set if the job is a SMB job */
+       fstring filename; /* the filename used to spool the file */
+       fstring jobname; /* the job name given to us by the client */
+       fstring user; /* the user who started the job */
+       fstring queuename; /* service number of printer for this job */
+       NT_DEVICEMODE *nt_devmode;
+};
+</programlisting></para>
+
+<para>
+The current manifestation of the printjob structure contains a field
+for the UNIX job id returned from the "lpq command" and a Windows job
+ID (32-bit bounded by PRINT_MAX_JOBID).  When a print job is returned
+by the "lpq command" that does not match an existing job in the queue's
+TDB, a 32-bit job ID above the &lt;*vance doesn't know what word is missing here*&gt; is generating by adding UNIX_JOB_START to
+the id reported by lpq.
+</para>
+
+<para>
+In order to match a 32-bit Windows jobid onto a 16-bit lanman print job
+id, smbd uses an in memory TDB to match the former to a number appropriate
+for old lanman clients.
+</para>
+
+<para>
+When updating a print queue, smbd will perform the following
+steps ( refer to <filename>print.c:print_queue_update()</filename> ):
+</para>
+
+<orderedlist>
+       <listitem><para>Check to see if another smbd is currently in 
+       the process of updating the queue contents by checking the pid 
+       stored in <constant>LOCK/<replaceable>printer_name</replaceable></constant>.  
+       If so, then do not update the TDB.</para></listitem>
+       
+       <listitem><para>Lock the mutex entry in the TDB and store our own pid.
+       Check that this succeeded, else fail.</para></listitem>
+
+       <listitem><para>Store the updated time stamp for the new cache
+       listing</para></listitem>
+
+       <listitem><para>Retrieve the queue listing via "lpq command"</para></listitem>
+
+       <listitem><para><programlisting>
+       foreach job in the queue
+       {
+               if the job is a UNIX job, create a new entry;
+               if the job has a Windows based jobid, then
+               {
+                       Lookup the record by the jobid;
+                       if the lookup failed, then
+                               treat it as a UNIX job;
+                       else
+                               update the job status only
+               }
+       }</programlisting></para></listitem>
+
+       <listitem><para>Delete any jobs in the TDB that are not
+       in the in the lpq listing</para></listitem>
+
+       <listitem><para>Store the print queue status in the TDB</para></listitem>
+       
+       <listitem><para>update the cache time stamp again</para></listitem>
+       
+</orderedlist>
+
+<para>
+Note that it is the contents of this TDB that is returned to Windows
+clients and not the actual listing from the "lpq command".
+</para>
+
+<para>
+The NT_DEVICEMODE stored as part of the printjob structure is used to
+store a pointer to a non-default DeviceMode associated with the print
+job.  The pointer will be non-null when the client included a Device
+Mode in the OpenPrinterEx() call and subsequently submitted a job for
+printing on that same handle.  If the client did not include a Device
+Mode in the OpenPrinterEx() request, the nt_devmode field is NULL
+and the job has the printer's device mode associated with it by default.
+</para>
+
+<para>
+Only non-default Device Mode are stored with print jobs in the print
+queue TDB.  Otherwise, the Device Mode is obtained from the printer
+object when the client issues a GetJob(level == 2) request.
+</para>
+
+</sect1>
+
+
+
+
+<sect1>
+<title>
+ChangeID and Client Caching of Printer Information
+</title>
+
+<para>
+[To be filled in later]
+</para>
+</sect1>
+
+
+
+<sect1>
+<title>
+Windows NT/2K Printer Change Notify
+</title>
+
+<para>
+When working with Windows NT+ clients, it is possible for a
+print server to use RPC to send asynchronous change notification
+events to clients for certain printer and print job attributes.
+This can be useful when the client needs to know that a new
+job has been added to the queue for a given printer or that the
+driver for a printer has been changed.  Note that this is done
+entirely orthogonal to cache updates based on a new ChangeID for
+a printer object.
+</para>
+
+<para>
+The basic set of RPC's used to implement change notification are
+</para>
+
+<itemizedlist>
+       <listitem><para>RemoteFindFirstPrinterChangeNotifyEx ( RFFPCN )</para></listitem>
+       <listitem><para>RemoteFindNextPrinterChangeNotifyEx ( RFNPCN )</para></listitem>
+       <listitem><para>FindClosePrinterChangeNotify( FCPCN )</para></listitem>
+       <listitem><para>ReplyOpenPrinter</para></listitem>
+       <listitem><para>ReplyClosePrinter</para></listitem>
+       <listitem><para>RouteRefreshPrinterChangeNotify ( RRPCN )</para></listitem>
+</itemizedlist>
+
+<para>
+One additional RPC is available to a server, but is never used by the
+Windows spooler service:
+</para>
+
+<itemizedlist>
+       <listitem><para>RouteReplyPrinter()</para></listitem>
+</itemizedlist>
+
+<para>
+The opnum for all of these RPC's are defined in include/rpc_spoolss.h
+</para>
+
+<para>
+Windows NT print servers use a bizarre method of sending print
+notification event to clients.  The process of registering a new change
+notification handle is as follows.  The 'C' is for client and the
+'S' is for server.  All error conditions have been eliminated.
+</para>
+
+<para><programlisting>
+C:     Obtain handle to printer or to the printer
+       server via the standard OpenPrinterEx() call.
+S:     Respond with a valid handle to object
+
+C:     Send a RFFPCN request with the previously obtained
+       handle with either (a) set of flags for change events
+       to monitor, or (b) a PRINTER_NOTIFY_OPTIONS structure
+       containing the event information to monitor.  The windows
+       spooler has only been observed to use (b).
+S:     The &lt;* another missing word*&gt; opens a new TCP session to the client (thus requiring
+       all print clients to be CIFS servers as well) and sends
+       a ReplyOpenPrinter() request to the client.
+C:     The client responds with a printer handle that can be used to
+       send event notification messages.
+S:     The server replies success to the RFFPCN request.
+
+C:     The windows spooler follows the RFFPCN with a RFNPCN
+       request to fetch the current values of all monitored
+       attributes.
+S:     The server replies with an array SPOOL_NOTIFY_INFO_DATA
+       structures (contained in a SPOOL_NOTIFY_INFO structure).
+
+C:     If the change notification handle is ever released by the
+       client via a FCPCN request, the server sends a ReplyClosePrinter()
+       request back to the client first.  However a request of this
+       nature from the client is often an indication that the previous
+       notification event was not marshalled correctly by the server
+       or a piece of data was wrong.
+S:     The server closes the internal change notification handle
+       (POLICY_HND) and does not send any further change notification
+       events to the client for that printer or job.
+</programlisting></para>
+
+<para>
+The current list of notification events supported by Samba can be
+found by examining the internal tables in srv_spoolss_nt.c
+</para>
+
+<itemizedlist>
+       <listitem><para>printer_notify_table[]</para></listitem>
+       <listitem><para>job_notify_table[]</para></listitem>
+</itemizedlist>
+
+<para>
+When an event occurs that could be monitored, smbd sends a message
+to itself about the change.  The list of events to be transmitted
+are queued by the smbd process sending the message to prevent an
+overload of TDB usage and the internal message is sent during smbd's
+idle loop (refer to printing/notify.c and the functions
+send_spoolss_notify2_msg() and print_notify_send_messages() ).
+</para>
+
+<para>
+The decision of whether or not the change is to be sent to connected
+clients is made by the routine which actually sends the notification.
+( refer to srv_spoolss_nt.c:recieve_notify2_message() ).
+</para>
+
+<para>
+Because it possible to receive a listing of multiple changes for
+multiple printers, the notification events must be split into
+categories by the printer name.  This makes it possible to group
+multiple change events to be sent in a single RPC according to the
+printer handle obtained via a ReplyOpenPrinter().
+</para>
+
+<para>
+The actual change notification is performed using the RRPCN request
+RPC.  This packet contains
+</para>
+
+
+<itemizedlist>
+       
+<listitem><para>the printer handle registered with the
+client's spooler on which the change occurred</para></listitem>
+
+<listitem><para>The change_low value which was sent as part
+of the last RFNPCN request from the client</para></listitem>
+
+<listitem><para>The SPOOL_NOTIFY_INFO container with the event
+information</para></listitem>
+
+</itemizedlist>
+
+<para>
+A <varname>SPOOL_NOTIFY_INFO</varname> contains:
+</para>
+
+<itemizedlist>
+
+<listitem><para>the version and flags field are predefined
+and should not be changed</para></listitem>
+
+<listitem><para>The count field is the number of entries
+in the SPOOL_NOTIFY_INFO_DATA array</para></listitem>
+
+</itemizedlist>
+
+<para>
+The <varname>SPOOL_NOTIFY_INFO_DATA</varname> entries contain:
+</para>
+
+<itemizedlist>
+
+<listitem><para>The type defines whether or not this event
+is for a printer or a print job</para></listitem>
+
+<listitem><para>The field is the flag identifying the event</para></listitem>
+
+<listitem><para>the notify_data union contains the new valuie of the
+attribute</para></listitem>
+
+<listitem><para>The enc_type defines the size of the structure for marshalling
+and unmarshalling</para></listitem>
+
+<listitem><para>(a) the id must be 0 for a printer event on a printer handle.
+(b) the id must be the job id for an event on a printer job
+(c) the id must be the matching number of the printer index used
+in the response packet to the RFNPCN when using a print server
+handle for notification.  Samba currently uses the snum of
+the printer for this which can break if the list of services
+has been modified since the notification handle was registered.</para></listitem>
+
+<listitem><para>The size is either (a) the string length in UNICODE for strings,
+(b) the size in bytes of the security descriptor, or (c) 0 for
+data values.</para></listitem>
+
+</itemizedlist>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/rpc_plugin.xml b/docs/docbook/devdoc/rpc_plugin.xml
new file mode 100644 (file)
index 0000000..c83742a
--- /dev/null
@@ -0,0 +1,83 @@
+<chapter id="rpc-plugin">
+<chapterinfo>
+       <author>
+               <firstname>Anthony</firstname><surname>Liguori</surname>
+               <affiliation>
+                       <orgname>IBM</orgname>
+                       <address><email>aliguor@us.ibm.com</email></address>
+               </affiliation>
+       </author>
+       <author>
+               <firstname>Jelmer</firstname><surname>Vernooij</surname>
+               <affiliation>
+                       <orgname>Samba Team</orgname>
+                       <address><email>jelmer@samba.org</email></address>
+               </affiliation>
+       </author>
+       <pubdate>January 2003</pubdate>
+</chapterinfo>
+
+<title>RPC Pluggable Modules</title>
+
+<sect1>
+<title>About</title>
+
+<para>
+This document describes how to make use the new RPC Pluggable Modules features
+of Samba 3.0.  This architecture was added to increase the maintainability of
+Samba allowing RPC Pipes to be worked on separately from the main CVS branch.
+The RPM architecture will also allow third-party vendors to add functionality
+to Samba through plug-ins.
+</para>
+
+</sect1>
+
+<sect1>
+<title>General Overview</title>
+
+<para>
+When an RPC call is sent to smbd, smbd tries to load a shared library by the
+name <filename>librpc_&lt;pipename&gt;.so</filename> to handle the call if
+it doesn't know how to handle the call internally.  For instance, LSA calls
+are handled by <filename>librpc_lsass.so</filename>..
+These shared libraries should be located in the <filename>&lt;sambaroot&gt;/lib/rpc</filename>.  smbd then attempts to call the init_module function within
+the shared library. Check the chapter on modules for more information.
+</para>
+
+<para>
+In the init_module function, the library should call 
+rpc_pipe_register_commands().  This function takes the following arguments:
+</para>
+
+<para><programlisting>
+int rpc_pipe_register_commands(const char *clnt, const char *srv,
+                               const struct api_struct *cmds, int size);
+</programlisting></para>
+
+<variablelist>
+
+<varlistentry><term>clnt</term>
+<listitem><para>the Client name of the named pipe</para></listitem>
+</varlistentry>
+
+<varlistentry><term>srv</term>
+<listitem><para>the Server name of the named pipe</para></listitem>
+</varlistentry>
+
+<varlistentry><term>cmds</term>
+<listitem><para>a list of api_structs that map RPC ordinal numbers to function calls</para></listitem>
+</varlistentry>
+
+<varlistentry><term>size</term>
+<listitem><para>the number of api_structs contained in cmds</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<para>
+See rpc_server/srv_reg.c and rpc_server/srv_reg_nt.c for a small example of
+how to use this library.
+</para>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/sam.xml b/docs/docbook/devdoc/sam.xml
new file mode 100644 (file)
index 0000000..84c17d6
--- /dev/null
@@ -0,0 +1,357 @@
+<chapter id="sam">
+
+<chapterinfo>
+       <author>
+               <firstname>Andrew</firstname><surname>Bartlett</surname>
+       </author>
+       <pubdate>1 October 2002</pubdate>
+</chapterinfo>
+
+<title>The Upcoming SAM System</title>
+
+<sect1>
+<title>Security in the 'new SAM'</title>
+
+<para>One of the biggest problems with passdb is it's implementation of
+'security'.  Access control is on a 'are you root at the moment' basis,
+and it has no concept of NT ACLs.  Things like ldapsam had to add
+'magic' 'are you root' checks.</para>
+
+<para>We took this very seriously when we started work, and the new structure
+is designed with this in mind, from the ground up.  Each call to the SAM
+has a NT_TOKEN and (if relevant) an 'access desired'.  This is either
+provided as a parameter, or implicitly supplied by the object being
+accessed.</para>
+
+<para>
+For example, when you call 
+</para>
+
+<programlisting>
+NTSTATUS sam_get_account_by_name(const SAM_CONTEXT *context, const
+NT_USER_TOKEN *access_token, uint32 access_desired, const char *domain,
+const char *name, SAM_ACCOUNT_HANDLE **account)
+</programlisting>
+
+<para>
+The context can be NULL (and is used to allow import/export by setting
+up 2 contexts, and allowing calls on both simultaneously)
+</para>
+
+<para>
+The access token *must* be specified.  Normally the user's token out of
+current_user, this can also be a global 'system' context.
+</para>
+
+<para>
+The access desired is as per the ACL, for passing to the seaccess stuff.
+</para>
+
+<para>
+The domain/username are standard.  Even if we only have one domain,
+keeping this ensures that we don't get 'unqualified' usernames (same
+problem as we had with unqualified SIDs).
+</para>
+
+<para>
+We return a 'handle'.  This is opaque to the rest of Samba, but is
+operated on by get/set routines, all of which return NTSTATUS.
+</para>
+
+<para>
+The access checking is done by the SAM module.   The reason it is not
+done 'above' the interface is to ensure a 'choke point'.  I put a lot of
+effort into the auth subsystem to ensure we never 'accidentally' forgot
+to check for null passwords, missed a restriction etc.  I intend the SAM
+to be written with the same caution.
+</para>
+
+<para>
+The reason the access checking is not handled by the interface itself is
+due to the different implementations it make take on.  For example, on
+ADS, you cannot set a password over a non-SSL connection.  Other
+backends may have similar requirements - we need to leave this policy up
+to the modules.  They will naturally have access to 'helper' procedures
+and good examples to avoid mishaps.
+</para>
+
+<para>
+(Furthermore, some backends my actually chose to push the whole ACL
+issue to the remote server, and - assuming ldap for this example - bind
+as the user directly)
+</para>
+
+<para>
+Each returned handle has an internal 'access permitted', which allows
+the 'get' and 'set' routines to return 'ACCESS_DENIED' for things that
+were not able to be retrieved from the backend.  This removes the need
+to specify the NT_TOKEN on every operation, and allows for 'object not
+present' to be easily distinguished from 'access denied'.
+</para>
+
+<para>
+When you 'set' an object (calling sam_update_account) the internal
+details are again used.  Each change that has been made to the object
+has been flagged, so as to avoid race conditions (on unmodified
+components) and to avoid violating any extra ACL requirements on the
+actual data store (like the LDAP server).
+</para>
+
+<para>
+Finally, we have generic get_sec_desc() and set_sec_desc() routines to
+allow external ACL manipulation.  These do lookups based on SID.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Standalone from UNIX</title>
+
+<para>
+One of the primary tenants of the 'new SAM' is that it would not attempt
+to deal with 'what unix id for that'.  This would be left to the 'SMS'
+(Sid Mapping System') or SID farm, and probably administered via
+winbind.  We have had constructive discussion on how 'basic' unix
+accounts like 'root' would be handled, and we think this can work.  
+Accounts not preexisting in unix would be served up via winbind.
+</para>
+
+<para>
+This is an *optional* part, and my preferred end-game.  We have a fare
+way to go before things like winbind up to it however.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Handles and Races in the new SAM</title>
+
+<para>
+One of the things that the 'new SAM' work has tried to face is both
+compatibility with existing code, and a closer alignment to the SAMR
+interface.  I consider SAMR to be a 'primary customer' to the this work,
+because if we get alignment with that wrong, things get more, rather
+than less complex.  Also, most other parts of Samba are much more
+flexible with what they can allow.
+</para>
+
+<para>
+In any case, that was a decision taken as to how the general design
+would progress.  BTW, my understanding of SAMR may be completely flawed.
+</para>
+
+<para>
+One of the most race-prone areas of the new code is the conflicting
+update problem.  We have taken two approaches:  
+</para>
+
+<itemizedlist>
+<listitem>
+<para>'Not conflicting' conflicts.  Due to the way usrmgr operates, it will
+open a user, display all the properties and *save* them all, even if you
+don't change any.
+</para>
+
+<para>
+For this, see what I've done in rpc_server/srv_samr_util.c.  I intend
+to take this one step further, and operate on the 'handle' that the
+values were read from.  This should mean that we only update things that
+have *really* changed.
+</para>
+</listitem>
+
+<listitem>
+<para>
+'conflicting' updates:  Currently we don't deal with this (in passdb
+or the new sam stuff), but the design is sufficiently flexible to 'deny'
+a second update.  I don't foresee locking records however.
+</para>
+</listitem>
+</itemizedlist>
+
+</sect1>
+
+<sect1>
+<title>Layers</title>
+
+<sect2>
+<title>Application</title>
+
+<para>
+This is where smbd, samtest and whatever end-user replacement we have
+for pdbedit sits.  They use only the SAM interface, and do not get
+'special knowledge' of what is below them.
+</para>
+</sect2>
+<sect2>
+<title>SAM Interface</title>
+
+<para>
+This level 'owns' the various handle structures, the get/set routines on
+those structures and provides the public interface.  The application
+layer may initialize a 'context' to be passed to all interface routines,
+else a default, self-initialising context will be supplied.  This layser
+finds the appropriate backend module for the task, and tries very hard
+not to need to much 'knowledge'.  It should just provide the required
+abstraction to the modules below, and arrange for their initial loading.
+</para>
+
+<para>
+We could possibly add ACL checking at this layer, to avoid discrepancies
+in implementation modules.
+</para>
+
+</sect2>
+
+<sect2>
+<title>SAM Modules</title>
+
+<para>
+These do not communicate with the application directly, only by setting
+values in the handles, and receiving requests from the interface.  These
+modules are responsible for translating values from the handle's
+.private into (say) an LDAP modification list.  The module is expected
+to 'know' things like it's own domain SID, domain name, and any other
+state attached to the SAM.  Simpler modules may call back to some helper
+routine.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>SAM Modules</title>
+
+<sect2>
+<title>Special Module: sam_passdb</title>
+
+<para>
+In order for there to be a smooth transition, kai is writing a module
+that reads existing passdb backends, and translates them into SAM
+replies.  (Also pulling data from the account policy DB etc).  We also
+intend to write a module that does the reverse - gives the SAM a passdb
+interface.
+</para>
+</sect2>
+
+<sect2>
+<title>sam_ads</title>
+<para>
+This is the first of the SAM modules to be committed to the tree -
+mainly because I needed to coordinate work with metze (who authored most
+of it).  This module aims to use Samba's libads code to provide an
+Active Directory LDAP client, suitable for use on a mixed-mode DC. 
+While it is currently being tested against Win2k servers (with a
+password in the smb.conf file) it is expected to eventually use a
+(possibly modified) OpenLDAP server.  We hope that this will assist in
+the construction of an Samba AD DC.
+</para>
+
+<para>
+We also intend to construct a Samba 2.2/3.0 compatible ldap module,
+again using libads code.
+</para>
+</sect2>
+</sect1>
+
+<sect1>
+<title>Memory Management</title>
+
+<para> 
+The 'new SAM' development effort also concerned itself with getting a
+sane implementation of memory management.  It was decided that we would
+be (as much as possible) talloc based, using an 'internal talloc
+context' on many objects.  That is, the creation of an object would
+initiate it's own internal talloc context, and this would be used for
+all operations on that object.  Much of this is already implemented in
+passdb.  Also, like passdb, it will be possible to specify that some
+object actually be created on a specified context.  
+</para>
+
+<para>
+Memory management is important here because the APIs in the 'new SAM' do
+not use 'pdb_init()' or an equivalent.  They always allocate new
+objects.  Enumeration's are slightly different, and occur on a supplied
+context that 'owns' the entire list, rather than per-element.  (the
+enumeration functions return an array of all elements - not full handles
+just basic (and public) info)  Likewise for things that fill in a char
+**.
+</para>
+
+<para>For example:</para>
+
+<para><programlisting>
+NTSTATUS sam_lookup_sid(const SAM_CONTEXT *context, const NT_USER_TOKEN
+*access_token, TALLOC_CTX *mem_ctx, const DOM_SID *sid, char **name,
+uint32 *type)
+</programlisting></para>
+
+<para>Takes a context to allocate the 'name' on, while:</para>
+
+<para><programlisting>
+NTSTATUS sam_get_account_by_sid(const SAM_CONTEXT *context, const
+NT_USER_TOKEN *access_token, uint32 access_desired, const DOM_SID
+*accountsid, SAM_ACCOUNT_HANDLE **account)
+</programlisting></para>
+
+<para>Allocates a handle and stores the allocation context on that handle.</para>
+
+<para>I think that the following:</para>
+
+<para><programlisting>
+NTSTATUS sam_enum_accounts(const SAM_CONTEXT *context, const
+NT_USER_TOKEN *access_token, const DOM_SID *domainsid, uint16 acct_ctrl,
+int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+</programlisting></para>
+
+</sect1>
+
+<sect1>
+<title>Testing</title>
+
+<para>
+Testing is vital in any piece of software, and Samba is certainly no
+exception. In designing this new subsystem, we have taken care to ensure
+it is easily tested, independent of outside protocols.
+</para>
+
+<para>
+To this end, Jelmer has constructed 'samtest'.  
+</para>
+
+<para>
+This utility (see torture/samtest.c) is structured like rpcclient, but
+instead operates on the SAM subsystem.  It creates a 'custom' SAM
+context, that may be distinct from the default values used by the rest
+of the system, and can load a separate configuration file.  
+</para>
+
+<para>
+A small number of commands are currently implemented, but these have
+already proved vital in testing.   I expect SAM module authors will find
+it particularly valuable.
+</para>
+
+<para>Example useage:</para>
+
+<para><prompt>$</prompt> <command>bin/samtest</command></para>
+
+<para><programlisting>
+> context ads:ldap://192.168.1.96
+</programlisting>
+(this loads a new context, using the new ADS module.  The parameter is
+the 'location' of the ldap server)
+</para>
+
+<para><programlisting>
+> lookup_name DOMAIN abartlet
+</programlisting>
+(returns a sid).
+</para>
+
+<para>
+Because the 'new SAM' is NT ACL based, there will be a command to
+specify an arbitrary NT ACL, but for now it uses 'system' by default.
+</para>
+</sect1>
+</chapter>
diff --git a/docs/docbook/devdoc/unix-smb.xml b/docs/docbook/devdoc/unix-smb.xml
new file mode 100644 (file)
index 0000000..d6a6580
--- /dev/null
@@ -0,0 +1,316 @@
+<chapter id="unix-smb">
+<chapterinfo>
+       <author>
+               <firstname>Andrew</firstname><surname>Tridgell</surname>
+       </author>
+       <pubdate>April 1995</pubdate>
+</chapterinfo>
+
+<title>NetBIOS in a Unix World</title>
+
+<sect1>
+<title>Introduction</title>
+<para>
+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&lt;-&gt;PC
+interoperability.
+</para>
+
+<para>
+It was written to help out a person who was writing a paper on unix to
+PC connectivity.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Usernames</title>
+<para>
+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.
+</para>
+
+<para>
+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. 
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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).
+</para>
+
+</sect1>
+
+<sect1>
+<title>File Ownership</title>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+There are several possible solutions to this problem, including
+username mapping, and forcing a specific username for particular
+shares.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Passwords</title>
+
+<para>
+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.
+</para>
+
+<para>
+Unix passwords are case sensitive. So if users use mixed case
+passwords they are in trouble.
+</para>
+
+<para>
+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).
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Locking</title>
+<para>
+Since samba 2.2, samba supports other types of locking as well. This 
+section is outdated.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Deny Modes</title>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Trapdoor UIDs</title>
+<para>
+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.
+</para>
+
+<para>
+Note that you can also get the "trapdoor uid" message for other
+reasons. Please see the FAQ for details.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Port numbers</title>
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Protocol Complexity</title>
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+</sect1>
+</chapter>
+
diff --git a/docs/docbook/devdoc/wins.xml b/docs/docbook/devdoc/wins.xml
new file mode 100644 (file)
index 0000000..5341031
--- /dev/null
@@ -0,0 +1,79 @@
+<chapter id="wins">
+<chapterinfo>
+       <author>
+               <firstname>Gerald</firstname><surname>Carter</surname>
+       </author>
+       <pubdate>October 2002</pubdate>
+</chapterinfo>
+
+
+<title>Samba WINS Internals</title>
+
+
+<sect1>
+<title>WINS Failover</title>
+
+
+<para>
+The current Samba codebase possesses the capability to use groups of WINS
+servers that share a common namespace for NetBIOS name registration and 
+resolution.  The formal parameter syntax is
+</para>
+
+<para><programlisting>
+       WINS_SERVER_PARAM       = SERVER [ SEPARATOR SERVER_LIST ]
+       WINS_SERVER_PARAM       = &quot;wins server&quot;
+       SERVER                  = ADDR[:TAG]
+       ADDR                    = ip_addr | fqdn
+       TAG                     = string
+       SEPARATOR               = comma | \s+
+       SERVER_LIST             = SERVER [ SEPARATOR SERVER_LIST ]
+</programlisting></para>
+
+<para>
+A simple example of a valid wins server setting is
+</para>
+
+<para><programlisting>
+[global]
+       wins server = 192.168.1.2 192.168.1.3
+</programlisting></para>
+
+<para>
+In the event that no TAG is defined in for a SERVER in the list, smbd assigns a default
+TAG of &quot;*&quot;.  A TAG is used to group servers of a shared NetBIOS namespace together.  Upon
+startup, nmbd will attempt to register the netbios name value with one server in each
+tagged group.
+</para>
+
+<para>
+An example using tags to group WINS servers together is show here.  Note that the use of
+interface names in the tags is only by convention and is not a technical requirement.
+</para>
+
+
+<para><programlisting>
+[global]
+       wins server = 192.168.1.2:eth0 192.168.1.3:eth0 192.168.2.2:eth1
+</programlisting></para>
+
+<para>
+Using this configuration, nmbd would attempt to register the server's NetBIOS name 
+with one WINS server in each group.  Because the &quot;eth0&quot; group has two servers, the 
+second server would only be used when a registration (or resolution) request to 
+the first server in that group timed out.
+</para>
+
+<para>
+NetBIOS name resolution follows a similar pattern as name registration.  When resolving 
+a NetBIOS name via WINS, smbd and other Samba programs will attempt to query a single WINS 
+server in a tagged group until either a positive response is obtained at least once or 
+until a server from every tagged group has responded negatively to the name query request.
+If a timeout occurs when querying a specific WINS server, that server is marked as down to 
+prevent further timeouts and the next server in the WINS group is contacted.  Once marked as 
+dead, Samba will not attempt to contact that server for name registration/resolution queries 
+for a period of 10 minutes.
+</para>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/faq/clientapp.xml b/docs/docbook/faq/clientapp.xml
new file mode 100644 (file)
index 0000000..3d44dd4
--- /dev/null
@@ -0,0 +1,101 @@
+<chapter id="FAQ-ClientApp">
+<title>Specific client application problems</title>
+
+<sect1>
+<title>MS Office Setup reports "Cannot change properties of '\\MSOFFICE\\SETUP.INI'"</title>
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>How to use a Samba share as an administrative share for MS Office, etc.</title>
+
+<para>
+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.
+</para>
+
+<para>
+The general mechanism for implementing an adminstrative installation involves
+running <command>X:\setup /A</command>, where X is the drive letter of either CDROM or floppy.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<itemizedlist>
+<listitem><para>
+As soon as the administrative installation (unpacking) has completed
+set the following parameters on the share containing it:
+</para>
+
+<para><programlisting>
+[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
+</programlisting></para>
+
+</listitem>
+
+<listitem>
+<para>Now you are ready to run the setup program from the Microsoft Windows
+workstation as follows: <command>\\"Server_Name"\MSOP95\msoffice\setup</command>
+</para>
+</listitem>
+</itemizedlist>
+
+</sect1>
+
+<sect1>
+<title>Microsoft Access database opening errors</title>
+
+<para>
+Here are some notes on running MS-Access on a Samba drive from <ulink url="stefank@esi.com.au">Stefan Kjellberg</ulink>
+</para>
+
+<para><simplelist>
+<member>Opening a database in 'exclusive' mode does NOT work. Samba ignores r/w/share modes on file open.</member>
+<member>Make sure that you open the database as 'shared' and to 'lock modified records'</member>
+<member>Of course locking must be enabled for the particular share (smb.conf)</member>
+</simplelist>
+</para>
+
+</sect1>
+</chapter>
diff --git a/docs/docbook/faq/config.xml b/docs/docbook/faq/config.xml
new file mode 100644 (file)
index 0000000..2c17c86
--- /dev/null
@@ -0,0 +1,37 @@
+<chapter id="FAQ-Config">
+<title>Configuration problems</title>
+
+<sect1>
+<title>I have set 'force user' and samba still makes 'root' the owner of all the files I touch!</title>
+<para>
+When you have a user in 'admin users', samba will always do file operations for 
+this user as 'root', even if 'force user' has been set.
+</para>
+</sect1>
+
+<sect1>
+<title>I have just installed samba and I'm trying to log in from Windows, but samba refuses all logins!</title>
+
+<para>
+Newer windows clients(NT4, 2000, XP) send encrypted passwords. Samba can't compare these 
+passwords to the unix password database, so it needs it's own user database. You can 
+add users to this database using "smbpasswd -a user-name".
+</para>
+
+<para>
+See also the "User database" chapter of the samba HOWTO Collection.
+</para>
+</sect1>
+
+<sect1>
+<title>How can I make samba use netbios scope ID's</title>
+
+<para>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 'netbios scope' smb.conf option.
+All your PCs will need to have the same setting for 
+this to work. Scope ID's are not recommended.</para>
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/faq/errors.xml b/docs/docbook/faq/errors.xml
new file mode 100644 (file)
index 0000000..97619ce
--- /dev/null
@@ -0,0 +1,176 @@
+<chapter id="FAQ-errors">
+
+<title>Common errors</title>
+
+<sect1>
+<title>Not listening for calling name</title>
+
+<para>
+<programlisting>
+Session request failed (131,129) with myname=HOBBES destname=CALVIN
+Not listening for calling name
+</programlisting>
+</para>
+
+<para>
+If you get this when talking to a Samba box then it means that your
+global "hosts allow" or "hosts deny" settings are causing the Samba 
+server to refuse the connection. 
+</para>
+
+<para>
+Look carefully at your "hosts allow" and "hosts deny" lines in the
+global section of smb.conf. 
+</para>
+
+<para>
+It can also be a problem with reverse DNS lookups not functioning 
+correctly, leading to the remote host identity not being able to
+be confirmed, but that is less likely.
+</para>
+</sect1>
+
+<sect1>
+<title>System Error 1240</title>
+
+<para>
+System error 1240 means that the client is refusing to talk
+to a non-encrypting server. Microsoft changed WinNT in service
+pack 3 to refuse to connect to servers that do not support
+SMB password encryption.
+</para>
+
+<para>There are two main solutions:
+<simplelist>
+<member>enable SMB password encryption in Samba. See the encryption part of 
+the samba HOWTO Collection</member>
+
+<member>disable this new behaviour in NT. See the section about 
+Windows NT in the chapter "Portability" of the samba HOWTO collection
+</member>
+</simplelist>
+</para>
+</sect1>
+
+<sect1>
+<title>smbclient ignores -N !</title>
+
+<para>
+<quote>When getting the list of shares available on a host using the command
+<command>smbclient -N -L</command>
+the program always prompts for the password if the server is a Samba server.
+It also ignores the "-N" argument when querying some (but not all) of our
+NT servers.
+</quote>
+</para>
+<para>
+No, it does not ignore -N, it is just that your server rejected the 
+null password in the connection, so smbclient prompts for a password
+to try again.
+</para>
+
+<para>
+To get the behaviour that you probably want use <command>smbclient -L host -U%</command>
+</para>
+
+<para>
+This will set both the username and password to null, which is
+an anonymous login for SMB. Using -N would only set the password
+to null, and this is not accepted as an anonymous login for most
+SMB servers.
+</para>
+
+</sect1>
+
+<sect1>
+<title>The data on the CD-Drive I've shared seems to be corrupted!</title>
+
+<para>
+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.
+</para>
+
+<para>
+To overcome this problem use conv=binary when mounting the cdrom
+before exporting it with Samba.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Why can users access home directories of other users?</title>
+
+<para>
+<quote>
+We are unable to keep individual users from mapping to any other user's
+home directory once they have supplied a valid password! They only need
+to enter their own password. I have not found *any* method that I can
+use to configure samba to enforce that only a user may map their own
+home directory.
+</quote>
+</para>
+<para><quote>
+User xyzzy can map his home directory. Once mapped user xyzzy can also map
+*anyone* elses home directory!
+</quote></para>
+
+<para>
+This is not a security flaw, it is by design. Samba allows
+users to have *exactly* the same access to the UNIX filesystem
+as they would if they were logged onto the UNIX box, except
+that it only allows such views onto the file system as are
+allowed by the defined shares.
+</para>
+
+<para>
+This means that if your UNIX home directories are set up
+such that one user can happily cd into another users
+directory and do an ls, the UNIX security solution is to 
+change the UNIX file permissions on the users home directories
+such that the cd and ls would be denied.
+</para>
+
+<para>
+Samba tries very hard not to second guess the UNIX administrators
+security policies, and trusts the UNIX admin to set
+the policies and permissions he or she desires.
+</para>
+
+<para>
+Samba does allow the setup you require when you have set the
+"only user = yes" option on the share, is that you have not set the
+valid users list for the share.
+</para>
+
+<para>
+Note that only user works in conjunction with the users= list,
+so to get the behavior you require, add the line :
+<programlisting>
+users = %S
+</programlisting>
+this is equivalent to:
+<programlisting>
+valid users = %S
+</programlisting>
+to the definition of the [homes] share, as recommended in
+the smb.conf man page.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Until a few minutes after samba has started, clients get the error "Domain Controller Unavailable"</title>
+<para>
+A domain controller has to announce on the network who it is. This usually takes a while.
+</para>
+</sect1>
+
+<sect1>
+<title>I'm getting "open_oplock_ipc: Failed to get local UDP socket for address 100007f. Error was Cannot assign requested" in the logs</title>
+<para>Your loopback device isn't working correctly. Make sure it's running.
+</para>
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/faq/features.xml b/docs/docbook/faq/features.xml
new file mode 100644 (file)
index 0000000..66b0537
--- /dev/null
@@ -0,0 +1,374 @@
+<chapter id="FAQ-features">
+
+<title>Features</title>
+
+<sect1>
+<title>How can I prevent my samba server from being used to distribute the Nimda worm?</title>
+
+<para>Author: HASEGAWA Yosuke (translated by <ulink url="monyo@samba.gr.jp">TAKAHASHI Motonobu</ulink>)</para>
+
+<para>
+Nimba Worm is infected through shared disks on a network, as well as through
+Microsoft IIS, Internet Explorer and mailer of Outlook series.
+</para>
+
+<para>
+At this time, the worm copies itself by the name *.nws and *.eml on
+the shared disk, moreover, by the name of Riched20.dll in the folder
+where *.doc file is included.
+</para>
+
+<para>
+To prevent infection through the shared disk offered by Samba, set
+up as follows:
+</para>
+
+<para>
+<programlisting>
+[global]
+  ...
+  # This can break Administration installations of Office2k.
+  # in that case, don't veto the riched20.dll
+  veto files = /*.eml/*.nws/riched20.dll/
+</programlisting>
+</para>
+
+<para>
+By setting the "veto files" parameter, matched files on the Samba
+server are completely hidden from the clients and making it impossible
+to access them at all.
+</para>
+
+<para>
+In addition to it, the following setting is also pointed out by the
+samba-jp:09448 thread: when the
+"readme.txt.{3050F4D8-98B5-11CF-BB82-00AA00BDCE0B}" file exists on
+a Samba server, it is visible only as "readme.txt" and dangerous
+code may be executed if this file is double-clicked.
+</para>
+
+<para>
+Setting the following,
+<programlisting>
+  veto files = /*.{*}/
+</programlisting>
+any files having CLSID in its file extension will be inaccessible from any
+clients.
+</para>
+
+<para>
+This technical article is created based on the discussion of
+samba-jp:09448 and samba-jp:10900 threads.
+</para>
+</sect1>
+
+<sect1>
+<title>How can I use samba as a fax server?</title>
+
+<para>Contributor: <ulink url="mailto:zuber@berlin.snafu.de">Gerhard Zuber</ulink></para>
+
+<para>Requirements:
+<simplelist>
+<member>UNIX box (Linux preferred) with SAMBA and a faxmodem</member>
+<member>ghostscript package</member>
+<member>mgetty+sendfax package</member>
+<member>pbm package (portable bitmap tools)</member>
+</simplelist>
+</para>
+
+<para>First, install and configure the required packages. Be sure to read the mgetty+sendfax 
+manual carefully.</para>
+
+<sect2>
+<title>Tools for printing faxes</title>
+
+<para>Your incomed faxes are in:
+<filename>/var/spool/fax/incoming</filename>. Print it with:</para>
+
+<para><programlisting>
+for i in *
+do
+g3cat $i | g3tolj | lpr -P hp
+done
+</programlisting>
+</para>
+
+<para>
+g3cat is in the tools-section, g3tolj is in the contrib-section
+for printing to HP lasers.
+</para>
+
+<para>
+If you want to produce files for displaying and printing with Windows, use
+some tools from the pbm-package like the following command: <command>g3cat $i | g3topbm - |  ppmtopcx - >$i.pcx</command>
+and view it with your favourite Windows tool (maybe paintbrush)
+</para>
+
+</sect2>
+
+<sect2>
+<title>Making the fax-server</title>
+
+<para>fetch the file <filename>mgetty+sendfax/frontends/winword/faxfilter</filename> and place it in <filename>/usr/local/etc/mgetty+sendfax/</filename>(replace /usr/local/ with whatever place you installed mgetty+sendfax)</para>
+
+<para>prepare your faxspool file as mentioned in this file
+edit fax/faxspool.in and reinstall or change the final
+/usr/local/bin/faxspool too.
+</para>
+
+<para><programlisting>
+if [ "$user" = "root" -o "$user" = "fax" -o \
+     "$user" = "lp" -o "$user" = "daemon" -o "$user" = "bin" ]
+</programlisting></para>
+
+<para>find the first line and change it to the second.</para>
+
+<para>
+make sure you have pbmtext (from the pbm-package). This is
+needed for creating the small header line on each page.
+</para>
+
+<para>Prepare your faxheader <filename>/usr/local/etc/mgetty+sendfax/faxheader</filename></para>
+
+<para>
+Edit your /etc/printcap file:
+<programlisting>
+# 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:
+</programlisting></para>
+
+<para>Now, edit your <filename>smb.conf</filename> so you have a smb based printer named "fax"</para>
+
+</sect2>
+
+<sect2>
+<title>Installing the client drivers</title>
+
+<para>
+Now you have a printer called "fax" which can be used via
+TCP/IP-printing (lpd-system) or via SAMBA (windows printing).
+</para>
+
+<para>
+On every system you are able to produce postscript-files you
+are ready to fax.
+</para>
+
+<para>
+On Windows 3.1 95 and NT:
+</para>
+
+<para>
+Install a printer wich produces postscript output,
+   e.g.  apple laserwriter
+</para>
+
+<para>Connect the "fax" to your printer.</para>
+
+<para>
+Now write your first fax. Use your favourite wordprocessor,
+write, winword, notepad or whatever you want, and start
+with the headerpage.
+</para>
+
+<para>
+Usually each fax has a header page. It carries your name,
+your address, your phone/fax-number.
+</para>
+
+<para>
+It carries also the recipient, his address and his *** fax
+number ***. Now here is the trick:
+</para>
+
+<para>
+Use the text:
+<programlisting>
+Fax-Nr: 123456789
+</programlisting>
+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).
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+Now print your fax through the fax-printer and it will be
+queued for later transmission. Use faxrunq for sending the
+queue out.
+</para>
+
+</sect2>
+
+<sect2>
+<title>Example smb.conf</title>
+
+<para><programlisting>
+[global]
+ 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
+</programlisting></para>
+
+</sect2>
+</sect1>
+
+<sect1>
+<title>Samba doesn't work well together with DHCP!</title>
+
+<para>
+We wish to help those folks who wish to use the ISC DHCP Server and provide
+sample configuration settings. Most operating systems today come ship with
+the ISC DHCP Server. ISC DHCP is available from:
+<ulink url="ftp://ftp.isc.org/isc/dhcp">ftp://ftp.isc.org/isc/dhcp</ulink>
+</para>
+
+<para>
+Incorrect configuration of MS Windows clients (Windows9X, Windows ME, Windows
+NT/2000) will lead to problems with browsing and with general network
+operation. Windows 9X/ME users often report problems where the TCP/IP and related
+network settings will inadvertantly become reset at machine start-up resulting
+in loss of configuration settings. This results in increased maintenance
+overheads as well as serious user frustration.
+</para>
+
+<para>
+In recent times users on one mailing list incorrectly attributed the cause of
+network operating problems to incorrect configuration of Samba.
+</para>
+
+<para>
+One user insisted that the only way to provent Windows95 from periodically
+performing a full system reset and hardware detection process on start-up was
+to install the NetBEUI protocol in addition to TCP/IP. This assertion is not
+correct.
+</para>
+
+<para>
+In the first place, there is NO need for NetBEUI. All Microsoft Windows clients
+natively run NetBIOS over TCP/IP, and that is the only protocol that is
+recognised by Samba. Installation of NetBEUI and/or NetBIOS over IPX will
+cause problems with browse list operation on most networks. Even Windows NT
+networks experience these problems when incorrectly configured Windows95
+systems share the same name space. It is important that only those protocols
+that are strictly needed for site specific reasons should EVER be installed.
+</para>
+
+<para>
+Secondly, and totally against common opinion, DHCP is NOT an evil design but is
+an extension of the BOOTP protocol that has been in use in Unix environments
+for many years without any of the melt-down problems that some sensationalists
+would have us believe can be experienced with DHCP. In fact, DHCP in covered by
+rfc1541 and is a very safe method of keeping an MS Windows desktop environment
+under control and for ensuring stable network operation.
+</para>
+
+<para>
+Please note that MS Windows systems as of MS Windows NT 3.1 and MS Windows 95
+store all network configuration settings a registry. There are a few reports
+from MS Windows network administrators that warrant mention here. It would appear
+that when one sets certain MS TCP/IP protocol settings (either directly or via
+DHCP) that these do get written to the registry. Even though a subsequent
+change of setting may occur the old value may persist in the registry. This
+has been known to create serious networking problems.
+</para>
+
+<para>
+An example of this occurs when a manual TCP/IP environment is configured to
+include a NetBIOS Scope. In this event, when the administrator then changes the
+configuration of the MS TCP/IP protocol stack, without first deleting the
+current settings, by simply checking the box to configure the MS TCP/IP stack
+via DHCP then the NetBIOS Scope that is still persistent in the registry WILL be
+applied to the resulting DHCP offered settings UNLESS the DHCP server also sets
+a NetBIOS Scope. It may therefore be prudent to forcibly apply a NULL NetBIOS
+Scope from your DHCP server. The can be done in the dhcpd.conf file with the
+parameter:
+<command>option netbios-scope "";</command>
+</para>
+
+<para>
+While it is true that the Microsoft DHCP server that comes with Windows NT
+Server provides only a sub-set of rfc1533 functionality this is hardly an issue
+in those sites that already have a large investment and commitment to Unix
+systems and technologies. The current state of the art of the DHCP Server
+specification in covered in rfc2132.
+</para>
+
+</sect1>
+
+<sect1>
+<title>How can I assign NetBIOS names to clients with DHCP?</title>
+
+<para>
+SMB network clients need to be configured so that all standard TCP/IP name to
+address resolution works correctly. Once this has been achieved the SMB
+environment provides additional tools and services that act as helper agents in
+the translation of SMB (NetBIOS) names to their appropriate IP Addresses. One
+such helper agent is the NetBIOS Name Server (NBNS) or as Microsoft called it
+in their Windows NT Server implementation WINS (Windows Internet Name Server).
+</para>
+
+<para>
+A client needs to be configured so that it has a unique Machine (Computer)
+Name.
+</para>
+
+<para>
+This can be done, but needs a few NT registry hacks and you need to be able to
+speak UNICODE, which is of course no problem for a True Wizzard(tm) :)
+Instructions on how to do this (including a small util for less capable
+Wizzards) can be found at
+</para>
+
+<para><ulink url="http://www.unixtools.org/~nneul/sw/nt/dhcp-netbios-hostname.html">http://www.unixtools.org/~nneul/sw/nt/dhcp-netbios-hostname.html</ulink></para>
+
+</sect1>
+
+<sect1>
+<title>How do I convert between unix and dos text formats?</title>
+
+<para>
+Jim barry has written an <ulink url="ftp://samba.org/pub/samba/contributed/fixcrlf.zip">
+excellent drag-and-drop cr/lf converter for
+windows</ulink>. Just drag your file onto the icon and it converts the file.
+</para>
+
+<para>
+The utilities unix2dos and dos2unix(in the mtools package) should do 
+the job under unix.
+</para>
+
+</sect1>
+
+<sect1>
+<title>Does samba have wins replication support?</title>
+
+<para>
+At the time of writing there is currently being worked on a wins replication implementation(wrepld).
+</para>
+
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/faq/general.xml b/docs/docbook/faq/general.xml
new file mode 100644 (file)
index 0000000..54c620b
--- /dev/null
@@ -0,0 +1,131 @@
+<chapter id="FAQ-general">
+<title>General Information</title>
+
+<sect1>
+<title>Where can I get it?</title>
+<para>
+The Samba suite is available at the <ulink url="http://samba.org/">samba website</ulink>.
+</para>
+</sect1>
+
+<sect1>
+<title>What do the version numbers mean?</title>
+<para>
+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.
+</para>
+
+<para>
+How the scheme works:
+<simplelist>
+<member>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.)</member>
+
+<member>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.</member>
+
+<member>When the release manager, currently Jerry, 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.</member>
+
+<member>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.</member>
+</simplelist>
+</para>
+
+<para>
+So the progression goes:
+
+<programlisting>
+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)
+</programlisting>
+</para>
+
+<para>
+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.
+</para>
+
+</sect1>
+
+<sect1>
+<title>What platforms are supported?</title>
+<para>
+Many different platforms have run Samba successfully. The platforms
+most widely used and thus best tested are Linux and SunOS.</para>
+
+<para>
+At time of writing, there is support (or has been support for in earlier 
+versions):
+</para>
+
+<simplelist>
+<member>A/UX 3.0</member>
+<member>AIX</member>
+<member>Altos Series 386/1000</member>
+<member>Amiga</member>
+<member>Apollo Domain/OS sr10.3</member>
+<member>BSDI </member>
+<member>B.O.S. (Bull Operating System)</member>
+<member>Cray, Unicos 8.0</member>
+<member>Convex</member>
+<member>DGUX. </member>
+<member>DNIX.</member>
+<member>FreeBSD</member>
+<member>HP-UX</member>
+<member>Intergraph. </member>
+<member>Linux with/without shadow passwords and quota</member>
+<member>LYNX 2.3.0</member>
+<member>MachTen (a unix like system for Macintoshes)</member>
+<member>Motorola 88xxx/9xx range of machines</member>
+<member>NetBSD</member>
+<member>NEXTSTEP Release 2.X, 3.0 and greater (including OPENSTEP for Mach).</member>
+<member>OS/2 using EMX 0.9b</member>
+<member>OSF1</member>
+<member>QNX 4.22</member>
+<member>RiscIX. </member>
+<member>RISCOs 5.0B</member>
+<member>SEQUENT. </member>
+<member>SCO (including: 3.2v2, European dist., OpenServer 5)</member>
+<member>SGI.</member>
+<member>SMP_DC.OSx v1.1-94c079 on Pyramid S series</member>
+<member>SONY NEWS, NEWS-OS (4.2.x and 6.1.x)</member>
+<member>SUNOS 4</member>
+<member>SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')</member>
+<member>Sunsoft ISC SVR3V4</member>
+<member>SVR4</member>
+<member>System V with some berkely extensions (Motorola 88k R32V3.2).</member>
+<member>ULTRIX.</member>
+<member>UNIXWARE</member>
+<member>UXP/DS</member>
+</simplelist>
+
+</sect1>
+
+<sect1>
+<title>How do I subscribe to the Samba Mailing Lists?</title>
+<para>
+Look at <ulink url="http://samba.org/samba/archives.html">the samba mailing list page</ulink>
+</para>
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/faq/install.xml b/docs/docbook/faq/install.xml
new file mode 100644 (file)
index 0000000..f8341dc
--- /dev/null
@@ -0,0 +1,333 @@
+<chapter id="FAQ-Install">
+<title>Compiling and installing Samba on a Unix host</title>
+
+<sect1>
+<title>I can't see the Samba server in any browse lists!</title>
+<para>
+See Browsing.html in the docs directory of the samba source
+for more information on browsing.
+</para>
+
+<para>
+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:
+<programlisting>
+   net use M: \\mary\fred
+</programlisting>
+The details of how to do this and the specific syntax varies from
+client to client - check your client's documentation.
+</para>
+</sect1>
+
+<sect1>
+<title>Some files that I KNOW are on the server don't show up when I view the files from my client!</title>
+<para>See the next question.</para>
+</sect1>
+
+<sect1>
+<title>Some files on the server show up with really wierd filenames when I view the files from my client!</title>
+<para>
+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).
+</para>
+
+<para>
+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".
+</para>
+</sect1>
+
+<sect1>
+<title>My client reports "cannot locate specified computer" or similar</title>
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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 Lan 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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+By the way, remember to REMOVE the hardcoded mapping before further
+tests :-)
+</para>
+
+</sect1>
+
+<sect1>
+<title>My client reports "cannot locate specified share name" or similar</title>
+<para>
+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.
+</para>
+
+<para>
+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 docs on how
+to specify a service name correctly), read on:
+</para>
+
+<simplelist>
+<member>Many clients cannot accept or use service names longer than eight characters.</member>
+<member>Many clients cannot accept or use service names containing spaces.</member>
+<member>Some servers (not Samba though) are case sensitive with service names.</member>
+<member>Some clients force service names into upper case.</member>
+</simplelist>
+</sect1>
+
+<sect1>
+<title>Printing doesn't work</title>
+<para>
+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").
+</para>
+
+<para>
+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".
+</para>
+
+<para>
+Make sure that the user specified in the service is permitted to use
+the printer.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+If using WfWg then you need to set the default protocol to TCP/IP, not
+Netbeui. This is a WfWg bug.
+</para>
+
+<para>
+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.
+</para>
+</sect1>
+
+<sect1>
+<title>My client reports "This server is not configured to list shared resources"</title>
+<para>
+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.
+</para>
+
+<para>See also 'guest account' in smb.conf man page.</para>
+
+</sect1>
+
+<sect1>
+<title>Log message "you appear to have a trapdoor uid system" </title>
+<para>
+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.
+</para>
+
+<para>It might also mean that your OS has a trapdoor uid/gid system :-)</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+Complain to your OS vendor and ask them to fix their system.
+</para>
+
+<para>
+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!
+</para>
+
+</sect1>
+
+<sect1>
+<title>Why are my file's timestamps off by an hour, or by a few hours?</title>
+<para>
+This is from Paul Eggert eggert@twinsun.com.
+</para>
+
+<para>
+Most likely it's a problem with your time zone settings.
+</para>
+
+<para>
+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.
+</para>
+
+<para>
+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.
+<simplelist>
+<member>The Unix system clock must have the correct Universal time. Use the shell command "sh -c 'TZ=UTC0 date'" to check this.</member>
+<member>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'.</member>
+</simplelist>
+</para>
+
+<para>TZ must have the correct value.</para>
+
+<para>
+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 <ulink url="ftp://elsie.nci.nih.gov/pub/">ftp://elsie.nci.nih.gov/pub/</ulink>.
+</para>
+
+<para>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):
+<programlisting>
+       StdOffset[Dst[Offset],Date/Time,Date/Time]
+</programlisting>
+                where:
+</para>
+
+<para><simplelist>
+<member>`Std' is the standard time designation (e.g. `PST').</member>
+<member>`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.</member>
+
+<member>`Dst' is the daylight-saving time designation
+(e.g. `PDT').</member>
+
+<member>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.
+</member>
+
+<member>`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.
+</member>
+
+</simplelist>
+</para>
+
+<para>
+Other Posix string formats are allowed but you don't want
+to know about them.</para>
+
+<para>
+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.  
+</para>
+</sect1>
+
+<sect1>
+<title>How do I set the printer driver name correctly?</title>
+<para>Question:
+<quote> On NT, I opened "Printer Manager" and "Connect to Printer".
+ Enter ["\\ptdi270\ps1"] in the box of printer. I got the
+ following error message
+ </quote></para>
+ <para>
+ <programlisting>
+     You do not have sufficient access to your machine
+     to connect to the selected printer, since a driver
+     needs to be installed locally.
+ </programlisting>
+ </para>
+
+ <para>Answer:</para>
+
+ <para>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:</para>
+<para><programlisting>
+     printer driver = HP LaserJet 4L
+</programlisting></para>
+<para>With this, NT knows to use the right driver. You have to get this string
+exactly right.</para>
+
+<para>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.</para>
+
+</sect1>
+
+</chapter>
diff --git a/docs/docbook/faq/printing.xml b/docs/docbook/faq/printing.xml
new file mode 100644 (file)
index 0000000..be2acbd
--- /dev/null
@@ -0,0 +1,38 @@
+<chapter id="FAQ-Printing">
+<!-- Kurt Pfeifle's HOWTO chapter on printing should make this obsolete -->
+<chapterinfo>
+<author>
+       <firstname>Ronan</firstname><surname>Waide</surname>
+</author>
+</chapterinfo>
+
+<title>Printing problems</title>
+
+<sect1>
+<title>setdriver or cupsaddsmb failes</title>
+<para>
+setdriver expects the following setup:
+
+<simplelist>
+<member>you are a printer admin, or root. this is the smb.conf printer admin group, not the Printer Operators group in NT. I've not tried the latter, but I don't believe it will work based on the current code.</member>
+<member>printer admins has to be defined in [global]</member>
+<member>upload the driver files to \\server\print$\w32x86 and win40 as appropriate. DON'T put them in the 0 or 2 subdirectories.</member>
+<member>Make sure that the user you're connecting as is able to write to the print$ directories</member>
+<member>Use adddriver (with appropriate parameters) to create the driver. note, this will not just update samba's notion of drivers, it will also move the files from the w32x86 and win40 directories to an appropriate subdirectory (based on driver version, I think, but not important enough for me to find out)</member>
+<member>Use setdriver to associate the driver with a printer</member>
+</simplelist>
+</para>
+
+<para>
+The setdriver call will fail if the printer doesn't already exist in
+samba's view of the world. Either create the printer in cups and
+restart samba, or create an add printer command (see smb.conf doco)
+and use RPC calls to create a printer. NB the add printer command MUST
+return a single line of text indicating which port the printer was
+added on. If it doesn't, Samba won't reload the printer
+definitions. Although samba doesn't really support the notion of
+ports, suitable add printer command and enumport command settings can
+allow you pretty good remote control of the samba printer setup.
+</para>
+</sect1>
+</chapter>
diff --git a/docs/docbook/faq/sambafaq.xml b/docs/docbook/faq/sambafaq.xml
new file mode 100644 (file)
index 0000000..d5dc3ae
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE book SYSTEM "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY general SYSTEM "general.xml">
+<!ENTITY install SYSTEM "install.xml">
+<!ENTITY errors SYSTEM "errors.xml">
+<!ENTITY clientapp SYSTEM "clientapp.xml">
+<!ENTITY features SYSTEM "features.xml">
+<!ENTITY config SYSTEM "config.xml">
+<!ENTITY printing SYSTEM "printing.xml">
+]>
+
+<book id="Samba-FAQ">
+<title>Samba FAQ</title>
+
+<bookinfo>
+       <author><surname>Samba Team</surname></author>
+       <pubdate>October 2002</pubdate>
+</bookinfo>
+
+<dedication>
+<para>
+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 3.0. Please send any
+corrections to the samba documentation mailinglist at
+<ulink url="mailto:samba-doc@samba.org">samba-doc@samba.org</ulink>. 
+This FAQ was based on the old Samba FAQ by Dan Shearer and Paul Blackman, 
+and the old samba text documents which were mostly written by John Terpstra.
+</para>
+</dedication>
+
+<toc/>
+
+&general;
+&install;
+&config;
+&clientapp;
+&errors;
+&features;
+&printing;
+</book>
diff --git a/docs/docbook/manpages/.cvsignore b/docs/docbook/manpages/.cvsignore
new file mode 100644 (file)
index 0000000..2d6c32d
--- /dev/null
@@ -0,0 +1 @@
+smb.conf.5.xml
\ No newline at end of file
diff --git a/docs/docbook/manpages/editreg.1.xml b/docs/docbook/manpages/editreg.1.xml
new file mode 100644 (file)
index 0000000..3427552
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="iso8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % globalentities SYSTEM './../global.ent'> %globalentities;
+]>
+<refentry id="editreg.1">
+
+<refmeta>
+       <refentrytitle>editreg</refentrytitle>
+       <manvolnum>1</manvolnum>
+</refmeta>
+
+
+<refnamediv>
+       <refname>editreg</refname>
+       <refpurpose>A utility to report and change SIDs in registry files
+       </refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+       <cmdsynopsis>
+               <command>editreg</command>
+               <arg choice="opt">-v</arg>
+               <arg choice="opt">-c file</arg>
+               <arg choice="req">file</arg>
+       </cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+       <title>DESCRIPTION</title>
+
+       <para>This tool is part of the <citerefentry><refentrytitle>Samba</refentrytitle>
+       <manvolnum>7</manvolnum></citerefentry> suite.</para>
+
+       <para><command>editreg</command> is a utility that 
+       can visualize windows registry files (currently only NT4) and apply 
+       so-called commandfiles to them. 
+       </para>
+</refsect1>
+
+
+<refsect1>
+       <title>OPTIONS</title>
+
+       <variablelist>
+               <varlistentry>
+               <term>registry_file</term>
+               <listitem><para>Registry file to view or edit.  </para></listitem>
+               </varlistentry>
+
+
+               <varlistentry>
+               <term>-v,--verbose</term>
+               <listitem><para>Increases verbosity of messages. 
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-c commandfile</term>
+               <listitem><para>Read commands to execute on <filename>registry_file</filename> from <filename>commandfile</filename>. Currently not yet supported!
+               </para></listitem>
+               </varlistentry>
+
+               &stdarg.help;
+               
+       </variablelist>
+</refsect1>
+
+<refsect1>
+       <title>VERSION</title>
+
+       <para>This man page is correct for version 3.0 of the Samba 
+       suite.</para>
+</refsect1>
+
+<refsect1>
+       <title>AUTHOR</title>
+       
+       <para>The original Samba software and related utilities 
+       were created by Andrew Tridgell. Samba is now developed
+       by the Samba Team as an Open Source project similar 
+       to the way the Linux kernel is developed.</para>
+       
+       <para>The editreg man page was written by Jelmer Vernooij. </para>
+</refsect1>
+
+</refentry>
diff --git a/docs/docbook/manpages/findsmb.1.xml b/docs/docbook/manpages/findsmb.1.xml
new file mode 100644 (file)
index 0000000..e5ec26c
--- /dev/null
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="iso8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % globalentities SYSTEM './../global.ent'> %globalentities;
+]>
+<refentry id="findsmb.1">
+
+<refmeta>
+       <refentrytitle>findsmb</refentrytitle>
+       <manvolnum>1</manvolnum>
+</refmeta>
+
+
+<refnamediv>
+       <refname>findsmb</refname>
+       <refpurpose>list info about machines that respond to SMB 
+       name queries on a subnet</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+       <cmdsynopsis>
+               <command>findsmb</command>
+               <arg choice="opt">subnet broadcast address</arg>
+       </cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+       <title>DESCRIPTION</title>
+       
+       <para>This perl script is part of the <citerefentry>
+       <refentrytitle>Samba</refentrytitle><manvolnum>7</manvolnum></citerefentry>
+       suite.</para>
+
+       <para><command>findsmb</command> is a perl script that
+       prints out several pieces of information about machines 
+       on a subnet that respond to SMB  name query requests.
+       It uses <citerefentry><refentrytitle>nmblookup</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+       and <citerefentry><refentrytitle>smbclient</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+       to obtain this information.
+       </para>
+</refsect1>            
+
+<refsect1>
+       <title>OPTIONS</title>
+
+       <variablelist>
+               <varlistentry>
+               <term>-r</term>
+               <listitem><para>Controls whether <command>findsmb</command> takes
+               bugs in Windows95 into account when trying to find a Netbios name
+               registered of the remote machine. This option is disabled by default
+               because it is specific to Windows 95 and Windows 95 machines only. 
+               If set, <citerefentry><refentrytitle>nmblookup</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+               will be called with <constant>-B</constant> option.</para></listitem>
+               </varlistentry>
+               <varlistentry>
+               <term>subnet broadcast address</term>
+               <listitem><para>Without this option, <command>findsmb
+               </command> will probe the subnet of the machine where 
+               <citerefentry><refentrytitle>findsmb</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+               is run. This value is passed to 
+               <citerefentry><refentrytitle>nmblookup</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+               as part of the <constant>-B</constant> option.</para></listitem>
+               </varlistentry>
+       </variablelist>
+</refsect1>
+
+<refsect1>
+       <title>EXAMPLES</title>
+
+       <para>The output of <command>findsmb</command> lists the following 
+       information for all machines that respond to the initial 
+       <command>nmblookup</command> for any name: IP address, NetBIOS name, 
+       Workgroup name, operating system, and SMB server version.</para>
+
+       <para>There will be a '+' in front of the workgroup name for 
+       machines that are local master browsers for that workgroup. There 
+       will be an '*' in front of the workgroup name for 
+       machines that are the domain master browser for that workgroup. 
+       Machines that are running Windows, Windows 95 or Windows 98 will 
+       not show any information about the operating system or server 
+       version.</para>
+
+       <para>The command with <constant>-r</constant> option
+       must be run on a system without <citerefentry>
+       <refentrytitle>nmbd</refentrytitle><manvolnum>8</manvolnum>
+       </citerefentry> running. 
+
+       If <command>nmbd</command> is running on the system, you will 
+       only  get the IP address and the DNS name of the machine. To 
+       get proper responses  from Windows 95 and Windows 98 machines, 
+       the command must be run as root and with <constant>-r</constant>
+       option on a machine without <command>nmbd</command> running.</para>
+
+       <para>For example, running <command>findsmb</command> 
+       without <constant>-r</constant> option set would yield output similar
+       to the following</para>
+
+<screen>
+IP ADDR         NETBIOS NAME   WORKGROUP/OS/VERSION 
+--------------------------------------------------------------------- 
+192.168.35.10   MINESET-TEST1  [DMVENGR]
+192.168.35.55   LINUXBOX      *[MYGROUP] [Unix] [Samba 2.0.6]
+192.168.35.56   HERBNT2        [HERB-NT]
+192.168.35.63   GANDALF        [MVENGR] [Unix] [Samba 2.0.5a for IRIX]
+192.168.35.65   SAUNA          [WORKGROUP] [Unix] [Samba 1.9.18p10]
+192.168.35.71   FROGSTAR       [ENGR] [Unix] [Samba 2.0.0 for IRIX]
+192.168.35.78   HERBDHCP1     +[HERB]
+192.168.35.88   SCNT2         +[MVENGR] [Windows NT 4.0] [NT LAN Manager 4.0]
+192.168.35.93   FROGSTAR-PC    [MVENGR] [Windows 5.0] [Windows 2000 LAN Manager]
+192.168.35.97   HERBNT1       *[HERB-NT] [Windows NT 4.0] [NT LAN Manager 4.0]
+</screen>
+
+</refsect1>
+
+
+<refsect1>
+       <title>VERSION</title>
+
+       <para>This man page is correct for version 3.0 of 
+       the Samba suite.</para>
+</refsect1>
+
+<refsect1>
+       <title>SEE ALSO</title>
+       <para><citerefentry>
+       <refentrytitle>nmbd</refentrytitle><manvolnum>8</manvolnum>
+       </citerefentry>,
+       <citerefentry><refentrytitle>smbclient</refentrytitle><manvolnum>1</manvolnum>
+       </citerefentry>, and <citerefentry><refentrytitle>nmblookup</refentrytitle>
+       <manvolnum>1</manvolnum></citerefentry>
+       </para>
+</refsect1>
+
+<refsect1>
+       <title>AUTHOR</title>
+       
+       <para>The original Samba software and related utilities 
+       were created by Andrew Tridgell. Samba is now developed
+       by the Samba Team as an Open Source project similar 
+       to the way the Linux kernel is developed.</para>
+       
+       <para>The original Samba man pages were written by Karl Auer. 
+       The man page sources were converted to YODL format (another 
+       excellent piece of Open Source software, available at <ulink 
+       url="ftp://ftp.icce.rug.nl/pub/unix/">ftp://ftp.icce.rug.nl/pub/unix/</ulink>) 
+       and updated for the Samba 2.0 release by Jeremy Allison.  The conversion to DocBook for 
+       Samba 2.2 was done by Gerald Carter. The conversion to DocBook
+       XML 4.2 for Samba 3.0 was done by Alexander Bokovoy.</para>
+</refsect1>
+
+</refentry>
diff --git a/docs/docbook/manpages/lmhosts.5.xml b/docs/docbook/manpages/lmhosts.5.xml
new file mode 100644 (file)
index 0000000..12d69a7
--- /dev/null
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="iso8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % globalentities SYSTEM './../global.ent'> %globalentities;
+]>
+<refentry id="lmhosts.5">
+
+<refmeta>
+       <refentrytitle>lmhosts</refentrytitle>
+       <manvolnum>5</manvolnum>
+</refmeta>
+
+
+<refnamediv>
+       <refname>lmhosts</refname>
+       <refpurpose>The Samba NetBIOS hosts file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+       <para><filename>lmhosts</filename> is the <citerefentry><refentrytitle>Samba</refentrytitle>
+       <manvolnum>7</manvolnum></citerefentry> NetBIOS name to IP address mapping file.</para> 
+</refsynopsisdiv>
+
+<refsect1>
+       <title>DESCRIPTION</title>
+       
+       <para>This file is part of the <citerefentry><refentrytitle>Samba</refentrytitle>
+       <manvolnum>7</manvolnum></citerefentry> suite.</para>
+
+       <para><filename>lmhosts</filename> is the <emphasis>Samba
+       </emphasis> NetBIOS name to IP address mapping file.  It 
+       is very similar to the <filename>/etc/hosts</filename> file 
+       format, except that the hostname component must correspond 
+       to the NetBIOS naming format.</para>
+</refsect1>
+
+<refsect1>
+       <title>FILE FORMAT</title>
+       <para>It is an ASCII file containing one line for NetBIOS name. 
+       The two fields on each line are separated from each other by 
+       white space. Any entry beginning with '#' is ignored. Each line 
+       in the lmhosts file contains the following information:</para>
+
+       <itemizedlist>
+               <listitem><para>IP Address - in dotted decimal format.</para>
+               </listitem>
+
+               <listitem><para>NetBIOS Name - This name format is a 
+               maximum fifteen character host name, with an optional 
+               trailing '#' character followed by the NetBIOS name type 
+               as two hexadecimal digits.</para>
+
+               <para>If the trailing '#' is omitted then the given IP 
+               address will be returned for all names that match the given 
+               name, whatever the NetBIOS name type in the lookup.</para>
+               </listitem>
+       </itemizedlist>
+
+       <para>An example follows:</para>
+       
+       <programlisting>
+#
+# Sample Samba lmhosts file.
+#
+192.9.200.1    TESTPC
+192.9.200.20   NTSERVER#20
+192.9.200.21   SAMBASERVER
+       </programlisting>
+       
+       <para>Contains three IP to NetBIOS name mappings. The first 
+       and third will be returned for any queries for the names "TESTPC" 
+       and "SAMBASERVER" respectively, whatever the type component of 
+       the NetBIOS name requested.</para>
+
+       <para>The second mapping will be returned only when the "0x20" name 
+       type for a name "NTSERVER" is queried. Any other name type will not 
+       be resolved.</para>
+
+       <para>The default location of the <filename>lmhosts</filename> file 
+       is in the same directory as the <citerefentry><refentrytitle>smb.conf</refentrytitle>
+       <manvolnum>5</manvolnum></citerefentry> file.</para>
+       
+</refsect1>
+
+<refsect1>
+       <title>VERSION</title>
+
+       <para>This man page is correct for version 3.0 of the Samba suite.</para>
+</refsect1>
+
+<refsect1>
+       <title>SEE ALSO</title>
+       <para><citerefentry>
+       <refentrytitle>smbclient</refentrytitle><manvolnum>1</manvolnum>
+       </citerefentry>, <citerefentry><refentrytitle>smb.conf</refentrytitle><manvolnum>5</manvolnum>
+       </citerefentry>, and <citerefentry><refentrytitle>smbpasswd</refentrytitle>
+       <manvolnum>8</manvolnum></citerefentry>
+       </para>
+</refsect1>
+
+<refsect1>
+       <title>AUTHOR</title>
+       
+       <para>The original Samba software and related utilities 
+       were created by Andrew Tridgell. Samba is now developed
+       by the Samba Team as an Open Source project similar 
+       to the way the Linux kernel is developed.</para>
+       
+       <para>The original Samba man pages were written by Karl Auer. 
+       The man page sources were converted to YODL format (another 
+       excellent piece of Open Source software, available at
+       <ulink url="ftp://ftp.icce.rug.nl/pub/unix/">
+       ftp://ftp.icce.rug.nl/pub/unix/</ulink>) and updated for the Samba 2.0 
+       release by Jeremy Allison.  The conversion to DocBook for 
+       Samba 2.2 was done by Gerald Carter. The conversion to DocBook
+       XML 4.2 was done by Alexander Bokovoy.</para>
+</refsect1>
+
+</refentry>
diff --git a/docs/docbook/manpages/net.8.xml b/docs/docbook/manpages/net.8.xml
new file mode 100644 (file)
index 0000000..c7874e6
--- /dev/null
@@ -0,0 +1,905 @@
+<?xml version="1.0" encoding="iso8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % globalentities SYSTEM './../global.ent'> %globalentities;
+
+<!-- This one is only used for adding users using RAP -->
+<!ENTITY net.arg.flags '
+<varlistentry>
+<term>-F flags</term>
+<listitem><para>
+FIXME. Defaults to 0x21
+</para></listitem>
+</varlistentry>'>
+
+<!-- This one is only used by shutdown (RPC) -->
+<!ENTITY net.arg.shutdown '
+<varlistentry>
+<term>-r</term>
+<listitem><para>
+Reboot after shutdown.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>-f</term>
+<listitem><para>
+Force shutting down all applications.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>-t timeout</term>
+<listitem><para>
+Timeout before system will be shut down. An interactive 
+user of the system can use this time to cancel the shutdown.
+</para></listitem>
+</varlistentry>'>
+]>
+
+<refentry id="net.8">
+
+<refmeta>
+       <refentrytitle>net</refentrytitle>
+       <manvolnum>8</manvolnum>
+</refmeta>
+
+
+<refnamediv>
+       <refname>net</refname>
+       <refpurpose>Tool for administration of Samba and remote
+       CIFS servers.
+       </refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+       <cmdsynopsis>
+               <command>net</command>
+               <arg choice="req">&lt;ads|rap|rpc&gt;</arg>
+               <arg choice="opt">-h</arg>
+               <arg choice="opt">-w workgroup</arg>
+               <arg choice="opt">-W myworkgroup</arg>
+               <arg choice="opt">-U user</arg>
+               <arg choice="opt">-I ip-address</arg>
+               <arg choice="opt">-p port</arg>
+               <arg choice="opt">-n myname</arg>
+               <arg choice="opt">-s conffile</arg>
+               <arg choice="opt">-S server</arg>
+               <arg choice="opt">-l</arg>
+               <arg choice="opt">-P</arg>
+               <arg choice="opt">-D debuglevel</arg>
+       </cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+       <title>DESCRIPTION</title>
+
+       <para>This tool is part of the <citerefentry><refentrytitle>Samba</refentrytitle>
+       <manvolnum>7</manvolnum></citerefentry> suite.</para>
+
+       <para>The samba net utility is meant to work just like the net utility 
+       available for windows and DOS. The first argument should be used 
+       to specify the protocol to use when executing a certain command. 
+       ADS is used for ActiveDirectory, RAP is using for old (Win9x/NT3) 
+       clients and RPC can be used for NT4 and Windows 2000. If this 
+       argument is omitted, net will try to determine it automatically. 
+       Not all commands are available on all protocols.
+       </para>
+
+</refsect1>
+
+<refsect1>
+       <title>OPTIONS</title>
+
+       <variablelist>
+               &stdarg.help;
+               
+               <varlistentry>
+               <term>-w target-workgroup</term>
+               <listitem><para>
+               Sets target workgroup or domain. You have to specify 
+               either this option or the IP address or the name of a server.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-W workgroup</term>
+               <listitem><para>
+               Sets client workgroup or domain
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-U user</term>
+               <listitem><para>
+               User name to use
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-I ip-address</term>
+               <listitem><para>
+               IP address of target server to use. You have to
+               specify either this option or a target workgroup or
+               a target server.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-p port</term>
+               <listitem><para>
+               Port on the target server to connect to (usually 139 or 445). 
+               Defaults to trying 445 first, then 139.
+               </para></listitem>
+               </varlistentry>
+
+               &stdarg.netbios.name;
+               &stdarg.configfile;
+
+               <varlistentry>
+               <term>-S server</term>
+               <listitem><para>
+               Name of target server. You should specify either 
+               this option or a target workgroup or a target IP address.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-l</term>
+               <listitem><para>
+               When listing data, give more information on each item.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-P</term>
+               <listitem><para>
+               Make queries to the external server using the machine account of the local server.
+               </para></listitem>
+               </varlistentry>
+
+               &stdarg.debug;
+       </variablelist>
+</refsect1>
+
+<refsect1>
+<title>COMMANDS</title>
+
+<refsect2>
+       <title>TIME</title>
+
+       <para>The <command>NET TIME</command> command allows you to view the time on a remote server
+       or synchronise the time on the local server with the time on the remote server.</para>
+
+<refsect3>
+<title>TIME</title>
+
+<para>Without any options, the <command>NET TIME</command> command 
+displays the time on the remote server.
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>TIME SYSTEM</title>
+
+<para> Displays the time on the remote server in a format ready for <command>/bin/date</command></para>
+
+</refsect3>
+
+<refsect3>
+<title>TIME SET</title>
+<para>Tries to set the date and time of the local server to that on 
+the remote server using <command>/bin/date</command>. </para>
+
+</refsect3>
+
+<refsect3>
+<title>TIME ZONE</title>
+
+<para>Displays the timezone in hours from GMT on the remote computer.</para>
+
+</refsect3>
+</refsect2>
+
+<refsect2>
+<title>[RPC|ADS] JOIN [TYPE] [-U username[%password]] [options]</title>
+
+<para>
+Join a domain.  If the account already exists on the server, and 
+[TYPE] is MEMBER, the machine will attempt to join automatically. 
+(Assuming that the machine has been created in server manager)
+Otherwise, a password will be prompted for, and a new account may
+be created.</para>
+
+<para>
+[TYPE] may be PDC, BDC or MEMBER to specify the type of server
+joining the domain.
+</para>
+</refsect2>
+
+<refsect2>
+<title>[RPC] OLDJOIN [options]</title>
+
+<para>Join a domain. Use the OLDJOIN option to join the domain 
+using the old style of domain joining - you need to create a trust 
+account in server manager first.</para>
+</refsect2>
+
+<refsect2>
+<title>[RPC|ADS] USER</title>
+
+<refsect3>
+<title>[RPC|ADS] USER DELETE <replaceable>target</replaceable></title>
+
+<para>Delete specified user</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|ADS] USER LIST</title>
+
+<para>List all users</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|ADS] USER INFO <replaceable>target</replaceable></title>
+
+<para>List the domain groups of a the specified user.</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|ADS] USER ADD <replaceable>name</replaceable> [password] [-F user flags] [-C comment]</title>
+
+<para>Add specified user.</para>
+</refsect3>
+</refsect2>
+
+<refsect2>
+<title>[RPC|ADS] GROUP</title>
+
+<refsect3>
+<title>[RPC|ADS] GROUP [misc options] [targets]</title>
+<para>List user groups.</para>
+</refsect3>
+
+<refsect3>
+<title>[RPC|ADS] GROUP DELETE <replaceable>name</replaceable> [misc. options]</title>
+
+<para>Delete specified group.</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|ADS] GROUP ADD <replaceable>name</replaceable> [-C comment]</title>
+
+<para>Create specified group.</para>
+
+</refsect3>
+</refsect2>
+
+<refsect2>
+<title>[RAP|RPC] SHARE</title>
+
+<refsect3>
+<title>[RAP|RPC] SHARE [misc. options] [targets]</title>
+
+<para>Enumerates all exported resources (network shares) on target server.</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RAP|RPC] SHARE ADD <replaceable>name=serverpath</replaceable> [-C comment] [-M maxusers] [targets]</title>
+
+<para>Adds a share from a server (makes the export active). Maxusers 
+specifies the number of users that can be connected to the 
+share simultaneously.</para>
+
+</refsect3>
+
+<refsect3>
+<title>SHARE DELETE <replaceable>sharenam</replaceable></title>
+
+<para>Delete specified share.</para>
+</refsect3>
+</refsect2>
+
+<refsect2>
+<title>[RPC|RAP] FILE</title>
+
+<refsect3>
+<title>[RPC|RAP] FILE</title>
+
+<para>List all open files on remote server.</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|RAP] FILE CLOSE <replaceable>fileid</replaceable></title>
+
+<para>Close file with specified <replaceable>fileid</replaceable> on 
+remote server.</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RPC|RAP] FILE INFO <replaceable>fileid</replaceable></title>
+
+<para>
+Print information on specified <replaceable>fileid</replaceable>. 
+Currently listed are: file-id, username, locks, path, permissions.
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>[RAP|RPC] FILE USER</title>
+
+&not.implemented;
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>SESSION</title>
+
+<refsect3>
+<title>RAP SESSION</title>
+
+<para>Without any other options, SESSION enumerates all active SMB/CIFS 
+sessions on the target server.</para>
+
+</refsect3>
+
+<refsect3>
+<title>RAP SESSION DELETE|CLOSE <replaceable>CLIENT_NAME</replaceable></title>
+
+<para>Close the specified sessions.</para>
+
+</refsect3>
+
+<refsect3>
+<title>RAP SESSION INFO <replaceable>CLIENT_NAME</replaceable></title>
+
+<para>Give a list with all the open files in specified session.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>RAP SERVER <replaceable>DOMAIN</replaceable></title>
+
+<para>List all servers in specified domain or workgroup. Defaults
+to local domain.</para>
+
+</refsect2>
+
+<refsect2>
+<title>RAP DOMAIN</title>
+
+<para>Lists all domains and workgroups visible on the 
+current network.</para>
+
+</refsect2>
+
+<refsect2>
+<title>RAP PRINTQ</title>
+
+<refsect3>
+<title>RAP PRINTQ LIST <replaceable>QUEUE_NAME</replaceable></title>
+
+<para>Lists the specified print queue and print jobs on the server.
+If the <replaceable>QUEUE_NAME</replaceable> is omitted, all 
+queues are listed.</para>
+
+</refsect3>
+
+<refsect3>
+<title>RAP PRINTQ DELETE <replaceable>JOBID</replaceable></title>
+
+<para>Delete job with specified id.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>RAP VALIDATE <replaceable>user</replaceable> [<replaceable>password</replaceable>]</title>
+
+<para>
+Validate whether the specified user can log in to the 
+remote server. If the password is not specified on the commandline, it 
+will be prompted. 
+</para>
+
+&not.implemented;
+
+</refsect2>
+
+<refsect2>
+<title>RAP GROUPMEMBER</title>
+
+<refsect3>
+<title>RAP GROUPMEMBER LIST <replaceable>GROUP</replaceable></title>
+
+<para>List all members of the specified group.</para>
+
+</refsect3>
+
+<refsect3>
+<title>RAP GROUPMEMBER DELETE <replaceable>GROUP</replaceable> <replaceable>USER</replaceable></title>
+
+<para>Delete member from group.</para>
+
+</refsect3>
+
+<refsect3>
+<title>RAP GROUPMEMBER ADD <replaceable>GROUP</replaceable> <replaceable>USER</replaceable></title>
+
+<para>Add member to group.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>RAP ADMIN <replaceable>command</replaceable></title>
+
+<para>Execute the specified <replaceable>command</replaceable> on 
+the remote server. Only works with OS/2 servers.
+</para>
+
+&not.implemented;
+
+</refsect2>
+
+<refsect2>
+<title>RAP SERVICE</title>
+
+<refsect3>
+<title>RAP SERVICE START <replaceable>NAME</replaceable> [arguments...]</title>
+
+<para>Start the specified service on the remote server. Not implemented yet.</para>
+
+&not.implemented;
+
+</refsect3>
+
+<refsect3>
+<title>RAP SERVICE STOP</title>
+
+<para>Stop the specified service on the remote server.</para>
+
+&not.implemented;
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>RAP PASSWORD <replaceable>USER</replaceable> <replaceable>OLDPASS</replaceable> <replaceable>NEWPASS</replaceable></title>
+
+<para>
+Change password of <replaceable>USER</replaceable> from <replaceable>OLDPASS</replaceable> to <replaceable>NEWPASS</replaceable>.
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>LOOKUP</title>
+
+<refsect3>
+<title>LOOKUP HOST <replaceable>HOSTNAME</replaceable> [<replaceable>TYPE</replaceable>]</title>
+
+<para>
+Lookup the IP address of the given host with the specified type (netbios suffix). 
+The type defaults to 0x20 (workstation).
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>LOOKUP LDAP [<replaceable>DOMAIN</replaceable></title>
+
+<para>Give IP address of LDAP server of specified <replaceable>DOMAIN</replaceable>. Defaults to local domain.</para>
+
+</refsect3>
+
+<refsect3>
+<title>LOOKUP KDC [<replaceable>REALM</replaceable>]</title>
+
+<para>Give IP address of KDC for the specified <replaceable>REALM</replaceable>.
+Defaults to local realm.</para>
+
+</refsect3>
+
+<refsect3>
+<title>LOOKUP DC [<replaceable>DOMAIN</replaceable>]</title>
+
+<para>Give IP's of Domain Controllers for specified <replaceable>
+DOMAIN</replaceable>. Defaults to local domain.</para>
+
+</refsect3>
+
+<refsect3>
+<title>LOOKUP MASTER <replaceable>DOMAIN</replaceable></title>
+
+<para>Give IP of master browser for specified <replaceable>DOMAIN</replaceable>
+or workgroup. Defaults to local domain.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>CACHE</title>
+
+<para>Samba uses a general caching interface called 'gencache'. It 
+can be controlled using 'NET CACHE'.</para>
+
+<para>All the timeout parameters support the suffixes:
+
+<simplelist>
+<member>s - Seconds</member>
+<member>m - Minutes</member>
+<member>h - Hours</member>
+<member>d - Days</member>
+<member>w - Weeks</member>
+</simplelist>
+
+</para>
+
+<refsect3>
+<title>CACHE ADD <replaceable>key</replaceable> <replaceable>data</replaceable> <replaceable>time-out</replaceable></title>
+
+<para>Add specified key+data to the cache with the given timeout.</para>
+
+</refsect3>
+
+<refsect3>
+<title>CACHE DEL <replaceable>key</replaceable></title>
+
+<para>Delete key from the cache.</para>
+
+</refsect3>
+
+<refsect3>
+<title>CACHE SET <replaceable>key</replaceable> <replaceable>data</replaceable> <replaceable>time-out</replaceable></title>
+
+<para>Update data of existing cache entry.</para>
+
+</refsect3>
+
+<refsect3>
+<title>CACHE SEARCH <replaceable>PATTERN</replaceable></title>
+
+<para>Search for the specified pattern in the cache data.</para>
+
+</refsect3>
+
+<refsect3>
+<title>CACHE LIST</title>
+
+<para>
+List all current items in the cache.
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>CACHE FLUSH</title>
+
+<para>Remove all the current items from the cache.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>GETLOCALSID [DOMAIN]</title>
+
+<para>Print the SID of the specified domain, or if the parameter is
+omitted, the SID of the domain the local server is in.</para>
+
+</refsect2>
+
+<refsect2>
+<title>SETLOCALSID S-1-5-21-x-y-z</title>
+
+<para>Sets domain sid for the local server to the specified SID.</para>
+
+</refsect2>
+
+<refsect2>
+<title>GROUPMAP</title>
+
+<para>Manage the mappings between Windows group SIDs and UNIX groups.
+Parameters take the for "parameter=value".  Common options include:</para>
+
+<itemizedlist>
+<listitem><para>unixgroup - Name of the UNIX group</para></listitem>
+<listitem><para>ntgroup - Name of the Windows NT group (must be
+  resolvable to a SID</para></listitem>
+<listitem><para>rid - Unsigned 32-bit integer</para></listitem>
+<listitem><para>sid - Full SID in the form of "S-1-..."</para></listitem>
+<listitem><para>type - Type of the group; either 'domain', 'local',
+  or 'builtin'</para></listitem>
+<listitem><para>comment - Freeform text description of the group</para></listitem>
+</itemizedlist>
+
+<refsect3>
+<title>GROUPMAP ADD</title>
+
+<para>Add a new group mapping entry</para>
+
+<para>net groupmap add {rid=int|sid=string} unixgroup=string [type={domain|local|builtin}] [ntgroup=string] [comment=string]</para>
+
+</refsect3>
+
+<refsect3>
+<title>GROUPMAP DELETE</title>
+
+<para>Delete a group mapping entry</para>
+
+<para>net groupmap delete {ntgroup=string|sid=SID}</para>
+
+</refsect3>
+
+<refsect3>
+<title>GROUPMAP MODIFY</title>
+
+<para>Update en existing group entry</para>
+
+<para>net groupmap modify {ntgroup=string|sid=SID} [unixgroup=string] [comment=string] [type={domain|local}</para>
+</refsect3>
+
+<refsect3>
+<title>GROUPMAP LIST</title>
+
+<para>List existing group mapping entries</para>
+
+<para>net groupmap list [verbose] [ntgroup=string] [sid=SID]</para>
+
+</refsect3>
+</refsect2>
+
+
+
+<refsect2>
+<title>MAXRID</title>
+
+<para>Prints out the highest RID currently in use on the local
+server (by the active 'passdb backend').
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>RPC INFO</title>
+
+<para>Print information about the domain of the remote server,
+such as domain name, domain sid and number of users and groups.
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>[RPC|ADS] TESTJOIN</title>
+
+<para>Check whether participation in a domain is still valid.</para>
+
+</refsect2>
+
+<refsect2>
+<title>[RPC|ADS] CHANGETRUSTPW</title>
+
+<para>Force change of domain trust password.</para>
+
+</refsect2>
+
+<refsect2>
+<title>RPC TRUSTDOM</title>
+
+<refsect3>
+<title>RPC TRUSTDOM ADD <replaceable>DOMAIN</replaceable></title>
+
+<para>Add a interdomain trust account for 
+<replaceable>DOMAIN</replaceable> to the remote server. 
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>RPC TRUSTDOM DEL <replaceable>DOMAIM</replaceable></title>
+
+<para>Remove interdomain trust account for 
+<replaceable>DOMAIN</replaceable> from the remote server. 
+</para>
+
+&not.implemented;
+
+</refsect3>
+
+<refsect3>
+<title>RPC TRUSTDOM ESTABLISH <replaceable>DOMAIN</replaceable></title>
+
+<para>
+Establish a trust relationship to a trusting domain. 
+Interdomain account must already be created on the remote PDC.
+</para>
+
+</refsect3>
+
+<refsect3>
+<title>RPC TRUSTDOM REVOKE <replaceable>DOMAIN</replaceable></title>
+<para>Abandon relationship to trusted domain</para>
+
+</refsect3>
+
+<refsect3>
+<title>RPC TRUSTDOM LIST</title>
+
+<para>List all current interdomain trust relationships.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>RPC ABORTSHUTDOWN</title>
+
+<para>Abort the shutdown of a remote server.</para>
+
+</refsect2>
+
+<refsect2>
+<title>SHUTDOWN [-t timeout] [-r] [-f] [-C message]</title>
+
+<para>Shut down the remote server.</para>
+
+<variablelist>
+&net.arg.shutdown;
+<varlistentry>
+<term>-C message</term>
+<listitem><para>Display the specified message on the screen to 
+announce the shutdown.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsect2>
+
+<refsect2>
+<title>SAMDUMP</title>
+
+<para>Print out sam database of remote server. You need
+to run this on either a BDC. <!-- 
+Is that correct? - Jelmer --></para>
+</refsect2>
+
+<refsect2>
+<title>VAMPIRE</title>
+
+<para>Export users, aliases and groups from remote server to 
+local server. Can only be run an a BDC.
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>GETSID</title>
+
+<para>Fetch domain SID and store it in the local <filename>secrets.tdb</filename>. </para>
+
+</refsect2>
+
+<refsect2>
+<title>ADS LEAVE</title>
+
+<para>Make the remote host leave the domain it is part of. </para>
+
+</refsect2>
+
+<refsect2>
+<title>ADS STATUS</title>
+
+<para>Print out status of machine account of the local machine in ADS.
+Prints out quite some debug info. Aimed at developers, regular 
+users should use <command>NET ADS TESTJOIN</command>.</para>
+
+</refsect2>
+
+<refsect2>
+<title>ADS PRINTER</title>
+
+<refsect3>
+<title>ADS PRINTER INFO [<replaceable>PRINTER</replaceable>] [<replaceable>SERVER</replaceable>]</title>
+
+<para>
+Lookup info for <replaceable>PRINTER</replaceable> on <replaceable>SERVER</replaceable>. The printer name defaults to "*", the 
+server name defaults to the local host.</para>
+
+</refsect3>
+
+<refsect3>
+<title>ADS PRINTER PUBLISH <replaceable>PRINTER</replaceable></title>
+
+<para>Publish specified printer using ADS.</para>
+
+</refsect3>
+
+<refsect3>
+<title>ADS PRINTER REMOVE <replaceable>PRINTER</replaceable></title>
+
+<para>Remove specified printer from ADS directory.</para>
+
+</refsect3>
+
+</refsect2>
+
+<refsect2>
+<title>ADS SEARCH <replaceable>EXPRESSION</replaceable> <replaceable>ATTRIBUTES...</replaceable></title>
+
+<para>Perform a raw LDAP search on a ADS server and dump the results. The 
+expression is a standard LDAP search expression, and the 
+attributes are a list of LDAP fields to show in the results.</para>
+
+<para>Example: <userinput>net ads search '(objectCategory=group)' sAMAccountName</userinput>
+</para>
+
+</refsect2>
+
+<refsect2>
+<title>ADS DN <replaceable>DN</replaceable> <replaceable>(attributes)</replaceable></title>
+
+<para>
+Perform a raw LDAP search on a ADS server and dump the results. The 
+DN standard LDAP DN, and the attributes are a list of LDAP fields 
+to show in the result. 
+</para>
+
+<para>Example: <userinput>net ads dn 'CN=administrator,CN=Users,DC=my,DC=domain' SAMAccountName</userinput></para>
+
+</refsect2>
+
+<refsect2>
+<title>WORKGROUP</title>
+
+<para>Print out workgroup name for specified kerberos realm.</para>
+
+</refsect2>
+
+
+<refsect2>
+<title>HELP [COMMAND]</title>
+
+<para>Gives usage information for the specified command.</para>
+
+</refsect2>
+
+</refsect1>
+
+<refsect1>
+       <title>VERSION</title>
+
+       <para>This man page is complete for version 3.0 of the Samba 
+       suite.</para>
+</refsect1>
+
+<refsect1>
+       <title>AUTHOR</title>
+       
+       <para>The original Samba software and related utilities 
+       were created by Andrew Tridgell. Samba is now developed
+       by the Samba Team as an Open Source project similar 
+       to the way the Linux kernel is developed.</para>
+
+       <para>The net manpage was written by Jelmer Vernooij.</para>
+       
+</refsect1>
+
+</refentry>
diff --git a/docs/docbook/manpages/nmbd.8.xml b/docs/docbook/manpages/nmbd.8.xml
new file mode 100644 (file)
index 0000000..a98d189
--- /dev/null
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="iso8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % globalentities SYSTEM './../global.ent'> %globalentities;
+]>
+<refentry id="nmbd.8">
+
+<refmeta>
+       <refentrytitle>nmbd</refentrytitle>
+       <manvolnum>8</manvolnum>
+</refmeta>
+
+
+<refnamediv>
+       <refname>nmbd</refname>
+       <refpurpose>NetBIOS name server to provide NetBIOS 
+       over IP naming services to clients</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+       <cmdsynopsis>
+               <command>nmbd</command>
+               <arg choice="opt">-D</arg>
+               <arg choice="opt">-F</arg>
+               <arg choice="opt">-S</arg>
+               <arg choice="opt">-a</arg>
+               <arg choice="opt">-i</arg>
+               <arg choice="opt">-o</arg>
+               <arg choice="opt">-h</arg>
+               <arg choice="opt">-V</arg>
+               <arg choice="opt">-d &lt;debug level&gt;</arg>
+               <arg choice="opt">-H &lt;lmhosts file&gt;</arg>
+               <arg choice="opt">-l &lt;log directory&gt;</arg>
+               <arg choice="opt">-n &lt;primary netbios name&gt;</arg>
+               <arg choice="opt">-p &lt;port number&gt;</arg>
+               <arg choice="opt">-s &lt;configuration file&gt;</arg>
+       </cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+       <title>DESCRIPTION</title>
+       <para>This program is part of the <citerefentry><refentrytitle>Samba</refentrytitle>
+       <manvolnum>7</manvolnum></citerefentry> suite.</para>
+
+       <para><command>nmbd</command> is a server that understands 
+       and can reply to NetBIOS over IP name service requests, like 
+       those produced by SMB/CIFS clients such as Windows 95/98/ME, 
+       Windows NT, Windows 2000, Windows XP and LanManager clients. It also
+       participates in the browsing protocols which make up the 
+       Windows "Network Neighborhood" view.</para>
+
+       <para>SMB/CIFS clients, when they start up, may wish to 
+       locate an SMB/CIFS server. That is, they wish to know what 
+       IP number a specified host is using.</para>
+
+       <para>Amongst other services, <command>nmbd</command> will 
+       listen for such requests, and if its own NetBIOS name is 
+       specified it will respond with the IP number of the host it 
+       is running on.  Its "own NetBIOS name" is by
+       default the primary DNS name of the host it is running on, 
+       but this can be overridden with the <emphasis>-n</emphasis> 
+       option (see OPTIONS below). Thus <command>nmbd</command> will 
+       reply to broadcast queries for its own name(s). Additional
+       names for <command>nmbd</command> to respond on can be set 
+       via parameters in the <citerefentry><refentrytitle>smb.conf</refentrytitle>
+       <manvolnum>5</manvolnum></citerefentry> configuration file.</para>
+
+       <para><command>nmbd</command> can also be used as a WINS 
+       (Windows Internet Name Server) server. What this basically means 
+       is that it will act as a WINS database server, creating a 
+       database from name registration requests that it receives and 
+       replying to queries from clients for these names.</para>
+
+       <para>In addition, <command>nmbd</command> can act as a WINS 
+       proxy, relaying broadcast queries from clients that do 
+       not understand how to talk the WINS protocol to a WINS 
+       server.</para>
+</refsect1>
+
+<refsect1>
+       <title>OPTIONS</title>
+
+       <variablelist>
+               <varlistentry>
+               <term>-D</term>
+               <listitem><para>If specified, this parameter causes 
+               <command>nmbd</command> to operate as a daemon. That is, 
+               it detaches itself and runs in the background, fielding 
+               requests on the appropriate port. By default, <command>nmbd</command> 
+               will operate as a daemon if launched from a command shell. 
+               nmbd can also be operated from the <command>inetd</command> 
+               meta-daemon, although this is not recommended.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-F</term>
+               <listitem><para>If specified, this parameter causes
+               the main <command>nmbd</command> process to not daemonize,
+               i.e. double-fork and disassociate with the terminal.
+               Child processes are still created as normal to service
+               each connection request, but the main process does not
+               exit. This operation mode is suitable for running
+               <command>nmbd</command> under process supervisors such
+               as <command>supervise</command> and <command>svscan</command>
+               from Daniel J. Bernstein's <command>daemontools</command>
+               package, or the AIX process monitor.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-S</term>
+               <listitem><para>If specified, this parameter causes
+               <command>nmbd</command> to log to standard output rather
+               than a file.</para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-i</term>
+               <listitem><para>If this parameter is specified it causes the
+               server to run "interactively", not as a daemon, even if the
+               server is executed on the command line of a shell. Setting this
+               parameter negates the implicit daemon mode when run from the
+               command line. <command>nmbd</command> also logs to standard
+               output, as if the <constant>-S</constant> parameter had been
+               given. </para></listitem>
+               </varlistentry>
+
+               &stdarg.help;
+               
+               <varlistentry>
+               <term>-H &lt;filename&gt;</term>
+               <listitem><para>NetBIOS lmhosts file.  The lmhosts 
+               file is a list of NetBIOS names to IP addresses that 
+               is loaded by the nmbd server and used via the name 
+               resolution mechanism <ulink url="smb.conf.5.html#nameresolveorder"><parameter>name resolve
+               order</parameter></ulink> described in <citerefentry><refentrytitle>smb.conf</refentrytitle>
+               <manvolnum>5</manvolnum></citerefentry> to resolve any 
+               NetBIOS name queries needed by the server. Note 
+               that the contents of this file are <emphasis>NOT</emphasis> 
+               used by <command>nmbd</command> to answer any name queries. 
+               Adding a line to this file affects name NetBIOS resolution 
+               from this host <emphasis>ONLY</emphasis>.</para>
+
+               <para>The default path to this file is compiled into 
+               Samba as part of the build process. Common defaults 
+               are <filename>/usr/local/samba/lib/lmhosts</filename>,
+               <filename>/usr/samba/lib/lmhosts</filename> or
+               <filename>/etc/samba/lmhosts</filename>. See the <citerefentry><refentrytitle>lmhosts</refentrytitle>
+       <manvolnum>5</manvolnum></citerefentry> man page for details on the contents of this file.</para></listitem>
+               </varlistentry>
+
+               &popt.common.samba;
+               
+               <varlistentry>
+               <term>-p &lt;UDP port number&gt;</term>
+               <listitem><para>UDP port number is a positive integer value.
+               This option changes the default UDP port number (normally 137)
+               that <command>nmbd</command> responds to name queries on. Don't
+               use this option unless you are an expert, in which case you
+               won't need help!</para></listitem>
+               </varlistentry>
+
+       </variablelist>
+</refsect1>
+
+<refsect1>
+       <title>FILES</title>
+
+       <variablelist>
+               <varlistentry>
+               <term><filename>/etc/inetd.conf</filename></term>
+               <listitem><para>If the server is to be run by the
+               <command>inetd</command> meta-daemon, this file
+               must contain suitable startup information for the
+               meta-daemon. See the <ulink
+               url="install.html">install</ulink> document
+               for details.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+             &n