[LIBTIRPC]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 18 Jun 2017 15:31:06 +0000 (15:31 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 18 Jun 2017 15:31:06 +0000 (15:31 +0000)
Import the libtirpc from the nfs41 project.

CORE-8204

svn path=/trunk/; revision=75096

173 files changed:
reactos/dll/win32/CMakeLists.txt
reactos/dll/win32/libtirpc/.gitignore [new file with mode: 0644]
reactos/dll/win32/libtirpc/AUTHORS [new file with mode: 0644]
reactos/dll/win32/libtirpc/CMakeLists.txt [new file with mode: 0644]
reactos/dll/win32/libtirpc/COPYING [new file with mode: 0644]
reactos/dll/win32/libtirpc/ChangeLog [new file with mode: 0644]
reactos/dll/win32/libtirpc/INSTALL [new file with mode: 0644]
reactos/dll/win32/libtirpc/Makefile.am [new file with mode: 0644]
reactos/dll/win32/libtirpc/NEWS [new file with mode: 0644]
reactos/dll/win32/libtirpc/README [new file with mode: 0644]
reactos/dll/win32/libtirpc/THANKS [new file with mode: 0644]
reactos/dll/win32/libtirpc/TODO [new file with mode: 0644]
reactos/dll/win32/libtirpc/VERSION [new file with mode: 0644]
reactos/dll/win32/libtirpc/autogen.sh [new file with mode: 0644]
reactos/dll/win32/libtirpc/bootstrap [new file with mode: 0644]
reactos/dll/win32/libtirpc/configure.ac [new file with mode: 0644]
reactos/dll/win32/libtirpc/dirs [new file with mode: 0644]
reactos/dll/win32/libtirpc/doc/Makefile.am [new file with mode: 0644]
reactos/dll/win32/libtirpc/doc/etc_netconfig [new file with mode: 0644]
reactos/dll/win32/libtirpc/libtirpc.pc.in [new file with mode: 0644]
reactos/dll/win32/libtirpc/libtirpc/libtirpc.def [new file with mode: 0644]
reactos/dll/win32/libtirpc/libtirpc/libtirpc.rc [new file with mode: 0644]
reactos/dll/win32/libtirpc/libtirpc/libtirpc_ros.rc [new file with mode: 0644]
reactos/dll/win32/libtirpc/libtirpc/resource.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/Makefile.am [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/bindresvport.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/des_crypt.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/getnetconfig.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/getnetpath.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/getrpcent.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/getrpcport.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/netconfig.5 [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/publickey.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/publickey.5 [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc.5 [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_clnt_auth.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_clnt_calls.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_clnt_create.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_secure.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_soc.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_svc_calls.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_svc_create.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_svc_err.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_svc_reg.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpc_xdr.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rpcbind.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/man/rtime.3t [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/Makefile.am [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/asprintf.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_des.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_gss.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_none.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_sspi.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_time.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/auth_unix.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/authdes_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/authgss_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/authsspi_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/authunix_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/bindresvport.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_bcast.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_dg.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_generic.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_perror.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_raw.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_simple.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/clnt_vc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/crypt_client.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/des_crypt.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/des_soft.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/epoll_sub.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getnetconfig.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getnetpath.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getpeereid.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getpublickey.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getrpcent.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/getrpcport.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/gettimeofday.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/key_call.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/key_prot_xdr.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/libtirpc.def [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/makefile [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/mt_misc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/netname.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/netnamer.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_clnt.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_getmaps.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_getport.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_prot2.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/pmap_rmt.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_callmsg.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_com.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_commondata.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_dtablesize.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_generic.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpc_soc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpcb_clnt.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpcb_prot.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpcb_st_xdr.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rpcdname.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/rtime.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/sources [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_auth.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_auth_des.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_auth_gss.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_auth_none.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_auth_unix.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_dg.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_generic.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_raw.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_run.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_simple.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/svc_vc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/winstubs.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/wintirpc.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_array.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_float.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_mem.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_rec.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_reference.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_sizeof.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/src/xdr_stdio.c [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/fpmath.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/getpeereid.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/libc_private.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/misc/event.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/misc/queue.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/misc/socket.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/namespace.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/netconfig.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/nss_tls.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/reentrant.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth_des.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth_gss.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth_kerb.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth_sspi.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/auth_unix.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/clnt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/clnt_soc.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/clnt_stat.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/des.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/des_crypt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/nettype.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/pmap_clnt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/pmap_prot.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/pmap_rmt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/raw.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpc.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpc_com.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpc_msg.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpcb_clnt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpcb_prot.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpcb_prot.x [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/rpcent.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/svc.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/svc_auth.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/svc_dg.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/svc_soc.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/types.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpc/xdr.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpcsvc/crypt.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpcsvc/crypt.x [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/rpcsvc/nis.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/spinlock.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/sys/queue.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/un-namespace.h [new file with mode: 0644]
reactos/dll/win32/libtirpc/tirpc/wintirpc.h [new file with mode: 0644]

index 291f5ab..62db44f 100644 (file)
@@ -71,6 +71,7 @@ add_subdirectory(jscript)
 add_subdirectory(jsproxy)
 add_subdirectory(kernel32)
 add_subdirectory(kernel32_vista)
+add_subdirectory(libtirpc)
 add_subdirectory(loadperf)
 add_subdirectory(lpk)
 add_subdirectory(lsasrv)
diff --git a/reactos/dll/win32/libtirpc/.gitignore b/reactos/dll/win32/libtirpc/.gitignore
new file mode 100644 (file)
index 0000000..f4a325a
--- /dev/null
@@ -0,0 +1,46 @@
+# files generated by autoconf, automake, autoheader and libtoolize
+aclocal.m4
+autom4te.cache
+compile
+config.guess
+config.log
+config.sub
+configure
+depcomp
+install-sh
+libtool
+ltmain.sh
+Makefile.in
+missing
+config.h.in
+# files generated by configure
+confdefs.h
+config.status
+conftest
+conftest.c
+conftest.cpp
+conftest.er1
+conftest.err
+.deps
+Makefile
+config.h
+stamp-h1
+libtirpc.pc
+# file generated during compilation
+*.o
+.libs
+lib*.a
+src/libtirpc.la
+src/libtirpc_la-*.lo
+# generic editor backup et al
+*~
+# cscope database files
+cscope.*
+# files generated by patches
+*.patch
+*.rej
+*.orig
+# files generated by debugging
+.gdb_history
+.gdbinit
+core
diff --git a/reactos/dll/win32/libtirpc/AUTHORS b/reactos/dll/win32/libtirpc/AUTHORS
new file mode 100644 (file)
index 0000000..5cc9b78
--- /dev/null
@@ -0,0 +1,3 @@
+Gilles Quillard <gilles.quillard@bull.net>
+Antoine Fraticelli <antoine.fraticelli@bull.net>
+
diff --git a/reactos/dll/win32/libtirpc/CMakeLists.txt b/reactos/dll/win32/libtirpc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f45fc75
--- /dev/null
@@ -0,0 +1,104 @@
+remove_definitions(-D_WIN32_WINNT=0x502)
+add_definitions(-D_WIN32_WINNT=0x600)
+add_definitions(-DUNICODE -D_WIN32 -DPORTMAP)
+
+include_directories(${REACTOS_SOURCE_DIR}/dll/win32/libtirpc/tirpc)
+
+list(APPEND SOURCE
+    src/asprintf.c
+#    src/auth_des.c
+    src/authdes_prot.c
+#    src/auth_gss.c
+#    src/authgss_prot.c
+    src/auth_none.c
+    src/auth_sspi.c
+    src/authsspi_prot.c
+    src/auth_time.c
+    src/auth_unix.c
+    src/authunix_prot.c
+    src/bindresvport.c
+    src/clnt_bcast.c
+    src/clnt_dg.c
+    src/clnt_generic.c
+    src/clnt_perror.c
+    src/clnt_raw.c
+    src/clnt_simple.c
+    src/clnt_vc.c
+#    src/crypt_client.c
+#    src/des_crypt.c
+    src/des_soft.c
+    src/epoll_sub.c
+    src/getnetconfig.c
+    src/getnetpath.c
+    src/getpeereid.c
+    src/getpublickey.c
+    src/getrpcent.c
+    src/getrpcport.c
+    src/gettimeofday.c
+    src/key_call.c
+    src/key_prot_xdr.c
+    src/libtirpc.def
+    src/makefile
+    src/Makefile.am
+    src/mt_misc.c
+    src/netname.c
+    src/netnamer.c
+    src/pmap_clnt.c
+    src/pmap_getmaps.c
+    src/pmap_getport.c
+    src/pmap_prot2.c
+    src/pmap_prot.c
+    src/pmap_rmt.c
+    src/rpcb_clnt.c
+    src/rpcb_prot.c
+    src/rpcb_st_xdr.c
+    src/rpc_callmsg.c
+    src/rpc_com.h
+    src/rpc_commondata.c
+    src/rpcdname.c
+    src/rpc_dtablesize.c
+    src/rpc_generic.c
+    src/rpc_prot.c
+    src/rpc_soc.c
+    src/rtime.c
+    src/sources
+    src/svc_auth.c
+#    src/svc_auth_des.c
+#    src/svc_auth_gss.c
+    src/svc_auth_none.c
+    src/svc_auth_unix.c
+    src/svc.c
+    src/svc_dg.c
+    src/svc_generic.c
+    src/svc_raw.c
+    src/svc_run.c
+    src/svc_simple.c
+    src/svc_vc.c
+    src/winstubs.c
+    src/wintirpc.c
+    src/xdr_array.c
+    src/xdr.c
+    src/xdr_float.c
+    src/xdr_mem.c
+    src/xdr_rec.c
+    src/xdr_reference.c
+    src/xdr_sizeof.c
+    src/xdr_stdio.c)
+
+add_library(libtirpc SHARED
+    ${SOURCE}
+#    libtirpc/libtirpc.rc
+    libtirpc/libtirpc_ros.rc
+    libtirpc/libtirpc.def)
+
+if(MSVC)
+else()
+    # FIXME: Tons of warnings.
+    replace_compile_flags("-Werror" " ")
+endif()
+
+set_module_type(libtirpc win32dll)
+target_link_libraries(libtirpc user32 advapi32)
+add_importlibs(libtirpc kernel32 kernel32_vista ws2_32 msvcrt)
+add_delay_importlibs(libtirpc secur32)
+add_cd_file(TARGET libtirpc DESTINATION reactos/system32 FOR all)
diff --git a/reactos/dll/win32/libtirpc/COPYING b/reactos/dll/win32/libtirpc/COPYING
new file mode 100644 (file)
index 0000000..8b548d6
--- /dev/null
@@ -0,0 +1,359 @@
+Sun Industry Standards Source License 1.0
+
+DEFINITIONS
+
+1.1.  "Commercial Use" means distribution or otherwise
+making the Original Code available to a third party.
+
+1.2.  "Contributor Version" means the combination of the
+Original Code, and the Modifications made by that particular
+Contributor.
+
+1.3.  "Electronic Distribution Mechanism" means a mechanism
+generally accepted in the software development community for
+the electronic transfer of data.
+
+1.4.  "Executable" means Original Code in any form other
+than Source Code.
+
+1.5.  "Initial Developer" means the individual or entity
+identified as the Initial Developer in the Source Code
+notice required by 2 (Exhibit A)
+
+1.6.  "Larger Work" means a work which combines Original
+Code or portions thereof with code not governed by the terms
+of this License.
+
+1.7.  "License" means this document.
+
+1.8.  "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9.  "Modifications" means any addition to or deletion from
+the substance or structure of either the Original Code or
+any previous Modifications.  A Modification is:
+
+A.  Any addition to or deletion from the contents of a file
+containing Original Code or previous Modifications.
+
+B.  Any new file that contains any part of the Original Code
+or previous Modifications.  .
+
+1.10.  "Original Code" means Source Code of computer
+software code which is described in the Source Code notice
+required by Exhibit A as Original Code.
+
+1.11.  "Patent Claims" means any patent claims, now owned or
+hereafter acquired, including without limitation, method,
+process, and apparatus claims, in any patent Licensable by
+grantor.
+
+1.12.  "Source Code" means the preferred form of the
+Original Code for making modifications to it, including all
+modules it contains, plus any associated interface
+definition files, or scripts used to control compilation and
+installation of an Executable.
+
+1.13.  "Standards" means the standard identified in Exhibit
+B or a subsequent version of such standard.
+
+1.14.  "You" or "Your" means an individual or a legal entity
+exercising rights under, and complying with all of the terms
+of, this License or a future version of this License issued
+under Section 6.1.  For legal entities, "You" includes any
+entity which controls, is controlled by, or is under common
+control with You.  For purposes of this definition,
+"control" means (a) the power, direct or indirect, to cause
+the direction or management of such entity, whether by
+contract or otherwise, or (b) ownership of more than fifty
+percent (50%) of the outstanding shares or beneficial
+ownership of such entity.
+
+2.0 SOURCE CODE LICENSE
+
+2.1 The Initial Developer Grant:  The Initial Developer
+hereby grants You a world-wide, royalty-free, non-exclusive
+license, subject to third party intellectual property
+claims:
+
+a) under intellectual property rights (other than patent or
+trademark) Licensable by Initial Developer to use,
+reproduce, modify, display, perform, sub license and
+distribute the Original Code (or portions thereof )with or
+without Modifications, and/or as part of a Larger Work; and
+
+b) under Patents Claims infringed by the making, using or
+selling of Original Code, to make, have made, use, practice,
+sell, and offer for sale, and/or otherwise dispose of the
+Original Code (or portions thereof).
+
+c) the licenses granted in this Section 2.1(a ) and (b) are
+effective on the date Initial Developer first distributes
+Original Code under the terms of this License.
+
+d) Notwithstanding Section 2.1(b )above, no patent license
+is granted:  1) for code that You delete from the Original
+Code; 2) separate from the Original Code; or 3) for
+infringements caused by:  i) the modification of the
+Original Code or
+
+ii) the combination of the Original Code with other software
+or devices, including but not limited to Modifications.
+
+3.0 DISTRIBUTION OBLIGATIONS
+
+3.1 Application of License.  The Source Code version of
+Original Code may be distributed only under the terms of
+this License or a future version of this License released
+under Section 6.1, and You must include a copy of this
+License with every copy of the Source Code You distribute.
+You may not offer or impose any terms on any Source Code
+version that alters or restricts the applicable version of
+this License or the recipient's rights hereunder.  Your
+license for shipment of the Contributor Version is
+conditioned upon your full compliance with this Section.
+The Modifications which you create must comply with all
+requirements set out by the Standards body in effect 120
+days before You ship the Contributor Version.  In the event
+that the Modifications do not meet such requirements, You
+agree to publish (i) any deviation from the Standards
+protocol resulting from implementation of your Modifications
+and (ii) a reference implementation of Your Modifications,
+and to make any such deviation and reference implementation
+available to all third parties under the same terms as the
+license on a royalty free basis within thirty (30) days of
+Your first customer shipment of Your Modifications.
+
+3.2 Required Notices.  You must duplicate the notice in
+Exhibit A in each file of the Source Code.  If it is not
+possible to put such notice in a particular Source Code file
+due to its structure, then You must include such notice in a
+location (such as a relevant directory ) where a user would
+be likely to look for such a notice.  If You created one or
+more Modifications ) You may add your name as a Contributor
+to the notice described in Exhibit A.  You must also
+duplicate this License in any documentation for the Source
+Code where You describe recipients' rights or ownership
+rights relating to Initial Code.  You may choose to offer,
+and to charge a fee for, warranty, support, indemnity or
+liability obligations to one or more recipients of Your
+version of the Code.  However, You may do so only
+
+on Your own behalf, and not on behalf of the Initial
+Developer.  You must make it absolutely clear than any such
+warranty, support, indemnity or liability obligation is
+offered by You alone, and You hereby agree to indemnify the
+Initial Developer for any liability incurred by the Initial
+Developer as a result of warranty, support, indemnity or
+liability terms You offer.
+
+3.3 Distribution of Executable Versions.  You may distribute
+Original Code in Executable and Source form only if the
+requirements of Section 3.1 and 3.2 have been met for that
+Original Code, and if You include a notice stating that the
+Source Code version of the Original Code is available under
+the terms of this License.  The notice must be conspicuously
+included in any notice in an Executable or Source versions,
+related documentation or collateral in which You describe
+recipients' rights relating to the Original Code.  You may
+distribute the Executable and Source versions of Your
+version of the Code or ownership rights under a license of
+Your choice, which may contain terms different from this
+License, provided that You are in compliance with the terms
+of this License.  If You distribute the Executable and
+Source versions under a different license You must make it
+absolutely clear that any terms which differ from this
+License are offered by You alone, not by the Initial
+Developer .  You hereby agree to indemnify the Initial
+Developer for any liability incurred by the Initial
+Developer as a result of any such terms You offer .
+
+3.4 Larger Works.  You may create a Larger Work by combining
+Original Code with other code not governed by the terms of
+this License and distribute the Larger Work as a single
+product.  In such a case, You must make sure the
+requirements of this License are fulfilled for the Original
+Code.
+
+4.0 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION
+
+If it is impossible for You to comply with any of the terms
+of this License with respect to some or all of the Original
+Code due to statute, judicial order, or regulation then You
+must:
+
+a) comply with the terms of this License to the maximum
+extent possible; and
+
+b) describe the limitations and the code they affect.  Such
+description must be included in the LEGAL file described in
+Section 3.2 and must be included with all distributions of
+the Source Code.  Except to the extent prohibited by statute
+or regulation, such description must be sufficiently
+detailed for a recipient of ordinary skill to be able to
+understand it.
+
+5.0 APPLICATION OF THIS LICENSE This License applies to code
+to which the Initial Developer has attached the notice in
+Exhibit A and to related Modifications as set out in Section
+3.1.
+
+6.0 VERSIONS OF THE LICENSE
+
+6.1 New Versions.  Sun Microsystems, Inc.  Sun may publish
+revised and/or new versions of the License from time to
+time.  Each version will be given a distinguishing version
+number .
+
+6.2 Effect of New Versions.  Once Original Code has been
+published under a particular version of the License, You may
+always continue to use it under the terms of that version.
+You may also choose to use such Original Code under the
+terms of any subsequent version of the License published by
+Sun.  No one other than Sun has the right to modify the
+terms applicable to Original Code.
+
+7.  DISCLAIMER OF W ARRANTY.  ORIGINAL CODE IS PROVIDED
+UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+LIMITATION, WARRANTIES THAT THE ORIGINAL CODE IS FREE OF
+DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
+NON-INFRINGING.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE ORIGINAL CODE IS WITH YOU.  SHOULD ANY
+ORIGINAL CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER )ASSUME THE COST OF ANY NECESSARY
+SERVICING, REPAIR OR CORRECTION.  THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.  NO
+USE OF ANY ORIGINAL CODE IS AUTHORIZED HEREUNDER EXCEPT
+UNDER THIS DISCLAIMER.
+
+8.0 TERMINATION
+
+8.1 This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach.  All sublicenses to the
+Original Code which are properly granted shall survive any
+termination of this License.  Provisions which, by their
+nature, must remain in effect beyond the termination of this
+License shall survive.
+
+8.2 .In the event of termination under Section 8.1 above,
+all end user license agreements (excluding distributors and
+resellers) which have been validly granted by You or any
+distributor hereunder prior to termination shall survive
+termination.
+
+9.0 LIMIT OF LIABILITY UNDER NO CIRCUMSTANCES AND UNDER NO
+LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE) ,CONTRACT,
+OR OTHER WISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER
+CONTRIBUTOR, OR ANY DISTRIBUTOR OF ORIGINAL CODE, OR ANY
+SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
+LOSS OF GOOD WILL, WORK STOPPAGE, COMPUTER FAILURE OR
+MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
+LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE
+POSSIBILITY OF SUCH DAMAGES.  THIS LIMITATION OF LIABILITY
+SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF
+INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND
+LIMITATION MAY NOT APPLY TO YOU.
+
+10.0 U .S.  GOVERNMENT END USERS U.S.  Government:  If this
+Software is being acquired by or on behalf of the U.S.
+Government or by a U.S.  Government prime contractor or
+subcontractor (at any tier), then the Government's rights in
+the Software and accompanying documentation shall be only as
+set forth in this license; this is in accordance with 48 C.F
+.R.  227.7201 through 227.7202-4 (for Department of Defense
+(DoD) acquisitions )and with 48 C.F.R.2.101 and 12.212( for
+non-DoD acquisitions).
+
+11.0 MISCELLANEOUS This License represents the complete
+agreement concerning subject matter hereof.  If any
+provision of this License is held to be unenforceable, such
+provision shall be reformed only to the extent necessary to
+make it enforceable.  This License shall be governed by
+California law provisions (except to the extent applicable
+law, if any, provides otherwise), excluding its
+conflict-of-law provisions.  With respect to disputes in
+which at least one party is a citizen of, or an entity
+chartered or registered to do business in the United States
+of America, any litigation relating to this License shall be
+subject to the jurisdiction of the Federal Courts of the
+Northern District of California, with venue lying in Santa
+Clara County, California, with the losing party responsible
+for costs, including without limitation, court costs and
+reasonable attorneys fees and expenses.  The application of
+the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded.  Any law
+or regulation which provides that the language of a contract
+shall be construed against the drafter shall not apply to
+this License.
+
+EXHIBIT A - Sun Standards
+
+"The contents of this file are subject to the Sun Standards
+License Version 1.0 the (the "License";) You may not use
+this file except in compliance with the License.  You may
+obtain a copy of the License at
+_______________________________.
+
+    Software distributed under the License is distributed on
+an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
+express or implied.  See the License for the specific
+language governing rights and limitations under the License.
+
+The Original Code is Copyright 1998 by Sun Microsystems, Inc
+
+The Initial Developer of the Original Code is:  Sun
+Microsystems, Inc.
+
+Portions created by _____________________________ are
+Copyright ______________________________.
+
+All Rights Reserved.
+
+Contributors:  ______________________________________.
+
+EXHIBIT B - Sun Standards
+
+The Standard is defined as the following IETF RFCs:
+
+RFC1831:  RPC:  Remote Procedure Call Protocol Specification
+Version 2 RFC1832:  XDR:  External Data REpresentation
+Standard RFC1833:  Binding Protocols for ONC RPC Version 2
+RFC2078:  Generic Security Service Application Program
+Interface, Version 2 RFC2203:  RPCSEC_GSS Protocol
+Specification RFC2695:  Authentication Mechanisms for ONC RPC
+
+*
+ * Copyright (c) Copyright (c) Bull S.A.  2005  All Rights Reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
diff --git a/reactos/dll/win32/libtirpc/ChangeLog b/reactos/dll/win32/libtirpc/ChangeLog
new file mode 100644 (file)
index 0000000..e9a2aa1
--- /dev/null
@@ -0,0 +1,206 @@
+2008-11-19  Steve Dickson <steved@redhat.com>
+    * Version 0.1.10 released.
+
+commit 32ec5931e3debf208972d5146578f08dc113a9b6
+Merge: 338af7f... 92cf0dd...
+Author: Steve Dickson <steved@redhat.com>
+Date:   Mon Nov 17 12:26:22 2008 -0500
+
+    Merge branch 'master' of git://git.infradead.org/~steved/libtirpc
+
+commit 92cf0dde310ca341a2f29ff66b19eeb9994a649a
+Author: Ian Kent <ikent@redhat.com>
+Date:   Tue Oct 28 11:19:07 2008 -0400
+
+    Fixed a warings the IPV6 client routines
+    
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 338af7f9f00e096b65a6d823f885c4eeaf1d1f8c
+Author: Steve Dickson <steved@redhat.com>
+Date:   Mon Oct 27 12:46:54 2008 -0400
+
+    __rpc_taddr2uaddr_af() assumes the netbuf to always have a
+    non-zero data. This is a bad assumption and can lead to a
+    seg-fault. This patch adds a check for zero length and returns
+    NULL when found.
+    
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit d9a5ae7079d001a9e3b9b384f9153f591a7158bd
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:10:43 2008 -0400
+
+    Fix __rpc_getconfip
+    
+    __rpc_getconfip is supposed to return the first netconf
+    entry supporting tcp or udp, respectively. The code will
+    currently return the *last* entry, plus it will leak
+    memory when there is more than one such entry.
+    
+    This patch fixes this issue.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 6c487efe74adb5c29f7bee5bd51b3ebef4968f7d
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:09:06 2008 -0400
+
+    Fix getpeereid
+    
+    getpeereid fails because it uses an incorrect getsockopt call to obtain
+    the peer credentials on a AF_LOCAL socket.  This in turn will cause all
+    RPC services to be registered with rpcbind to show up as having been
+    registered by "unknown".
+    
+    This has a serious impact on security - a service owned by "unknown"
+    can essentially be unregistered (and thus replaced) by anyone.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 851b0f5c6dca22d634603f03f0a5e3e35c6db867
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:08:07 2008 -0400
+
+    svc_getcaller_netbuf macro seems broken
+    
+    I haven't found any documentation, but the comment in the header
+    file seems to suggest that svc_getcaller_netbuf should return the
+    xp_rtaddr netbuf. Returning the address of the socket descripor
+    seems to be wrong at any rate.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit d94b92d5125242ce595c1baf42a1e6d1004b7756
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:06:54 2008 -0400
+
+    Introduce __rpc_set_netbuf helper
+    
+    The RPC code contains a number of places where a netbuf
+    is initialized with some data. All the mem_alloc/memcpy
+    stuff is open-coded. Introduce a helper function and
+    convert the code.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit da5f9861ea3bae59c8eead26d38334721caa9f0a
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:05:20 2008 -0400
+
+    Kill map_ipv4_to_ipv6
+    
+    After the change to svc_vc.c performed in the previous patch,
+    this function is no longer needed.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 59c374c4b507aeca957ed0096d98006edf601375
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 30 15:04:17 2008 -0400
+
+    Fix xp_raddr handling in svc_fd_create etc
+    
+    Currently svc_fd_create tries to do some clever tricks
+    with IPv4/v6 address mapping.
+    
+    This is broken for several reasons.
+     1.        We don't want IPv4 based transport to look like IPv6
+       transports. Old applications compiled against tirpc
+       will expect AF_INET addresses, and are not equipped
+       to deal with AF_INET6.
+     2.        There's a buffer overflow.
+               memcpy(&sin6, &ss, sizeof(ss));
+       copies a full struct sockaddr to a sockaddr_in6 on
+       the stack. Unlikely to be exploitable, but I wonder
+       if this ever worked....
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 628788c1cc84c86ee4cb36ee5d4fe8954e90fca5
+Author: Steve Dickson <steved@redhat.com>
+Date:   Tue Sep 16 11:32:31 2008 -0400
+
+    - Fixed version-info in src/Makefile.am to reflect the correct version
+    - Fixed some of warnings in: src/auth_time.c, src/clnt_dg.c and
+        src/clnt_raw.c
+    - Added some #ifdef NOTUSED around some code in src/rpbc_clnt.c
+      that was not being used...
+    
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 9e7ba0c7a02031294fefadfbca42b3dd5f2d841f
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 16 08:46:29 2008 -0400
+
+    Fix for taddr2addr conversion bug of local addresses
+    
+    When converting af_local socket addresses in taddr2uaddr, an incorrect
+    sizeof() would result in a truncated path string. As a result,
+    rpcbind will report the local /var/lib/rpcbind address to clients
+    as "/v" on a 32bit machine.
+    
+    Signed-off-by: okir@suse.de
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit ea9f048761d0b9a2ab6310bffa07351f0b04d8c5
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 2 12:11:15 2008 -0400
+
+    Always make IPv6 sockets V6ONLY
+    
+    Assume you have a netconfig file looking like this:
+    
+    udp        tpi_clts      v     inet     udp     -       -
+    udp6       tpi_clts      v     inet6    udp     -       -
+    ...
+    
+    a call to svc_tli_create(... &someaddr, "udp") will fail to create an
+    IPv6 server socket. The problem is that on Linux, passive IPv6 sockets
+    will also accept packets/connections from IPv4, and will simply map
+    the sender's address to an IPv6 mapped IPv4 address. So if you want to
+    bind both a UDPv4 and UDPv6 socket to the same port, this will fail with
+    EADDRINUSE.
+    
+    The way to avoid this behavior is to change the socket to V6ONLY,
+    which tells the kernel to avoid the autmatic mapping.
+    
+    The change proposed in the patch below does this. I *think* this is
+    a good place to do this, as it will also fix applications that do not
+    use svc_tli_create() - such as rpcbind, which creates the sockets on
+    its own using __rpc_nconf2fd.
+    
+    I think this also improves portability, as BSD code assumes BSD
+    behavior, where this mapping does not occur either.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+commit 95c8f7227e6b15f2e430d7b87dadc95b2acd4a61
+Author: Olaf Kirch <okir@suse.de>
+Date:   Tue Sep 2 12:09:39 2008 -0400
+
+    Fix incorrect sizeof() in __rpc_getbroadifs
+    
+    __rpc_getbroadifs returns bad broadcast addresses on 32bit
+    machines because when copying the broadcast addresses, ite
+    applies the sizeof() operator to a pointer to a sockaddr,
+    rather than the sockaddr itself.
+    
+    Signed-off-by: Olaf Kirch <okir@suse.de>
+    Signed-off-by: Steve Dickson <steved@redhat.com>
+
+2004-10-13  Antoine Fraticelli  <antoine.fraticellie@bull.net>
+        * Version 0.1 released.
+
+2005-01-07  Gilles Quillard  <Gilles.Quillard@bull.net>
+
+       * Version 0.1.5  Fix problems links to the use of Kerberos.
diff --git a/reactos/dll/win32/libtirpc/INSTALL b/reactos/dll/win32/libtirpc/INSTALL
new file mode 100644 (file)
index 0000000..3fc70ae
--- /dev/null
@@ -0,0 +1,251 @@
+Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+
+TI-RPC Library Quick Installation
+=================================
+
+   Without GSS API
+
+$ ./configure 
+$ make
+# make install
+      
+   To enable utilization of RPCSEC via GSS API use following commands
+but you need to install libgssapi from the CITI before
+$ ./configure --enable-gss
+$ make
+# make install 
+
+   Once installed, you can customize the /etc/netconfig configuration file
+to configure the supported protocols. To support INET6 udp/tcp, uncomment
+the udp6/tcp6 lines.
+
+
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/reactos/dll/win32/libtirpc/Makefile.am b/reactos/dll/win32/libtirpc/Makefile.am
new file mode 100644 (file)
index 0000000..7f5f37b
--- /dev/null
@@ -0,0 +1,36 @@
+SUBDIRS = src man doc
+
+nobase_include_HEADERS = tirpc/netconfig.h \
+                        tirpc/rpcsvc/crypt.x \
+                        tirpc/rpcsvc/crypt.h \
+                        tirpc/rpc/xdr.h \
+                        tirpc/rpc/types.h \
+                        tirpc/rpc/svc_soc.h \
+                        tirpc/rpc/svc.h \
+                        tirpc/rpc/svc_dg.h \
+                        tirpc/rpc/svc_auth.h \
+                        tirpc/rpc/rpc_msg.h \
+                        tirpc/rpc/rpc.h \
+                        tirpc/rpc/rpcent.h \
+                        tirpc/rpc/rpc_com.h \
+                        tirpc/rpc/rpcb_prot.x \
+                        tirpc/rpc/rpcb_prot.h \
+                        tirpc/rpc/rpcb_clnt.h \
+                        tirpc/rpc/raw.h \
+                        tirpc/rpc/pmap_rmt.h \
+                        tirpc/rpc/pmap_prot.h \
+                        tirpc/rpc/pmap_clnt.h \
+                        tirpc/rpc/nettype.h \
+                        tirpc/rpc/des.h \
+                        tirpc/rpc/des_crypt.h \
+                        tirpc/rpc/clnt_stat.h \
+                        tirpc/rpc/clnt_soc.h \
+                        tirpc/rpc/clnt.h \
+                        tirpc/rpc/auth_unix.h \
+                        tirpc/rpc/auth_kerb.h \
+                        tirpc/rpc/auth.h \
+                        tirpc/rpc/auth_gss.h \
+                        tirpc/rpc/auth_des.h
+    
+pkgconfigdir=$(libdir)/pkgconfig
+pkgconfig_DATA = libtirpc.pc
diff --git a/reactos/dll/win32/libtirpc/NEWS b/reactos/dll/win32/libtirpc/NEWS
new file mode 100644 (file)
index 0000000..7eef517
--- /dev/null
@@ -0,0 +1,3 @@
+New in 0.1:
+* Portage from FreeBSD 5.2.1 (security part to be completed)
+* Use autoconf/automake
diff --git a/reactos/dll/win32/libtirpc/README b/reactos/dll/win32/libtirpc/README
new file mode 100644 (file)
index 0000000..3b10e0d
--- /dev/null
@@ -0,0 +1,44 @@
+LIBTIRPC 0.1 FROM SUN'S TIRPCSRC 2.3 29 Aug 1994
+
+This package contains SunLib's implementation of transport-independent
+RPC (TI-RPC) documentation.  This library forms a piece of the base of Open Network
+Computing (ONC), and is derived directly from the Solaris 2.3 source.
+
+TI-RPC is an enhanced version of TS-RPC that requires the UNIX System V
+Transport Layer Interface (TLI) or an equivalent X/Open Transport Interface
+(XTI).  TI-RPC is on-the-wire compatible with the TS-RPC, which is supported
+by almost 70 vendors on all major operating systems.  TS-RPC source code
+(RPCSRC 4.0) remains available from several internet sites.
+
+This release was a native source release, compatible for
+building on Solaris 2.3. It had been ported from FreeBSD 5.2.1 to GNU/Linux 
+in 2004.
+
+Applications linked with this release's librpc must link with the United
+States domestic version of libcrypt in order to resolve the cbc_crypt() and
+ecb_crypt() functions.  These routines are used with Secure RPC however all
+RPC programs that link with this release's librpc will need to link with the
+domestic libcrypt.  
+
+WHAT'S NEW IN THIS RELEASE: TIRPCSRC 2.3 FROM SUN
+
+The previous release was TIRPCSRC 2.0.
+
+1.      This release is based on Solaris 2.3.  The previous release was
+       based on Solaris 2.0.  This release contains a siginificant number of
+       bug fixes and other enhancements over TIRPCSRC 2.0.
+
+2.      The RPC library is thread safe for all client-side interfaces
+       (clnt_create, clnt_call, etc.).  The server-side interfaces
+       (svc_create, svc_run, etc.) are not thread safe in this release. The
+       server-side interfaces will be made thread safe in the next release of
+       TIRPCSRC.  Please see the manual pages for details about which
+       interfaces are thread safe.
+
+3.      As part of the work to make the RPC library thread-safe, rpcgen has
+       been enhanced to generate thread-safe RPC stubs (the -M option).  Note
+       that this modifies the call-signature for the stub functions; the
+       procedure calling the RPC stub must now pass to the stub a pointer to
+       an allocated structure where results will be placed by the stub.  See
+       the rpcgen manual page and the rpcgen Programming Guide for details.
+
diff --git a/reactos/dll/win32/libtirpc/THANKS b/reactos/dll/win32/libtirpc/THANKS
new file mode 100644 (file)
index 0000000..cea8ee3
--- /dev/null
@@ -0,0 +1,6 @@
+          Thanks to                               for
+Aurelien Charbon <aurelien.charbon@bull.net>  TI-RPC portage from NetBSD
+
+BSD Communauty                                TI-RPC improvement from Sun implementation
+
diff --git a/reactos/dll/win32/libtirpc/TODO b/reactos/dll/win32/libtirpc/TODO
new file mode 100644 (file)
index 0000000..6f62665
--- /dev/null
@@ -0,0 +1,3 @@
+* Support of DES & other security part
+* Provide tests
+* rpcgen command missing
diff --git a/reactos/dll/win32/libtirpc/VERSION b/reactos/dll/win32/libtirpc/VERSION
new file mode 100644 (file)
index 0000000..5ee5442
--- /dev/null
@@ -0,0 +1,7 @@
+# This file is used by configure to get version information
+#
+PKG_MAJOR=0
+PKG_MINOR=1
+PKG_REVISION=11
+PKG_BUILD=0
+
diff --git a/reactos/dll/win32/libtirpc/autogen.sh b/reactos/dll/win32/libtirpc/autogen.sh
new file mode 100644 (file)
index 0000000..1613b6d
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh -e
+
+echo -n cleaning up .
+
+# Clean up the generated crud
+(
+       for FILE in compile config.guess config.sub depcomp install-sh ltmain.sh missing mkinstalldirs; do
+           if test -f $FILE; then
+               rm -f $FILE
+           fi
+           echo -n .
+       done
+)
+
+for FILE in aclocal.m4 configure config.h.in; do
+    if test -f $FILE; then
+       rm -f $FILE
+    fi
+       echo -n .
+done
+
+for DIR in autom4te.cache; do
+    if test -d $DIR; then
+       rm -rf $DIR
+    fi
+       echo -n .
+done
+
+find . -type f -name 'Makefile.in' -print0 | xargs -r0  rm -f --
+find . -type f -name 'Makefile' -print0 | xargs -r0 rm -f --
+
+echo ' done'
+
+if test x"${1}" = x"clean"; then
+    exit
+fi
+
+aclocal
+libtoolize --force --copy
+autoheader
+automake --add-missing --copy --gnu # -Wall
+autoconf # -Wall
diff --git a/reactos/dll/win32/libtirpc/bootstrap b/reactos/dll/win32/libtirpc/bootstrap
new file mode 100644 (file)
index 0000000..dde1a77
--- /dev/null
@@ -0,0 +1,10 @@
+[ -e Makefile ] && make clean
+rm -rf autom4te.cache configure Makefile stamp-h1 
+rm -rf src/Makefile src/.deps
+rm -rf Makefile.in aclocal.m4 config.log config.h
+rm -rf depcomp missing install-sh config.status
+aclocal
+autoheader
+automake --gnu --add-missing -c
+autoconf
+rm -rf autom4te.cache config.log libtool stamp-h1* 
diff --git a/reactos/dll/win32/libtirpc/configure.ac b/reactos/dll/win32/libtirpc/configure.ac
new file mode 100644 (file)
index 0000000..0f3ce42
--- /dev/null
@@ -0,0 +1,29 @@
+AC_INIT(libtirpc, 0.2.1)
+AM_INIT_AUTOMAKE(libtirpc, 0.2.1)
+AM_MAINTAINER_MODE
+AC_CONFIG_SRCDIR([src/auth_des.c])
+
+AC_ARG_ENABLE(gss,[  --enable-gss            Turn on gss api], [case "${enableval}" in
+        yes) gss=true ; AC_CHECK_LIB([gssapi],[gss_init_sec_context]) ;;
+        no)  gss=false ;;
+        *) AC_MSG_ERROR(bad value ${enableval} for --enable-gss) ;;
+      esac],[gss=false])
+AM_CONDITIONAL(GSS, test x$gss = xtrue)
+if test x$gss = xtrue; then
+       AC_DEFINE(HAVE_LIBGSSAPI, 1, [])
+       PKG_CHECK_MODULES(GSSGLUE, libgssglue, [],
+       AC_MSG_ERROR([Unable to locate information required to use libgssglue.]))
+fi
+
+AC_PROG_CC
+AM_CONFIG_HEADER(config.h)
+AC_PROG_LIBTOOL
+##AC_PROG_RANLIB
+AC_HEADER_DIRENT
+AC_PREFIX_DEFAULT(/usr)
+AC_CHECK_HEADERS([arpa/inet.h fcntl.h libintl.h limits.h locale.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h])
+AC_CHECK_LIB([pthread], [pthread_create])
+
+
+AC_CONFIG_FILES([Makefile src/Makefile man/Makefile doc/Makefile])
+AC_OUTPUT(libtirpc.pc)
diff --git a/reactos/dll/win32/libtirpc/dirs b/reactos/dll/win32/libtirpc/dirs
new file mode 100644 (file)
index 0000000..0be5295
--- /dev/null
@@ -0,0 +1,2 @@
+DIRS = src
+
diff --git a/reactos/dll/win32/libtirpc/doc/Makefile.am b/reactos/dll/win32/libtirpc/doc/Makefile.am
new file mode 100644 (file)
index 0000000..cc4fa76
--- /dev/null
@@ -0,0 +1,5 @@
+
+install: install-am
+       $(mkinstalldirs) $(DESTDIR)/etc
+       cp -p ./etc_netconfig $(DESTDIR)/etc/netconfig
+       chmod 0644 $(DESTDIR)/etc/netconfig
diff --git a/reactos/dll/win32/libtirpc/doc/etc_netconfig b/reactos/dll/win32/libtirpc/doc/etc_netconfig
new file mode 100644 (file)
index 0000000..effc67e
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# The network configuration file. This file is currently only used in
+# conjunction with the TI-RPC code in the libtirpc library.
+#
+# Entries consist of:
+#
+#       <network_id> <semantics> <flags> <protofamily> <protoname> \
+#               <device> <nametoaddr_libs>
+#
+# The <device> and <nametoaddr_libs> fields are always empty in this
+# implementation.
+#
+udp        tpi_clts      v     inet     udp     -       -
+tcp        tpi_cots_ord  v     inet     tcp     -       -
+udp6       tpi_clts      v     inet6    udp     -       -
+tcp6       tpi_cots_ord  v     inet6    tcp     -       -
+rawip      tpi_raw       -     inet      -      -       -
+local      tpi_cots_ord  -     loopback  -      -       -
+unix       tpi_cots_ord  -     loopback  -      -       -
diff --git a/reactos/dll/win32/libtirpc/libtirpc.pc.in b/reactos/dll/win32/libtirpc/libtirpc.pc.in
new file mode 100644 (file)
index 0000000..ec4cf75
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libtirpc
+Description: Transport Independent RPC Library
+Requires:
+Version: @PACKAGE_VERSION@
+Libs: -L@libdir@ -ltirpc
+Cflags: -I@includedir@/tirpc
diff --git a/reactos/dll/win32/libtirpc/libtirpc/libtirpc.def b/reactos/dll/win32/libtirpc/libtirpc/libtirpc.def
new file mode 100644 (file)
index 0000000..d83b1a7
--- /dev/null
@@ -0,0 +1,96 @@
+LIBRARY libtirpc
+EXPORTS
+authnone_create
+authunix_create
+authunix_create_default
+authsspi_create
+authsspi_create_default
+clnt_create
+clnt_broadcast
+clnt_pcreateerror
+clnt_perrno
+clnt_perror
+clnt_spcreateerror
+clnt_sperrno
+clnt_sperror
+clnt_tli_create
+clntraw_create
+clnttcp_create
+clntudp_bufcreate
+clntudp_create
+freenetbuf
+freenetconfigent
+freeuaddr
+get_myaddress
+getnetconfigent
+pmap_getmaps
+pmap_getport
+pmap_rmtcall
+pmap_set
+pmap_unset
+svc_getreq
+svc_getreqset
+svc_run
+svc_sendreply
+svcerr_auth
+svcerr_decode
+svcerr_noproc
+svcerr_noprog
+svcerr_progvers
+svcerr_systemerr
+svcerr_weakauth
+svcraw_create
+svctcp_create
+svcudp_bufcreate
+svcudp_create
+taddr2uaddr
+tsd_key_delete
+uaddr2taddr
+xdr_array
+xdr_authunix_parms
+xdr_bool
+xdr_bytes
+xdr_callhdr
+xdr_callmsg
+xdr_char
+xdr_des_block
+xdr_double
+xdr_enum
+xdr_float
+xdr_free
+xdr_hyper
+xdr_int
+xdr_long
+xdr_netobj
+xdr_opaque
+xdr_opaque_auth
+xdr_pmap
+xdr_pmaplist
+xdr_pmaplist_ptr
+xdr_pointer
+xdr_reference
+xdr_replymsg
+xdr_short
+xdr_string
+xdr_u_char
+xdr_u_hyper
+xdr_u_int
+xdr_u_int32_t
+xdr_u_int64_t
+xdr_u_long
+xdr_u_short
+xdr_union
+xdr_vector
+xdr_void
+xdr_wrapstring
+xdrmem_create
+xdrrec_create
+xdrrec_endofrecord
+xdrrec_eof
+xdrrec_skiprecord
+xdrstdio_create
+xprt_register
+xprt_unregister
+svc_fdset DATA
+rpc_createerr DATA
+_null_auth DATA
diff --git a/reactos/dll/win32/libtirpc/libtirpc/libtirpc.rc b/reactos/dll/win32/libtirpc/libtirpc/libtirpc.rc
new file mode 100644 (file)
index 0000000..3eee795
--- /dev/null
@@ -0,0 +1,61 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 9, 1
+#pragma code_page(1252)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE  
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE  
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE  
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/reactos/dll/win32/libtirpc/libtirpc/libtirpc_ros.rc b/reactos/dll/win32/libtirpc/libtirpc/libtirpc_ros.rc
new file mode 100644 (file)
index 0000000..239a98a
--- /dev/null
@@ -0,0 +1,4 @@
+#define REACTOS_STR_FILE_DESCRIPTION  "RPC library"
+#define REACTOS_STR_INTERNAL_NAME     "libtirpc"
+#define REACTOS_STR_ORIGINAL_FILENAME "libtirpc.dll"
+#include <reactos/version.rc>
diff --git a/reactos/dll/win32/libtirpc/libtirpc/resource.h b/reactos/dll/win32/libtirpc/libtirpc/resource.h
new file mode 100644 (file)
index 0000000..8aa83fc
--- /dev/null
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by tirpc.rc
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        101
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/reactos/dll/win32/libtirpc/man/Makefile.am b/reactos/dll/win32/libtirpc/man/Makefile.am
new file mode 100644 (file)
index 0000000..b84dd24
--- /dev/null
@@ -0,0 +1,9 @@
+
+man5_MANS = netconfig.5
+man3_MANS = bindresvport.3t des_crypt.3t getnetconfig.3t getnetpath.3t \
+               getrpcent.3t getrpcport.3t rpc.3t rpc_clnt_auth.3t rpc_clnt_calls.3t \
+               rpc_clnt_create.3t rpc_secure.3t rpc_soc.3t rpc_svc_calls.3t \
+               rpc_svc_create.3t rpc_svc_err.3t rpc_svc_reg.3t rpc_xdr.3t rtime.3t
+
+EXTRA_DIST = $(man5_MANS) $(man3_MANS)
+
diff --git a/reactos/dll/win32/libtirpc/man/bindresvport.3t b/reactos/dll/win32/libtirpc/man/bindresvport.3t
new file mode 100644 (file)
index 0000000..6724663
--- /dev/null
@@ -0,0 +1,101 @@
+.\" @(#)bindresvport.3n        2.2 88/08/02 4.0 RPCSRC; from 1.7 88/03/14 SMI
+.\"
+.Dd November 22, 1987
+.Dt BINDRESVPORT 3
+.Os
+.Sh NAME
+.Nm bindresvport ,
+.Nm bindresvport_sa
+.Nd bind a socket to a privileged IP port
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/types.h
+.In rpc/rpc.h
+.Ft int
+.Fn bindresvport "int sd" "struct sockaddr_in *sin"
+.Ft int
+.Fn bindresvport_sa "int sd" "struct sockaddr *sa"
+.Sh DESCRIPTION
+The
+.Fn bindresvport
+and
+.Fn bindresvport_sa
+functions
+are used to bind a socket descriptor to a privileged
+.Tn IP
+port, that is, a
+port number in the range 0-1023.
+.Pp
+If
+.Fa sin
+is a pointer to a
+.Ft "struct sockaddr_in"
+then the appropriate fields in the structure should be defined.
+Note that
+.Fa sin->sin_family
+must be initialized to the address family of the socket, passed by
+.Fa sd .
+If
+.Fa sin->sin_port
+is
+.Sq 0
+then an anonymous port (in the range 600-1023) will be
+chosen, and if
+.Xr bind 2
+is successful, the
+.Fa sin->sin_port
+will be updated to contain the allocated port.
+.Pp
+If
+.Fa sin
+is the
+.Dv NULL
+pointer,
+an anonymous port will be allocated (as above).
+However, there is no way for
+.Fn bindresvport
+to return the allocated port in this case.
+.Pp
+Only root can bind to a privileged port; this call will fail for any
+other users.
+.Pp
+Function prototype of
+.Fn bindresvport
+is biased to
+.Dv AF_INET
+socket.
+The
+.Fn bindresvport_sa
+function
+acts exactly the same, with more neutral function prototype.
+Note that both functions behave exactly the same, and
+both support
+.Dv AF_INET6
+sockets as well as
+.Dv AF_INET
+sockets.
+.Sh RETURN VALUES
+.Rv -std bindresvport
+.Sh ERRORS
+.Bl -tag -width Er
+.It Bq Er EPFNOSUPPORT
+If second argument was supplied,
+and address family did not match between arguments.
+.El
+.Pp
+The
+.Fn bindresvport
+function
+may also fail and set
+.Va errno
+for any of the errors specified for the calls
+.Xr bind 2 ,
+.Xr getsockopt 2 ,
+or
+.Xr setsockopt 2 .
+.Sh SEE ALSO
+.Xr bind 2 ,
+.Xr getsockopt 2 ,
+.Xr setsockopt 2 ,
+.Xr ip 4
diff --git a/reactos/dll/win32/libtirpc/man/des_crypt.3t b/reactos/dll/win32/libtirpc/man/des_crypt.3t
new file mode 100644 (file)
index 0000000..b708f76
--- /dev/null
@@ -0,0 +1,129 @@
+.\" @(#)des_crypt.3    2.1 88/08/11 4.0 RPCSRC; from 1.16 88/03/02 SMI;
+.\"
+.Dd October 6, 1987
+.Dt DES_CRYPT 3
+.Os
+.Sh NAME
+.Nm des_crypt , ecb_crypt , cbc_crypt , des_setparity
+.Nd "fast DES encryption"
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/des_crypt.h
+.Ft int
+.Fn ecb_crypt "char *key" "char *data" "unsigned datalen" "unsigned mode"
+.Ft int
+.Fn cbc_crypt "char *key" "char *data" "unsigned datalen" "unsigned mode" "char *ivec"
+.Ft void
+.Fn des_setparity "char *key"
+.Sh DESCRIPTION
+The
+.Fn ecb_crypt
+and
+.Fn cbc_crypt
+functions
+implement the
+.Tn NBS
+.Tn DES
+(Data Encryption Standard).
+These routines are faster and more general purpose than
+.Xr crypt 3 .
+They also are able to utilize
+.Tn DES
+hardware if it is available.
+The
+.Fn ecb_crypt
+function
+encrypts in
+.Tn ECB
+(Electronic Code Book)
+mode, which encrypts blocks of data independently.
+The
+.Fn cbc_crypt
+function
+encrypts in
+.Tn CBC
+(Cipher Block Chaining)
+mode, which chains together
+successive blocks.
+.Tn CBC
+mode protects against insertions, deletions and
+substitutions of blocks.
+Also, regularities in the clear text will
+not appear in the cipher text.
+.Pp
+Here is how to use these routines.
+The first argument,
+.Fa key ,
+is the 8-byte encryption key with parity.
+To set the key's parity, which for
+.Tn DES
+is in the low bit of each byte, use
+.Fn des_setparity .
+The second argument,
+.Fa data ,
+contains the data to be encrypted or decrypted.
+The
+third argument,
+.Fa datalen ,
+is the length in bytes of
+.Fa data ,
+which must be a multiple of 8.
+The fourth argument,
+.Fa mode ,
+is formed by
+.Em OR Ns 'ing
+together some things.
+For the encryption direction
+.Em OR
+in either
+.Dv DES_ENCRYPT
+or
+.Dv DES_DECRYPT .
+For software versus hardware
+encryption,
+.Em OR
+in either
+.Dv DES_HW
+or
+.Dv DES_SW .
+If
+.Dv DES_HW
+is specified, and there is no hardware, then the encryption is performed
+in software and the routine returns
+.Er DESERR_NOHWDEVICE .
+For
+.Fn cbc_crypt ,
+the
+.Fa ivec
+argument
+is the 8-byte initialization
+vector for the chaining.
+It is updated to the next initialization
+vector upon return.
+.Sh ERRORS
+.Bl -tag -width [DESERR_NOHWDEVICE] -compact
+.It Bq Er DESERR_NONE
+No error.
+.It Bq Er DESERR_NOHWDEVICE
+Encryption succeeded, but done in software instead of the requested hardware.
+.It Bq Er DESERR_HWERR
+An error occurred in the hardware or driver.
+.It Bq Er DESERR_BADPARAM
+Bad argument to routine.
+.El
+.Pp
+Given a result status
+.Va stat ,
+the macro
+.Fn DES_FAILED stat
+is false only for the first two statuses.
+.Sh SEE ALSO
+.\" .Xr des 1 ,
+.Xr crypt 3
+.Sh RESTRICTIONS
+These routines are not available in RPCSRC 4.0.
+This information is provided to describe the
+.Tn DES
+interface expected by
+Secure RPC.
diff --git a/reactos/dll/win32/libtirpc/man/getnetconfig.3t b/reactos/dll/win32/libtirpc/man/getnetconfig.3t
new file mode 100644 (file)
index 0000000..fbaa14d
--- /dev/null
@@ -0,0 +1,220 @@
+.\" @(#)getnetconfig.3n 1.28 93/06/02 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.Dd April 22, 2000
+.Dt GETNETCONFIG 3
+.Os
+.Sh NAME
+.Nm getnetconfig ,
+.Nm setnetconfig ,
+.Nm endnetconfig ,
+.Nm getnetconfigent ,
+.Nm freenetconfigent ,
+.Nm nc_perror ,
+.Nm nc_sperror
+.Nd get network configuration database entry
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In netconfig.h
+.Ft "struct netconfig *"
+.Fn getnetconfig "void *handlep"
+.Ft "void *"
+.Fn setnetconfig "void"
+.Ft int
+.Fn endnetconfig "void *handlep"
+.Ft "struct netconfig *"
+.Fn getnetconfigent "const char *netid"
+.Ft void
+.Fn freenetconfigent "struct netconfig *netconfigp"
+.Ft void
+.Fn nc_perror "const char *msg"
+.Ft "char *"
+.Fn nc_sperror "void"
+.Sh DESCRIPTION
+The library routines described on this page
+provide the application access to
+the system network configuration database,
+.Pa /etc/netconfig .
+The
+.Fn getnetconfig
+function
+returns a pointer to the
+current entry in the
+netconfig
+database, formatted as a
+.Ft "struct netconfig" .
+Successive calls will return successive netconfig
+entries in the netconfig database.
+The
+.Fn getnetconfig
+function
+can be used to search the entire netconfig
+file.
+The
+.Fn getnetconfig
+function
+returns
+.Dv NULL
+at the end of the file.
+The
+.Fa handlep
+argument
+is the handle obtained through
+.Fn setnetconfig .
+.Pp
+A call to
+.Fn setnetconfig
+has the effect of
+.Dq binding
+to or
+.Dq rewinding
+the netconfig database.
+The
+.Fn setnetconfig
+function
+must be called before the first call to
+.Fn getnetconfig
+and may be called at any other time.
+The
+.Fn setnetconfig
+function
+need not be called before a call to
+.Fn getnetconfigent .
+The
+.Fn setnetconfig
+function
+returns a unique handle to be used by
+.Fn getnetconfig .
+.Pp
+The
+.Fn endnetconfig
+function
+should be called when processing is complete to release resources for reuse.
+The
+.Fa handlep
+argument
+is the handle obtained through
+.Fn setnetconfig .
+Programmers should be aware, however, that the last call to
+.Fn endnetconfig
+frees all memory allocated by
+.Fn getnetconfig
+for the
+.Ft "struct netconfig"
+data structure.
+The
+.Fn endnetconfig
+function
+may not be called before
+.Fn setnetconfig .
+.Pp
+The
+.Fn getnetconfigent
+function
+returns a pointer
+to the netconfig structure corresponding
+to
+.Fa netid .
+It returns
+.Dv NULL
+if
+.Fa netid
+is invalid
+(that is, does not name an entry in the netconfig database).
+.Pp
+The
+.Fn freenetconfigent
+function
+frees the netconfig structure pointed to by
+.Fa netconfigp
+(previously returned by
+.Fn getnetconfigent ) .
+.Pp
+The
+.Fn nc_perror
+function
+prints a message to the standard error indicating why any of the
+above routines failed.
+The message is prepended with the string
+.Fa msg
+and a colon.
+A newline character is appended at the end of the message.
+.Pp
+The
+.Fn nc_sperror
+function
+is similar to
+.Fn nc_perror
+but instead of sending the message
+to the standard error, will return a pointer to a string that
+contains the error message.
+.Pp
+The
+.Fn nc_perror
+and
+.Fn nc_sperror
+functions
+can also be used with the
+.Ev NETPATH
+access routines defined in
+.Xr getnetpath 3 .
+.Sh RETURN VALUES
+The
+.Fn setnetconfig
+function
+returns a unique handle to be used by
+.Fn getnetconfig .
+In the case of an error,
+.Fn setnetconfig
+returns
+.Dv NULL
+and
+.Fn nc_perror
+or
+.Fn nc_sperror
+can be used to print the reason for failure.
+.Pp
+The
+.Fn getnetconfig
+function
+returns a pointer to the current entry in the netconfig
+database, formatted as a
+.Ft "struct netconfig" .
+The
+.Fn getnetconfig
+function
+returns
+.Dv NULL
+at the end of the file, or upon failure.
+.Pp
+The
+.Fn endnetconfig
+function
+returns 0 on success and \-1 on failure
+(for example, if
+.Fn setnetconfig
+was not called previously).
+.Pp
+On success,
+.Fn getnetconfigent
+returns a pointer to the
+.Ft "struct netconfig"
+structure corresponding to
+.Fa netid ;
+otherwise it returns
+.Dv NULL .
+.Pp
+The
+.Fn nc_sperror
+function
+returns a pointer to a buffer which contains the error message string.
+This buffer is overwritten on each call.
+In multithreaded applications, this buffer is
+implemented as thread-specific data.
+.Sh FILES
+.Bl -tag -width /etc/netconfig -compact
+.It Pa /etc/netconfig
+.El
+.Sh SEE ALSO
+.Xr getnetpath 3 ,
+.Xr netconfig 5
diff --git a/reactos/dll/win32/libtirpc/man/getnetpath.3t b/reactos/dll/win32/libtirpc/man/getnetpath.3t
new file mode 100644 (file)
index 0000000..b3712ad
--- /dev/null
@@ -0,0 +1,168 @@
+.\" @(#)getnetpath.3n 1.26 93/05/07 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.Dd April 22, 2000
+.Dt GETNETPATH 3
+.Os
+.Sh NAME
+.Nm getnetpath ,
+.Nm setnetpath ,
+.Nm endnetpath
+.Nd get
+.Pa /etc/netconfig
+entry corresponding to
+.Ev NETPATH
+component
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In netconfig.h
+.Ft "struct netconfig *"
+.Fn getnetpath "void *handlep"
+.Ft "void *"
+.Fn setnetpath "void"
+.Ft int
+.Fn endnetpath "void *handlep"
+.Sh DESCRIPTION
+The routines described in this page provide the application access to the system
+network configuration database,
+.Pa /etc/netconfig ,
+as it is
+.Dq filtered
+by the
+.Ev NETPATH
+environment variable (see
+.Xr environ 7 ) .
+See
+.Xr getnetconfig 3
+for other routines that also access the
+network configuration database directly.
+The
+.Ev NETPATH
+variable is a list of colon-separated network identifiers.
+.Pp
+The
+.Fn getnetpath
+function
+returns a pointer to the
+netconfig database entry corresponding to the first valid
+.Ev NETPATH
+component.
+The netconfig entry is formatted as a
+.Ft "struct netconfig" .
+On each subsequent call,
+.Fn getnetpath
+returns a pointer to the netconfig entry that corresponds to the next
+valid
+.Ev NETPATH
+component.
+The
+.Fn getnetpath
+function
+can thus be used to search the netconfig database for all networks
+included in the
+.Ev NETPATH
+variable.
+When
+.Ev NETPATH
+has been exhausted,
+.Fn getnetpath
+returns
+.Dv NULL .
+.Pp
+A call to
+.Fn setnetpath
+.Dq binds
+to or
+.Dq rewinds
+.Ev NETPATH .
+The
+.Fn setnetpath
+function
+must be called before the first call to
+.Fn getnetpath
+and may be called at any other time.
+It returns a handle that is used by
+.Fn getnetpath .
+.Pp
+The
+.Fn getnetpath
+function
+silently ignores invalid
+.Ev NETPATH
+components.
+A
+.Ev NETPATH
+component is invalid if there is no corresponding
+entry in the netconfig database.
+.Pp
+If the
+.Ev NETPATH
+variable is unset,
+.Fn getnetpath
+behaves as if
+.Ev NETPATH
+were set to the sequence of
+.Dq default
+or
+.Dq visible
+networks in the netconfig database, in the
+order in which they are listed.
+.\"This proviso holds also for this
+.\"whole manpage.
+.Pp
+The
+.Fn endnetpath
+function
+may be called to
+.Dq unbind
+from
+.Ev NETPATH
+when processing is complete, releasing resources for reuse.
+Programmers should be aware, however, that
+.Fn endnetpath
+frees all memory allocated by
+.Fn getnetpath
+for the struct netconfig data structure.
+.Sh RETURN VALUES
+The
+.Fn setnetpath
+function
+returns a handle that is used by
+.Fn getnetpath .
+In case of an error,
+.Fn setnetpath
+returns
+.Dv NULL .
+.Pp
+The
+.Fn endnetpath
+function
+returns 0 on success and \-1 on failure
+(for example, if
+.Fn setnetpath
+was not called previously).
+The
+.Fn nc_perror
+or
+.Fn nc_sperror
+function
+can be used to print out the reason for failure.
+See
+.Xr getnetconfig 3 .
+.Pp
+When first called,
+.Fn getnetpath
+returns a pointer to the netconfig database entry corresponding to the first
+valid
+.Ev NETPATH
+component.
+When
+.Ev NETPATH
+has been exhausted,
+.Fn getnetpath
+returns
+.Dv NULL .
+.Sh SEE ALSO
+.Xr getnetconfig 3 ,
+.Xr netconfig 5 ,
+.Xr environ 7
diff --git a/reactos/dll/win32/libtirpc/man/getrpcent.3t b/reactos/dll/win32/libtirpc/man/getrpcent.3t
new file mode 100644 (file)
index 0000000..261a8f4
--- /dev/null
@@ -0,0 +1,106 @@
+.\" @(#)getrpcent.3n   2.2 88/08/02 4.0 RPCSRC; from 1.11 88/03/14 SMI
+.\"
+.Dd December 14, 1987
+.Dt GETRPCENT 3
+.Os
+.Sh NAME
+.Nm getrpcent ,
+.Nm getrpcbyname ,
+.Nm getrpcbynumber ,
+.Nm endrpcent ,
+.Nm setrpcent
+.Nd get RPC entry
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft struct rpcent *
+.Fn getrpcent void
+.Ft struct rpcent *
+.Fn getrpcbyname "char *name"
+.Ft struct rpcent *
+.Fn getrpcbynumber "int number"
+.Ft void
+.Fn setrpcent "int stayopen"
+.Ft void
+.Fn endrpcent void
+.Sh DESCRIPTION
+The
+.Fn getrpcent ,
+.Fn getrpcbyname ,
+and
+.Fn getrpcbynumber
+functions
+each return a pointer to an object with the
+following structure
+containing the broken-out
+fields of a line in the rpc program number data base,
+.Pa /etc/rpc :
+.Bd -literal
+struct rpcent {
+       char    *r_name;        /* name of server for this rpc program */
+       char    **r_aliases;    /* alias list */
+       long    r_number;       /* rpc program number */
+};
+.Ed
+.Pp
+The members of this structure are:
+.Bl -tag -width r_aliases -offset indent
+.It Va r_name
+The name of the server for this rpc program.
+.It Va r_aliases
+A zero terminated list of alternate names for the rpc program.
+.It Va r_number
+The rpc program number for this service.
+.El
+.Pp
+The
+.Fn getrpcent
+function
+reads the next line of the file, opening the file if necessary.
+.Pp
+The
+.Fn setrpcent
+function
+opens and rewinds the file.  If the
+.Fa stayopen
+flag is non-zero,
+the net data base will not be closed after each call to
+.Fn getrpcent
+(either directly, or indirectly through one of
+the other
+.Dq getrpc
+calls).
+.Pp
+The
+.Fn endrpcent
+function
+closes the file.
+.Pp
+The
+.Fn getrpcbyname
+and
+.Fn getrpcbynumber
+functions
+sequentially search from the beginning
+of the file until a matching rpc program name or
+program number is found, or until end-of-file is encountered.
+.Sh FILES
+.Bl -tag -width /etc/rpc -compact
+.It Pa /etc/rpc
+.El
+.Sh SEE ALSO
+.Xr rpc 5 ,
+.Xr rpcinfo 8 ,
+.Xr ypserv 8
+.Sh DIAGNOSTICS
+A
+.Dv NULL
+pointer is returned on
+.Dv EOF
+or error.
+.Sh BUGS
+All information
+is contained in a static area
+so it must be copied if it is
+to be saved.
diff --git a/reactos/dll/win32/libtirpc/man/getrpcport.3t b/reactos/dll/win32/libtirpc/man/getrpcport.3t
new file mode 100644 (file)
index 0000000..8a072c7
--- /dev/null
@@ -0,0 +1,34 @@
+.\" @(#)getrpcport.3r  2.2 88/08/02 4.0 RPCSRC; from 1.12 88/02/26 SMI
+.\"
+.Dd October 6, 1987
+.Dt GETRPCPORT 3
+.Os
+.Sh NAME
+.Nm getrpcport
+.Nd get RPC port number
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.Ft int
+.Fn getrpcport "char *host" "int prognum" "int versnum" "int proto"
+.Sh DESCRIPTION
+The
+.Fn getrpcport
+function
+returns the port number for version
+.Fa versnum
+of the RPC program
+.Fa prognum
+running on
+.Fa host
+and using protocol
+.Fa proto .
+It returns 0 if it cannot contact the portmapper, or if
+.Fa prognum
+is not registered.  If
+.Fa prognum
+is registered but not with version
+.Fa versnum ,
+it will still return a port number (for some version of the program)
+indicating that the program is indeed registered.
+The version mismatch will be detected upon the first call to the service.
diff --git a/reactos/dll/win32/libtirpc/man/netconfig.5 b/reactos/dll/win32/libtirpc/man/netconfig.5
new file mode 100644 (file)
index 0000000..e8dcbb2
--- /dev/null
@@ -0,0 +1,123 @@
+.Dd November 17, 2000
+.Dt NETCONFIG 5
+.Os
+.Sh NAME
+.Nm netconfig
+.Nd network configuration data base
+.Sh SYNOPSIS
+.Pa /etc/netconfig
+.Sh DESCRIPTION
+The
+.Nm
+file defines a list of
+.Dq transport names ,
+describing their semantics and protocol.
+In
+.Fx ,
+this file is only used by the RPC library code.
+.Pp
+Entries have the following format:
+.Pp
+.Ar network_id semantics flags family protoname device libraries
+.Pp
+Entries consist of the following fields:
+.Bl -tag -width network_id
+.It Ar network_id
+The name of the transport described.
+.It Ar semantics
+Describes the semantics of the transport.
+This can be one of:
+.Bl -tag -width tpi_cots_ord -offset indent
+.It Sy tpi_clts
+Connectionless transport.
+.It Sy tpi_cots
+Connection-oriented transport
+.It Sy tpi_cots_ord
+Connection-oriented, ordered transport.
+.It Sy tpi_raw
+A raw connection.
+.El
+.It Ar flags
+This field is either blank (specified by
+.Dq Li - ) ,
+or contains a
+.Dq Li v ,
+meaning visible to the
+.Xr getnetconfig 3
+function.
+.It Ar family
+The protocol family of the transport.
+This is currently one of:
+.Bl -tag -width loopback -offset indent
+.It Sy inet6
+The IPv6
+.Pq Dv PF_INET6
+family of protocols.
+.It Sy inet
+The IPv4
+.Pq Dv PF_INET
+family of protocols.
+.It Sy loopback
+The
+.Dv PF_LOCAL
+protocol family.
+.El
+.It Ar protoname
+The name of the protocol used for this transport.
+Can currently be either
+.Sy udp ,
+.Sy tcp
+or empty.
+.It Ar device
+This field is always empty in
+.Fx .
+.It Ar libraries
+This field is always empty in
+.Fx .
+.El
+.Pp
+The order of entries in this file will determine which transport will
+be preferred by the RPC library code, given a match on a specified
+network type.
+For example, if a sample network config file would look like this:
+.Bd -literal -offset indent
+udp6       tpi_clts      v     inet6    udp     -       -
+tcp6       tpi_cots_ord  v     inet6    tcp     -       -
+udp        tpi_clts      v     inet     udp     -       -
+tcp        tpi_cots_ord  v     inet     tcp     -       -
+rawip      tpi_raw       -     inet      -      -       -
+local      tpi_cots_ord  -     loopback  -      -       -
+.Ed
+.Pp
+then using the network type
+.Sy udp
+in calls to the RPC library function (see
+.Xr rpc 3 )
+will make the code first try
+.Sy udp6 ,
+and then
+.Sy udp .
+.Pp
+.Xr getnetconfig 3
+and associated functions will parse this file and return structures of
+the following format:
+.Bd -literal
+struct netconfig {
+    char *nc_netid;              /* Network ID */
+    unsigned long nc_semantics;  /* Semantics (see below) */
+    unsigned long nc_flag;       /* Flags (see below) */
+    char *nc_protofmly;          /* Protocol family */
+    char *nc_proto;              /* Protocol name */
+    char *nc_device;             /* Network device pathname (unused) */
+    unsigned long nc_nlookups;   /* Number of lookup libs (unused) */
+    char **nc_lookups;           /* Names of the libraries (unused) */
+    unsigned long nc_unused[9];  /* reserved */
+};
+.Ed
+.Sh FILES
+.Bl -tag -width /etc/netconfig -compact
+.It Pa /etc/netconfig
+.El
+.Sh SEE ALSO
+.Xr getnetconfig 3 ,
+.Xr getnetpath 3
diff --git a/reactos/dll/win32/libtirpc/man/publickey.3t b/reactos/dll/win32/libtirpc/man/publickey.3t
new file mode 100644 (file)
index 0000000..0d4b13f
--- /dev/null
@@ -0,0 +1,52 @@
+.\" @(#)publickey.3r   2.1 88/08/07 4.0 RPCSRC
+.\"
+.Dd October 6, 1987
+.Dt PUBLICKEY 3
+.Os
+.Sh NAME
+.Nm publickey , getpublickey , getsecretkey
+.Nd "get public or secret key"
+.Sh LIBRARY
+.Lb librpcsvc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.In rpc/key_prot.h
+.Ft int
+.Fo getpublickey
+.Fa "char netname[MAXNETNAMELEN+1]"
+.Fa "char publickey[HEXKEYBYTES+1]"
+.Fc
+.Ft int
+.Fo getsecretkey
+.Fa "char netname[MAXNETNAMELEN+1]"
+.Fa "char secretkey[HEXKEYBYTES+1]"
+.Fa "char *passwd"
+.Fc
+.Sh DESCRIPTION
+These routines are used to get public and secret keys from the
+.Tn YP
+database.
+The
+.Fn getsecretkey
+function
+has an extra argument,
+.Fa passwd ,
+which is used to decrypt the encrypted secret key stored in the database.
+Both routines return 1 if they are successful in finding the key, 0 otherwise.
+The keys are returned as
+.Dv NULL Ns \-terminated ,
+hexadecimal strings.
+If the password supplied to
+.Fn getsecretkey
+fails to decrypt the secret key, the routine will return 1 but the
+.Fa secretkey
+argument will be a
+.Dv NULL
+string
+.Pq Dq .
+.Sh SEE ALSO
+.Xr publickey 5
+.Pp
+.%T "RPC Programmer's Manual"
+in
+.Pa /usr/share/doc/psd/23.rpc .
diff --git a/reactos/dll/win32/libtirpc/man/publickey.5 b/reactos/dll/win32/libtirpc/man/publickey.5
new file mode 100644 (file)
index 0000000..e0a03f7
--- /dev/null
@@ -0,0 +1,41 @@
+.\" @(#)publickey.5    2.1 88/08/07 4.0 RPCSRC; from 1.6 88/02/29 SMI;
+.Dd October 19, 1987
+.Dt PUBLICKEY 5
+.Os
+.Sh NAME
+.Nm publickey
+.Nd "public key database"
+.Sh SYNOPSIS
+.Pa /etc/publickey
+.Sh DESCRIPTION
+.Pa /etc/publickey
+is the public key database used for secure
+RPC (Remote Procedure Calls).
+Each entry in
+the database consists of a network user
+name (which may either refer to
+a user or a hostname), followed by the user's
+public key (in hex
+notation), a colon, and then the user's
+secret key encrypted with
+its login password (also in hex notation).
+.Pp
+This file is altered either by the user through the
+.Xr chkey 1
+command or by the system administrator through the
+.Xr newkey 8
+command.
+The file
+.Pa /etc/publickey
+should only contain data on the
+.Tn NIS
+master machine, where it
+is converted into the
+.Tn NIS
+database
+.Pa publickey.byname .
+.Sh SEE ALSO
+.Xr chkey 1 ,
+.Xr publickey 3 ,
+.Xr newkey 8 ,
+.Xr ypupdated 8
diff --git a/reactos/dll/win32/libtirpc/man/rpc.3t b/reactos/dll/win32/libtirpc/man/rpc.3t
new file mode 100644 (file)
index 0000000..b2927b1
--- /dev/null
@@ -0,0 +1,515 @@
+.\" @(#)rpc.3n 1.31 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.Dd May 7, 1993
+.Dt RPC 3
+.Os
+.Sh NAME
+.Nm rpc
+.Nd library routines for remote procedure calls
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.In netconfig.h
+.Sh DESCRIPTION
+These
+routines allow C language programs to make procedure
+calls on other machines across a network.
+First, the client sends a request to the server.
+On receipt of the request, the server calls a dispatch routine
+to perform the requested service, and then sends back a reply.
+.Pp
+All
+RPC routines require the header
+.In rpc/rpc.h .
+Routines that take a
+.Vt "struct netconfig"
+also require that
+.In netconfig.h
+be included.
+.Sh Nettype
+Some of the high-level
+RPC interface routines take a
+.Fa nettype
+string as one of the arguments
+(for example,
+.Fn clnt_create ,
+.Fn svc_create ,
+.Fn rpc_reg ,
+.Fn rpc_call ) .
+This string defines a class of transports which can be used
+for a particular application.
+.Pp
+The
+.Fa nettype
+argument
+can be one of the following:
+.Bl -tag -width datagram_v
+.It netpath
+Choose from the transports which have been
+indicated by their token names in the
+.Ev NETPATH
+environment variable.
+.Ev NETPATH
+is unset or
+.Dv NULL ,
+it defaults to
+.Qq visible .
+.Qq netpath
+is the default
+.Fa nettype .
+.It visible
+Choose the transports which have the visible flag (v)
+set in the
+.Pa /etc/netconfig
+file.
+.It circuit_v
+This is same as
+.Qq visible
+except that it chooses only the connection oriented transports
+(semantics
+.Qq tpi_cots
+or
+.Qq tpi_cots_ord )
+from the entries in the
+.Pa /etc/netconfig
+file.
+.It datagram_v
+This is same as
+.Qq visible
+except that it chooses only the connectionless datagram transports
+(semantics
+.Qq tpi_clts )
+from the entries in the
+.Pa /etc/netconfig
+file.
+.It circuit_n
+This is same as
+.Qq netpath
+except that it chooses only the connection oriented datagram transports
+(semantics
+.Qq tpi_cots
+or
+.Qq tpi_cots_ord ) .
+.It datagram_n
+This is same as
+.Qq netpath
+except that it chooses only the connectionless datagram transports
+(semantics
+.Qq tpi_clts ) .
+.It udp
+This refers to Internet UDP, both version 4 and 6.
+.It tcp
+This refers to Internet TCP, both version 4 and 6.
+.El
+.Pp
+If
+.Fa nettype
+is
+.Dv NULL ,
+it defaults to
+.Qq netpath .
+The transports are tried in left to right order in the
+.Ev NETPATH
+variable or in top to down order in the
+.Pa /etc/netconfig
+file.
+.Sh Derived Types
+The derived types used in the RPC interfaces are defined as follows:
+.Bd -literal
+       typedef u_int32_t rpcprog_t;
+       typedef u_int32_t rpcvers_t;
+       typedef u_int32_t rpcproc_t;
+       typedef u_int32_t rpcprot_t;
+       typedef u_int32_t rpcport_t;
+       typedef   int32_t rpc_inline_t;
+.Ed
+.Sh "Data Structures"
+Some of the data structures used by the
+RPC package are shown below.
+.Sh "The AUTH Structure"
+.Bd -literal
+/*
+ * Authentication info. Opaque to client.
+ */
+struct opaque_auth {
+    enum_t    oa_flavor;    /* flavor of auth */
+    caddr_t    oa_base;    /* address of more auth stuff */
+    u_int    oa_length;    /* not to exceed MAX_AUTH_BYTES */
+};
+
+/*
+ * Auth handle, interface to client side authenticators.
+ */
+typedef struct {
+    struct    opaque_auth    ah_cred;
+    struct    opaque_auth    ah_verf;
+    struct auth_ops {
+        void    (*ah_nextverf)(\|);
+        int    (*ah_marshal)(\|);    /* nextverf & serialize */
+        int    (*ah_validate)(\|);    /* validate verifier */
+        int    (*ah_refresh)(\|);    /* refresh credentials */
+        void    (*ah_destroy)(\|);    /* destroy this structure */
+    } *ah_ops;
+    caddr_t ah_private;
+} AUTH;
+.Ed
+.Sh "The CLIENT Structure"
+.Bd -literal
+/*
+ * Client rpc handle.
+ * Created by individual implementations.
+ * Client is responsible for initializing auth.
+ */
+
+typedef struct {
+    AUTH    *cl_auth;    /* authenticator */
+    struct clnt_ops {
+        enum clnt_stat    (*cl_call)();    /* call remote procedure */
+        void    (*cl_abort)();        /* abort a call */
+        void    (*cl_geterr)();        /* get specific error code */
+        bool_t    (*cl_freeres)();    /* frees results */
+        void    (*cl_destroy)();    /* destroy this structure */
+        bool_t    (*cl_control)();    /* the ioctl() of rpc */
+    } *cl_ops;
+    caddr_t    cl_private;    /* private stuff */
+    char    *cl_netid;    /* network identifier */
+    char    *cl_tp;        /* device name */
+} CLIENT;
+.Ed
+.Sh "The SVCXPRT structure"
+.Bd -literal
+enum xprt_stat {
+    XPRT_DIED,
+    XPRT_MOREREQS,
+    XPRT_IDLE
+};
+
+/*
+ * Server side transport handle
+ */
+typedef struct {
+    int    xp_fd;    /* file descriptor for the server handle */
+    u_short    xp_port;    /* obsolete */
+    const struct xp_ops {
+        bool_t    (*xp_recv)();    /* receive incoming requests */
+        enum xprt_stat    (*xp_stat)();    /* get transport status */
+        bool_t    (*xp_getargs)();    /* get arguments */
+        bool_t    (*xp_reply)();      /* send reply */
+        bool_t    (*xp_freeargs)(); /* free mem allocated for args */
+        void    (*xp_destroy)();    /* destroy this struct */
+    } *xp_ops;
+    int    xp_addrlen;    /* length of remote addr.  Obsolete */
+    struct sockaddr_in    xp_raddr; /* Obsolete */
+    const struct xp_ops2 {
+        bool_t    (*xp_control)();    /* catch-all function */
+    } *xp_ops2;
+    char    *xp_tp;    /* transport provider device name */
+    char    *xp_netid;    /* network identifier */
+    struct netbuf    xp_ltaddr;    /* local transport address */
+    struct netbuf    xp_rtaddr;    /* remote transport address */
+    struct opaque_auth    xp_verf;    /* raw response verifier */
+    caddr_t    xp_p1;    /* private: for use by svc ops */
+    caddr_t    xp_p2;    /* private: for use by svc ops */
+    caddr_t    xp_p3;    /* private: for use by svc lib */
+    int    xp_type    /* transport type */
+} SVCXPRT;
+.Ed
+.Sh "The svc_reg structure"
+.Bd -literal
+struct svc_req {
+    rpcprog_t    rq_prog;    /* service program number */
+    rpcvers_t    rq_vers;    /* service protocol version */
+    rpcproc_t    rq_proc;    /* the desired procedure */
+    struct opaque_auth    rq_cred;    /* raw creds from the wire */
+    caddr_t    rq_clntcred;    /* read only cooked cred */
+    SVCXPRT    *rq_xprt;    /* associated transport */
+};
+.Ed
+.Sh  "The XDR structure"
+.Bd -literal
+/*
+ * XDR operations.
+ * XDR_ENCODE causes the type to be encoded into the stream.
+ * XDR_DECODE causes the type to be extracted from the stream.
+ * XDR_FREE can be used to release the space allocated by an XDR_DECODE
+ * request.
+ */
+enum xdr_op {
+    XDR_ENCODE=0,
+    XDR_DECODE=1,
+    XDR_FREE=2
+};
+/*
+ * This is the number of bytes per unit of external data.
+ */
+#define BYTES_PER_XDR_UNIT    (4)
+#define RNDUP(x)  ((((x) + BYTES_PER_XDR_UNIT - 1) /
+                   BYTES_PER_XDR_UNIT) \e * BYTES_PER_XDR_UNIT)
+
+/*
+ * A xdrproc_t exists for each data type which is to be encoded or
+ * decoded.  The second argument to the xdrproc_t is a pointer to
+ * an opaque pointer.  The opaque pointer generally points to a
+ * structure of the data type to be decoded.  If this points to 0,
+ * then the type routines should allocate dynamic storage of the
+ * appropriate size and return it.
+ * bool_t  (*xdrproc_t)(XDR *, caddr_t *);
+ */
+typedef  bool_t (*xdrproc_t)();
+
+/*
+ * The XDR handle.
+ * Contains operation which is being applied to the stream,
+ * an operations vector for the particular implementation
+ */
+typedef struct {
+    enum xdr_op    x_op;    /* operation; fast additional param */
+    struct xdr_ops {
+        bool_t    (*x_getlong)();    /* get a long from underlying stream */
+        bool_t    (*x_putlong)();    /* put a long to underlying stream */
+        bool_t    (*x_getbytes)(); /* get bytes from underlying stream */
+        bool_t    (*x_putbytes)(); /* put bytes to underlying stream */
+        u_int    (*x_getpostn)(); /* returns bytes off from beginning */
+        bool_t    (*x_setpostn)(); /* lets you reposition the stream */
+        long *    (*x_inline)();    /* buf quick ptr to buffered data */
+        void    (*x_destroy)();    /* free privates of this xdr_stream */
+    } *x_ops;
+    caddr_t    x_public;    /* users' data */
+    caddr_t    x_private;    /* pointer to private data */
+    caddr_t    x_base;    /* private used for position info */
+    u_int    x_handy;    /* extra private word */
+} XDR;
+
+/*
+ * The netbuf structure. This structure is defined in <xti.h> on SysV
+ * systems, but NetBSD / FreeBSD do not use XTI.
+ *
+ * Usually, buf will point to a struct sockaddr, and len and maxlen
+ * will contain the length and maximum length of that socket address,
+ * respectively.
+ */
+struct netbuf {
+       unsigned int maxlen;
+       unsigned int len;
+       void *buf;
+};
+
+/*
+ * The format of the address and options arguments of the XTI t_bind call.
+ * Only provided for compatibility, it should not be used other than
+ * as an argument to svc_tli_create().
+ */
+
+struct t_bind {
+       struct netbuf   addr;
+       unsigned int    qlen;
+};
+.Ed
+.Sh "Index to Routines"
+The following table lists RPC routines and the manual reference
+pages on which they are described:
+.Pp
+.Bl -tag -width "authunix_create_default()" -compact
+.It Em "RPC Routine"
+.Em "Manual Reference Page"
+.Pp
+.It Fn auth_destroy
+.Xr rpc_clnt_auth 3
+.It Fn authdes_create
+.Xr rpc_soc 3
+.It Fn authnone_create
+.Xr rpc_clnt_auth 3
+.It Fn authsys_create
+.Xr rpc_clnt_auth 3
+.It Fn authsys_create_default
+.Xr rpc_clnt_auth 3
+.It Fn authunix_create
+.Xr rpc_soc 3
+.It Fn authunix_create_default
+.Xr rpc_soc 3
+.It Fn callrpc
+.Xr rpc_soc 3
+.It Fn clnt_broadcast
+.Xr rpc_soc 3
+.It Fn clnt_call
+.Xr rpc_clnt_calls 3
+.It Fn clnt_control
+.Xr rpc_clnt_create 3
+.It Fn clnt_create
+.Xr rpc_clnt_create 3
+.It Fn clnt_create_timed
+.Xr rpc_clnt_create 3
+.It Fn clnt_create_vers
+.Xr rpc_clnt_create 3
+.It Fn clnt_create_vers_timed
+.Xr rpc_clnt_create 3
+.It Fn clnt_destroy
+.Xr rpc_clnt_create 3
+.It Fn clnt_dg_create
+.Xr rpc_clnt_create 3
+.It Fn clnt_freeres
+.Xr rpc_clnt_calls 3
+.It Fn clnt_geterr
+.Xr rpc_clnt_calls 3
+.It Fn clnt_pcreateerror
+.Xr rpc_clnt_create 3
+.It Fn clnt_perrno
+.Xr rpc_clnt_calls 3
+.It Fn clnt_perror
+.Xr rpc_clnt_calls 3
+.It Fn clnt_raw_create
+.Xr rpc_clnt_create 3
+.It Fn clnt_spcreateerror
+.Xr rpc_clnt_create 3
+.It Fn clnt_sperrno
+.Xr rpc_clnt_calls 3
+.It Fn clnt_sperror
+.Xr rpc_clnt_calls 3
+.It Fn clnt_tli_create
+.Xr rpc_clnt_create 3
+.It Fn clnt_tp_create
+.Xr rpc_clnt_create 3
+.It Fn clnt_tp_create_timed
+.Xr rpc_clnt_create 3
+.It Fn clnt_udpcreate
+.Xr rpc_soc 3
+.It Fn clnt_vc_create
+.Xr rpc_clnt_create 3
+.It Fn clntraw_create
+.Xr rpc_soc 3
+.It Fn clnttcp_create
+.Xr rpc_soc 3
+.It Fn clntudp_bufcreate
+.Xr rpc_soc 3
+.It Fn get_myaddress
+.Xr rpc_soc 3
+.It Fn pmap_getmaps
+.Xr rpc_soc 3
+.It Fn pmap_getport
+.Xr rpc_soc 3
+.It Fn pmap_rmtcall
+.Xr rpc_soc 3
+.It Fn pmap_set
+.Xr rpc_soc 3
+.It Fn pmap_unset
+.Xr rpc_soc 3
+.It Fn registerrpc
+.Xr rpc_soc 3
+.It Fn rpc_broadcast
+.Xr rpc_clnt_calls 3
+.It Fn rpc_broadcast_exp
+.Xr rpc_clnt_calls 3
+.It Fn rpc_call
+.Xr rpc_clnt_calls 3
+.It Fn rpc_reg
+.Xr rpc_svc_calls 3
+.It Fn svc_create
+.Xr rpc_svc_create 3
+.It Fn svc_destroy
+.Xr rpc_svc_create 3
+.It Fn svc_dg_create
+.Xr rpc_svc_create 3
+.It Fn svc_dg_enablecache
+.Xr rpc_svc_calls 3
+.It Fn svc_fd_create
+.Xr rpc_svc_create 3
+.It Fn svc_fds
+.Xr rpc_soc 3
+.It Fn svc_freeargs
+.Xr rpc_svc_reg 3
+.It Fn svc_getargs
+.Xr rpc_svc_reg 3
+.It Fn svc_getcaller
+.Xr rpc_soc 3
+.It Fn svc_getreq
+.Xr rpc_soc 3
+.It Fn svc_getreqset
+.Xr rpc_svc_calls 3
+.It Fn svc_getrpccaller
+.Xr rpc_svc_calls 3
+.It Fn svc_kerb_reg
+.Xr kerberos_rpc 3
+.It Fn svc_raw_create
+.Xr rpc_svc_create 3
+.It Fn svc_reg
+.Xr rpc_svc_calls 3
+.It Fn svc_register
+.Xr rpc_soc 3
+.It Fn svc_run
+.Xr rpc_svc_reg 3
+.It Fn svc_sendreply
+.Xr rpc_svc_reg 3
+.It Fn svc_tli_create
+.Xr rpc_svc_create 3
+.It Fn svc_tp_create
+.Xr rpc_svc_create 3
+.It Fn svc_unreg
+.Xr rpc_svc_calls 3
+.It Fn svc_unregister
+.Xr rpc_soc 3
+.It Fn svc_vc_create
+.Xr rpc_svc_create 3
+.It Fn svcerr_auth
+.Xr rpc_svc_err 3
+.It Fn svcerr_decode
+.Xr rpc_svc_err 3
+.It Fn svcerr_noproc
+.Xr rpc_svc_err 3
+.It Fn svcerr_noprog
+.Xr rpc_svc_err 3
+.It Fn svcerr_progvers
+.Xr rpc_svc_err 3
+.It Fn svcerr_systemerr
+.Xr rpc_svc_err 3
+.It Fn svcerr_weakauth
+.Xr rpc_svc_err 3
+.It Fn svcfd_create
+.Xr rpc_soc 3
+.It Fn svcraw_create
+.Xr rpc_soc 3
+.It Fn svctcp_create
+.Xr rpc_soc 3
+.It Fn svcudp_bufcreate
+.Xr rpc_soc 3
+.It Fn svcudp_create
+.Xr rpc_soc 3
+.It Fn xdr_accepted_reply
+.Xr rpc_xdr 3
+.It Fn xdr_authsys_parms
+.Xr rpc_xdr 3
+.It Fn xdr_authunix_parms
+.Xr rpc_soc 3
+.It Fn xdr_callhdr
+.Xr rpc_xdr 3
+.It Fn xdr_callmsg
+.Xr rpc_xdr 3
+.It Fn xdr_opaque_auth
+.Xr rpc_xdr 3
+.It Fn xdr_rejected_reply
+.Xr rpc_xdr 3
+.It Fn xdr_replymsg
+.Xr rpc_xdr 3
+.It Fn xprt_register
+.Xr rpc_svc_calls 3
+.It Fn xprt_unregister
+.Xr rpc_svc_calls 3
+.El
+.Sh FILES
+.Bl -tag -width /etc/netconfig
+.It Pa /etc/netconfig
+.El
+.Sh SEE ALSO
+.Xr getnetconfig 3 ,
+.Xr getnetpath 3 ,
+.Xr rpcbind 3 ,
+.Xr rpc_clnt_auth 3 ,
+.Xr rpc_clnt_calls 3 ,
+.Xr rpc_clnt_create 3 ,
+.Xr rpc_svc_calls 3 ,
+.Xr rpc_svc_create 3 ,
+.Xr rpc_svc_err 3 ,
+.Xr rpc_svc_reg 3 ,
+.Xr rpc_xdr 3 ,
+.Xr xdr 3 ,
+.Xr netconfig 5
diff --git a/reactos/dll/win32/libtirpc/man/rpc.5 b/reactos/dll/win32/libtirpc/man/rpc.5
new file mode 100644 (file)
index 0000000..385c637
--- /dev/null
@@ -0,0 +1,57 @@
+.\" @(#)rpc.4 1.17 93/08/30 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.Dd December 10, 1991
+.Dt RPC 5
+.Os
+.Sh NAME
+.Nm rpc
+.Nd rpc program number data base
+.Sh SYNOPSIS
+.Pa /etc/rpc
+.Sh DESCRIPTION
+The
+.Nm
+file contains user readable names that
+can be used in place of RPC program numbers.
+For each RPC program a single line should be present
+with the following information:
+.Pp
+.Bl -enum -compact
+.It
+name of the RPC program
+.It
+RPC program number
+.It
+aliases
+.El
+.Pp
+Items are separated by any number of blanks and/or
+tab characters.
+A hash
+.Pq Dq Li #
+indicates the beginning of a comment; characters up to the end of
+the line are not interpreted by routines which search the file.
+.Sh EXAMPLES
+Below is an example of an RPC database:
+.Bd -literal
+#
+#      rpc
+#
+rpcbind                100000  portmap sunrpc portmapper
+rusersd                100002  rusers
+nfs            100003  nfsprog
+mountd         100005  mount   showmount
+walld          100008  rwall   shutdown
+sprayd         100012  spray
+llockmgr       100020
+nlockmgr       100021
+status         100024
+bootparam      100026
+keyserv                100029  keyserver
+.Ed
+.Sh FILES
+.Bl -tag -width /etc/nsswitch.conf -compact
+.It Pa /etc/nsswitch.conf
+.El
+.Sh SEE ALSO
+.Xr getrpcent 3
diff --git a/reactos/dll/win32/libtirpc/man/rpc_clnt_auth.3t b/reactos/dll/win32/libtirpc/man/rpc_clnt_auth.3t
new file mode 100644 (file)
index 0000000..ee8fd1d
--- /dev/null
@@ -0,0 +1,96 @@
+.\" @(#)rpc_clnt_auth.3n 1.21 93/05/07 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_clnt_auth 1.4 89/07/20 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $NetBSD: rpc_clnt_auth.3,v 1.1 2000/06/03 09:29:50 fvdl Exp $
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_clnt_auth.3,v 1.5 2002/12/19 09:40:23 ru Exp $
+.Dd May 7, 1993
+.Dt RPC_CLNT_AUTH 3
+.Os
+.Sh NAME
+.Nm auth_destroy ,
+.Nm authnone_create ,
+.Nm authsys_create ,
+.Nm authsys_create_default
+.Nd library routines for client side remote procedure call authentication
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft "void"
+.Fn auth_destroy "AUTH *auth"
+.Ft "AUTH *"
+.Fn authnone_create "void"
+.Ft "AUTH *"
+.Fn authsys_create "const char *host" "const uid_t uid" "const gid_t gid" "const int len" "const gid_t *aup_gids"
+.Ft "AUTH *"
+.Fn authsys_create_default "void"
+.Sh DESCRIPTION
+These routines are part of the
+RPC library that allows C language programs to make procedure
+calls on other machines across the network,
+with desired authentication.
+.Pp
+These routines are normally called after creating the
+.Vt CLIENT
+handle.
+The
+.Va cl_auth
+field of the
+.Vt CLIENT
+structure should be initialized by the
+.Vt AUTH
+structure returned by some of the following routines.
+The client's authentication information
+is passed to the server when the
+RPC
+call is made.
+.Pp
+Only the
+.Dv NULL
+and the
+.Dv SYS
+style of authentication is discussed here.
+.Sh Routines
+.Bl -tag -width authsys_create_default()
+.It Fn auth_destroy
+A function macro that destroys the authentication
+information associated with
+.Fa auth .
+Destruction usually involves deallocation
+of private data structures.
+The use of
+.Fa auth
+is undefined after calling
+.Fn auth_destroy .
+.It Fn authnone_create
+Create and return an RPC
+authentication handle that passes nonusable
+authentication information with each remote procedure call.
+This is the default authentication used by RPC.
+.It Fn authsys_create
+Create and return an RPC authentication handle that contains
+.Dv AUTH_SYS
+authentication information.
+The
+.Fa host
+argument
+is the name of the machine on which the information was
+created;
+.Fa uid
+is the user's user ID;
+.Fa gid
+is the user's current group ID;
+.Fa len
+and
+.Fa aup_gids
+refer to a counted array of groups to which the user belongs.
+.It Fn authsys_create_default
+Call
+.Fn authsys_create
+with the appropriate arguments.
+.El
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr rpc_clnt_calls 3 ,
+.Xr rpc_clnt_create 3
diff --git a/reactos/dll/win32/libtirpc/man/rpc_clnt_calls.3t b/reactos/dll/win32/libtirpc/man/rpc_clnt_calls.3t
new file mode 100644 (file)
index 0000000..38b29d5
--- /dev/null
@@ -0,0 +1,316 @@
+.\" @(#)rpc_clnt_calls.3n 1.30 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_clnt_calls 1.4 89/07/20 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_clnt_calls.3,v 1.7 2002/12/19 09:40:23 ru Exp $
+.Dd May 7, 1993
+.Dt RPC_CLNT_CALLS 3
+.Os
+.Sh NAME
+.Nm rpc_clnt_calls ,
+.Nm clnt_call ,
+.Nm clnt_freeres ,
+.Nm clnt_geterr ,
+.Nm clnt_perrno ,
+.Nm clnt_perror ,
+.Nm clnt_sperrno ,
+.Nm clnt_sperror ,
+.Nm rpc_broadcast ,
+.Nm rpc_broadcast_exp ,
+.Nm rpc_call
+.Nd library routines for client side calls
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft "enum clnt_stat"
+.Fn clnt_call "CLIENT *clnt" "const rpcproc_t procnum" "const xdrproc_t inproc" "const caddr_t in" "const xdrproc_t outproc" "caddr_t out" "const struct timeval tout"
+.Ft bool_t
+.Fn clnt_freeres "CLIENT *clnt" "const xdrproc_t outproc" "caddr_t out"
+.Ft void
+.Fn clnt_geterr "const CLIENT * clnt" "struct rpc_err * errp"
+.Ft void
+.Fn clnt_perrno "const enum clnt_stat stat"
+.Ft void
+.Fn clnt_perror "CLIENT *clnt" "const char *s"
+.Ft "char *"
+.Fn clnt_sperrno "const enum clnt_stat stat"
+.Ft "char *"
+.Fn clnt_sperror "CLIENT *clnt" "const char * s"
+.Ft "enum clnt_stat"
+.Fo rpc_broadcast
+.Fa "const rpcprog_t prognum" "const rpcvers_t versnum"
+.Fa "const rpcproc_t procnum" "const xdrproc_t inproc"
+.Fa "const caddr_t in" "const xdrproc_t outproc" "caddr_t out"
+.Fa "const resultproc_t eachresult" "const char *nettype"
+.Fc
+.Ft "enum clnt_stat"
+.Fo rpc_broadcast_exp
+.Fa "const rpcprog_t prognum" "const rpcvers_t versnum"
+.Fa "const rpcproc_t procnum" "const xdrproc_t xargs"
+.Fa "caddr_t argsp" "const xdrproc_t xresults"
+.Fa "caddr_t resultsp" "const resultproc_t eachresult"
+.Fa "const int inittime" "const int waittime"
+.Fa "const char * nettype"
+.Fc
+.Ft "enum clnt_stat"
+.Fo rpc_call
+.Fa "const char *host" "const rpcprog_t prognum"
+.Fa "const rpcvers_t versnum" "const rpcproc_t procnum"
+.Fa "const xdrproc_t inproc" "const char *in"
+.Fa "const xdrproc_t outproc" "char *out" "const char *nettype"
+.Fc
+.Sh DESCRIPTION
+RPC library routines allow C language programs to make procedure
+calls on other machines across the network.
+First, the client calls a procedure to send a request to the server.
+Upon receipt of the request, the server calls a dispatch routine
+to perform the requested service, and then sends back a reply.
+.Pp
+The
+.Fn clnt_call ,
+.Fn rpc_call ,
+and
+.Fn rpc_broadcast
+routines handle the client side of the procedure call.
+The remaining routines deal with error handling in the case of errors.
+.Pp
+Some of the routines take a
+.Vt CLIENT
+handle as one of the arguments.
+A
+.Vt CLIENT
+handle can be created by an RPC creation routine such as
+.Fn clnt_create
+(see
+.Xr rpc_clnt_create 3 ) .
+.Pp
+These routines are safe for use in multithreaded applications.
+.Vt CLIENT
+handles can be shared between threads, however in this implementation
+requests by different threads are serialized (that is, the first request will
+receive its results before the second request is sent).
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt CLIENT
+data structure.
+.Bl -tag -width XXXXX
+.It Fn clnt_call
+A function macro that calls the remote procedure
+.Fa procnum
+associated with the client handle,
+.Fa clnt ,
+which is obtained with an RPC
+client creation routine such as
+.Fn clnt_create
+(see
+.Xr rpc_clnt_create 3 ) .
+The
+.Fa inproc
+argument
+is the XDR function used to encode the procedure's arguments, and
+.Fa outproc
+is the XDR function used to decode the procedure's results;
+.Fa in
+is the address of the procedure's argument(s), and
+.Fa out
+is the address of where to place the result(s).
+The
+.Fa tout
+argument
+is the time allowed for results to be returned, which is overridden by
+a time-out set explicitly through
+.Fn clnt_control ,
+see
+.Xr rpc_clnt_create 3 .
+If the remote call succeeds, the status returned is
+.Dv RPC_SUCCESS ,
+otherwise an appropriate status is returned.
+.It Fn clnt_freeres
+A function macro that frees any data allocated by the
+RPC/XDR system when it decoded the results of an RPC call.
+The
+.Fa out
+argument
+is the address of the results, and
+.Fa outproc
+is the XDR routine describing the results.
+This routine returns 1 if the results were successfully freed,
+and 0 otherwise.
+.It Fn clnt_geterr
+A function macro that copies the error structure out of the client
+handle to the structure at address
+.Fa errp .
+.It Fn clnt_perrno
+Print a message to standard error corresponding
+to the condition indicated by
+.Fa stat .
+A newline is appended.
+Normally used after a procedure call fails for a routine
+for which a client handle is not needed, for instance
+.Fn rpc_call .
+.It Fn clnt_perror
+Print a message to the standard error indicating why an
+RPC call failed;
+.Fa clnt
+is the handle used to do the call.
+The message is prepended with string
+.Fa s
+and a colon.
+A newline is appended.
+Normally used after a remote procedure call fails
+for a routine which requires a client handle,
+for instance
+.Fn clnt_call .
+.It Fn clnt_sperrno
+Take the same arguments as
+.Fn clnt_perrno ,
+but instead of sending a message to the standard error
+indicating why an RPC
+call failed, return a pointer to a string which contains the message.
+The
+.Fn clnt_sperrno
+function
+is normally used instead of
+.Fn clnt_perrno
+when the program does not have a standard error (as a program
+running as a server quite likely does not), or if the programmer
+does not want the message to be output with
+.Fn printf
+(see
+.Xr printf 3 ) ,
+or if a message format different than that supported by
+.Fn clnt_perrno
+is to be used.
+Note:
+unlike
+.Fn clnt_sperror
+and
+.Fn clnt_spcreateerror
+(see
+.Xr rpc_clnt_create 3 ) ,
+.Fn clnt_sperrno
+does not return pointer to static data so the
+result will not get overwritten on each call.
+.It Fn clnt_sperror
+Like
+.Fn clnt_perror ,
+except that (like
+.Fn clnt_sperrno )
+it returns a string instead of printing to standard error.
+However,
+.Fn clnt_sperror
+does not append a newline at the end of the message.
+Warning:
+returns pointer to a buffer that is overwritten
+on each call.
+.It Fn rpc_broadcast
+Like
+.Fn rpc_call ,
+except the call message is broadcast to
+all the connectionless transports specified by
+.Fa nettype .
+If
+.Fa nettype
+is
+.Dv NULL ,
+it defaults to
+.Qq netpath .
+Each time it receives a response,
+this routine calls
+.Fn eachresult ,
+whose form is:
+.Ft bool_t
+.Fn eachresult "caddr_t out" "const struct netbuf * addr" "const struct netconfig * netconf"
+where
+.Fa out
+is the same as
+.Fa out
+passed to
+.Fn rpc_broadcast ,
+except that the remote procedure's output is decoded there;
+.Fa addr
+points to the address of the machine that sent the results, and
+.Fa netconf
+is the netconfig structure of the transport on which the remote
+server responded.
+If
+.Fn eachresult
+returns 0,
+.Fn rpc_broadcast
+waits for more replies;
+otherwise it returns with appropriate status.
+Warning:
+broadcast file descriptors are limited in size to the
+maximum transfer size of that transport.
+For Ethernet, this value is 1500 bytes.
+The
+.Fn rpc_broadcast
+function
+uses
+.Dv AUTH_SYS
+credentials by default (see
+.Xr rpc_clnt_auth 3 ) .
+.It Fn rpc_broadcast_exp
+Like
+.Fn rpc_broadcast ,
+except that the initial timeout,
+.Fa inittime
+and the maximum timeout,
+.Fa waittime
+are specified in milliseconds.
+The
+.Fa inittime
+argument
+is the initial time that
+.Fn rpc_broadcast_exp
+waits before resending the request.
+After the first resend, the re-transmission interval
+increases exponentially until it exceeds
+.Fa waittime .
+.It Fn rpc_call
+Call the remote procedure associated with
+.Fa prognum ,
+.Fa versnum ,
+and
+.Fa procnum
+on the machine,
+.Fa host .
+The
+.Fa inproc
+argument
+is used to encode the procedure's arguments, and
+.Fa outproc
+is used to decode the procedure's results;
+.Fa in
+is the address of the procedure's argument(s), and
+.Fa out
+is the address of where to place the result(s).
+The
+.Fa nettype
+argument
+can be any of the values listed on
+.Xr rpc 3 .
+This routine returns
+.Dv RPC_SUCCESS
+if it succeeds,
+or an appropriate status is returned.
+Use the
+.Fn clnt_perrno
+routine to translate failure status into error messages.
+Warning:
+.Fn rpc_call
+uses the first available transport belonging
+to the class
+.Fa nettype ,
+on which it can create a connection.
+You do not have control of timeouts or authentication
+using this routine.
+.El
+.Sh SEE ALSO
+.Xr printf 3 ,
+.Xr rpc 3 ,
+.Xr rpc_clnt_auth 3 ,
+.Xr rpc_clnt_create 3
diff --git a/reactos/dll/win32/libtirpc/man/rpc_clnt_create.3t b/reactos/dll/win32/libtirpc/man/rpc_clnt_create.3t
new file mode 100644 (file)
index 0000000..acdbab4
--- /dev/null
@@ -0,0 +1,514 @@
+.\" @(#)rpc_clnt_create.3n 1.36 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_clnt_create 1.5 89/07/24 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\" $NetBSD: rpc_clnt_create.3,v 1.2 2000/06/20 00:53:08 fvdl Exp $
+.\" $FreeBSD: src/lib/libc/rpc/rpc_clnt_create.3,v 1.12 2003/09/14 13:41:56 ru Exp $
+.Dd May 7, 1993
+.Dt RPC_CLNT_CREATE 3
+.Os
+.Sh NAME
+.Nm rpc_clnt_create ,
+.Nm clnt_control ,
+.Nm clnt_create ,
+.Nm clnt_create_timed ,
+.Nm clnt_create_vers ,
+.Nm clnt_create_vers_timed ,
+.Nm clnt_destroy ,
+.Nm clnt_dg_create ,
+.Nm clnt_pcreateerror ,
+.Nm clnt_raw_create ,
+.Nm clnt_spcreateerror ,
+.Nm clnt_tli_create ,
+.Nm clnt_tp_create ,
+.Nm clnt_tp_create_timed ,
+.Nm clnt_vc_create ,
+.Nm rpc_createerr
+.Nd "library routines for dealing with creation and manipulation of"
+.Vt CLIENT
+handles
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft bool_t
+.Fn clnt_control "CLIENT *clnt" "const u_int req" "char *info"
+.Ft "CLIENT *"
+.Fn clnt_create "const char * host" "const rpcprog_t prognum" "const rpcvers_t versnum" "const char *nettype"
+.Ft "CLIENT *"
+.Fn clnt_create_timed "const char * host" "const rpcprog_t prognum" "const rpcvers_t versnum" "const char *nettype" "const struct timeval *timeout"
+.Ft "CLIENT *"
+.Fn clnt_create_vers "const char * host" "const rpcprog_t prognum" "rpcvers_t *vers_outp" "const rpcvers_t vers_low" "const rpcvers_t vers_high" "const char *nettype"
+.Ft "CLIENT *"
+.Fn clnt_create_vers_timed "const char * host" "const rpcprog_t prognum" "rpcvers_t *vers_outp" "const rpcvers_t vers_low" "const rpcvers_t vers_high" "char *nettype" "const struct timeval *timeout"
+.Ft void
+.Fn clnt_destroy "CLIENT *clnt"
+.Ft "CLIENT *"
+.Fn clnt_dg_create "const int fildes" "const struct netbuf *svcaddr" "const rpcprog_t prognum" "const rpcvers_t versnum" "const u_int sendsz" "const u_int recvsz"
+.Ft void
+.Fn clnt_pcreateerror "const char *s"
+.Ft "char *"
+.Fn clnt_spcreateerror "const char *s"
+.Ft "CLIENT *"
+.Fn clnt_raw_create "const rpcprog_t prognum" "const rpcvers_t versnum"
+.Ft "CLIENT *"
+.Fn clnt_tli_create "const int fildes" "const struct netconfig *netconf" "const struct netbuf *svcaddr" "const rpcprog_t prognum" "const rpcvers_t versnum" "const u_int sendsz" "const u_int recvsz"
+.Ft "CLIENT *"
+.Fn clnt_tp_create "const char * host" "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf"
+.Ft "CLIENT *"
+.Fn clnt_tp_create_timed "const char * host" "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf" "const struct timeval *timeout"
+.Ft "CLIENT *"
+.Fn clnt_vc_create "const int fildes" "const struct netbuf *svcaddr" "const rpcprog_t prognum" "const rpcvers_t versnum" "u_int sendsz" "u_int recvsz"
+.Sh DESCRIPTION
+RPC library routines allow C language programs to make procedure
+calls on other machines across the network.
+First a
+.Vt CLIENT
+handle is created and then the client calls a procedure to send a
+request to the server.
+On receipt of the request, the server calls a dispatch routine
+to perform the requested service, and then sends a reply.
+.Sh Routines
+.Bl -tag -width YYYYYYY
+.It Fn clnt_control
+A function macro to change or retrieve various information
+about a client object.
+The
+.Fa req
+argument
+indicates the type of operation, and
+.Fa info
+is a pointer to the information.
+For both connectionless and connection-oriented transports,
+the supported values of
+.Fa req
+and their argument types and what they do are:
+.Bl -column "CLSET_FD_NCLOSE" "struct timeval *" "set total timeout"
+.It Dv CLSET_TIMEOUT Ta "struct timeval *" Ta "set total timeout"
+.It Dv CLGET_TIMEOUT Ta "struct timeval *" Ta "get total timeout"
+.El
+.Pp
+Note:
+if you set the timeout using
+.Fn clnt_control ,
+the timeout argument passed by
+.Fn clnt_call
+is ignored in all subsequent calls.
+.Pp
+Note:
+If you set the timeout value to 0,
+.Fn clnt_control
+immediately returns an error
+.Pq Dv RPC_TIMEDOUT .
+Set the timeout argument to 0 for batching calls.
+.Bl -column CLSET_FD_NCLOSE "struct timeval *" "do not close fd on destroy"
+.It Dv CLGET_SVC_ADDR Ta "struct netbuf *" Ta "get servers address"
+.It Dv CLGET_FD Ta "int *" Ta "get fd from handle"
+.It Dv CLSET_FD_CLOSE Ta "void" Ta "close fd on destroy"
+.It Dv CLSET_FD_NCLOSE Ta void Ta "don't close fd on destroy"
+.It Dv CLGET_VERS Ta "u_int32_t *" Ta "get RPC program version"
+.It Dv CLSET_VERS Ta "u_int32_t *" Ta "set RPC program version"
+.It Dv CLGET_XID Ta "u_int32_t *" Ta "get XID of previous call"
+.It Dv CLSET_XID Ta "u_int32_t *" Ta "set XID of next call"
+.El
+.Pp
+The following operations are valid for connectionless transports only:
+.Bl -column CLSET_RETRY_TIMEOUT "struct timeval *" "set total timeout"
+.It Dv CLSET_RETRY_TIMEOUT Ta "struct timeval *" Ta "set the retry timeout"
+.It Dv CLGET_RETRY_TIMEOUT Ta "struct timeval *" Ta "get the retry timeout"
+.It Dv CLSET_CONNECT Ta Vt "int *" Ta use Xr connect 2
+.El
+.Pp
+The retry timeout is the time that RPC
+waits for the server to reply before retransmitting the request.
+The
+.Fn clnt_control
+function
+returns
+.Dv TRUE
+on success and
+.Dv FALSE
+on failure.
+.It Fn clnt_create
+Generic client creation routine for program
+.Fa prognum
+and version
+.Fa versnum .
+The
+.Fa host
+argument
+identifies the name of the remote host where the server
+is located.
+The
+.Fa nettype
+argument
+indicates the class of transport protocol to use.
+The transports are tried in left to right order in
+.Ev NETPATH
+environment variable or in top to bottom order in
+the netconfig database.
+The
+.Fn clnt_create
+function
+tries all the transports of the
+.Fa nettype
+class available from the
+.Ev NETPATH
+environment variable and the netconfig database,
+and chooses the first successful one.
+A default timeout is set and can be modified using
+.Fn clnt_control .
+This routine returns
+.Dv NULL
+if it fails.
+The
+.Fn clnt_pcreateerror
+routine can be used to print the reason for failure.
+.Pp
+Note:
+.Fn clnt_create
+returns a valid client handle even
+if the particular version number supplied to
+.Fn clnt_create
+is not registered with the
+.Xr rpcbind 8
+service.
+This mismatch will be discovered by a
+.Fn clnt_call
+later (see
+.Xr rpc_clnt_calls 3 ) .
+.It Fn clnt_create_timed
+Generic client creation routine which is similar to
+.Fn clnt_create
+but which also has the additional argument
+.Fa timeout
+that specifies the maximum amount of time allowed for
+each transport class tried.
+In all other respects, the
+.Fn clnt_create_timed
+call behaves exactly like the
+.Fn clnt_create
+call.
+.It Fn clnt_create_vers
+Generic client creation routine which is similar to
+.Fn clnt_create
+but which also checks for the
+version availability.
+The
+.Fa host
+argument
+identifies the name of the remote host where the server
+is located.
+The
+.Fa nettype
+argument
+indicates the class transport protocols to be used.
+If the routine is successful it returns a client handle created for
+the highest version between
+.Fa vers_low
+and
+.Fa vers_high
+that is supported by the server.
+The
+.Fa vers_outp
+argument
+is set to this value.
+That is, after a successful return
+.Fa vers_low
+<=
+.Fa *vers_outp
+<=
+.Fa vers_high .
+If no version between
+.Fa vers_low
+and
+.Fa vers_high
+is supported by the server then the routine fails and returns
+.Dv NULL .
+A default timeout is set and can be modified using
+.Fn clnt_control .
+This routine returns
+.Dv NULL
+if it fails.
+The
+.Fn clnt_pcreateerror
+routine can be used to print the reason for failure.
+Note:
+.Fn clnt_create
+returns a valid client handle even
+if the particular version number supplied to
+.Fn clnt_create
+is not registered with the
+.Xr rpcbind 8
+service.
+This mismatch will be discovered by a
+.Fn clnt_call
+later (see
+.Xr rpc_clnt_calls 3 ) .
+However,
+.Fn clnt_create_vers
+does this for you and returns a valid handle
+only if a version within
+the range supplied is supported by the server.
+.It Fn clnt_create_vers_timed
+Generic client creation routine which is similar to
+.Fn clnt_create_vers
+but which also has the additional argument
+.Fa timeout
+that specifies the maximum amount of time allowed for
+each transport class tried.
+In all other respects, the
+.Fn clnt_create_vers_timed
+call behaves exactly like the
+.Fn clnt_create_vers
+call.
+.It Fn clnt_destroy
+A function macro that destroys the client's RPC handle.
+Destruction usually involves deallocation
+of private data structures, including
+.Fa clnt
+itself.
+Use of
+.Fa clnt
+is undefined after calling
+.Fn clnt_destroy .
+If the RPC library opened the associated file descriptor, or
+.Dv CLSET_FD_CLOSE
+was set using
+.Fn clnt_control ,
+the file descriptor will be closed.
+The caller should call
+.Fn auth_destroy "clnt->cl_auth"
+(before calling
+.Fn clnt_destroy )
+to destroy the associated
+.Vt AUTH
+structure (see
+.Xr rpc_clnt_auth 3 ) .
+.It Fn clnt_dg_create
+This routine creates an RPC client for the remote program
+.Fa prognum
+and version
+.Fa versnum ;
+the client uses a connectionless transport.
+The remote program is located at address
+.Fa svcaddr .
+The
+.Fa fildes
+argument
+is an open and bound file descriptor.
+This routine will resend the call message in intervals of
+15 seconds until a response is received or until the
+call times out.
+The total time for the call to time out is specified by
+.Fn clnt_call
+(see
+.Fn clnt_call
+in
+.Xr rpc_clnt_calls 3 ) .
+The retry time out and the total time out periods can
+be changed using
+.Fn clnt_control .
+The user may set the size of the send and receive
+buffers with the
+.Fa sendsz
+and
+.Fa recvsz
+arguments;
+values of 0 choose suitable defaults.
+This routine returns
+.Dv NULL
+if it fails.
+.It Fn clnt_pcreateerror
+Print a message to standard error indicating
+why a client RPC handle could not be created.
+The message is prepended with the string
+.Fa s
+and a colon, and appended with a newline.
+.It Fn clnt_spcreateerror
+Like
+.Fn clnt_pcreateerror ,
+except that it returns a string
+instead of printing to the standard error.
+A newline is not appended to the message in this case.
+Warning:
+returns a pointer to a buffer that is overwritten
+on each call.
+.It Fn clnt_raw_create
+This routine creates an RPC
+client handle for the remote program
+.Fa prognum
+and version
+.Fa versnum .
+The transport used to pass messages to the service is
+a buffer within the process's address space,
+so the corresponding RPC
+server should live in the same address space;
+(see
+.Fn svc_raw_create
+in
+.Xr rpc_svc_create 3 ) .
+This allows simulation of RPC and measurement of
+RPC overheads, such as round trip times,
+without any kernel or networking interference.
+This routine returns
+.Dv NULL
+if it fails.
+The
+.Fn clnt_raw_create
+function
+should be called after
+.Fn svc_raw_create .
+.It Fn clnt_tli_create
+This routine creates an RPC
+client handle for the remote program
+.Fa prognum
+and version
+.Fa versnum .
+The remote program is located at address
+.Fa svcaddr .
+If
+.Fa svcaddr
+is
+.Dv NULL
+and it is connection-oriented, it is assumed that the file descriptor
+is connected.
+For connectionless transports, if
+.Fa svcaddr
+is
+.Dv NULL ,
+.Dv RPC_UNKNOWNADDR
+error is set.
+The
+.Fa fildes
+argument
+is a file descriptor which may be open, bound and connected.
+If it is
+.Dv RPC_ANYFD ,
+it opens a file descriptor on the transport specified by
+.Fa netconf .
+If
+.Fa fildes
+is
+.Dv RPC_ANYFD
+and
+.Fa netconf
+is
+.Dv NULL ,
+a
+.Dv RPC_UNKNOWNPROTO
+error is set.
+If
+.Fa fildes
+is unbound, then it will attempt to bind the descriptor.
+The user may specify the size of the buffers with the
+.Fa sendsz
+and
+.Fa recvsz
+arguments;
+values of 0 choose suitable defaults.
+Depending upon the type of the transport (connection-oriented
+or connectionless),
+.Fn clnt_tli_create
+calls appropriate client creation routines.
+This routine returns
+.Dv NULL
+if it fails.
+The
+.Fn clnt_pcreateerror
+routine can be used to print the reason for failure.
+The remote rpcbind
+service (see
+.Xr rpcbind 8 )
+is not consulted for the address of the remote
+service.
+.It Fn clnt_tp_create
+Like
+.Fn clnt_create
+except
+.Fn clnt_tp_create
+tries only one transport specified through
+.Fa netconf .
+The
+.Fn clnt_tp_create
+function
+creates a client handle for the program
+.Fa prognum ,
+the version
+.Fa versnum ,
+and for the transport specified by
+.Fa netconf .
+Default options are set,
+which can be changed using
+.Fn clnt_control
+calls.
+The remote rpcbind service on the host
+.Fa host
+is consulted for the address of the remote service.
+This routine returns
+.Dv NULL
+if it fails.
+The
+.Fn clnt_pcreateerror
+routine can be used to print the reason for failure.
+.It Fn clnt_tp_create_timed
+Like
+.Fn clnt_tp_create
+except
+.Fn clnt_tp_create_timed
+has the extra argument
+.Fa timeout
+which specifies the maximum time allowed for
+the creation attempt to succeed.
+In all other respects, the
+.Fn clnt_tp_create_timed
+call behaves exactly like the
+.Fn clnt_tp_create
+call.
+.It Fn clnt_vc_create
+This routine creates an RPC
+client for the remote program
+.Fa prognum
+and version
+.Fa versnum ;
+the client uses a connection-oriented transport.
+The remote program is located at address
+.Fa svcaddr .
+The
+.Fa fildes
+argument
+is an open and bound file descriptor.
+The user may specify the size of the send and receive buffers
+with the
+.Fa sendsz
+and
+.Fa recvsz
+arguments;
+values of 0 choose suitable defaults.
+This routine returns
+.Dv NULL
+if it fails.
+The address
+.Fa svcaddr
+should not be
+.Dv NULL
+and should point to the actual address of the remote program.
+The
+.Fn clnt_vc_create
+function
+does not consult the remote rpcbind service for this information.
+.It Xo
+.Vt "struct rpc_createerr" Va rpc_createerr ;
+.Xc
+A global variable whose value is set by any RPC
+client handle creation routine
+that fails.
+It is used by the routine
+.Fn clnt_pcreateerror
+to print the reason for the failure.
+.El
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr rpc_clnt_auth 3 ,
+.Xr rpc_clnt_calls 3 ,
+.Xr rpcbind 8
diff --git a/reactos/dll/win32/libtirpc/man/rpc_secure.3t b/reactos/dll/win32/libtirpc/man/rpc_secure.3t
new file mode 100644 (file)
index 0000000..7969a91
--- /dev/null
@@ -0,0 +1,279 @@
+.\" @(#)rpc_secure.3n  2.1 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI
+.\" $FreeBSD: src/lib/libc/rpc/rpc_secure.3,v 1.14 2002/12/19 09:40:23 ru Exp $
+.\"
+.Dd February 16, 1988
+.Dt RPC 3
+.Os
+.Sh NAME
+.Nm rpc_secure
+.Nd library routines for secure remote procedure calls
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft AUTH *
+.Fo authdes_create
+.Fa "char *name"
+.Fa "unsigned window"
+.Fa "struct sockaddr *addr"
+.Fa "des_block *ckey"
+.Fc
+.Ft int
+.Fn authdes_getucred "struct authdes_cred *adc" "uid_t *uid" "gid_t *gid" "int *grouplen" "gid_t *groups"
+.Ft int
+.Fn getnetname "char *name"
+.Ft int
+.Fn host2netname "char *name" "const char *host" "const char *domain"
+.Ft int
+.Fn key_decryptsession "const char *remotename" "des_block *deskey"
+.Ft int
+.Fn key_encryptsession "const char *remotename" "des_block *deskey"
+.Ft int
+.Fn key_gendes "des_block *deskey"
+.Ft int
+.Fn key_setsecret "const char *key"
+.Ft int
+.Fn netname2host "char *name" "char *host" "int hostlen"
+.Ft int
+.Fn netname2user "char *name" "uid_t *uidp" "gid_t *gidp" "int *gidlenp" "gid_t *gidlist"
+.Ft int
+.Fn user2netname "char *name" "const uid_t uid" "const char *domain"
+.Sh DESCRIPTION
+These routines are part of the
+.Tn RPC
+library.  They implement
+.Tn DES
+Authentication.  See
+.Xr rpc 3
+for further details about
+.Tn RPC .
+.Pp
+The
+.Fn authdes_create
+is the first of two routines which interface to the
+.Tn RPC
+secure authentication system, known as
+.Tn DES
+authentication.
+The second is
+.Fn authdes_getucred ,
+below.
+.Pp
+Note: the keyserver daemon
+.Xr keyserv 8
+must be running for the
+.Tn DES
+authentication system to work.
+.Pp
+The
+.Fn authdes_create
+function,
+used on the client side, returns an authentication handle that
+will enable the use of the secure authentication system.
+The first argument
+.Fa name
+is the network name, or
+.Fa netname ,
+of the owner of the server process.
+This field usually
+represents a
+.Fa hostname
+derived from the utility routine
+.Fn host2netname ,
+but could also represent a user name using
+.Fn user2netname .
+The second field is window on the validity of
+the client credential, given in seconds.  A small
+window is more secure than a large one, but choosing
+too small of a window will increase the frequency of
+resynchronizations because of clock drift.
+The third
+argument
+.Fa addr
+is optional.  If it is
+.Dv NULL ,
+then the authentication system will assume
+that the local clock is always in sync with the server's
+clock, and will not attempt resynchronizations.
+If an address
+is supplied, however, then the system will use the address
+for consulting the remote time service whenever
+resynchronization
+is required.
+This argument is usually the
+address of the
+.Tn RPC
+server itself.
+The final argument
+.Fa ckey
+is also optional.  If it is
+.Dv NULL ,
+then the authentication system will
+generate a random
+.Tn DES
+key to be used for the encryption of credentials.
+If it is supplied, however, then it will be used instead.
+.Pp
+The
+.Fn authdes_getucred
+function,
+the second of the two
+.Tn DES
+authentication routines,
+is used on the server side for converting a
+.Tn DES
+credential, which is
+operating system independent, into a
+.Ux
+credential.
+This routine differs from utility routine
+.Fn netname2user
+in that
+.Fn authdes_getucred
+pulls its information from a cache, and does not have to do a
+Yellow Pages lookup every time it is called to get its information.
+.Pp
+The
+.Fn getnetname
+function
+installs the unique, operating-system independent netname of
+the
+caller in the fixed-length array
+.Fa name .
+Returns
+.Dv TRUE
+if it succeeds and
+.Dv FALSE
+if it fails.
+.Pp
+The
+.Fn host2netname
+function
+converts from a domain-specific hostname to an
+operating-system independent netname.
+Returns
+.Dv TRUE
+if it succeeds and
+.Dv FALSE
+if it fails.
+Inverse of
+.Fn netname2host .
+.Pp
+The
+.Fn key_decryptsession
+function
+is an interface to the keyserver daemon, which is associated
+with
+.Tn RPC Ns 's
+secure authentication system
+.Tn ( DES
+authentication).
+User programs rarely need to call it, or its associated routines
+.Fn key_encryptsession ,
+.Fn key_gendes
+and
+.Fn key_setsecret .
+System commands such as
+.Xr login 1
+and the
+.Tn RPC
+library are the main clients of these four routines.
+.Pp
+The
+.Fn key_decryptsession
+function
+takes a server netname and a
+.Tn DES
+key, and decrypts the key by
+using the public key of the server and the secret key
+associated with the effective uid of the calling process.  It
+is the inverse of
+.Fn key_encryptsession .
+.Pp
+The
+.Fn key_encryptsession
+function
+is a keyserver interface routine.
+It
+takes a server netname and a des key, and encrypts
+it using the public key of the server and the secret key
+associated with the effective uid of the calling process.  It
+is the inverse of
+.Fn key_decryptsession .
+.Pp
+The
+.Fn key_gendes
+function
+is a keyserver interface routine.
+It
+is used to ask the keyserver for a secure conversation key.
+Choosing one
+.Qq random
+is usually not good enough,
+because
+the common ways of choosing random numbers, such as using the
+current time, are very easy to guess.
+.Pp
+The
+.Fn key_setsecret
+function
+is a keyserver interface routine.
+It is used to set the key for
+the effective
+.Fa uid
+of the calling process.
+.Pp
+The
+.Fn netname2host
+function
+converts from an operating-system independent netname to a
+domain-specific hostname.
+Returns
+.Dv TRUE
+if it succeeds and
+.Dv FALSE
+if it fails.  Inverse of
+.Fn host2netname .
+.Pp
+The
+.Fn netname2user
+function
+converts from an operating-system independent netname to a
+domain-specific user ID.
+Returns
+.Dv TRUE
+if it succeeds and
+.Dv FALSE
+if it fails.
+Inverse of
+.Fn user2netname .
+.Pp
+The
+.Fn user2netname
+function
+converts from a domain-specific username to an operating-system
+independent netname.
+Returns
+.Dv TRUE
+if it succeeds and
+.Dv FALSE
+if it fails.
+Inverse of
+.Fn netname2user .
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr xdr 3 ,
+.Xr keyserv 8
+.Pp
+The following manuals:
+.Rs
+.%B Remote Procedure Calls: Protocol Specification
+.Re
+.Rs
+.%B Remote Procedure Call Programming Guide
+.Re
+.Rs
+.%B Rpcgen Programming Guide
+.Re
+.Rs
+.%B RPC: Remote Procedure Call Protocol Specification
+.%O RFC1050, Sun Microsystems Inc., USC-ISI
+.Re
diff --git a/reactos/dll/win32/libtirpc/man/rpc_soc.3t b/reactos/dll/win32/libtirpc/man/rpc_soc.3t
new file mode 100644 (file)
index 0000000..59058c0
--- /dev/null
@@ -0,0 +1,1726 @@
+.\" @(#)rpc.3n 2.4 88/08/08 4.0 RPCSRC; from 1.19 88/06/24 SMI
+.\" $NetBSD: rpc_soc.3,v 1.2 2000/06/07 13:39:43 simonb Exp $
+.\" $FreeBSD: src/lib/libc/rpc/rpc_soc.3,v 1.12 2003/02/06 11:04:47 charnier Exp $
+.\"
+.Dd February 16, 1988
+.Dt RPC_SOC 3
+.Os
+.Sh NAME
+.Nm rpc_soc ,
+.Nm auth_destroy ,
+.Nm authnone_create ,
+.Nm authunix_create ,
+.Nm authunix_create_default ,
+.Nm callrpc ,
+.Nm clnt_broadcast ,
+.Nm clnt_call ,
+.Nm clnt_control ,
+.Nm clnt_create ,
+.Nm clnt_destroy ,
+.Nm clnt_freeres ,
+.Nm clnt_geterr ,
+.Nm clnt_pcreateerror ,
+.Nm clnt_perrno ,
+.Nm clnt_perror ,
+.Nm clnt_spcreateerror ,
+.Nm clnt_sperrno ,
+.Nm clnt_sperror ,
+.Nm clntraw_create ,
+.Nm clnttcp_create ,
+.Nm clntudp_bufcreate ,
+.Nm clntudp_create ,
+.Nm clntunix_create ,
+.Nm get_myaddress ,
+.Nm pmap_getmaps ,
+.Nm pmap_getport ,
+.Nm pmap_rmtcall ,
+.Nm pmap_set ,
+.Nm pmap_unset ,
+.Nm registerrpc ,
+.Nm rpc_createerr ,
+.Nm svc_destroy ,
+.Nm svc_fds ,
+.Nm svc_fdset ,
+.Nm svc_getargs ,
+.Nm svc_getcaller ,
+.Nm svc_getreq ,
+.Nm svc_getreqset ,
+.Nm svc_register ,
+.Nm svc_run ,
+.Nm svc_sendreply ,
+.Nm svc_unregister ,
+.Nm svcerr_auth ,
+.Nm svcerr_decode ,
+.Nm svcerr_noproc ,
+.Nm svcerr_noprog ,
+.Nm svcerr_progvers ,
+.Nm svcerr_systemerr ,
+.Nm svcerr_weakauth ,
+.Nm svcfd_create ,
+.Nm svcunixfd_create ,
+.Nm svcraw_create ,
+.Nm svcunix_create ,
+.Nm xdr_accepted_reply ,
+.Nm xdr_authunix_parms ,
+.Nm xdr_callhdr ,
+.Nm xdr_callmsg ,
+.Nm xdr_opaque_auth ,
+.Nm xdr_pmap ,
+.Nm xdr_pmaplist ,
+.Nm xdr_rejected_reply ,
+.Nm xdr_replymsg ,
+.Nm xprt_register ,
+.Nm xprt_unregister
+.Nd "library routines for remote procedure calls"
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Pp
+See
+.Sx DESCRIPTION
+for function declarations.
+.Sh DESCRIPTION
+.Bf -symbolic
+The
+.Fn svc_*
+and
+.Fn clnt_*
+functions described in this page are the old, TS-RPC
+interface to the XDR and RPC library, and exist for backward compatibility.
+The new interface is described in the pages
+referenced from
+.Xr rpc 3 .
+.Ef
+.Pp
+These routines allow C programs to make procedure
+calls on other machines across the network.
+First, the client calls a procedure to send a
+data packet to the server.
+Upon receipt of the packet, the server calls a dispatch routine
+to perform the requested service, and then sends back a
+reply.
+Finally, the procedure call returns to the client.
+.Pp
+Routines that are used for Secure
+.Tn RPC ( DES
+authentication) are described in
+.Xr rpc_secure 3 .
+Secure
+.Tn RPC
+can be used only if
+.Tn DES
+encryption is available.
+.Bl -tag -width indent -compact
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn auth_destroy "AUTH *auth"
+.Xc
+.Pp
+A macro that destroys the authentication information associated with
+.Fa auth .
+Destruction usually involves deallocation of private data
+structures.
+The use of
+.Fa auth
+is undefined after calling
+.Fn auth_destroy .
+.Pp
+.It Xo
+.Ft "AUTH *"
+.Xc
+.It Xo
+.Fn authnone_create
+.Xc
+.Pp
+Create and return an
+.Tn RPC
+authentication handle that passes nonusable authentication
+information with each remote procedure call.
+This is the
+default authentication used by
+.Tn RPC .
+.Pp
+.It Xo
+.Ft "AUTH *"
+.Xc
+.It Xo
+.Fn authunix_create "char *host" "int uid" "int gid" "int len" "int *aup_gids"
+.Xc
+.Pp
+Create and return an
+.Tn RPC
+authentication handle that contains
+.Ux
+authentication information.
+The
+.Fa host
+argument
+is the name of the machine on which the information was
+created;
+.Fa uid
+is the user's user ID;
+.Fa gid
+is the user's current group ID;
+.Fa len
+and
+.Fa aup_gids
+refer to a counted array of groups to which the user belongs.
+It is easy to impersonate a user.
+.Pp
+.It Xo
+.Ft "AUTH *"
+.Xc
+.It Xo
+.Fn authunix_create_default
+.Xc
+.Pp
+Calls
+.Fn authunix_create
+with the appropriate arguments.
+.Pp
+.It Xo
+.Ft int
+.Fo callrpc
+.Fa "char *host"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "u_long procnum"
+.Fa "xdrproc_t inproc"
+.Fa "void *in"
+.Fa "xdrproc_t outproc"
+.Fa "void *out"
+.Fc
+.Xc
+.Pp
+Call the remote procedure associated with
+.Fa prognum ,
+.Fa versnum ,
+and
+.Fa procnum
+on the machine
+.Fa host .
+The
+.Fa in
+argument
+is the address of the procedure's argument(s), and
+.Fa out
+is the address of where to place the result(s);
+.Fa inproc
+is used to encode the procedure's arguments, and
+.Fa outproc
+is used to decode the procedure's results.
+This routine returns zero if it succeeds, or the value of
+.Vt "enum clnt_stat"
+cast to an integer if it fails.
+The routine
+.Fn clnt_perrno
+is handy for translating failure statuses into messages.
+.Pp
+Warning: calling remote procedures with this routine
+uses
+.Tn UDP/IP
+as a transport; see
+.Fn clntudp_create
+for restrictions.
+You do not have control of timeouts or authentication using
+this routine.
+.Pp
+.It Xo
+.Ft "enum clnt_stat"
+.Xc
+.It Xo
+.Fo clnt_broadcast
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "u_long procnum"
+.Fa "xdrproc_t inproc"
+.Fa "char *in"
+.Fa "xdrproc_t outproc"
+.Fa "char *out"
+.Fa "bool_t (*eachresult)(caddr_t, struct sockaddr_in *)"
+.Fc
+.Xc
+.Pp
+Like
+.Fn callrpc ,
+except the call message is broadcast to all locally
+connected broadcast nets.
+Each time it receives a
+response, this routine calls
+.Fn eachresult ,
+whose form is:
+.Bd -ragged -offset indent
+.Ft bool_t
+.Fn eachresult "caddr_t out" "struct sockaddr_in *addr"
+.Ed
+.Pp
+where
+.Fa out
+is the same as
+.Fa out
+passed to
+.Fn clnt_broadcast ,
+except that the remote procedure's output is decoded there;
+.Fa addr
+points to the address of the machine that sent the results.
+If
+.Fn eachresult
+returns zero,
+.Fn clnt_broadcast
+waits for more replies; otherwise it returns with appropriate
+status.
+.Pp
+Warning: broadcast sockets are limited in size to the
+maximum transfer unit of the data link.
+For ethernet,
+this value is 1500 bytes.
+.Pp
+.It Xo
+.Ft "enum clnt_stat"
+.Xc
+.It Xo
+.Fo clnt_call
+.Fa "CLIENT *clnt"
+.Fa "u_long procnum"
+.Fa "xdrproc_t inproc"
+.Fa "char *in"
+.Fa "xdrproc_t outproc"
+.Fa "char *out"
+.Fa "struct timeval tout"
+.Fc
+.Xc
+.Pp
+A macro that calls the remote procedure
+.Fa procnum
+associated with the client handle,
+.Fa clnt ,
+which is obtained with an
+.Tn RPC
+client creation routine such as
+.Fn clnt_create .
+The
+.Fa in
+argument
+is the address of the procedure's argument(s), and
+.Fa out
+is the address of where to place the result(s);
+.Fa inproc
+is used to encode the procedure's arguments, and
+.Fa outproc
+is used to decode the procedure's results;
+.Fa tout
+is the time allowed for results to come back.
+.Pp
+.It Xo
+.Ft void
+.Fn clnt_destroy "CLIENT *clnt"
+.Xc
+.Pp
+A macro that destroys the client's
+.Tn RPC
+handle.
+Destruction usually involves deallocation
+of private data structures, including
+.Fa clnt
+itself.
+Use of
+.Fa clnt
+is undefined after calling
+.Fn clnt_destroy .
+If the
+.Tn RPC
+library opened the associated socket, it will close it also.
+Otherwise, the socket remains open.
+.Pp
+.It Xo
+.Ft CLIENT *
+.Xc
+.It Xo
+.Fn clnt_create "char *host" "u_long prog" "u_long vers" "char *proto"
+.Xc
+.Pp
+Generic client creation routine.
+The
+.Fa host
+argument
+identifies the name of the remote host where the server
+is located.
+The
+.Fa proto
+argument
+indicates which kind of transport protocol to use.
+The
+currently supported values for this field are
+.Qq Li udp
+and
+.Qq Li tcp .
+Default timeouts are set, but can be modified using
+.Fn clnt_control .
+.Pp
+Warning: Using
+.Tn UDP
+has its shortcomings.
+Since
+.Tn UDP Ns \-based
+.Tn RPC
+messages can only hold up to 8 Kbytes of encoded data,
+this transport cannot be used for procedures that take
+large arguments or return huge results.
+.Pp
+.It Xo
+.Ft bool_t
+.Xc
+.It Xo
+.Fn clnt_control "CLIENT *cl" "u_int req" "char *info"
+.Xc
+.Pp
+A macro used to change or retrieve various information
+about a client object.
+The
+.Fa req
+argument
+indicates the type of operation, and
+.Fa info
+is a pointer to the information.
+For both
+.Tn UDP
+and
+.Tn TCP ,
+the supported values of
+.Fa req
+and their argument types and what they do are:
+.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
+.It Dv CLSET_TIMEOUT Ta Xo
+.Vt "struct timeval" Ta "set total timeout"
+.Xc
+.It Dv CLGET_TIMEOUT Ta Xo
+.Vt "struct timeval" Ta "get total timeout"
+.Xc
+.El
+.Pp
+Note: if you set the timeout using
+.Fn clnt_control ,
+the timeout argument passed to
+.Fn clnt_call
+will be ignored in all future calls.
+.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
+.It Dv CLGET_SERVER_ADDR Ta Xo
+.Vt "struct sockaddr_in" Ta "get server's address"
+.Xc
+.El
+.Pp
+The following operations are valid for
+.Tn UDP
+only:
+.Bl -column "CLSET_RETRY_TIMEOUT" "struct sockaddr_in"
+.It Dv CLSET_RETRY_TIMEOUT Ta Xo
+.Vt "struct timeval" Ta "set the retry timeout"
+.Xc
+.It Dv CLGET_RETRY_TIMEOUT Ta Xo
+.Vt "struct timeval" Ta "get the retry timeout"
+.Xc
+.El
+.Pp
+The retry timeout is the time that
+.Tn "UDP RPC"
+waits for the server to reply before
+retransmitting the request.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn clnt_freeres "CLIENT *clnt" "xdrproc_t outproc" "char *out"
+.Xc
+.Pp
+A macro that frees any data allocated by the
+.Tn RPC/XDR
+system when it decoded the results of an
+.Tn RPC
+call.
+The
+.Fa out
+argument
+is the address of the results, and
+.Fa outproc
+is the
+.Tn XDR
+routine describing the results.
+This routine returns one if the results were successfully
+freed,
+and zero otherwise.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn clnt_geterr "CLIENT *clnt" "struct rpc_err *errp"
+.Xc
+.Pp
+A macro that copies the error structure out of the client
+handle
+to the structure at address
+.Fa errp .
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn clnt_pcreateerror "char *s"
+.Xc
+.Pp
+prints a message to standard error indicating
+why a client
+.Tn RPC
+handle could not be created.
+The message is prepended with string
+.Fa s
+and a colon.
+A newline is appended at the end of the message.
+Used when a
+.Fn clnt_create ,
+.Fn clntraw_create ,
+.Fn clnttcp_create ,
+or
+.Fn clntudp_create
+call fails.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn clnt_perrno "enum clnt_stat stat"
+.Xc
+.Pp
+Print a message to standard error corresponding
+to the condition indicated by
+.Fa stat .
+A newline is appended at the end of the message.
+Used after
+.Fn callrpc .
+.Pp
+.It Xo
+.Ft void
+.Fn clnt_perror "CLIENT *clnt" "char *s"
+.Xc
+.Pp
+Print a message to standard error indicating why an
+.Tn RPC
+call failed;
+.Fa clnt
+is the handle used to do the call.
+The message is prepended with string
+.Fa s
+and a colon.
+A newline is appended at the end of the message.
+Used after
+.Fn clnt_call .
+.Pp
+.It Xo
+.Ft "char *"
+.Xc
+.It Xo
+.Fn clnt_spcreateerror "char *s"
+.Xc
+.Pp
+Like
+.Fn clnt_pcreateerror ,
+except that it returns a string
+instead of printing to the standard error.
+.Pp
+Bugs: returns pointer to static data that is overwritten
+on each call.
+.Pp
+.It Xo
+.Ft "char *"
+.Xc
+.It Xo
+.Fn clnt_sperrno "enum clnt_stat stat"
+.Xc
+.Pp
+Take the same arguments as
+.Fn clnt_perrno ,
+but instead of sending a message to the standard error
+indicating why an
+.Tn RPC
+call failed, return a pointer to a string which contains
+the message.
+.Pp
+The
+.Fn clnt_sperrno
+function
+is used instead of
+.Fn clnt_perrno
+if the program does not have a standard error (as a program
+running as a server quite likely does not), or if the
+programmer
+does not want the message to be output with
+.Fn printf ,
+or if a message format different from that supported by
+.Fn clnt_perrno
+is to be used.
+.Pp
+Note: unlike
+.Fn clnt_sperror
+and
+.Fn clnt_spcreateerror ,
+.Fn clnt_sperrno
+returns pointer to static data, but the
+result will not get overwritten on each call.
+.Pp
+.It Xo
+.Ft "char *"
+.Xc
+.It Xo
+.Fn clnt_sperror "CLIENT *rpch" "char *s"
+.Xc
+.Pp
+Like
+.Fn clnt_perror ,
+except that (like
+.Fn clnt_sperrno )
+it returns a string instead of printing to standard error.
+.Pp
+Bugs: returns pointer to static data that is overwritten
+on each call.
+.Pp
+.It Xo
+.Ft "CLIENT *"
+.Xc
+.It Xo
+.Fn clntraw_create "u_long prognum" "u_long versnum"
+.Xc
+.Pp
+This routine creates a toy
+.Tn RPC
+client for the remote program
+.Fa prognum ,
+version
+.Fa versnum .
+The transport used to pass messages to the service is
+actually a buffer within the process's address space, so the
+corresponding
+.Tn RPC
+server should live in the same address space; see
+.Fn svcraw_create .
+This allows simulation of
+.Tn RPC
+and acquisition of
+.Tn RPC
+overheads, such as round trip times, without any
+kernel interference.
+This routine returns
+.Dv NULL
+if it fails.
+.Pp
+.It Xo
+.Ft "CLIENT *"
+.Xc
+.It Xo
+.Fo clnttcp_create
+.Fa "struct sockaddr_in *addr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "int *sockp"
+.Fa "u_int sendsz"
+.Fa "u_int recvsz"
+.Fc
+.Xc
+.Pp
+This routine creates an
+.Tn RPC
+client for the remote program
+.Fa prognum ,
+version
+.Fa versnum ;
+the client uses
+.Tn TCP/IP
+as a transport.
+The remote program is located at Internet
+address
+.Fa addr .
+If
+.Fa addr\->sin_port
+is zero, then it is set to the actual port that the remote
+program is listening on (the remote
+.Xr rpcbind 8
+service is consulted for this information).
+The
+.Fa sockp
+argument
+is a socket; if it is
+.Dv RPC_ANYSOCK ,
+then this routine opens a new one and sets
+.Fa sockp .
+Since
+.Tn TCP Ns \-based
+.Tn RPC
+uses buffered
+.Tn I/O ,
+the user may specify the size of the send and receive buffers
+with the
+.Fa sendsz
+and
+.Fa recvsz
+arguments;
+values of zero choose suitable defaults.
+This routine returns
+.Dv NULL
+if it fails.
+.Pp
+.It Xo
+.Ft "CLIENT *"
+.Xc
+.It Xo
+.Fo clntudp_create
+.Fa "struct sockaddr_in *addr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "struct timeval wait"
+.Fa "int *sockp"
+.Fc
+.Xc
+.Pp
+This routine creates an
+.Tn RPC
+client for the remote program
+.Fa prognum ,
+version
+.Fa versnum ;
+the client uses
+.Tn UDP/IP
+as a transport.
+The remote program is located at Internet
+address
+.Fa addr .
+If
+.Fa addr\->sin_port
+is zero, then it is set to actual port that the remote
+program is listening on (the remote
+.Xr rpcbind 8
+service is consulted for this information).
+The
+.Fa sockp
+argument
+is a socket; if it is
+.Dv RPC_ANYSOCK ,
+then this routine opens a new one and sets
+.Fa sockp .
+The
+.Tn UDP
+transport resends the call message in intervals of
+.Fa wait
+time until a response is received or until the call times
+out.
+The total time for the call to time out is specified by
+.Fn clnt_call .
+.Pp
+Warning: since
+.Tn UDP Ns \-based
+.Tn RPC
+messages can only hold up to 8 Kbytes
+of encoded data, this transport cannot be used for procedures
+that take large arguments or return huge results.
+.Pp
+.It Xo
+.Ft "CLIENT *"
+.Xc
+.It Xo
+.Fo clntudp_bufcreate
+.Fa "struct sockaddr_in *addr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "struct timeval wait"
+.Fa "int *sockp"
+.Fa "unsigned int sendsize"
+.Fa "unsigned int recosize"
+.Fc
+.Xc
+.Pp
+This routine creates an
+.Tn RPC
+client for the remote program
+.Fa prognum ,
+on
+.Fa versnum ;
+the client uses
+.Tn UDP/IP
+as a transport.
+The remote program is located at Internet
+address
+.Fa addr .
+If
+.Fa addr\->sin_port
+is zero, then it is set to actual port that the remote
+program is listening on (the remote
+.Xr rpcbind 8
+service is consulted for this information).
+The
+.Fa sockp
+argument
+is a socket; if it is
+.Dv RPC_ANYSOCK ,
+then this routine opens a new one and sets
+.Fa sockp .
+The
+.Tn UDP
+transport resends the call message in intervals of
+.Fa wait
+time until a response is received or until the call times
+out.
+The total time for the call to time out is specified by
+.Fn clnt_call .
+.Pp
+This allows the user to specify the maximum packet size
+for sending and receiving
+.Tn UDP Ns \-based
+.Tn RPC
+messages.
+.Pp
+.It Xo
+.Ft "CLIENT *"
+.Xc
+.It Xo
+.Fo clntunix_create
+.Fa "struct sockaddr_un *raddr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "int *sockp"
+.Fa "u_int sendsz"
+.Fa "u_int recvsz"
+.Fc
+.Xc
+.Pp
+This routine creates an
+.Tn RPC
+client for the local
+program
+.Fa prognum ,
+version
+.Fa versnum ;
+the client uses
+.Ux Ns -domain
+sockets as a transport.
+The local program is located at the
+.Fa *raddr .
+The
+.Fa sockp
+argument
+is a socket; if it is
+.Dv RPC_ANYSOCK ,
+then this routine opens a new one and sets
+.Fa sockp .
+Since
+.Ux Ns -based
+.Tn RPC
+uses buffered
+.Tn I/O ,
+the user may specify the size of the send and receive buffers
+with the
+.Fa sendsz
+and
+.Fa recvsz
+arguments;
+values of zero choose suitable defaults.
+This routine returns
+.Dv NULL
+if it fails.
+.Pp
+.It Xo
+.Ft int
+.Xc
+.It Xo
+.Fn get_myaddress "struct sockaddr_in *addr"
+.Xc
+.Pp
+Stuff the machine's
+.Tn IP
+address into
+.Fa addr ,
+without consulting the library routines that deal with
+.Pa /etc/hosts .
+The port number is always set to
+.Fn htons PMAPPORT .
+Returns zero on success, non-zero on failure.
+.Pp
+.It Xo
+.Ft "struct pmaplist *"
+.Xc
+.It Xo
+.Fn pmap_getmaps "struct sockaddr_in *addr"
+.Xc
+.Pp
+A user interface to the
+.Xr rpcbind 8
+service, which returns a list of the current
+.Tn RPC
+program\-to\-port mappings
+on the host located at
+.Tn IP
+address
+.Fa addr .
+This routine can return
+.Dv NULL .
+The command
+.Dq Nm rpcinfo Fl p
+uses this routine.
+.Pp
+.It Xo
+.Ft u_short
+.Xc
+.It Xo
+.Fo pmap_getport
+.Fa "struct sockaddr_in *addr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "u_long protocol"
+.Fc
+.Xc
+.Pp
+A user interface to the
+.Xr rpcbind 8
+service, which returns the port number
+on which waits a service that supports program number
+.Fa prognum ,
+version
+.Fa versnum ,
+and speaks the transport protocol associated with
+.Fa protocol .
+The value of
+.Fa protocol
+is most likely
+.Dv IPPROTO_UDP
+or
+.Dv IPPROTO_TCP .
+A return value of zero means that the mapping does not exist
+or that
+the
+.Tn RPC
+system failed to contact the remote
+.Xr rpcbind 8
+service.
+In the latter case, the global variable
+.Va rpc_createerr
+contains the
+.Tn RPC
+status.
+.Pp
+.It Xo
+.Ft "enum clnt_stat"
+.Xc
+.It Xo
+.Fo pmap_rmtcall
+.Fa "struct sockaddr_in *addr"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "u_long procnum"
+.Fa "xdrproc_t inproc"
+.Fa "char *in"
+.Fa "xdrproc_t outproc"
+.Fa "char *out"
+.Fa "struct timeval tout"
+.Fa "u_long *portp"
+.Fc
+.Xc
+.Pp
+A user interface to the
+.Xr rpcbind 8
+service, which instructs
+.Xr rpcbind 8
+on the host at
+.Tn IP
+address
+.Fa addr
+to make an
+.Tn RPC
+call on your behalf to a procedure on that host.
+The
+.Fa portp
+argument
+will be modified to the program's port number if the
+procedure
+succeeds.
+The definitions of other arguments are discussed
+in
+.Fn callrpc
+and
+.Fn clnt_call .
+This procedure should be used for a
+.Dq ping
+and nothing
+else.
+See also
+.Fn clnt_broadcast .
+.Pp
+.It Xo
+.Ft bool_t
+.Fn pmap_set "u_long prognum" "u_long versnum" "u_long protocol" "u_short port"
+.Xc
+.Pp
+A user interface to the
+.Xr rpcbind 8
+service, which establishes a mapping between the triple
+.Pq Fa prognum , versnum , protocol
+and
+.Fa port
+on the machine's
+.Xr rpcbind 8
+service.
+The value of
+.Fa protocol
+is most likely
+.Dv IPPROTO_UDP
+or
+.Dv IPPROTO_TCP .
+This routine returns one if it succeeds, zero otherwise.
+Automatically done by
+.Fn svc_register .
+.Pp
+.It Xo
+.Ft bool_t
+.Fn pmap_unset "u_long prognum" "u_long versnum"
+.Xc
+.Pp
+A user interface to the
+.Xr rpcbind 8
+service, which destroys all mapping between the triple
+.Pq Fa prognum , versnum , *
+and
+.Fa ports
+on the machine's
+.Xr rpcbind 8
+service.
+This routine returns one if it succeeds, zero
+otherwise.
+.Pp
+.It Xo
+.Ft bool_t
+.Fo registerrpc
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "u_long procnum"
+.Fa "char *(*procname)(void)"
+.Fa "xdrproc_t inproc"
+.Fa "xdrproc_t outproc"
+.Fc
+.Xc
+.Pp
+Register procedure
+.Fa procname
+with the
+.Tn RPC
+service package.
+If a request arrives for program
+.Fa prognum ,
+version
+.Fa versnum ,
+and procedure
+.Fa procnum ,
+.Fa procname
+is called with a pointer to its argument(s);
+.Fa progname
+should return a pointer to its static result(s);
+.Fa inproc
+is used to decode the arguments while
+.Fa outproc
+is used to encode the results.
+This routine returns zero if the registration succeeded, \-1
+otherwise.
+.Pp
+Warning: remote procedures registered in this form
+are accessed using the
+.Tn UDP/IP
+transport; see
+.Fn svcudp_create
+for restrictions.
+.Pp
+.It Xo
+.Vt "struct rpc_createerr" rpc_createerr ;
+.Xc
+.Pp
+A global variable whose value is set by any
+.Tn RPC
+client creation routine
+that does not succeed.
+Use the routine
+.Fn clnt_pcreateerror
+to print the reason why.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn svc_destroy "SVCXPRT * xprt"
+.Xc
+.Pp
+A macro that destroys the
+.Tn RPC
+service transport handle,
+.Fa xprt .
+Destruction usually involves deallocation
+of private data structures, including
+.Fa xprt
+itself.
+Use of
+.Fa xprt
+is undefined after calling this routine.
+.Pp
+.It Xo
+.Vt fd_set svc_fdset ;
+.Xc
+.Pp
+A global variable reflecting the
+.Tn RPC
+service side's
+read file descriptor bit mask; it is suitable as a template argument
+to the
+.Xr select 2
+system call.
+This is only of interest
+if a service implementor does not call
+.Fn svc_run ,
+but rather does his own asynchronous event processing.
+This variable is read\-only (do not pass its address to
+.Xr select 2 ! ) ,
+yet it may change after calls to
+.Fn svc_getreqset
+or any creation routines.
+As well, note that if the process has descriptor limits
+which are extended beyond
+.Dv FD_SETSIZE ,
+this variable will only be usable for the first
+.Dv FD_SETSIZE
+descriptors.
+.Pp
+.It Xo
+.Vt int svc_fds ;
+.Xc
+.Pp
+Similar to
+.Va svc_fdset ,
+but limited to 32 descriptors.
+This
+interface is obsoleted by
+.Va svc_fdset .
+.Pp
+.It Xo
+.Ft bool_t
+.Fn svc_freeargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in"
+.Xc
+.Pp
+A macro that frees any data allocated by the
+.Tn RPC/XDR
+system when it decoded the arguments to a service procedure
+using
+.Fn svc_getargs .
+This routine returns 1 if the results were successfully
+freed,
+and zero otherwise.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn svc_getargs "SVCXPRT *xprt" "xdrproc_t inproc" "char *in"
+.Xc
+.Pp
+A macro that decodes the arguments of an
+.Tn RPC
+request
+associated with the
+.Tn RPC
+service transport handle,
+.Fa xprt .
+The
+.Fa in
+argument
+is the address where the arguments will be placed;
+.Fa inproc
+is the
+.Tn XDR
+routine used to decode the arguments.
+This routine returns one if decoding succeeds, and zero
+otherwise.
+.Pp
+.It Xo
+.Ft "struct sockaddr_in *"
+.Xc
+.It Xo
+.Fn svc_getcaller "SVCXPRT *xprt"
+.Xc
+.Pp
+The approved way of getting the network address of the caller
+of a procedure associated with the
+.Tn RPC
+service transport handle,
+.Fa xprt .
+.Pp
+.It Xo
+.Ft void
+.Fn svc_getreqset "fd_set *rdfds"
+.Xc
+.Pp
+This routine is only of interest if a service implementor
+does not call
+.Fn svc_run ,
+but instead implements custom asynchronous event processing.
+It is called when the
+.Xr select 2
+system call has determined that an
+.Tn RPC
+request has arrived on some
+.Tn RPC
+socket(s);
+.Fa rdfds
+is the resultant read file descriptor bit mask.
+The routine returns when all sockets associated with the
+value of
+.Fa rdfds
+have been serviced.
+.Pp
+.It Xo
+.Ft void
+.Fn svc_getreq "int rdfds"
+.Xc
+.Pp
+Similar to
+.Fn svc_getreqset ,
+but limited to 32 descriptors.
+This interface is obsoleted by
+.Fn svc_getreqset .
+.Pp
+.It Xo
+.Ft bool_t
+.Fo svc_register
+.Fa "SVCXPRT *xprt"
+.Fa "u_long prognum"
+.Fa "u_long versnum"
+.Fa "void (*dispatch)(struct svc_req *, SVCXPRT *)"
+.Fa "int protocol"
+.Fc
+.Xc
+.Pp
+Associates
+.Fa prognum
+and
+.Fa versnum
+with the service dispatch procedure,
+.Fn dispatch .
+If
+.Fa protocol
+is zero, the service is not registered with the
+.Xr rpcbind 8
+service.
+If
+.Fa protocol
+is non-zero, then a mapping of the triple
+.Pq Fa prognum , versnum , protocol
+to
+.Fa xprt\->xp_port
+is established with the local
+.Xr rpcbind 8
+service (generally
+.Fa protocol
+is zero,
+.Dv IPPROTO_UDP
+or
+.Dv IPPROTO_TCP ) .
+The procedure
+.Fn dispatch
+has the following form:
+.Bd -ragged -offset indent
+.Ft bool_t
+.Fn dispatch "struct svc_req *request" "SVCXPRT *xprt"
+.Ed
+.Pp
+The
+.Fn svc_register
+routine returns one if it succeeds, and zero otherwise.
+.Pp
+.It Xo
+.Fn svc_run
+.Xc
+.Pp
+This routine never returns.
+It waits for
+.Tn RPC
+requests to arrive, and calls the appropriate service
+procedure using
+.Fn svc_getreq
+when one arrives.
+This procedure is usually waiting for a
+.Xr select 2
+system call to return.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn svc_sendreply "SVCXPRT *xprt" "xdrproc_t outproc" "char *out"
+.Xc
+.Pp
+Called by an
+.Tn RPC
+service's dispatch routine to send the results of a
+remote procedure call.
+The
+.Fa xprt
+argument
+is the request's associated transport handle;
+.Fa outproc
+is the
+.Tn XDR
+routine which is used to encode the results; and
+.Fa out
+is the address of the results.
+This routine returns one if it succeeds, zero otherwise.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svc_unregister "u_long prognum" "u_long versnum"
+.Xc
+.Pp
+Remove all mapping of the double
+.Pq Fa prognum , versnum
+to dispatch routines, and of the triple
+.Pq Fa prognum , versnum , *
+to port number.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_auth "SVCXPRT *xprt" "enum auth_stat why"
+.Xc
+.Pp
+Called by a service dispatch routine that refuses to perform
+a remote procedure call due to an authentication error.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_decode "SVCXPRT *xprt"
+.Xc
+.Pp
+Called by a service dispatch routine that cannot successfully
+decode its arguments.
+See also
+.Fn svc_getargs .
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_noproc "SVCXPRT *xprt"
+.Xc
+.Pp
+Called by a service dispatch routine that does not implement
+the procedure number that the caller requests.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_noprog "SVCXPRT *xprt"
+.Xc
+.Pp
+Called when the desired program is not registered with the
+.Tn RPC
+package.
+Service implementors usually do not need this routine.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_progvers "SVCXPRT *xprt" "u_long low_vers" "u_long high_vers"
+.Xc
+.Pp
+Called when the desired version of a program is not registered
+with the
+.Tn RPC
+package.
+Service implementors usually do not need this routine.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_systemerr "SVCXPRT *xprt"
+.Xc
+.Pp
+Called by a service dispatch routine when it detects a system
+error
+not covered by any particular protocol.
+For example, if a service can no longer allocate storage,
+it may call this routine.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn svcerr_weakauth "SVCXPRT *xprt"
+.Xc
+.Pp
+Called by a service dispatch routine that refuses to perform
+a remote procedure call due to insufficient
+authentication arguments.
+The routine calls
+.Fn svcerr_auth xprt AUTH_TOOWEAK .
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svcraw_create void
+.Xc
+.Pp
+This routine creates a toy
+.Tn RPC
+service transport, to which it returns a pointer.
+The transport
+is really a buffer within the process's address space,
+so the corresponding
+.Tn RPC
+client should live in the same
+address space;
+see
+.Fn clntraw_create .
+This routine allows simulation of
+.Tn RPC
+and acquisition of
+.Tn RPC
+overheads (such as round trip times), without any kernel
+interference.
+This routine returns
+.Dv NULL
+if it fails.
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svctcp_create "int sock" "u_int send_buf_size" "u_int recv_buf_size"
+.Xc
+.Pp
+This routine creates a
+.Tn TCP/IP Ns \-based
+.Tn RPC
+service transport, to which it returns a pointer.
+The transport is associated with the socket
+.Fa sock ,
+which may be
+.Dv RPC_ANYSOCK ,
+in which case a new socket is created.
+If the socket is not bound to a local
+.Tn TCP
+port, then this routine binds it to an arbitrary port.
+Upon completion,
+.Fa xprt\->xp_fd
+is the transport's socket descriptor, and
+.Fa xprt\->xp_port
+is the transport's port number.
+This routine returns
+.Dv NULL
+if it fails.
+Since
+.Tn TCP Ns \-based
+.Tn RPC
+uses buffered
+.Tn I/O ,
+users may specify the size of buffers; values of zero
+choose suitable defaults.
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svcunix_create "int sock" "u_int send_buf_size" "u_int recv_buf_size" "char *path"
+.Xc
+.Pp
+This routine creates a
+.Ux Ns -based
+.Tn RPC
+service transport, to which it returns a pointer.
+The transport is associated with the socket
+.Fa sock ,
+which may be
+.Dv RPC_ANYSOCK ,
+in which case a new socket is created.
+The
+.Fa *path
+argument
+is a variable-length file system pathname of
+at most 104 characters.
+This file is
+.Em not
+removed when the socket is closed.
+The
+.Xr unlink 2
+system call must be used to remove the file.
+Upon completion,
+.Fa xprt\->xp_fd
+is the transport's socket descriptor.
+This routine returns
+.Dv NULL
+if it fails.
+Since
+.Ux Ns -based
+.Tn RPC
+uses buffered
+.Tn I/O ,
+users may specify the size of buffers; values of zero
+choose suitable defaults.
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svcunixfd_create "int fd" "u_int sendsize" "u_int recvsize"
+.Xc
+.Pp
+Create a service on top of any open descriptor.
+The
+.Fa sendsize
+and
+.Fa recvsize
+arguments
+indicate sizes for the send and receive buffers.
+If they are
+zero, a reasonable default is chosen.
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svcfd_create "int fd" "u_int sendsize" "u_int recvsize"
+.Xc
+.Pp
+Create a service on top of any open descriptor.
+Typically,
+this
+descriptor is a connected socket for a stream protocol such
+as
+.Tn TCP .
+The
+.Fa sendsize
+and
+.Fa recvsize
+arguments
+indicate sizes for the send and receive buffers.
+If they are
+zero, a reasonable default is chosen.
+.Pp
+.It Xo
+.Ft "SVCXPRT *"
+.Xc
+.It Xo
+.Fn svcudp_bufcreate "int sock" "u_int sendsize" "u_int recvsize"
+.Xc
+.Pp
+This routine creates a
+.Tn UDP/IP Ns \-based
+.Tn RPC
+service transport, to which it returns a pointer.
+The transport is associated with the socket
+.Fa sock ,
+which may be
+.Dv RPC_ANYSOCK ,
+in which case a new socket is created.
+If the socket is not bound to a local
+.Tn UDP
+port, then this routine binds it to an arbitrary port.
+Upon
+completion,
+.Fa xprt\->xp_fd
+is the transport's socket descriptor, and
+.Fa xprt\->xp_port
+is the transport's port number.
+This routine returns
+.Dv NULL
+if it fails.
+.Pp
+This allows the user to specify the maximum packet size for sending and
+receiving
+.Tn UDP Ns \-based
+.Tn RPC
+messages.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_accepted_reply "XDR *xdrs" "struct accepted_reply *ar"
+.Xc
+.Pp
+Used for encoding
+.Tn RPC
+reply messages.
+This routine is useful for users who
+wish to generate
+.Tn RPC Ns \-style
+messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_authunix_parms "XDR *xdrs" "struct authunix_parms *aupp"
+.Xc
+.Pp
+Used for describing
+.Ux
+credentials.
+This routine is useful for users
+who wish to generate these credentials without using the
+.Tn RPC
+authentication package.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Ft bool_t
+.Fn xdr_callhdr "XDR *xdrs" "struct rpc_msg *chdr"
+.Xc
+.Pp
+Used for describing
+.Tn RPC
+call header messages.
+This routine is useful for users who wish to generate
+.Tn RPC Ns \-style
+messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_callmsg "XDR *xdrs" "struct rpc_msg *cmsg"
+.Xc
+.Pp
+Used for describing
+.Tn RPC
+call messages.
+This routine is useful for users who wish to generate
+.Tn RPC Ns \-style
+messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_opaque_auth "XDR *xdrs" "struct opaque_auth *ap"
+.Xc
+.Pp
+Used for describing
+.Tn RPC
+authentication information messages.
+This routine is useful for users who wish to generate
+.Tn RPC Ns \-style
+messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Vt struct pmap ;
+.Xc
+.It Xo
+.Ft bool_t
+.Fn xdr_pmap "XDR *xdrs" "struct pmap *regs"
+.Xc
+.Pp
+Used for describing arguments to various
+.Xr rpcbind 8
+procedures, externally.
+This routine is useful for users who wish to generate
+these arguments without using the
+.Fn pmap_*
+interface.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_pmaplist "XDR *xdrs" "struct pmaplist **rp"
+.Xc
+.Pp
+Used for describing a list of port mappings, externally.
+This routine is useful for users who wish to generate
+these arguments without using the
+.Fn pmap_*
+interface.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_rejected_reply "XDR *xdrs" "struct rejected_reply *rr"
+.Xc
+.Pp
+Used for describing
+.Tn RPC
+reply messages.
+This routine is useful for users who wish to generate
+.Tn RPC Ns \-style
+messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Ft bool_t
+.Fn xdr_replymsg "XDR *xdrs" "struct rpc_msg *rmsg"
+.Xc
+.Pp
+Used for describing
+.Tn RPC
+reply messages.
+This routine is useful for users who wish to generate
+.Tn RPC
+style messages without using the
+.Tn RPC
+package.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn xprt_register "SVCXPRT *xprt"
+.Xc
+.Pp
+After
+.Tn RPC
+service transport handles are created,
+they should register themselves with the
+.Tn RPC
+service package.
+This routine modifies the global variable
+.Va svc_fds .
+Service implementors usually do not need this routine.
+.Pp
+.It Xo
+.Ft void
+.Xc
+.It Xo
+.Fn xprt_unregister "SVCXPRT *xprt"
+.Xc
+.Pp
+Before an
+.Tn RPC
+service transport handle is destroyed,
+it should unregister itself with the
+.Tn RPC
+service package.
+This routine modifies the global variable
+.Va svc_fds .
+Service implementors usually do not need this routine.
+.El
+.Sh SEE ALSO
+.Xr rpc_secure 3 ,
+.Xr xdr 3
+.Rs
+.%T "Remote Procedure Calls: Protocol Specification"
+.Re
+.Rs
+.%T "Remote Procedure Call Programming Guide"
+.Re
+.Rs
+.%T "rpcgen Programming Guide"
+.Re
+.Rs
+.%T "RPC: Remote Procedure Call Protocol Specification"
+.%O RFC1050
+.%Q "Sun Microsystems, Inc., USC-ISI"
+.Re
diff --git a/reactos/dll/win32/libtirpc/man/rpc_svc_calls.3t b/reactos/dll/win32/libtirpc/man/rpc_svc_calls.3t
new file mode 100644 (file)
index 0000000..582b45d
--- /dev/null
@@ -0,0 +1,267 @@
+.\" @(#)rpc_svc_calls.3n 1.28 93/05/10 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_svc_calls 1.5 89/07/25 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $NetBSD: rpc_svc_calls.3,v 1.1 2000/06/02 23:11:13 fvdl Exp $
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_svc_calls.3,v 1.8 2003/09/08 19:57:15 ru Exp $
+.Dd May 3, 1993
+.Dt RPC_SVC_CALLS 3
+.Os
+.Sh NAME
+.Nm svc_dg_enablecache ,
+.Nm svc_exit ,
+.Nm svc_fdset ,
+.Nm svc_freeargs ,
+.Nm svc_getargs ,
+.Nm svc_getreq_common ,
+.Nm svc_getreq_poll ,
+.Nm svc_getreqset ,
+.Nm svc_getrpccaller ,
+.Nm svc_pollset ,
+.Nm svc_run ,
+.Nm svc_sendreply
+.Nd library routines for RPC servers
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft int
+.Fn svc_dg_enablecache "SVCXPRT *xprt" "const unsigned cache_size"
+.Ft void
+.Fn svc_exit "void"
+.Ft bool_t
+.Fn svc_freeargs "const SVCXPRT *xprt" "const xdrproc_t inproc" "caddr_t in"
+.Ft bool_t
+.Fn svc_getargs "const SVCXPRT *xprt" "const xdrproc_t inproc" "caddr_t in"
+.Ft void
+.Fn svc_getreq_common "const int fd"
+.Ft void
+.Fn svc_getreq_poll "struct pollfd *pfdp" "const int pollretval"
+.Ft void
+.Fn svc_getreqset "fd_set * rdfds"
+.Ft "struct netbuf *"
+.Fn svc_getrpccaller "const SVCXPRT *xprt"
+.Ft "struct cmsgcred *"
+.Fn __svc_getcallercreds "const SVCXPRT *xprt"
+.Vt struct pollfd svc_pollset[FD_SETSIZE];
+.Ft void
+.Fn svc_run "void"
+.Ft bool_t
+.Fn svc_sendreply "SVCXPRT *xprt" "xdrproc_t outproc" "char *out"
+.Sh DESCRIPTION
+These routines are part of the
+RPC
+library which allows C language programs to make procedure
+calls on other machines across the network.
+.Pp
+These routines are associated with the server side of the
+RPC mechanism.
+Some of them are called by the server side dispatch function,
+while others
+(such as
+.Fn svc_run )
+are called when the server is initiated.
+.\" .Pp
+.\" In the current implementation, the service transport handle,
+.\" .Dv SVCXPRT ,
+.\" contains a single data area for decoding arguments and encoding results.
+.\" Therefore, this structure cannot be freely shared between threads that call
+.\" functions that do this.
+.\" Routines on this page that are affected by this
+.\" restriction are marked as unsafe for MT applications.
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt SVCXPRT
+data structure.
+.Bl -tag -width __svc_getcallercreds()
+.It Fn svc_dg_enablecache
+This function allocates a duplicate request cache for the
+service endpoint
+.Fa xprt ,
+large enough to hold
+.Fa cache_size
+entries.
+Once enabled, there is no way to disable caching.
+This routine returns 0 if space necessary for a cache of the given size
+was successfully allocated, and 1 otherwise.
+.It Fn svc_exit
+This function, when called by any of the RPC server procedure or
+otherwise, causes
+.Fn svc_run
+to return.
+.Pp
+As currently implemented,
+.Fn svc_exit
+zeroes the
+.Va svc_fdset
+global variable.
+If RPC server activity is to be resumed,
+services must be reregistered with the RPC library
+either through one of the
+.Xr rpc_svc_create 3
+functions, or using
+.Fn xprt_register .
+The
+.Fn svc_exit
+function
+has global scope and ends all RPC server activity.
+.It Xo
+.Vt fd_set Va svc_fdset
+.Xc
+A global variable reflecting the
+RPC server's read file descriptor bit mask; it is suitable as an argument
+to the
+.Xr select 2
+system call.
+This is only of interest
+if service implementors do not call
+.Fn svc_run ,
+but rather do their own asynchronous event processing.
+This variable is read-only (do not pass its address to
+.Xr select 2 ! ) ,
+yet it may change after calls to
+.Fn svc_getreqset
+or any creation routines.
+.It Fn svc_freeargs
+A function macro that frees any data allocated by the
+RPC/XDR system when it decoded the arguments to a service procedure
+using
+.Fn svc_getargs .
+This routine returns
+.Dv TRUE
+if the results were successfully
+freed, and
+.Dv FALSE
+otherwise.
+.It Fn svc_getargs
+A function macro that decodes the arguments of an
+RPC request associated with the RPC
+service transport handle
+.Fa xprt .
+The
+.Fa in
+argument
+is the address where the arguments will be placed;
+.Fa inproc
+is the XDR
+routine used to decode the arguments.
+This routine returns
+.Dv TRUE
+if decoding succeeds, and
+.Dv FALSE
+otherwise.
+.It Fn svc_getreq_common
+This routine is called to handle a request on the given
+file descriptor.
+.It Fn svc_getreq_poll
+This routine is only of interest if a service implementor
+does not call
+.Fn svc_run ,
+but instead implements custom asynchronous event processing.
+It is called when
+.Xr poll 2
+has determined that an RPC request has arrived on some RPC
+file descriptors;
+.Fa pollretval
+is the return value from
+.Xr poll 2
+and
+.Fa pfdp
+is the array of
+.Vt pollfd
+structures on which the
+.Xr poll 2
+was done.
+It is assumed to be an array large enough to
+contain the maximal number of descriptors allowed.
+.It Fn svc_getreqset
+This routine is only of interest if a service implementor
+does not call
+.Fn svc_run ,
+but instead implements custom asynchronous event processing.
+It is called when
+.Xr poll 2
+has determined that an RPC
+request has arrived on some RPC file descriptors;
+.Fa rdfds
+is the resultant read file descriptor bit mask.
+The routine returns when all file descriptors
+associated with the value of
+.Fa rdfds
+have been serviced.
+.It Fn svc_getrpccaller
+The approved way of getting the network address of the caller
+of a procedure associated with the
+RPC service transport handle
+.Fa xprt .
+.It Fn __svc_getcallercreds
+.Em Warning :
+this macro is specific to
+.Fx
+and thus not portable.
+This macro returns a pointer to a
+.Vt cmsgcred
+structure, defined in
+.In sys/socket.h ,
+identifying the calling client.
+This only works if the client is
+calling the server over an
+.Dv AF_LOCAL
+socket.
+.It Xo
+.Vt struct pollfd Va svc_pollset[FD_SETSIZE] ;
+.Xc
+.Va svc_pollset
+is an array of
+.Vt pollfd
+structures derived from
+.Va svc_fdset[] .
+It is suitable as an argument to the
+.Xr poll 2
+system call.
+The derivation of
+.Va svc_pollset
+from
+.Va svc_fdset
+is made in the current implementation in
+.Fn svc_run .
+Service implementors who do not call
+.Fn svc_run
+and who wish to use this array must perform this derivation themselves.
+.It Fn svc_run
+This routine never returns.
+It waits for RPC
+requests to arrive, and calls the appropriate service
+procedure using
+.Fn svc_getreq_poll
+when one arrives.
+This procedure is usually waiting for the
+.Xr poll 2
+system call to return.
+.It Fn svc_sendreply
+Called by an RPC service's dispatch routine to send the results of a
+remote procedure call.
+The
+.Fa xprt
+argument
+is the request's associated transport handle;
+.Fa outproc
+is the XDR
+routine which is used to encode the results; and
+.Fa out
+is the address of the results.
+This routine returns
+.Dv TRUE
+if it succeeds,
+.Dv FALSE
+otherwise.
+.El
+.Sh SEE ALSO
+.Xr poll 2 ,
+.Xr select 2 ,
+.Xr rpc 3 ,
+.Xr rpc_svc_create 3 ,
+.Xr rpc_svc_err 3 ,
+.Xr rpc_svc_reg 3
diff --git a/reactos/dll/win32/libtirpc/man/rpc_svc_create.3t b/reactos/dll/win32/libtirpc/man/rpc_svc_create.3t
new file mode 100644 (file)
index 0000000..d47be2b
--- /dev/null
@@ -0,0 +1,337 @@
+.\" @(#)rpc_svc_create.3n 1.26 93/08/26 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_svc_create 1.3 89/06/28 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\" $FreeBSD: src/lib/libc/rpc/rpc_svc_create.3,v 1.7 2003/09/08 19:57:15 ru Exp $
+.Dd May 3, 1993
+.Dt RPC_SVC_CREATE 3
+.Os
+.Sh NAME
+.Nm rpc_svc_create ,
+.Nm svc_control ,
+.Nm svc_create ,
+.Nm svc_destroy ,
+.Nm svc_dg_create ,
+.Nm svc_fd_create ,
+.Nm svc_raw_create ,
+.Nm svc_tli_create ,
+.Nm svc_tp_create ,
+.Nm svc_vc_create
+.Nd library routines for the creation of server handles
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft bool_t
+.Fn svc_control "SVCXPRT *svc" "const u_int req" "void *info"
+.Ft int
+.Fn svc_create "void (*dispatch)(struct svc_req *, SVCXPRT *)" "const rpcprog_t prognum" "const rpcvers_t versnum" "const char *nettype"
+.Ft SVCXPRT *
+.Fn svc_dg_create "const int fildes" "const u_int sendsz" "const u_int recvsz"
+.Ft void
+.Fn svc_destroy "SVCXPRT *xprt"
+.Ft "SVCXPRT *"
+.Fn svc_fd_create "const int fildes" "const u_int sendsz" "const u_int recvsz"
+.Ft "SVCXPRT *"
+.Fn svc_raw_create "void"
+.Ft "SVCXPRT *"
+.Fn svc_tli_create "const int fildes" "const struct netconfig *netconf" "const struct t_bind *bindaddr" "const u_int sendsz" "const u_int recvsz"
+.Ft "SVCXPRT *"
+.Fn svc_tp_create "void (*dispatch)(struct svc_req *, SVCXPRT *)" "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf"
+.Ft "SVCXPRT *"
+.Fn svc_vc_create "const int fildes" "const u_int sendsz" "const u_int recvsz"
+.Sh DESCRIPTION
+These routines are part of the RPC
+library which allows C language programs to make procedure
+calls on servers across the network.
+These routines deal with the creation of service handles.
+Once the handle is created, the server can be invoked by calling
+.Fn svc_run .
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt SVCXPRT
+data structure.
+.Bl -tag -width XXXXX
+.It Fn svc_control
+A function to change or retrieve various information
+about a service object.
+The
+.Fa req
+argument
+indicates the type of operation and
+.Fa info
+is a pointer to the information.
+The supported values of
+.Fa req ,
+their argument types, and what they do are:
+.Bl -tag -width SVCGET_XID
+.It Dv SVCGET_VERSQUIET
+If a request is received for a program number
+served by this server but the version number
+is outside the range registered with the server,
+an
+.Dv RPC_PROGVERSMISMATCH
+error will normally
+be returned.
+The
+.Fa info
+argument
+should be a pointer to an
+integer.
+Upon successful completion of the
+.Dv SVCGET_VERSQUIET
+request,
+.Fa *info
+contains an
+integer which describes the server's current
+behavior: 0 indicates normal server behavior
+(that is, an
+.Dv RPC_PROGVERSMISMATCH
+error
+will be returned); 1 indicates that the out of
+range request will be silently ignored.
+.It Dv SVCSET_VERSQUIET
+If a request is received for a program number
+served by this server but the version number
+is outside the range registered with the server,
+an
+.Dv RPC_PROGVERSMISMATCH
+error will normally
+be returned.
+It is sometimes desirable to
+change this behavior.
+The
+.Fa info
+argument
+should be a
+pointer to an integer which is either 0
+(indicating normal server behavior - an
+.Dv RPC_PROGVERSMISMATCH
+error will be returned),
+or 1 (indicating that the out of range request
+should be silently ignored).
+.El
+.It Fn svc_create
+The
+.Fn svc_create
+function
+creates server handles for all the transports
+belonging to the class
+.Fa nettype .
+The
+.Fa nettype
+argument
+defines a class of transports which can be used
+for a particular application.
+The transports are tried in left to right order in
+.Ev NETPATH
+variable or in top to bottom order in the netconfig database.
+If
+.Fa nettype
+is
+.Dv NULL ,
+it defaults to
+.Qq netpath .
+.Pp
+The
+.Fn svc_create
+function
+registers itself with the rpcbind
+service (see
+.Xr rpcbind 8 ) .
+The
+.Fa dispatch
+function
+is called when there is a remote procedure call for the given
+.Fa prognum
+and
+.Fa versnum ;
+this requires calling
+.Fn svc_run
+(see
+.Fn svc_run
+in
+.Xr rpc_svc_reg 3 ) .
+If
+.Fn svc_create
+succeeds, it returns the number of server
+handles it created,
+otherwise it returns 0 and an error message is logged.
+.It Fn svc_destroy
+A function macro that destroys the RPC
+service handle
+.Fa xprt .
+Destruction usually involves deallocation
+of private data structures,
+including
+.Fa xprt
+itself.
+Use of
+.Fa xprt
+is undefined after calling this routine.
+.It Fn svc_dg_create
+This routine creates a connectionless RPC
+service handle, and returns a pointer to it.
+This routine returns
+.Dv NULL
+if it fails, and an error message is logged.
+The
+.Fa sendsz
+and
+.Fa recvsz
+arguments
+are arguments used to specify the size of the buffers.
+If they are 0, suitable defaults are chosen.
+The file descriptor
+.Fa fildes
+should be open and bound.
+The server is not registered with
+.Xr rpcbind 8 .
+.Pp
+Warning:
+since connectionless-based RPC
+messages can only hold limited amount of encoded data,
+this transport cannot be used for procedures
+that take large arguments or return huge results.
+.It Fn svc_fd_create
+This routine creates a service on top of an open and bound file descriptor,
+and returns the handle to it.
+Typically, this descriptor is a connected file descriptor for a
+connection-oriented transport.
+The
+.Fa sendsz
+and
+.Fa recvsz
+arguments
+indicate sizes for the send and receive buffers.
+If they are 0, reasonable defaults are chosen.
+This routine returns
+.Dv NULL
+if it fails, and an error message is logged.
+.It Fn svc_raw_create
+This routine creates an RPC
+service handle and returns a pointer to it.
+The transport is really a buffer within the process's
+address space, so the corresponding RPC
+client should live in the same address space;
+(see
+.Fn clnt_raw_create
+in
+.Xr rpc_clnt_create 3 ) .
+This routine allows simulation of RPC and acquisition of
+RPC overheads (such as round trip times),
+without any kernel and networking interference.
+This routine returns
+.Dv NULL
+if it fails, and an error message is logged.
+.Pp
+Note:
+.Fn svc_run
+should not be called when the raw interface is being used.
+.It Fn svc_tli_create
+This routine creates an RPC
+server handle, and returns a pointer to it.
+The
+.Fa fildes
+argument
+is the file descriptor on which the service is listening.
+If
+.Fa fildes
+is
+.Dv RPC_ANYFD ,
+it opens a file descriptor on the transport specified by
+.Fa netconf .
+If the file descriptor is unbound and
+.Fa bindaddr
+is not
+.Dv NULL ,
+.Fa fildes
+is bound to the address specified by
+.Fa bindaddr ,
+otherwise
+.Fa fildes
+is bound to a default address chosen by the transport.
+.Pp
+Note: the
+.Vt t_bind
+structure comes from the TLI/XTI SysV interface, which
+.Nx
+does not use.
+The structure is defined in
+.In rpc/types.h
+for compatibility as:
+.Bd -literal
+struct t_bind {
+    struct netbuf addr;        /* network address, see rpc(3) */
+    unsigned int  qlen;        /* queue length (for listen(2)) */
+};
+.Ed
+.Pp
+In the case where the default address is chosen,
+the number of outstanding connect requests is set to 8
+for connection-oriented transports.
+The user may specify the size of the send and receive buffers
+with the arguments
+.Fa sendsz
+and
+.Fa recvsz ;
+values of 0 choose suitable defaults.
+This routine returns
+.Dv NULL
+if it fails,
+and an error message is logged.
+The server is not registered with the
+.Xr rpcbind 8
+service.
+.It Fn svc_tp_create
+The
+.Fn svc_tp_create
+function
+creates a server handle for the network
+specified by
+.Fa netconf ,
+and registers itself with the rpcbind service.
+The
+.Fa dispatch
+function
+is called when there is a remote procedure call
+for the given
+.Fa prognum
+and
+.Fa versnum ;
+this requires calling
+.Fn svc_run .
+The
+.Fn svc_tp_create
+function
+returns the service handle if it succeeds,
+otherwise a
+.Dv NULL
+is returned and an error message is logged.
+.It Fn svc_vc_create
+This routine creates a connection-oriented RPC
+service and returns a pointer to it.
+This routine returns
+.Dv NULL
+if it fails, and an error message is logged.
+The users may specify the size of the send and receive buffers
+with the arguments
+.Fa sendsz
+and
+.Fa recvsz ;
+values of 0 choose suitable defaults.
+The file descriptor
+.Fa fildes
+should be open and bound.
+The server is not registered with the
+.Xr rpcbind 8
+service.
+.El
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr rpc_svc_calls 3 ,
+.Xr rpc_svc_err 3 ,
+.Xr rpc_svc_reg 3 ,
+.Xr rpcbind 8
diff --git a/reactos/dll/win32/libtirpc/man/rpc_svc_err.3t b/reactos/dll/win32/libtirpc/man/rpc_svc_err.3t
new file mode 100644 (file)
index 0000000..49139cb
--- /dev/null
@@ -0,0 +1,97 @@
+.\" @(#)rpc_svc_err.3n 1.23 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_svc_err 1.4 89/06/28 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $NetBSD: rpc_svc_err.3,v 1.1 2000/06/02 23:11:14 fvdl Exp $
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_svc_err.3,v 1.4 2002/12/19 09:40:23 ru Exp $
+.Dd May 3, 1993
+.Dt RPC_SVC_ERR 3
+.Os
+.Sh NAME
+.Nm rpc_svc_err ,
+.Nm svcerr_auth ,
+.Nm svcerr_decode ,
+.Nm svcerr_noproc ,
+.Nm svcerr_noprog ,
+.Nm svcerr_progvers ,
+.Nm svcerr_systemerr ,
+.Nm svcerr_weakauth
+.Nd library routines for server side remote procedure call errors
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft void
+.Fn svcerr_auth "SVCXPRT *xprt" "enum auth_stat why"
+.Ft void
+.Fn svcerr_decode "SVCXPRT *xprt"
+.Ft void
+.Fn svcerr_noproc "SVCXPRT *xprt"
+.Ft void
+.Fn svcerr_noprog "SVCXPRT *xprt"
+.Ft void
+.Fn svcerr_progvers "SVCXPRT *xprt" "rpcvers_t low_vers" "rpcvers_t high_vers"
+.Ft void
+.Fn svcerr_systemerr "SVCXPRT *xprt"
+.Ft void
+.Fn svcerr_weakauth "SVCXPRT *xprt"
+.Sh DESCRIPTION
+These routines are part of the RPC
+library which allows C language programs to make procedure
+calls on other machines across the network.
+.Pp
+These routines can be called by the server side
+dispatch function if there is any error in the
+transaction with the client.
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt SVCXPRT
+data structure.
+.Bl -tag -width XXXXX
+.It Fn svcerr_auth
+Called by a service dispatch routine that refuses to perform
+a remote procedure call due to an authentication error.
+.It Fn svcerr_decode
+Called by a service dispatch routine that cannot successfully
+decode the remote arguments
+(see
+.Fn svc_getargs
+in
+.Xr rpc_svc_reg 3 ) .
+.It Fn svcerr_noproc
+Called by a service dispatch routine that does not implement
+the procedure number that the caller requests.
+.It Fn svcerr_noprog
+Called when the desired program is not registered with the
+RPC package.
+Service implementors usually do not need this routine.
+.It Fn svcerr_progvers
+Called when the desired version of a program is not registered with the
+RPC package.
+The
+.Fa low_vers
+argument
+is the lowest version number,
+and
+.Fa high_vers
+is the highest version number.
+Service implementors usually do not need this routine.
+.It Fn svcerr_systemerr
+Called by a service dispatch routine when it detects a system
+error not covered by any particular protocol.
+For example, if a service can no longer allocate storage,
+it may call this routine.
+.It Fn svcerr_weakauth
+Called by a service dispatch routine that refuses to perform
+a remote procedure call due to insufficient (but correct)
+authentication arguments.
+The routine calls
+.Fn svcerr_auth "xprt" "AUTH_TOOWEAK" .
+.El
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr rpc_svc_calls 3 ,
+.Xr rpc_svc_create 3 ,
+.Xr rpc_svc_reg 3
diff --git a/reactos/dll/win32/libtirpc/man/rpc_svc_reg.3t b/reactos/dll/win32/libtirpc/man/rpc_svc_reg.3t
new file mode 100644 (file)
index 0000000..56dd530
--- /dev/null
@@ -0,0 +1,183 @@
+.\" @(#)rpc_svc_reg.3n 1.32 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_svc_call 1.6 89/07/20 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $NetBSD: rpc_svc_reg.3,v 1.1 2000/06/02 23:11:14 fvdl Exp $
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_svc_reg.3,v 1.5 2002/12/19 09:40:23 ru Exp $
+.Dd May 3, 1993
+.Dt RPC_SVC_REG 3
+.Os
+.Sh NAME
+.Nm rpc_svc_reg ,
+.Nm rpc_reg ,
+.Nm svc_reg ,
+.Nm svc_unreg ,
+.Nm svc_auth_reg ,
+.Nm xprt_register ,
+.Nm xprt_unregister
+.Nd library routines for registering servers
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft int
+.Fn rpc_reg "rpcprog_t prognum" "rpcvers_t versnum" "rpcproc_t procnum" "char *(*procname)()" "xdrproc_t inproc" "xdrproc_t outproc" "char *nettype"
+.Ft bool_t
+.Fn svc_reg "SVCXPRT *xprt" "const rpcprog_t prognum" "const rpcvers_t versnum" "void (*dispatch)(struct svc_req *, SVCXPRT *)" "const struct netconfig *netconf"
+.Ft void
+.Fn svc_unreg "const rpcprog_t prognum" "const rpcvers_t versnum"
+.Ft int
+.Fn svc_auth_reg "int cred_flavor" "enum auth_stat (*handler)(struct svc_req *, struct rpc_msg *)"
+.Ft void
+.Fn xprt_register "SVCXPRT *xprt"
+.Ft void
+.Fn xprt_unregister "SVCXPRT *xprt"
+.Sh DESCRIPTION
+These routines are a part of the RPC
+library which allows the RPC
+servers to register themselves with rpcbind
+(see
+.Xr rpcbind 8 ) ,
+and associate the given program and version
+number with the dispatch function.
+When the RPC server receives a RPC request, the library invokes the
+dispatch routine with the appropriate arguments.
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt SVCXPRT
+data structure.
+.Bl -tag -width XXXXX
+.It Fn rpc_reg
+Register program
+.Fa prognum ,
+procedure
+.Fa procname ,
+and version
+.Fa versnum
+with the RPC
+service package.
+If a request arrives for program
+.Fa prognum ,
+version
+.Fa versnum ,
+and procedure
+.Fa procnum ,
+.Fa procname
+is called with a pointer to its argument(s);
+.Fa procname
+should return a pointer to its static result(s);
+.Fa inproc
+is the XDR function used to decode the arguments while
+.Fa outproc
+is the XDR function used to encode the results.
+Procedures are registered on all available transports of the class
+.Fa nettype .
+See
+.Xr rpc 3 .
+This routine returns 0 if the registration succeeded,
+\-1 otherwise.
+.It Fn svc_reg
+Associates
+.Fa prognum
+and
+.Fa versnum
+with the service dispatch procedure,
+.Fa dispatch .
+If
+.Fa netconf
+is
+.Dv NULL ,
+the service is not registered with the
+.Xr rpcbind 8
+service.
+If
+.Fa netconf
+is non-zero,
+then a mapping of the triple
+.Bq Fa prognum , versnum , netconf->nc_netid
+to
+.Fa xprt->xp_ltaddr
+is established with the local rpcbind
+service.
+.Pp
+The
+.Fn svc_reg
+routine returns 1 if it succeeds,
+and 0 otherwise.
+.It Fn svc_unreg
+Remove from the rpcbind
+service, all mappings of the triple
+.Bq Fa prognum , versnum , No all-transports
+to network address
+and all mappings within the RPC service package
+of the double
+.Bq Fa prognum , versnum
+to dispatch routines.
+.It Fn svc_auth_reg
+Registers the service authentication routine
+.Fa handler
+with the dispatch mechanism so that it can be
+invoked to authenticate RPC requests received
+with authentication type
+.Fa cred_flavor .
+This interface allows developers to add new authentication
+types to their RPC applications without needing to modify
+the libraries.
+Service implementors usually do not need this routine.
+.Pp
+Typical service application would call
+.Fn svc_auth_reg
+after registering the service and prior to calling
+.Fn svc_run .
+When needed to process an RPC credential of type
+.Fa cred_flavor ,
+the
+.Fa handler
+procedure will be called with two arguments,
+.Fa "struct svc_req *rqst"
+and
+.Fa "struct rpc_msg *msg" ,
+and is expected to return a valid
+.Vt "enum auth_stat"
+value.
+There is no provision to change or delete an authentication handler
+once registered.
+.Pp
+The
+.Fn svc_auth_reg
+routine returns 0 if the registration is successful,
+1 if
+.Fa cred_flavor
+already has an authentication handler registered for it,
+and \-1 otherwise.
+.It Fn xprt_register
+After RPC service transport handle
+.Fa xprt
+is created, it is registered with the RPC
+service package.
+This routine modifies the global variable
+.Va svc_fdset
+(see
+.Xr rpc_svc_calls 3 ) .
+Service implementors usually do not need this routine.
+.It Fn xprt_unregister
+Before an RPC service transport handle
+.Fa xprt
+is destroyed, it unregisters itself with the
+RPC service package.
+This routine modifies the global variable
+.Va svc_fdset
+(see
+.Xr rpc_svc_calls 3 ) .
+Service implementors usually do not need this routine.
+.El
+.Sh SEE ALSO
+.Xr select 2 ,
+.Xr rpc 3 ,
+.Xr rpcbind 3 ,
+.Xr rpc_svc_calls 3 ,
+.Xr rpc_svc_create 3 ,
+.Xr rpc_svc_err 3 ,
+.Xr rpcbind 8
diff --git a/reactos/dll/win32/libtirpc/man/rpc_xdr.3t b/reactos/dll/win32/libtirpc/man/rpc_xdr.3t
new file mode 100644 (file)
index 0000000..feb708b
--- /dev/null
@@ -0,0 +1,101 @@
+.\" @(#)rpc_xdr.3n 1.24 93/08/31 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" @(#)rpc_xdr.new 1.1 89/04/06 SMI;
+.\" Copyright (c) 1988 Sun Microsystems, Inc. - All Rights Reserved.
+.\"    $FreeBSD: src/lib/libc/rpc/rpc_xdr.3,v 1.3 2001/10/03 16:47:56 bde Exp $
+.Dd May 3, 1993
+.Dt RPC_XDR 3
+.Os
+.Sh NAME
+.Nm xdr_accepted_reply ,
+.Nm xdr_authsys_parms ,
+.Nm xdr_callhdr ,
+.Nm xdr_callmsg ,
+.Nm xdr_opaque_auth ,
+.Nm xdr_rejected_reply ,
+.Nm xdr_replymsg
+.Nd XDR library routines for remote procedure calls
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft bool_t
+.Fn xdr_accepted_reply "XDR *xdrs" "struct accepted_reply *ar"
+.Ft bool_t
+.Fn xdr_authsys_parms "XDR *xdrs" "struct authsys_parms *aupp"
+.Ft bool_t
+.Fn xdr_callhdr "XDR *xdrs" "struct rpc_msg *chdr"
+.Ft bool_t
+.Fn xdr_callmsg "XDR *xdrs" "struct rpc_msg *cmsg"
+.Ft bool_t
+.Fn xdr_opaque_auth "XDR *xdrs" "struct opaque_auth *ap"
+.Ft bool_t
+.Fn xdr_rejected_reply "XDR *xdrs" "struct rejected_reply *rr"
+.Ft bool_t
+.Fn xdr_replymsg "XDR *xdrs" "struct rpc_msg *rmsg"
+.Sh DESCRIPTION
+These routines are used for describing the
+RPC messages in XDR language.
+They should normally be used by those who do not
+want to use the RPC
+package directly.
+These routines return
+.Dv TRUE
+if they succeed,
+.Dv FALSE
+otherwise.
+.Sh Routines
+See
+.Xr rpc 3
+for the definition of the
+.Vt XDR
+data structure.
+.Bl -tag -width XXXXX
+.It Fn xdr_accepted_reply
+Used to translate between RPC
+reply messages and their external representation.
+It includes the status of the RPC
+call in the XDR language format.
+In the case of success, it also includes the call results.
+.It Fn xdr_authsys_parms
+Used for describing
+.Ux
+operating system credentials.
+It includes machine-name, uid, gid list, etc.
+.It Fn xdr_callhdr
+Used for describing
+RPC
+call header messages.
+It encodes the static part of the call message header in the
+XDR language format.
+It includes information such as transaction
+ID, RPC version number, program and version number.
+.It Fn xdr_callmsg
+Used for describing
+RPC call messages.
+This includes all the RPC
+call information such as transaction
+ID, RPC version number, program number, version number,
+authentication information, etc.
+This is normally used by servers to determine information about the client
+RPC call.
+.It Fn xdr_opaque_auth
+Used for describing RPC
+opaque authentication information messages.
+.It Fn xdr_rejected_reply
+Used for describing RPC reply messages.
+It encodes the rejected RPC message in the XDR language format.
+The message could be rejected either because of version
+number mis-match or because of authentication errors.
+.It Fn xdr_replymsg
+Used for describing RPC
+reply messages.
+It translates between the
+RPC reply message and its external representation.
+This reply could be either an acceptance,
+rejection or
+.Dv NULL .
+.El
+.Sh SEE ALSO
+.Xr rpc 3 ,
+.Xr xdr 3
diff --git a/reactos/dll/win32/libtirpc/man/rpcbind.3t b/reactos/dll/win32/libtirpc/man/rpcbind.3t
new file mode 100644 (file)
index 0000000..99b03cf
--- /dev/null
@@ -0,0 +1,194 @@
+.\" @(#)rpcbind.3n 1.25 93/05/07 SMI; from SVr4
+.\" Copyright 1989 AT&T
+.\" Copyright (c) 1988 Sun Microsystem's, Inc. - All Right's Reserved.
+.\"    $NetBSD: rpcbind.3,v 1.2 2000/06/03 18:47:28 fvdl Exp   $
+.\"    $FreeBSD: src/lib/libc/rpc/rpcbind.3,v 1.5 2002/12/19 09:40:23 ru Exp $
+.Dd May 7, 1993
+.Dt RPCBIND 3
+.Os
+.Sh NAME
+.Nm rpcb_getmaps ,
+.Nm rpcb_getaddr ,
+.Nm rpcb_gettime ,
+.Nm rpcb_rmtcall ,
+.Nm rpcb_set ,
+.Nm rpcb_unset
+.Nd library routines for RPC bind service
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In rpc/rpc.h
+.Ft "rpcblist *"
+.Fn rpcb_getmaps "const struct netconfig *netconf" "const char *host"
+.Ft bool_t
+.Fn rpcb_getaddr "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf" "struct netbuf *svcaddr" "const char *host"
+.Ft bool_t
+.Fn rpcb_gettime "const char *host" "time_t * timep"
+.Ft "enum clnt_stat"
+.Fn rpcb_rmtcall "const struct netconfig *netconf" "const char *host" "const rpcprog_t prognum, const rpcvers_t versnum" "const rpcproc_t procnum, const xdrproc_t inproc" "const caddr_t in" "const xdrproc_t outproc" "const caddr_t out" "const struct timeval tout, const struct netbuf *svcaddr"
+.Ft bool_t
+.Fn rpcb_set "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf" "const struct netbuf *svcaddr"
+.Ft bool_t
+.Fn rpcb_unset "const rpcprog_t prognum" "const rpcvers_t versnum" "const struct netconfig *netconf"
+.Sh DESCRIPTION
+These routines allow client C programs to make procedure
+calls to the RPC binder service.
+(see
+.Xr rpcbind 8 )
+maintains a list of mappings between programs
+and their universal addresses.
+.Sh Routines
+.Bl -tag -width XXXXX
+.It Fn rpcb_getmaps
+An interface to the rpcbind service,
+which returns a list of the current
+RPC program-to-address mappings on
+.Fa host .
+It uses the transport specified through
+.Fa netconf
+to contact the remote rpcbind
+service on
+.Fa host .
+This routine will return
+.Dv NULL ,
+if the remote rpcbind could not be contacted.
+.It Fn rpcb_getaddr
+An interface to the rpcbind
+service, which finds the address of the service on
+.Fa host
+that is registered with program number
+.Fa prognum ,
+version
+.Fa versnum ,
+and speaks the transport protocol associated with
+.Fa netconf .
+The address found is returned in
+.Fa svcaddr .
+The
+.Fa svcaddr
+argument
+should be preallocated.
+This routine returns
+.Dv TRUE
+if it succeeds.
+A return value of
+.Dv FALSE
+means that the mapping does not exist
+or that the RPC
+system failed to contact the remote
+rpcbind service.
+In the latter case, the global variable
+.Va rpc_createerr
+(see
+.Xr rpc_clnt_create 3 )
+contains the
+RPC status.
+.It Fn rpcb_gettime
+This routine returns the time on
+.Fa host
+in
+.Fa timep .
+If
+.Fa host
+is
+.Dv NULL ,
+.Fn rpcb_gettime
+returns the time on its own machine.
+This routine returns
+.Dv TRUE
+if it succeeds,
+.Dv FALSE
+if it fails.
+The
+.Fn rpcb_gettime
+function
+can be used to synchronize the time between the
+client and the remote server.
+.It Fn rpcb_rmtcall
+An interface to the rpcbind service, which instructs
+rpcbind on
+.Fa host
+to make an RPC
+call on your behalf to a procedure on that host.
+The
+.Fn netconfig
+structure should correspond to a connectionless transport.
+The
+.Fa svcaddr
+argument
+will be modified to the server's address if the procedure succeeds
+(see
+.Fn rpc_call
+and
+.Fn clnt_call
+in
+.Xr rpc_clnt_calls 3
+for the definitions of other arguments).
+.Pp
+This procedure should normally be used for a
+.Dq ping
+and nothing else.
+This routine allows programs to do lookup and call, all in one step.
+.Pp
+Note: Even if the server is not running
+.Fn rpcb_rmtcall
+does not return any error messages to the caller.
+In such a case, the caller times out.
+.Pp
+Note:
+.Fn rpcb_rmtcall
+is only available for connectionless transports.
+.It Fn rpcb_set
+An interface to the rpcbind
+service, which establishes a mapping between the triple
+.Bq Fa prognum , versnum , netconf->nc_netid
+and
+.Fa svcaddr
+on the machine's rpcbind
+service.
+The value of
+.Fa nc_netid
+must correspond to a network identifier that is defined by the
+netconfig database.
+This routine returns
+.Dv TRUE
+if it succeeds,
+.Dv FALSE
+otherwise.
+(See also
+.Fn svc_reg
+in
+.Xr rpc_svc_calls 3 . )
+If there already exists such an entry with rpcbind,
+.Fn rpcb_set
+will fail.
+.It Fn rpcb_unset
+An interface to the rpcbind
+service, which destroys the mapping between the triple
+.Bq Fa prognum , versnum , netconf->nc_netid
+and the address on the machine's rpcbind
+service.
+If
+.Fa netconf
+is
+.Dv NULL ,
+.Fn rpcb_unset
+destroys all mapping between the triple
+.Bq Fa prognum , versnum , No all-transports
+and the addresses on the machine's rpcbind service.
+This routine returns
+.Dv TRUE
+if it succeeds,
+.Dv FALSE
+otherwise.
+Only the owner of the service or the super-user can destroy the mapping.
+(See also
+.Fn svc_unreg
+in
+.Xr rpc_svc_calls 3 . )
+.El
+.Sh SEE ALSO
+.Xr rpc_clnt_calls 3 ,
+.Xr rpc_svc_calls 3 ,
+.Xr rpcbind 8 ,
+.Xr rpcinfo 8
diff --git a/reactos/dll/win32/libtirpc/man/rtime.3t b/reactos/dll/win32/libtirpc/man/rtime.3t
new file mode 100644 (file)
index 0000000..6e61350
--- /dev/null
@@ -0,0 +1,50 @@
+.\" @(#)rtime.3n       2.1 88/08/08 4.0 RPCSRC; from 1.5 88/02/08 SMI
+.\" $FreeBSD: src/lib/libc/rpc/rtime.3,v 1.8 2002/12/19 09:40:23 ru Exp $
+.\"
+.Dd November 22, 1987
+.Dt RTIME 3
+.Os
+.Sh NAME
+.Nm rtime
+.Nd "get remote time"
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/types.h
+.In sys/time.h
+.In netinet/in.h
+.Ft int
+.Fo rtime
+.Fa "struct sockaddr_in *addrp"
+.Fa "struct timeval *timep"
+.Fa "struct timeval *timeout"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn rtime
+function
+consults the Internet Time Server at the address pointed to by
+.Fa addrp
+and returns the remote time in the
+.Vt timeval
+struct pointed to by
+.Fa timep .
+Normally, the
+.Tn UDP
+protocol is used when consulting the Time Server.
+The
+.Fa timeout
+argument specifies how long the
+routine should wait before giving
+up when waiting for a reply.
+If
+.Fa timeout
+is specified as
+.Dv NULL ,
+however, the routine will instead use
+.Tn TCP
+and block until a reply is received from the time server.
+.Sh RETURN VALUES
+.Rv -std rtime
+.Sh SEE ALSO
+.Xr timed 8
diff --git a/reactos/dll/win32/libtirpc/src/Makefile.am b/reactos/dll/win32/libtirpc/src/Makefile.am
new file mode 100644 (file)
index 0000000..7b002da
--- /dev/null
@@ -0,0 +1,95 @@
+## Process this file with automake to create Makefile.in.
+
+## NOTE: this file doesn't really try to be complete.  In particular
+## `make dist' won't work at all.  We're just aiming to get the
+## program built.  We also don't bother trying to assemble code, or
+## anything like that.
+
+
+INCLUDES = -I$(top_srcdir)/tirpc -DPORTMAP -DINET6 -DVERSION="\"$(VERSION)\"" \
+               -D_GNU_SOURCE -Wall -pipe  
+
+lib_LTLIBRARIES = libtirpc.la
+
+#
+# Set the library version information
+#
+# According to the libtool manual:
+#
+# "This flag accepts an argument of the form current[:revision[:age]].
+#
+# If either revision or age are omitted, they default to 0. Also note that
+# age must be less than or equal to the current interface number.
+#
+# Here are a set of rules to help you update your library version information:
+#
+# 1.  Start with version information of 0:0:0 for each libtool library.
+# 2.  Update the version information only immediately before a public
+#     release of your software. More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger faster.
+# 3.  If the library source code has changed at all since the last update,
+#     then increment revision (c:r:a becomes c:r+1:a).
+# 4.  If any interfaces have been added, removed, or changed since the last
+#     update, increment current, and set revision to 0.
+# 5.  If any interfaces have been added since the last public release,
+#     then increment age.
+# 6.  If any interfaces have been removed since the last public release,
+#     then set age to 0.
+#
+# _Never_ try to set the interface numbers so that they correspond to the
+# release number of your package. This is an abuse that only fosters
+# misunderstanding of the purpose of library versions."
+#
+libtirpc_la_LDFLAGS = -lnsl -lpthread -version-info 1:10:0
+
+libtirpc_la_SOURCES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
+        clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \
+        clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+        getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+        pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+        rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+        svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
+        auth_time.c auth_des.c authdes_prot.c
+
+## XDR
+libtirpc_la_SOURCES += xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c
+
+## Secure-RPC
+if GSS
+    libtirpc_la_SOURCES += auth_gss.c authgss_prot.c svc_auth_gss.c \
+               svc_auth_none.c
+    libtirpc_la_LDFLAGS += $(GSSGLUE_LIBS)
+    libtirpc_la_CFLAGS = -DHAVE_RPCSEC_GSS $(GSSGLUE_CFLAGS)
+endif
+
+## libtirpc_a_SOURCES += key_call.c key_prot_xdr.c getpublickey.c
+## libtirpc_a_SOURCES += netname.c netnamer.c rpcdname.c \
+## libtirpc_a_SOURCES += rtime.c \
+## auth_time.c auth_des.c authdes_prot.c 
+
+if GSS
+$(libtirpc_la_OBJECTS) :auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
+        clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \
+        clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+        getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+        pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+        rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+        svc_raw.c svc_run.c svc_simple.c svc_vc.c \
+       xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c \
+       auth_gss.c authgss_prot.c svc_auth_gss.c getpeereid.c \
+       auth_time.c auth_des.c authdes_prot.c svc_auth_none.c
+        
+else
+$(libtirpc_la_OBJECTS) :auth_none.c auth_unix.c authunix_prot.c bindresvport.c clnt_bcast.c \
+        clnt_dg.c clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c \
+        clnt_vc.c rpc_dtablesize.c getnetconfig.c getnetpath.c getrpcent.c \
+        getrpcport.c mt_misc.c pmap_clnt.c pmap_getmaps.c pmap_getport.c \
+        pmap_prot.c pmap_prot2.c pmap_rmt.c rpc_prot.c rpc_commondata.c \
+        rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
+        rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_generic.c \
+        svc_raw.c svc_run.c svc_simple.c svc_vc.c \
+       xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c \
+       getpeereid.c auth_time.c auth_des.c authdes_prot.c
+endif
diff --git a/reactos/dll/win32/libtirpc/src/asprintf.c b/reactos/dll/win32/libtirpc/src/asprintf.c
new file mode 100644 (file)
index 0000000..be62c01
--- /dev/null
@@ -0,0 +1,107 @@
+/* Copyright (c) 2004 Darren Tucker.
+ *
+ * Based originally on asprintf.c from OpenBSD:
+ * Copyright (c) 1997 Todd C. Miller <Todd.Miller AT courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+//extern int vsnprintf();
+#include <wintirpc.h>
+#include <stdio.h>
+#ifndef __REACTOS__
+#include <varargs.h>
+#endif
+
+/* Include vasprintf() if not on your OS. */
+#ifndef HAVE_VASPRINTF
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#ifndef VA_COPY
+# ifdef HAVE_VA_COPY
+#  define VA_COPY(dest, src) va_copy(dest, src)
+# else
+#  ifdef HAVE___VA_COPY
+#   define VA_COPY(dest, src) __va_copy(dest, src)
+#  else
+#   define VA_COPY(dest, src) (dest) = (src)
+#  endif
+# endif
+#endif
+
+#define INIT_SZ 128
+
+int
+vasprintf(char **str, const char *fmt, va_list ap)
+{
+        int ret = -1;
+        va_list ap2;
+        char *string, *newstr;
+        size_t len;
+
+        VA_COPY(ap2, ap);
+        if ((string = malloc(INIT_SZ)) == NULL)
+                goto fail;
+
+        ret = _vsnprintf(string, INIT_SZ, fmt, ap2);
+        if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */
+                *str = string;
+        } else if (ret == INT_MAX || ret < 0) { /* Bad length */
+                goto fail;
+        } else {        /* bigger than initial, realloc allowing for nul */
+                len = (size_t)ret + 1;
+                if ((newstr = realloc(string, len)) == NULL) {
+                        free(string);
+                        goto fail;
+                } else {
+                        va_end(ap2);
+                        VA_COPY(ap2, ap);
+                        ret = _vsnprintf(newstr, len, fmt, ap2);
+                        if (ret >= 0 && (size_t)ret < len) {
+                                *str = newstr;
+                        } else { /* failed with realloc'ed string, give up */
+                                free(newstr);
+                                goto fail;
+                        }
+                }
+        }
+        va_end(ap2);
+        return (ret);
+
+fail:
+        *str = NULL;
+        errno = ENOMEM;
+        va_end(ap2);
+        return (-1);
+}
+#endif
+
+/* Include asprintf() if not on your OS. */
+#ifndef HAVE_ASPRINTF
+int asprintf(char **str, const char *fmt, ...)
+{
+        va_list ap;
+        int ret;
+        
+        *str = NULL;
+        va_start(ap, fmt);
+        ret = vasprintf(str, fmt, ap);
+        va_end(ap);
+
+        return ret;
+}
+#endif
diff --git a/reactos/dll/win32/libtirpc/src/auth_des.c b/reactos/dll/win32/libtirpc/src/auth_des.c
new file mode 100644 (file)
index 0000000..b515a0c
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * Copyright (c) 2009, Sun Microsystems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of Sun Microsystems, Inc. nor the names of its 
+ *   contributors may be used to endorse or promote products derived 
+ *   from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Copyright (c) 1988 by Sun Microsystems, Inc.
+ */
+/*
+ * auth_des.c, client-side implementation of DES authentication
+ */
+
+#include <wintirpc.h>
+//#include <pthread.h>
+#include <reentrant.h>
+//#include <err.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+//#include <unistd.h>
+//#include <sys/cdefs.h>
+#include <rpc/des_crypt.h>
+//#include <syslog.h>
+#include <rpc/types.h>
+#include <rpc/auth.h>
+#include <rpc/auth_des.h>
+#include <rpc/clnt.h>
+#include <rpc/xdr.h>
+//#include <sys/socket.h>
+#undef NIS
+#include <rpcsvc/nis.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#endif
+//#include <sys/cdefs.h>
+
+#define USEC_PER_SEC           1000000
+#define RTIME_TIMEOUT          5       /* seconds to wait for sync */
+
+#define AUTH_PRIVATE(auth)     (struct ad_private *) auth->ah_private
+#define ALLOC(object_type)     (object_type *) mem_alloc(sizeof(object_type))
+#define FREE(ptr, size)                mem_free((char *)(ptr), (int) size)
+#define ATTEMPT(xdr_op)                if (!(xdr_op)) return (FALSE)
+
+extern bool_t xdr_authdes_cred( XDR *, struct authdes_cred *);
+extern bool_t xdr_authdes_verf( XDR *, struct authdes_verf *);
+extern int key_encryptsession_pk();
+
+extern bool_t __rpc_get_time_offset(struct timeval *, nis_server *, char *,
+       char **, char **);
+
+/* 
+ * DES authenticator operations vector
+ */
+static void    authdes_nextverf(AUTH *);
+static bool_t  authdes_marshal(AUTH *, XDR *);
+static bool_t  authdes_validate(AUTH *, struct opaque_auth *);
+static bool_t  authdes_refresh(AUTH *, void *);
+static void    authdes_destroy(AUTH *);
+
+static struct auth_ops *authdes_ops(void);
+
+/*
+ * This struct is pointed to by the ah_private field of an "AUTH *"
+ */
+struct ad_private {
+       char *ad_fullname;              /* client's full name */
+       u_int ad_fullnamelen;           /* length of name, rounded up */
+       char *ad_servername;            /* server's full name */
+       u_int ad_servernamelen;         /* length of name, rounded up */
+       u_int ad_window;                /* client specified window */
+       bool_t ad_dosync;               /* synchronize? */              
+       struct netbuf ad_syncaddr;      /* remote host to synch with */
+       char *ad_timehost;              /* remote host to synch with */
+       struct timeval ad_timediff;     /* server's time - client's time */
+       u_int ad_nickname;              /* server's nickname for client */
+       struct authdes_cred ad_cred;    /* storage for credential */
+       struct authdes_verf ad_verf;    /* storage for verifier */
+       struct timeval ad_timestamp;    /* timestamp sent */
+       des_block ad_xkey;              /* encrypted conversation key */
+       u_char ad_pkey[1024];           /* Server's actual public key */
+       char *ad_netid;                 /* Timehost netid */
+       char *ad_uaddr;                 /* Timehost uaddr */
+       nis_server *ad_nis_srvr;        /* NIS+ server struct */
+};
+
+AUTH *authdes_pk_seccreate(const char *, netobj *, u_int, const char *,
+       const des_block *, nis_server *);
+
+/*
+ * documented version of authdes_seccreate
+ */
+/*
+       servername:     network name of server
+       win:            time to live
+       timehost:       optional hostname to sync with
+       ckey:           optional conversation key to use
+*/
+
+AUTH *
+authdes_seccreate(const char *servername, const u_int win,
+       const char *timehost, const des_block *ckey)
+{
+       u_char  pkey_data[1024];
+       netobj  pkey;
+       AUTH    *dummy;
+
+       if (! getpublickey(servername, (char *) pkey_data)) {
+               //syslog(LOG_ERR,
+               //    "authdes_seccreate: no public key found for %s",
+               //    servername);
+               return (NULL);
+       }
+
+       pkey.n_bytes = (char *) pkey_data;
+       pkey.n_len = (u_int)strlen((char *)pkey_data) + 1;
+       dummy = authdes_pk_seccreate(servername, &pkey, win, timehost,
+           ckey, NULL);
+       return (dummy);
+}
+
+/*
+ * Slightly modified version of authdessec_create which takes the public key
+ * of the server principal as an argument. This spares us a call to
+ * getpublickey() which in the nameserver context can cause a deadlock.
+ */
+AUTH *
+authdes_pk_seccreate(const char *servername, netobj *pkey, u_int window,
+       const char *timehost, const des_block *ckey, nis_server *srvr)
+{
+       AUTH *auth;
+       struct ad_private *ad;
+       char namebuf[MAXNETNAMELEN+1];
+
+       /*
+        * Allocate everything now
+        */
+       auth = ALLOC(AUTH);
+       if (auth == NULL) {
+               //syslog(LOG_ERR, "authdes_pk_seccreate: out of memory");
+               return (NULL);
+       }
+       ad = ALLOC(struct ad_private);
+       if (ad == NULL) {
+               //syslog(LOG_ERR, "authdes_pk_seccreate: out of memory");
+               goto failed;
+       }
+       ad->ad_fullname = ad->ad_servername = NULL; /* Sanity reasons */
+       ad->ad_timehost = NULL;
+       ad->ad_netid = NULL;
+       ad->ad_uaddr = NULL;
+       ad->ad_nis_srvr = NULL;
+       ad->ad_timediff.tv_sec = 0;
+       ad->ad_timediff.tv_usec = 0;
+       memcpy(ad->ad_pkey, pkey->n_bytes, pkey->n_len);
+       if (!getnetname(namebuf))
+               goto failed;
+       ad->ad_fullnamelen = RNDUP((u_int) strlen(namebuf));
+       ad->ad_fullname = (char *)mem_alloc(ad->ad_fullnamelen + 1);
+       ad->ad_servernamelen = strlen(servername);
+       ad->ad_servername = (char *)mem_alloc(ad->ad_servernamelen + 1);
+
+       if (ad->ad_fullname == NULL || ad->ad_servername == NULL) {
+               //syslog(LOG_ERR, "authdes_seccreate: out of memory");
+               goto failed;
+       }
+       if (timehost != NULL) {
+               ad->ad_timehost = (char *)mem_alloc(strlen(timehost) + 1);
+               if (ad->ad_timehost == NULL) {
+                       //syslog(LOG_ERR, "authdes_seccreate: out of memory");
+                       goto failed;
+               }
+               memcpy(ad->ad_timehost, timehost, strlen(timehost) + 1);
+               ad->ad_dosync = TRUE;
+       } else if (srvr != NULL) {
+               ad->ad_nis_srvr = srvr; /* transient */
+               ad->ad_dosync = TRUE;
+       } else {
+               ad->ad_dosync = FALSE;
+       }
+       memcpy(ad->ad_fullname, namebuf, ad->ad_fullnamelen + 1);
+       memcpy(ad->ad_servername, servername, ad->ad_servernamelen + 1);
+       ad->ad_window = window;
+       if (ckey == NULL) {
+               if (key_gendes(&auth->ah_key) < 0) {
+                       //syslog(LOG_ERR,
+                       //              "authdes_seccreate: keyserv(1m) is unable to generate session key");
+                       goto failed;
+               }
+       } else {
+               auth->ah_key = *ckey;
+       }
+
+       /*
+        * Set up auth handle
+        */
+       auth->ah_cred.oa_flavor = AUTH_DES;
+       auth->ah_verf.oa_flavor = AUTH_DES;
+       auth->ah_ops = authdes_ops();
+       auth->ah_private = (caddr_t)ad;
+
+       if (!authdes_refresh(auth, NULL)) {
+               goto failed;
+       }
+       ad->ad_nis_srvr = NULL; /* not needed any longer */
+       return (auth);
+
+failed:
+       if (auth)
+               FREE(auth, sizeof (AUTH));
+       if (ad) {
+               if (ad->ad_fullname)
+                       FREE(ad->ad_fullname, ad->ad_fullnamelen + 1);
+               if (ad->ad_servername)
+                       FREE(ad->ad_servername, ad->ad_servernamelen + 1);
+               if (ad->ad_timehost)
+                       FREE(ad->ad_timehost, strlen(ad->ad_timehost) + 1);
+               if (ad->ad_netid)
+                       FREE(ad->ad_netid, strlen(ad->ad_netid) + 1);
+               if (ad->ad_uaddr)
+                       FREE(ad->ad_uaddr, strlen(ad->ad_uaddr) + 1);
+               FREE(ad, sizeof (struct ad_private));
+       }
+       return (NULL);
+}
+
+/*
+ * Implement the five authentication operations
+ */
+
+
+/*
+ * 1. Next Verifier
+ */    
+/*ARGSUSED*/
+static void
+authdes_nextverf(AUTH *auth)
+{
+       /* what the heck am I supposed to do??? */
+}
+
+
+/*
+ * 2. Marshal
+ */
+static bool_t
+authdes_marshal(AUTH *auth, XDR *xdrs)
+{
+/* LINTED pointer alignment */
+       struct ad_private *ad = AUTH_PRIVATE(auth);
+       struct authdes_cred *cred = &ad->ad_cred;
+       struct authdes_verf *verf = &ad->ad_verf;
+       des_block cryptbuf[2];  
+       des_block ivec;
+       int status;
+       int len;
+       rpc_inline_t *ixdr;
+
+       /*
+        * Figure out the "time", accounting for any time difference
+        * with the server if necessary.
+        */
+       (void) gettimeofday(&ad->ad_timestamp, (struct timezone *)NULL);
+       ad->ad_timestamp.tv_sec += ad->ad_timediff.tv_sec;
+       ad->ad_timestamp.tv_usec += ad->ad_timediff.tv_usec;
+       while (ad->ad_timestamp.tv_usec >= USEC_PER_SEC) {
+               ad->ad_timestamp.tv_usec -= USEC_PER_SEC;
+               ad->ad_timestamp.tv_sec++;
+       }
+
+       /*
+        * XDR the timestamp and possibly some other things, then
+        * encrypt them.
+        */
+       ixdr = (rpc_inline_t *)cryptbuf;
+       IXDR_PUT_INT32(ixdr, ad->ad_timestamp.tv_sec);
+       IXDR_PUT_INT32(ixdr, ad->ad_timestamp.tv_usec);
+       if (ad->ad_cred.adc_namekind == ADN_FULLNAME) {
+               IXDR_PUT_U_INT32(ixdr, ad->ad_window);
+               IXDR_PUT_U_INT32(ixdr, ad->ad_window - 1);
+               ivec.key.high = ivec.key.low = 0;       
+               status = cbc_crypt((char *)&auth->ah_key, (char *)cryptbuf, 
+                       (u_int) 2 * sizeof (des_block),
+                       DES_ENCRYPT | DES_HW, (char *)&ivec);
+       } else {
+               status = ecb_crypt((char *)&auth->ah_key, (char *)cryptbuf, 
+                       (u_int) sizeof (des_block),
+                       DES_ENCRYPT | DES_HW);
+       }
+       if (DES_FAILED(status)) {
+               //syslog(LOG_ERR, "authdes_marshal: DES encryption failure");
+               return (FALSE);
+       }
+       ad->ad_verf.adv_xtimestamp = cryptbuf[0];
+       if (ad->ad_cred.adc_namekind == ADN_FULLNAME) {
+               ad->ad_cred.adc_fullname.window = cryptbuf[1].key.high;
+               ad->ad_verf.adv_winverf = cryptbuf[1].key.low;
+       } else {
+               ad->ad_cred.adc_nickname = ad->ad_nickname;
+               ad->ad_verf.adv_winverf = 0;
+       }
+
+       /*
+        * Serialize the credential and verifier into opaque
+        * authentication data.
+        */
+       if (ad->ad_cred.adc_namekind == ADN_FULLNAME) {
+               len = ((1 + 1 + 2 + 1)*BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
+       } else {
+               len = (1 + 1)*BYTES_PER_XDR_UNIT;
+       }
+
+       if ((ixdr = xdr_inline(xdrs, 2*BYTES_PER_XDR_UNIT))) {
+               IXDR_PUT_INT32(ixdr, AUTH_DES);
+               IXDR_PUT_INT32(ixdr, len);
+       } else {
+               ATTEMPT(xdr_putint32(xdrs, (int *)&auth->ah_cred.oa_flavor));
+               ATTEMPT(xdr_putint32(xdrs, &len));
+       }
+       ATTEMPT(xdr_authdes_cred(xdrs, cred));
+
+       len = (2 + 1)*BYTES_PER_XDR_UNIT; 
+       if ((ixdr = xdr_inline(xdrs, 2*BYTES_PER_XDR_UNIT))) {
+               IXDR_PUT_INT32(ixdr, AUTH_DES);
+               IXDR_PUT_INT32(ixdr, len);
+       } else {
+               ATTEMPT(xdr_putint32(xdrs, (int *)&auth->ah_verf.oa_flavor));
+               ATTEMPT(xdr_putint32(xdrs, &len));
+       }
+       ATTEMPT(xdr_authdes_verf(xdrs, verf));
+       return (TRUE);
+}
+
+
+/*
+ * 3. Validate
+ */
+static bool_t
+authdes_validate(AUTH *auth, struct opaque_auth *rverf)
+{
+/* LINTED pointer alignment */
+       struct ad_private *ad = AUTH_PRIVATE(auth);
+       struct authdes_verf verf;
+       int status;
+       uint32_t *ixdr;
+       des_block buf;
+
+       if (rverf->oa_length != (2 + 1) * BYTES_PER_XDR_UNIT) {
+               return (FALSE);
+       }
+/* LINTED pointer alignment */
+       ixdr = (uint32_t *)rverf->oa_base;
+       buf.key.high = (uint32_t)*ixdr++;
+       buf.key.low = (uint32_t)*ixdr++;
+       verf.adv_int_u = (uint32_t)*ixdr++;
+
+       /*
+        * Decrypt the timestamp
+        */
+       status = ecb_crypt((char *)&auth->ah_key, (char *)&buf,
+               (u_int)sizeof (des_block), DES_DECRYPT | DES_HW);
+
+       if (DES_FAILED(status)) {
+               //syslog(LOG_ERR, "authdes_validate: DES decryption failure");
+               return (FALSE);
+       }
+
+       /*
+        * xdr the decrypted timestamp
+        */
+/* LINTED pointer alignment */
+       ixdr = (uint32_t *)buf.c;
+       verf.adv_timestamp.tv_sec = IXDR_GET_INT32(ixdr) + 1;
+       verf.adv_timestamp.tv_usec = IXDR_GET_INT32(ixdr);
+
+       /*
+        * validate
+        */
+       if (bcmp((char *)&ad->ad_timestamp, (char *)&verf.adv_timestamp,
+                sizeof(struct timeval)) != 0) {
+               //syslog(LOG_DEBUG, "authdes_validate: verifier mismatch");
+               return (FALSE);
+       }
+
+       /*
+        * We have a nickname now, let's use it
+        */
+       ad->ad_nickname = verf.adv_nickname;
+       ad->ad_cred.adc_namekind = ADN_NICKNAME;
+       return (TRUE);
+}
+
+/*
+ * 4. Refresh
+ */
+/*ARGSUSED*/
+static bool_t
+authdes_refresh(AUTH *auth, void *dummy)
+{
+/* LINTED pointer alignment */
+       struct ad_private *ad = AUTH_PRIVATE(auth);
+       struct authdes_cred *cred = &ad->ad_cred;
+       int             ok;
+       netobj          pkey;
+
+       if (ad->ad_dosync) {
+#if 1 // WINDOWS
+               ok = 1;
+#else
+                ok = __rpc_get_time_offset(&ad->ad_timediff, ad->ad_nis_srvr,
+                   ad->ad_timehost, &(ad->ad_uaddr),
+                   &(ad->ad_netid));
+#endif
+               if (! ok) {
+                       /*
+                        * Hope the clocks are synced!
+                        */
+                       ad->ad_dosync = 0;
+                       //syslog(LOG_DEBUG,
+                       //    "authdes_refresh: unable to synchronize clock");
+                }
+       }
+       ad->ad_xkey = auth->ah_key;
+       pkey.n_bytes = (char *)(ad->ad_pkey);
+       pkey.n_len = (u_int)strlen((char *)ad->ad_pkey) + 1;
+       if (key_encryptsession_pk(ad->ad_servername, &pkey, &ad->ad_xkey) < 0) {
+               //syslog(LOG_INFO,
+               //    "authdes_refresh: keyserv(1m) is unable to encrypt session key");
+               return (FALSE);
+       }
+       cred->adc_fullname.key = ad->ad_xkey;
+       cred->adc_namekind = ADN_FULLNAME;
+       cred->adc_fullname.name = ad->ad_fullname;
+       return (TRUE);
+}
+
+
+/*
+ * 5. Destroy
+ */
+static void
+authdes_destroy(AUTH *auth)
+{
+/* LINTED pointer alignment */
+       struct ad_private *ad = AUTH_PRIVATE(auth);
+
+       FREE(ad->ad_fullname, ad->ad_fullnamelen + 1);
+       FREE(ad->ad_servername, ad->ad_servernamelen + 1);
+       if (ad->ad_timehost)
+               FREE(ad->ad_timehost, strlen(ad->ad_timehost) + 1);
+       if (ad->ad_netid)
+               FREE(ad->ad_netid, strlen(ad->ad_netid) + 1);
+       if (ad->ad_uaddr)
+               FREE(ad->ad_uaddr, strlen(ad->ad_uaddr) + 1);
+       FREE(ad, sizeof (struct ad_private));
+       FREE(auth, sizeof(AUTH));
+}
+
+static struct auth_ops *
+authdes_ops(void)
+{
+       static struct auth_ops ops;
+       extern mutex_t authdes_ops_lock;
+
+       /* VARIABLES PROTECTED BY ops_lock: ops */
+       mutex_lock(&authdes_ops_lock);
+       if (ops.ah_nextverf == NULL) {
+               ops.ah_nextverf = authdes_nextverf;
+               ops.ah_marshal = authdes_marshal;
+               ops.ah_validate = authdes_validate;
+               ops.ah_refresh = authdes_refresh;
+               ops.ah_destroy = authdes_destroy;
+        }
+       mutex_unlock(&authdes_ops_lock);
+       return (&ops);
+}
diff --git a/reactos/dll/win32/libtirpc/src/auth_gss.c b/reactos/dll/win32/libtirpc/src/auth_gss.c
new file mode 100644 (file)
index 0000000..89d4628
--- /dev/null
@@ -0,0 +1,633 @@
+/*
+  auth_gss.c
+
+  RPCSEC_GSS client routines.
+
+  Copyright (c) 2000 The Regents of the University of Michigan.
+  All rights reserved.
+
+  Copyright (c) 2000 Dug Song <dugsong@UMICH.EDU>.
+  All rights reserved, all wrongs reversed.
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+  3. Neither the name of the University nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+//#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+#include <rpc/auth.h>
+#include <rpc/auth_gss.h>
+#include <rpc/clnt.h>
+#include <netinet/in.h>
+#include <gssapi/gssapi.h>
+
+static void    authgss_nextverf();
+static bool_t  authgss_marshal();
+static bool_t  authgss_refresh();
+static bool_t  authgss_validate();
+static void    authgss_destroy();
+static void    authgss_destroy_context();
+static bool_t  authgss_wrap();
+static bool_t  authgss_unwrap();
+
+
+/*
+ * from mit-krb5-1.2.1 mechglue/mglueP.h:
+ * Array of context IDs typed by mechanism OID
+ */
+typedef struct gss_union_ctx_id_t {
+       gss_OID     mech_type;
+       gss_ctx_id_t    internal_ctx_id;
+} gss_union_ctx_id_desc, *gss_union_ctx_id_t;
+
+static struct auth_ops authgss_ops = {
+       authgss_nextverf,
+       authgss_marshal,
+       authgss_validate,
+       authgss_refresh,
+       authgss_destroy,
+       authgss_wrap,
+       authgss_unwrap
+};
+
+#ifdef DEBUG
+
+/* useful as i add more mechanisms */
+void
+print_rpc_gss_sec(struct rpc_gss_sec *ptr)
+{
+int i;
+char *p;
+
+       log_debug("rpc_gss_sec:");
+       if(ptr->mech == NULL)
+               log_debug("NULL gss_OID mech");
+       else {
+               fprintf(stderr, "     mechanism_OID: {");
+               p = (char *)ptr->mech->elements;
+               for (i=0; i < ptr->mech->length; i++)
+                       /* First byte of OIDs encoded to save a byte */
+                       if (i == 0) {
+                               int first, second;
+                               if (*p < 40) {
+                                       first = 0;
+                                       second = *p;
+                               }
+                               else if (40 <= *p && *p < 80) {
+                                       first = 1;
+                                       second = *p - 40;
+                               }
+                               else if (80 <= *p && *p < 127) {
+                                       first = 2;
+                                       second = *p - 80;
+                               }
+                               else {
+                                       /* Invalid value! */
+                                       first = -1;
+                                       second = -1;
+                               }
+                               fprintf(stderr, " %u %u", first, second);
+                               p++;
+                       }
+                       else {
+                               fprintf(stderr, " %u", (unsigned char)*p++);
+                       }
+               fprintf(stderr, " }\n");
+       }
+       fprintf(stderr, "     qop: %d\n", ptr->qop);
+       fprintf(stderr, "     service: %d\n", ptr->svc);
+       fprintf(stderr, "     cred: %p\n", ptr->cred);
+}
+#endif /*DEBUG*/
+
+struct rpc_gss_data {
+       bool_t                   established;   /* context established */
+       gss_buffer_desc          gc_wire_verf;  /* save GSS_S_COMPLETE NULL RPC verfier
+                                                * to process at end of context negotiation*/
+       CLIENT                  *clnt;          /* client handle */
+       gss_name_t               name;          /* service name */
+       struct rpc_gss_sec       sec;           /* security tuple */
+       gss_ctx_id_t             ctx;           /* context id */
+       struct rpc_gss_cred      gc;            /* client credentials */
+       u_int                    win;           /* sequence window */
+};
+
+#define        AUTH_PRIVATE(auth)      ((struct rpc_gss_data *)auth->ah_private)
+
+static struct timeval AUTH_TIMEOUT = { 25, 0 };
+
+AUTH *
+authgss_create(CLIENT *clnt, gss_name_t name, struct rpc_gss_sec *sec)
+{
+       AUTH                    *auth, *save_auth;
+       struct rpc_gss_data     *gd;
+       OM_uint32               min_stat = 0;
+
+       log_debug("in authgss_create()");
+
+       memset(&rpc_createerr, 0, sizeof(rpc_createerr));
+
+       if ((auth = calloc(sizeof(*auth), 1)) == NULL) {
+               rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+               rpc_createerr.cf_error.re_errno = ENOMEM;
+               return (NULL);
+       }
+       if ((gd = calloc(sizeof(*gd), 1)) == NULL) {
+               rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+               rpc_createerr.cf_error.re_errno = ENOMEM;
+               free(auth);
+               return (NULL);
+       }
+#ifdef DEBUG
+       fprintf(stderr, "authgss_create: name is %p\n", name);
+#endif
+       if (name != GSS_C_NO_NAME) {
+               if (gss_duplicate_name(&min_stat, name, &gd->name)
+                                               != GSS_S_COMPLETE) {
+                       rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+                       rpc_createerr.cf_error.re_errno = ENOMEM;
+                       free(auth);
+                       return (NULL);
+               }
+       }
+       else
+               gd->name = name;
+
+#ifdef DEBUG
+       fprintf(stderr, "authgss_create: gd->name is %p\n", gd->name);
+#endif
+       gd->clnt = clnt;
+       gd->ctx = GSS_C_NO_CONTEXT;
+       gd->sec = *sec;
+
+       gd->gc.gc_v = RPCSEC_GSS_VERSION;
+       gd->gc.gc_proc = RPCSEC_GSS_INIT;
+       gd->gc.gc_svc = gd->sec.svc;
+
+       auth->ah_ops = &authgss_ops;
+       auth->ah_private = (caddr_t)gd;
+
+       save_auth = clnt->cl_auth;
+       clnt->cl_auth = auth;
+
+       if (!authgss_refresh(auth))
+               auth = NULL;
+
+       clnt->cl_auth = save_auth;
+
+       return (auth);
+}
+
+AUTH *
+authgss_create_default(CLIENT *clnt, char *service, struct rpc_gss_sec *sec)
+{
+       AUTH                    *auth;
+       OM_uint32                maj_stat = 0, min_stat = 0;
+       gss_buffer_desc          sname;
+       gss_name_t               name = GSS_C_NO_NAME;
+
+       log_debug("in authgss_create_default()");
+
+
+       sname.value = service;
+       sname.length = strlen(service);
+
+       maj_stat = gss_import_name(&min_stat, &sname,
+               (gss_OID)GSS_C_NT_HOSTBASED_SERVICE,
+               &name);
+
+       if (maj_stat != GSS_S_COMPLETE) {
+               log_status("gss_import_name", maj_stat, min_stat);
+               rpc_createerr.cf_stat = RPC_AUTHERROR;
+               return (NULL);
+       }
+
+       auth = authgss_create(clnt, name, sec);
+
+       if (name != GSS_C_NO_NAME) {
+#ifdef DEBUG
+       fprintf(stderr, "authgss_create_default: freeing name %p\n", name);
+#endif
+               gss_release_name(&min_stat, &name);
+       }
+
+       return (auth);
+}
+
+bool_t
+authgss_get_private_data(AUTH *auth, struct authgss_private_data *pd)
+{
+       struct rpc_gss_data     *gd;
+
+       log_debug("in authgss_get_private_data()");
+
+       if (!auth || !pd)
+               return (FALSE);
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (!gd || !gd->established)
+               return (FALSE);
+
+       pd->pd_ctx = gd->ctx;
+       pd->pd_ctx_hndl = gd->gc.gc_ctx;
+       pd->pd_seq_win = gd->win;
+
+       return (TRUE);
+}
+
+static void
+authgss_nextverf(AUTH *auth)
+{
+       log_debug("in authgss_nextverf()");
+       /* no action necessary */
+}
+
+static bool_t
+authgss_marshal(AUTH *auth, XDR *xdrs)
+{
+       XDR                      tmpxdrs;
+       char                     tmp[MAX_AUTH_BYTES];
+       struct rpc_gss_data     *gd;
+       gss_buffer_desc          rpcbuf, checksum;
+       OM_uint32                maj_stat, min_stat;
+       bool_t                   xdr_stat;
+
+       log_debug("in authgss_marshal()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->established)
+               gd->gc.gc_seq++;
+
+       xdrmem_create(&tmpxdrs, tmp, sizeof(tmp), XDR_ENCODE);
+
+       if (!xdr_rpc_gss_cred(&tmpxdrs, &gd->gc)) {
+               XDR_DESTROY(&tmpxdrs);
+               return (FALSE);
+       }
+       auth->ah_cred.oa_flavor = RPCSEC_GSS;
+       auth->ah_cred.oa_base = tmp;
+       auth->ah_cred.oa_length = XDR_GETPOS(&tmpxdrs);
+
+       XDR_DESTROY(&tmpxdrs);
+
+       if (!xdr_opaque_auth(xdrs, &auth->ah_cred))
+               return (FALSE);
+
+       if (gd->gc.gc_proc == RPCSEC_GSS_INIT ||
+           gd->gc.gc_proc == RPCSEC_GSS_CONTINUE_INIT) {
+               return (xdr_opaque_auth(xdrs, &_null_auth));
+       }
+       /* Checksum serialized RPC header, up to and including credential. */
+       rpcbuf.length = XDR_GETPOS(xdrs);
+       XDR_SETPOS(xdrs, 0);
+       rpcbuf.value = XDR_INLINE(xdrs, rpcbuf.length);
+
+       maj_stat = gss_get_mic(&min_stat, gd->ctx, gd->sec.qop,
+                           &rpcbuf, &checksum);
+
+       if (maj_stat != GSS_S_COMPLETE) {
+               log_status("gss_get_mic", maj_stat, min_stat);
+               if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+                       gd->established = FALSE;
+                       authgss_destroy_context(auth);
+               }
+               return (FALSE);
+       }
+       auth->ah_verf.oa_flavor = RPCSEC_GSS;
+       auth->ah_verf.oa_base = checksum.value;
+       auth->ah_verf.oa_length = checksum.length;
+
+       xdr_stat = xdr_opaque_auth(xdrs, &auth->ah_verf);
+       gss_release_buffer(&min_stat, &checksum);
+
+       return (xdr_stat);
+}
+
+static bool_t
+authgss_validate(AUTH *auth, struct opaque_auth *verf)
+{
+       struct rpc_gss_data     *gd;
+       u_int                    num, qop_state;
+       gss_buffer_desc          signbuf, checksum;
+       OM_uint32                maj_stat, min_stat;
+
+       log_debug("in authgss_validate()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->established == FALSE) {
+               /* would like to do this only on NULL rpc --
+                * gc->established is good enough.
+                * save the on the wire verifier to validate last
+                * INIT phase packet after decode if the major
+                * status is GSS_S_COMPLETE
+                */
+               if ((gd->gc_wire_verf.value =
+                               mem_alloc(verf->oa_length)) == NULL) {
+                       fprintf(stderr, "gss_validate: out of memory\n");
+                       return (FALSE);
+               }
+               memcpy(gd->gc_wire_verf.value, verf->oa_base, verf->oa_length);
+               gd->gc_wire_verf.length = verf->oa_length;
+               return (TRUE);
+       }
+
+       if (gd->gc.gc_proc == RPCSEC_GSS_INIT ||
+           gd->gc.gc_proc == RPCSEC_GSS_CONTINUE_INIT) {
+               num = htonl(gd->win);
+       }
+       else num = htonl(gd->gc.gc_seq);
+
+       signbuf.value = &num;
+       signbuf.length = sizeof(num);
+
+       checksum.value = verf->oa_base;
+       checksum.length = verf->oa_length;
+
+       maj_stat = gss_verify_mic(&min_stat, gd->ctx, &signbuf,
+                                 &checksum, &qop_state);
+       if (maj_stat != GSS_S_COMPLETE || qop_state != gd->sec.qop) {
+               log_status("gss_verify_mic", maj_stat, min_stat);
+               if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+                       gd->established = FALSE;
+                       authgss_destroy_context(auth);
+               }
+               return (FALSE);
+       }
+       return (TRUE);
+}
+
+static bool_t
+authgss_refresh(AUTH *auth)
+{
+       struct rpc_gss_data     *gd;
+       struct rpc_gss_init_res  gr;
+       gss_buffer_desc         *recv_tokenp, send_token;
+       OM_uint32                maj_stat, min_stat, call_stat, ret_flags;
+
+       log_debug("in authgss_refresh()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->established)
+               return (TRUE);
+
+       /* GSS context establishment loop. */
+       memset(&gr, 0, sizeof(gr));
+       recv_tokenp = GSS_C_NO_BUFFER;
+
+#ifdef DEBUG
+       print_rpc_gss_sec(&gd->sec);
+#endif /*DEBUG*/
+
+       for (;;) {
+#ifdef DEBUG
+               /* print the token we just received */
+               if (recv_tokenp != GSS_C_NO_BUFFER) {
+                       log_debug("The token we just received (length %d):",
+                                 recv_tokenp->length);
+                       log_hexdump(recv_tokenp->value, recv_tokenp->length, 0);
+               }
+#endif
+               maj_stat = gss_init_sec_context(&min_stat,
+                                               gd->sec.cred,
+                                               &gd->ctx,
+                                               gd->name,
+                                               gd->sec.mech,
+                                               gd->sec.req_flags,
+                                               0,              /* time req */
+                                               NULL,           /* channel */
+                                               recv_tokenp,
+                                               NULL,           /* used mech */
+                                               &send_token,
+                                               &ret_flags,
+                                               NULL);          /* time rec */
+
+               if (recv_tokenp != GSS_C_NO_BUFFER) {
+                       gss_release_buffer(&min_stat, &gr.gr_token);
+                       recv_tokenp = GSS_C_NO_BUFFER;
+               }
+               if (maj_stat != GSS_S_COMPLETE &&
+                   maj_stat != GSS_S_CONTINUE_NEEDED) {
+                       log_status("gss_init_sec_context", maj_stat, min_stat);
+                       break;
+               }
+               if (send_token.length != 0) {
+                       memset(&gr, 0, sizeof(gr));
+
+#ifdef DEBUG
+                       /* print the token we are about to send */
+                       log_debug("The token being sent (length %d):",
+                                 send_token.length);
+                       log_hexdump(send_token.value, send_token.length, 0);
+#endif
+
+                       call_stat = clnt_call(gd->clnt, NULLPROC,
+                                             (xdrproc_t)xdr_rpc_gss_init_args,
+                                             &send_token,
+                                             (xdrproc_t)xdr_rpc_gss_init_res,
+                                             (caddr_t)&gr, AUTH_TIMEOUT);
+
+                       gss_release_buffer(&min_stat, &send_token);
+
+                       if (call_stat != RPC_SUCCESS ||
+                           (gr.gr_major != GSS_S_COMPLETE &&
+                            gr.gr_major != GSS_S_CONTINUE_NEEDED))
+                               return FALSE;
+
+                       if (gr.gr_ctx.length != 0) {
+                               if (gd->gc.gc_ctx.value)
+                                       gss_release_buffer(&min_stat,
+                                                          &gd->gc.gc_ctx);
+                               gd->gc.gc_ctx = gr.gr_ctx;
+                       }
+                       if (gr.gr_token.length != 0) {
+                               if (maj_stat != GSS_S_CONTINUE_NEEDED)
+                                       break;
+                               recv_tokenp = &gr.gr_token;
+                       }
+                       gd->gc.gc_proc = RPCSEC_GSS_CONTINUE_INIT;
+               }
+
+               /* GSS_S_COMPLETE => check gss header verifier,
+                * usually checked in gss_validate
+                */
+               if (maj_stat == GSS_S_COMPLETE) {
+                       gss_buffer_desc   bufin;
+                       gss_buffer_desc   bufout;
+                       u_int seq, qop_state = 0;
+
+                       seq = htonl(gr.gr_win);
+                       bufin.value = (unsigned char *)&seq;
+                       bufin.length = sizeof(seq);
+                       bufout.value = (unsigned char *)gd->gc_wire_verf.value;
+                       bufout.length = gd->gc_wire_verf.length;
+
+                       maj_stat = gss_verify_mic(&min_stat, gd->ctx,
+                               &bufin, &bufout, &qop_state);
+
+                       if (maj_stat != GSS_S_COMPLETE
+                                       || qop_state != gd->sec.qop) {
+                               log_status("gss_verify_mic", maj_stat, min_stat);
+                               if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
+                                       gd->established = FALSE;
+                                       authgss_destroy_context(auth);
+                               }
+                               return (FALSE);
+                       }
+                       gd->established = TRUE;
+                       gd->gc.gc_proc = RPCSEC_GSS_DATA;
+                       gd->gc.gc_seq = 0;
+                       gd->win = gr.gr_win;
+                       break;
+               }
+       }
+       /* End context negotiation loop. */
+       if (gd->gc.gc_proc != RPCSEC_GSS_DATA) {
+               if (gr.gr_token.length != 0)
+                       gss_release_buffer(&min_stat, &gr.gr_token);
+
+               authgss_destroy(auth);
+               auth = NULL;
+               rpc_createerr.cf_stat = RPC_AUTHERROR;
+
+               return (FALSE);
+       }
+       return (TRUE);
+}
+
+bool_t
+authgss_service(AUTH *auth, int svc)
+{
+       struct rpc_gss_data     *gd;
+
+       log_debug("in authgss_service()");
+
+       if (!auth)
+               return(FALSE);
+       gd = AUTH_PRIVATE(auth);
+       if (!gd || !gd->established)
+               return (FALSE);
+       gd->sec.svc = svc;
+       gd->gc.gc_svc = svc;
+       return (TRUE);
+}
+
+static void
+authgss_destroy_context(AUTH *auth)
+{
+       struct rpc_gss_data     *gd;
+       OM_uint32                min_stat;
+
+       log_debug("in authgss_destroy_context()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->gc.gc_ctx.length != 0) {
+               if (gd->established) {
+                       gd->gc.gc_proc = RPCSEC_GSS_DESTROY;
+                       clnt_call(gd->clnt, NULLPROC, (xdrproc_t)xdr_void, NULL,
+                                 (xdrproc_t)xdr_void, NULL, AUTH_TIMEOUT);
+               }
+               gss_release_buffer(&min_stat, &gd->gc.gc_ctx);
+               /* XXX ANDROS check size of context  - should be 8 */
+               memset(&gd->gc.gc_ctx, 0, sizeof(gd->gc.gc_ctx));
+       }
+       if (gd->ctx != GSS_C_NO_CONTEXT) {
+               gss_delete_sec_context(&min_stat, &gd->ctx, NULL);
+               gd->ctx = GSS_C_NO_CONTEXT;
+       }
+
+       /* free saved wire verifier (if any) */
+       mem_free(gd->gc_wire_verf.value, gd->gc_wire_verf.length);
+       gd->gc_wire_verf.value = NULL;
+       gd->gc_wire_verf.length = 0;
+
+       gd->established = FALSE;
+}
+
+static void
+authgss_destroy(AUTH *auth)
+{
+       struct rpc_gss_data     *gd;
+       OM_uint32                min_stat;
+
+       log_debug("in authgss_destroy()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       authgss_destroy_context(auth);
+
+#ifdef DEBUG
+       fprintf(stderr, "authgss_destroy: freeing name %p\n", gd->name);
+#endif
+       if (gd->name != GSS_C_NO_NAME)
+               gss_release_name(&min_stat, &gd->name);
+
+       free(gd);
+       free(auth);
+}
+
+bool_t
+authgss_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+{
+       struct rpc_gss_data     *gd;
+
+       log_debug("in authgss_wrap()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (!gd->established || gd->sec.svc == RPCSEC_GSS_SVC_NONE) {
+               return ((*xdr_func)(xdrs, xdr_ptr));
+       }
+       return (xdr_rpc_gss_data(xdrs, xdr_func, xdr_ptr,
+                                gd->ctx, gd->sec.qop,
+                                gd->sec.svc, gd->gc.gc_seq));
+}
+
+bool_t
+authgss_unwrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+{
+       struct rpc_gss_data     *gd;
+
+       log_debug("in authgss_unwrap()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (!gd->established || gd->sec.svc == RPCSEC_GSS_SVC_NONE) {
+               return ((*xdr_func)(xdrs, xdr_ptr));
+       }
+       return (xdr_rpc_gss_data(xdrs, xdr_func, xdr_ptr,
+                                gd->ctx, gd->sec.qop,
+                                gd->sec.svc, gd->gc.gc_seq));
+}
diff --git a/reactos/dll/win32/libtirpc/src/auth_none.c b/reactos/dll/win32/libtirpc/src/auth_none.c
new file mode 100644 (file)
index 0000000..f931d6d
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2009, Sun Microsystems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of Sun Microsystems, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *sccsid = "@(#)auth_none.c 1.19 87/08/11 Copyr 1984 Sun Micro";
+static char *sccsid = "@(#)auth_none.c 2.1 88/07/29 4.0 RPCSRC";
+#endif
+//#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/lib/libc/rpc/auth_none.c,v 1.12 2002/03/22 23:18:35 obrien Exp $");
+*/
+
+
+/*
+ * auth_none.c
+ * Creates a client authentication handle for passing "null"
+ * credentials and verifiers to remote systems.
+ *
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ */
+
+/* NFSv4.1 client for Windows
+ * Copyright © 2012 The Regents of the University of Michigan
+ *
+ * Olga Kornievskaia <aglo@umich.edu>
+ * Casey Bodley <cbodley@umich.edu>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at
+ * your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * without any warranty; without even the implied warranty of merchantability
+ * or fitness for a particular purpose.  See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ */
+
+#include <wintirpc.h>
+//#include <pthread.h>
+#include <reentrant.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+#include <rpc/auth.h>
+
+#define MAX_MARSHAL_SIZE 20
+
+/*
+ * Authenticator operations routines
+ */
+
+static bool_t authnone_marshal (AUTH *, XDR *, u_int *);
+static void authnone_verf (AUTH *);
+static bool_t authnone_validate (AUTH *, struct opaque_auth *, u_int);
+static bool_t authnone_refresh (AUTH *, void *);
+static void authnone_destroy (AUTH *);
+
+extern bool_t xdr_opaque_auth();
+
+static struct auth_ops *authnone_ops();
+
+static struct authnone_private {
+       AUTH    no_client;
+       char    marshalled_client[MAX_MARSHAL_SIZE];
+       u_int   mcnt;
+} *authnone_private;
+
+AUTH *
+authnone_create()
+{
+       struct authnone_private *ap = authnone_private;
+       XDR xdr_stream;
+       XDR *xdrs;
+       extern mutex_t authnone_lock;
+
+       mutex_lock(&authnone_lock);
+       if (ap == 0) {
+               ap = (struct authnone_private *)calloc(1, sizeof (*ap));
+               if (ap == 0) {
+                       mutex_unlock(&authnone_lock);
+                       return (0);
+               }
+               authnone_private = ap;
+       }
+       if (!ap->mcnt) {
+               ap->no_client.ah_cred = ap->no_client.ah_verf = _null_auth;
+               ap->no_client.ah_ops = authnone_ops();
+               xdrs = &xdr_stream;
+               xdrmem_create(xdrs, ap->marshalled_client,
+                   (u_int)MAX_MARSHAL_SIZE, XDR_ENCODE);
+               (void)xdr_opaque_auth(xdrs, &ap->no_client.ah_cred);
+               (void)xdr_opaque_auth(xdrs, &ap->no_client.ah_verf);
+               ap->mcnt = XDR_GETPOS(xdrs);
+               XDR_DESTROY(xdrs);
+       }
+       mutex_unlock(&authnone_lock);
+       return (&ap->no_client);
+}
+
+/*ARGSUSED*/
+static bool_t
+authnone_marshal(AUTH *client, XDR *xdrs, u_int *seq)
+{
+       struct authnone_private *ap;
+       bool_t dummy;
+       extern mutex_t authnone_lock;
+
+       assert(xdrs != NULL);
+
+       ap = authnone_private;
+       if (ap == NULL) {
+               mutex_unlock(&authnone_lock);
+               return (FALSE);
+       }
+       dummy = (*xdrs->x_ops->x_putbytes)(xdrs,
+           ap->marshalled_client, ap->mcnt);
+       mutex_unlock(&authnone_lock);
+       return (dummy);
+}
+
+/* All these unused parameters are required to keep ANSI-C from grumbling */
+/*ARGSUSED*/
+static void
+authnone_verf(AUTH *client)
+{
+}
+
+/*ARGSUSED*/
+static bool_t
+authnone_validate(AUTH *client, struct opaque_auth *opaque, u_int seq)
+{
+
+       return (TRUE);
+}
+
+/*ARGSUSED*/
+static bool_t
+authnone_refresh(AUTH *client, void *dummy)
+{
+
+       return (FALSE);
+}
+
+/*ARGSUSED*/
+static void
+authnone_destroy(AUTH *client)
+{
+}
+
+static int
+authnone_wrap(AUTH *auth, XDR *xdrs, xdrproc_t func, caddr_t args)
+{
+    return ((*func)(xdrs, args));
+}
+
+static int
+authnone_unwrap(AUTH *auth, XDR *xdrs, xdrproc_t func, caddr_t args, u_int seq)
+{
+    return ((*func)(xdrs, args));
+}
+
+static struct auth_ops *
+authnone_ops()
+{
+       static struct auth_ops ops;
+       extern mutex_t ops_lock;
+/* VARIABLES PROTECTED BY ops_lock: ops */
+       mutex_lock(&ops_lock);
+       if (ops.ah_nextverf == NULL) {
+               ops.ah_nextverf = authnone_verf;
+               ops.ah_marshal = authnone_marshal;
+               ops.ah_validate = authnone_validate;
+               ops.ah_refresh = authnone_refresh;
+               ops.ah_destroy = authnone_destroy;
+        ops.ah_wrap = authnone_wrap;
+        ops.ah_unwrap = authnone_unwrap;
+       }
+       mutex_unlock(&ops_lock);
+       return (&ops);
+}
diff --git a/reactos/dll/win32/libtirpc/src/auth_sspi.c b/reactos/dll/win32/libtirpc/src/auth_sspi.c
new file mode 100644 (file)
index 0000000..7c616d0
--- /dev/null
@@ -0,0 +1,994 @@
+/* NFSv4.1 client for Windows
+ * Copyright © 2012 The Regents of the University of Michigan
+ *
+ * Olga Kornievskaia <aglo@umich.edu>
+ * Casey Bodley <cbodley@umich.edu>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at
+ * your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * without any warranty; without even the implied warranty of merchantability
+ * or fitness for a particular purpose.  See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ */
+
+#include <wintirpc.h>
+#include <stdio.h>
+#include <stdlib.h>
+//#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+#include <rpc/auth.h>
+#include <rpc/auth_sspi.h>
+#include <rpc/clnt.h>
+
+static void authsspi_nextverf(AUTH *auth);
+static bool_t authsspi_marshal(AUTH *auth, XDR *xdrs, u_int *seq);
+static bool_t authsspi_refresh(AUTH *auth, void *);
+static bool_t authsspi_validate(AUTH *auth, struct opaque_auth *verf, u_int seq);
+static void    authsspi_destroy(AUTH *auth);
+static void    authsspi_destroy_context(AUTH *auth);
+static bool_t authsspi_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr);
+static bool_t authsspi_unwrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, u_int seq);
+
+static struct auth_ops authsspi_ops = {
+       authsspi_nextverf,
+       authsspi_marshal,
+       authsspi_validate,
+       authsspi_refresh,
+       authsspi_destroy,
+       authsspi_wrap,
+       authsspi_unwrap
+};
+
+struct rpc_sspi_data {
+       bool_t              established;        /* context established */
+    bool_t              inprogress;
+       sspi_buffer_desc    gc_wire_verf;       /* save GSS_S_COMPLETE NULL RPC verfier
+                                         * to process at end of context negotiation*/
+       CLIENT              *clnt;                  /* client handle */
+       sspi_name_t         name;                   /* service name */
+       struct rpc_sspi_sec *sec;                   /* security tuple */
+    CtxtHandle          ctx;            /* context id */
+       struct rpc_sspi_cred gc;                    /* client credentials */
+       u_int               win;                    /* sequence window */
+    TimeStamp           expiry;
+};
+
+#define        AUTH_PRIVATE(auth)      ((struct rpc_sspi_data *)auth->ah_private)
+
+static struct timeval AUTH_TIMEOUT = { 25, 0 };
+void print_rpc_gss_sec(struct rpc_sspi_sec *ptr);
+void print_negotiated_attrs(PCtxtHandle ctx);
+
+AUTH *
+authsspi_create(CLIENT *clnt, sspi_name_t name, struct rpc_sspi_sec *sec)
+{
+       AUTH *auth, *save_auth;
+       struct rpc_sspi_data *gd;
+
+       log_debug("in authgss_create()");
+
+       memset(&rpc_createerr, 0, sizeof(rpc_createerr));
+
+       if ((auth = calloc(sizeof(*auth), 1)) == NULL) {
+               rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+               rpc_createerr.cf_error.re_errno = ENOMEM;
+               return (NULL);
+       }
+       if ((gd = calloc(sizeof(*gd), 1)) == NULL) {
+               rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+               rpc_createerr.cf_error.re_errno = ENOMEM;
+               free(auth);
+               return (NULL);
+       }
+
+#if 0
+       if (name != SSPI_C_NO_NAME) {
+               if (gss_duplicate_name(&min_stat, name, &gd->name)
+                                               != GSS_S_COMPLETE) {
+                       rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+                       rpc_createerr.cf_error.re_errno = ENOMEM;
+                       free(auth);
+                       return (NULL);
+               }
+       }
+       else
+#else
+    gd->name = strdup(name);
+#endif
+
+       gd->clnt = clnt;
+       SecInvalidateHandle(&gd->ctx);
+       gd->sec = sec;
+
+       gd->gc.gc_v = RPCSEC_SSPI_VERSION;
+       gd->gc.gc_proc = RPCSEC_SSPI_INIT;
+       gd->gc.gc_svc = gd->sec->svc;
+
+       auth->ah_ops = &authsspi_ops;
+       auth->ah_private = (caddr_t)gd;
+
+       save_auth = clnt->cl_auth;
+       clnt->cl_auth = auth;
+
+       if (!authsspi_refresh(auth, NULL))
+               auth = NULL;
+
+       clnt->cl_auth = save_auth;
+
+       return (auth);
+}
+
+AUTH *
+authsspi_create_default(CLIENT *clnt, char *service, int svc)
+{
+       AUTH *auth = NULL;
+       uint32_t maj_stat = 0;
+       sspi_buffer_desc sname;
+    sspi_name_t name = SSPI_C_NO_NAME;
+    unsigned char sec_pkg_name[] = "Kerberos";
+    struct rpc_sspi_sec *sec;
+
+       log_debug("in authgss_create_default() for %s", service);
+
+       sname.value = service;
+       sname.length = (int)strlen(service);
+#if 0
+       maj_stat = gss_import_name(&min_stat, &sname,
+               (gss_OID)GSS_C_NT_HOSTBASED_SERVICE,
+               &name);
+#else
+    maj_stat = sspi_import_name(&sname, &name);
+#endif
+       if (maj_stat != SEC_E_OK) {
+               log_debug("authgss_create_default: sspi_import_name failed with %x", maj_stat);
+               return (NULL);
+       }
+    sec = calloc(1, sizeof(struct rpc_sspi_sec));
+    if (sec == NULL)
+        goto out_err;
+    sec->svc = svc;
+    // Let's acquire creds here for now
+    maj_stat = AcquireCredentialsHandleA(NULL, sec_pkg_name, SECPKG_CRED_BOTH,
+        NULL, NULL, NULL, NULL, &sec->cred, &sec->expiry);
+    if (maj_stat != SEC_E_OK) {
+        log_debug("authgss_create_default: AcquireCredentialsHandleA failed with %x", maj_stat);
+        free(sec);
+        goto out;
+    }
+
+       auth = authsspi_create(clnt, name, sec);
+    if (auth == NULL)
+        goto out_free_sec;
+
+out:
+       if (name != SSPI_C_NO_NAME) {
+#if 0
+               gss_release_name(&min_stat, &name);
+#else
+        free(name);
+#endif
+       }
+
+       return (auth);
+out_free_sec:
+    if (rpc_createerr.cf_error.re_errno == ENOMEM) {
+        FreeCredentialsHandle(&sec->cred);
+        free(sec);
+    }
+out_err:
+    rpc_createerr.cf_stat = RPC_SYSTEMERROR;
+       rpc_createerr.cf_error.re_errno = ENOMEM;
+    goto out;
+}
+
+static void
+authsspi_nextverf(AUTH *auth)
+{
+       log_debug("in authgss_nextverf()");
+       /* no action necessary */
+}
+
+static bool_t
+authsspi_marshal(AUTH *auth, XDR *xdrs, u_int *seq)
+{
+       XDR tmpxdrs;
+       char tmp[MAX_AUTH_BYTES];
+       struct rpc_sspi_data *gd;
+       sspi_buffer_desc rpcbuf, checksum;
+       uint32_t maj_stat;
+       bool_t xdr_stat;
+
+    log_debug("in authgss_marshal()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->established) {
+               gd->gc.gc_seq++;
+        *seq = gd->gc.gc_seq;
+    }
+
+       xdrmem_create(&tmpxdrs, tmp, sizeof(tmp), XDR_ENCODE);
+
+       if (!xdr_rpc_sspi_cred(&tmpxdrs, &gd->gc)) {
+        log_debug("authsspi_marshal: xdr_rpc_sspi_cred failed");
+               XDR_DESTROY(&tmpxdrs);
+               return (FALSE);
+       }
+       auth->ah_cred.oa_flavor = RPCSEC_GSS;
+       auth->ah_cred.oa_base = tmp;
+       auth->ah_cred.oa_length = XDR_GETPOS(&tmpxdrs);
+
+       XDR_DESTROY(&tmpxdrs);
+
+       if (!xdr_opaque_auth(xdrs, &auth->ah_cred)) {
+        log_debug("authsspi_marshal: failed to xdr GSS CRED");
+               return (FALSE);
+    }
+       if (gd->gc.gc_proc == RPCSEC_SSPI_INIT ||
+           gd->gc.gc_proc == RPCSEC_SSPI_CONTINUE_INIT) {
+               return (xdr_opaque_auth(xdrs, &_null_auth));
+       }
+       /* Checksum serialized RPC header, up to and including credential. */
+       rpcbuf.length = XDR_GETPOS(xdrs) - 4;
+       //XDR_SETPOS(xdrs, 0);
+       //rpcbuf.value = XDR_INLINE(xdrs, rpcbuf.length);
+       rpcbuf.value = xdrrec_getoutbase(xdrs) + 1;
+
+#if 0
+       maj_stat = gss_get_mic(&min_stat, gd->ctx, gd->sec.qop,
+                           &rpcbuf, &checksum);
+#else
+    maj_stat = sspi_get_mic(&gd->ctx, 0, gd->gc.gc_seq, &rpcbuf, &checksum);
+#endif
+       if (maj_stat != SEC_E_OK) {
+               log_debug("authsspi_marshal: sspi_get_mic failed with %x", maj_stat);
+               if (maj_stat == SEC_E_NO_AUTHENTICATING_AUTHORITY) {
+                       gd->established = FALSE;
+                       authsspi_destroy_context(auth);
+               }
+               return (FALSE);
+       }
+       auth->ah_verf.oa_flavor = RPCSEC_GSS;
+       auth->ah_verf.oa_base = checksum.value;
+       auth->ah_verf.oa_length = checksum.length;
+       xdr_stat = xdr_opaque_auth(xdrs, &auth->ah_verf);
+#if 0
+       gss_release_buffer(&min_stat, &checksum);
+#else
+    sspi_release_buffer(&checksum);
+#endif
+       return (xdr_stat);
+}
+
+static bool_t
+authsspi_validate(AUTH *auth, struct opaque_auth *verf, u_int seq)
+{
+       struct rpc_sspi_data *gd;
+       u_int num, qop_state, cur_seq;
+       sspi_buffer_desc signbuf, checksum;
+       uint32_t maj_stat;
+
+       log_debug("in authgss_validate(for seq=%d)", seq);
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (gd->established == FALSE) {
+               /* would like to do this only on NULL rpc --
+                * gc->established is good enough.
+                * save the on the wire verifier to validate last
+                * INIT phase packet after decode if the major
+                * status is GSS_S_COMPLETE
+                */
+               if ((gd->gc_wire_verf.value =
+                               mem_alloc(verf->oa_length)) == NULL) {
+                       return (FALSE);
+               }
+               memcpy(gd->gc_wire_verf.value, verf->oa_base, verf->oa_length);
+               gd->gc_wire_verf.length = verf->oa_length;
+               return (TRUE);
+       }
+
+    if (gd->gc.gc_proc == RPCSEC_SSPI_DESTROY) 
+        return TRUE;
+
+       if (gd->gc.gc_proc == RPCSEC_SSPI_INIT ||
+               gd->gc.gc_proc == RPCSEC_SSPI_CONTINUE_INIT) {
+               num = htonl(gd->win);
+       }
+       else {
+        if (seq == -1) {
+            num = htonl(gd->gc.gc_seq);
+            cur_seq = gd->gc.gc_seq;
+        }
+           else {
+            num = htonl(seq);
+            cur_seq = seq;
+        }
+    }
+
+       signbuf.value = &num;
+       signbuf.length = sizeof(num);
+
+       checksum.value = verf->oa_base;
+       checksum.length = verf->oa_length;
+#if 0
+       maj_stat = gss_verify_mic(&min_stat, gd->ctx, &signbuf,
+                                 &checksum, &qop_state);
+#else
+    maj_stat = sspi_verify_mic(&gd->ctx, cur_seq, &signbuf, &checksum, &qop_state);
+#endif
+       if (maj_stat != SEC_E_OK) {
+               log_debug("authsspi_validate: VerifySignature failed with %x", maj_stat);
+               if (maj_stat == SEC_E_NO_AUTHENTICATING_AUTHORITY) {
+                       gd->established = FALSE;
+                       authsspi_destroy_context(auth);
+               }
+               return (FALSE);
+       }
+       return (TRUE);
+}
+
+static bool_t
+authsspi_refresh(AUTH *auth, void *tmp)
+{
+       struct rpc_sspi_data *gd;
+       struct rpc_sspi_init_res gr;
+    sspi_buffer_desc *recv_tokenp, send_token;
+       uint32_t maj_stat, call_stat, ret_flags, i;
+    unsigned long flags = 
+        ISC_REQ_MUTUAL_AUTH|ISC_REQ_INTEGRITY|ISC_REQ_ALLOCATE_MEMORY;
+    SecBufferDesc out_desc, in_desc;
+    SecBuffer wtkn[1], rtkn[1];    
+
+    log_debug("in authgss_refresh()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if ((gd->established && tmp == NULL) || gd->inprogress)
+               return (TRUE);
+    else if (tmp) {
+        log_debug("trying to refresh credentials\n");
+        DeleteSecurityContext(&gd->ctx);
+        sspi_release_buffer(&gd->gc.gc_ctx);
+        SecInvalidateHandle(&gd->ctx);
+        mem_free(gd->gc_wire_verf.value, gd->gc_wire_verf.length);
+        gd->gc_wire_verf.value = NULL;
+        gd->gc_wire_verf.length = 0;
+        gd->established = FALSE;        
+        gd->gc.gc_proc = RPCSEC_SSPI_INIT;
+    }
+
+       /* GSS context establishment loop. */
+       memset(&gr, 0, sizeof(gr));
+       recv_tokenp = SSPI_C_NO_BUFFER;
+    send_token.length = 0;
+    send_token.value = NULL;
+
+       print_rpc_gss_sec(gd->sec);
+
+    if (gd->sec->svc == RPCSEC_SSPI_SVC_PRIVACY)
+        flags |= ISC_REQ_CONFIDENTIALITY;
+
+    for (i=0;;i++) {
+               /* print the token we just received */
+               if (recv_tokenp != SSPI_C_NO_BUFFER) {
+                       log_debug("The token we just received (length %d):",
+                                 recv_tokenp->length);
+                       log_hexdump(0, "", recv_tokenp->value, recv_tokenp->length, 0);
+               }
+#if 0
+               maj_stat = gss_init_sec_context(&min_stat,
+                                               gd->sec.cred,
+                                               &gd->ctx,
+                                               gd->name,
+                                               gd->sec.mech,
+                                               gd->sec.req_flags,
+                                               0,              /* time req */
+                                               NULL,           /* channel */
+                                               recv_tokenp,
+                                               NULL,           /* used mech */
+                                               &send_token,
+                                               &ret_flags,
+                                               NULL);          /* time rec */
+#else
+        gd->inprogress = TRUE;
+        out_desc.cBuffers = 1;
+        out_desc.pBuffers = wtkn;
+        out_desc.ulVersion = SECBUFFER_VERSION;
+        wtkn[0].BufferType = SECBUFFER_TOKEN;
+        wtkn[0].cbBuffer = send_token.length;
+        wtkn[0].pvBuffer = send_token.value;
+        log_debug("calling InitializeSecurityContextA for %s", gd->name);
+
+        maj_stat = InitializeSecurityContextA(
+                        &gd->sec->cred, 
+                        ((i==0)?NULL:&gd->ctx),
+                        gd->name, 
+                        flags, 
+                        0, 
+                        SECURITY_NATIVE_DREP,  
+                        ((i==0)?NULL:&in_desc),
+                        0, 
+                        &gd->ctx, 
+                        &out_desc, 
+                        &ret_flags, 
+                        &gd->expiry);
+#endif
+               if (recv_tokenp != SSPI_C_NO_BUFFER) {
+#if 0
+                       gss_release_buffer(&min_stat, &gr.gr_token);
+#else
+            sspi_release_buffer(&gr.gr_token);
+#endif
+                       recv_tokenp = SSPI_C_NO_BUFFER;
+               }
+               if (maj_stat != SEC_E_OK && maj_stat != SEC_I_CONTINUE_NEEDED) {
+                       log_debug("InitializeSecurityContext failed with %x", maj_stat);
+                       break;
+               }
+        send_token.length = wtkn[0].cbBuffer;
+        send_token.value = wtkn[0].pvBuffer;
+               if (send_token.length != 0) {
+                       memset(&gr, 0, sizeof(gr));
+
+                       /* print the token we are about to send */
+                       log_debug("The token being sent (length %d):",
+                                 send_token.length);
+                       log_hexdump(0, "", send_token.value, send_token.length, 0);
+
+                       call_stat = clnt_call(gd->clnt, NULLPROC,
+                                             (xdrproc_t)xdr_rpc_sspi_init_args,
+                                             &send_token,
+                                             (xdrproc_t)xdr_rpc_sspi_init_res,
+                                             (caddr_t)&gr, AUTH_TIMEOUT);
+#if 0
+                       gss_release_buffer(&min_stat, &send_token);
+#else
+            // 11/29/2010 [aglo] can't call sspi_relase_buffer, causes heap 
+            // corruption (later) to try and free the buffer directly.
+            FreeContextBuffer(send_token.value);
+#endif
+                       if (call_stat != RPC_SUCCESS ||
+                           (gr.gr_major != SEC_E_OK &&
+                            gr.gr_major != SEC_I_CONTINUE_NEEDED))
+                               break;
+
+                       if (gr.gr_ctx.length != 0) {
+#if 0
+                               if (gd->gc.gc_ctx.value)
+                                       gss_release_buffer(&min_stat,
+                                                          &gd->gc.gc_ctx);
+#else 
+                sspi_release_buffer(&gd->gc.gc_ctx);
+#endif
+                               gd->gc.gc_ctx = gr.gr_ctx;
+                       }
+                       if (gr.gr_token.length != 0) {
+                               if (maj_stat != SEC_I_CONTINUE_NEEDED)
+                                       break;
+                               recv_tokenp = &gr.gr_token;
+                in_desc.cBuffers = 1;
+                in_desc.pBuffers = rtkn;
+                in_desc.ulVersion = SECBUFFER_VERSION;
+                rtkn[0].BufferType = SECBUFFER_TOKEN;
+                rtkn[0].cbBuffer = gr.gr_token.length;
+                rtkn[0].pvBuffer = gr.gr_token.value;
+                       }
+                       gd->gc.gc_proc = RPCSEC_SSPI_CONTINUE_INIT;
+               }
+
+               /* GSS_S_COMPLETE => check gss header verifier,
+                * usually checked in gss_validate
+                */
+               if (maj_stat == SEC_E_OK) {
+                       sspi_buffer_desc bufin;
+                       u_int seq, qop_state = 0;
+            
+            print_negotiated_attrs(&gd->ctx);
+
+                       seq = htonl(gr.gr_win);
+                       bufin.value = (unsigned char *)&seq;
+                       bufin.length = sizeof(seq);
+#if 0
+                       maj_stat = gss_verify_mic(&min_stat, gd->ctx,
+                               &bufin, &bufout, &qop_state);
+#else
+            maj_stat = sspi_verify_mic(&gd->ctx, 0, &bufin, &gd->gc_wire_verf, &qop_state);
+#endif
+                       if (maj_stat != SEC_E_OK) {
+                               log_debug("authgss_refresh: sspi_verify_mic failed with %x", maj_stat);
+                               if (maj_stat == SEC_E_NO_AUTHENTICATING_AUTHORITY) {
+                                       gd->established = FALSE;
+                                       authsspi_destroy_context(auth);
+                               }
+                               break;
+                       }
+                       gd->established = TRUE;
+            gd->inprogress = FALSE;
+                       gd->gc.gc_proc = RPCSEC_SSPI_DATA;
+                       gd->gc.gc_seq = 0;
+                       gd->win = gr.gr_win;
+            log_debug("authgss_refresh: established GSS context");
+                       break;
+               }
+       }
+       /* End context negotiation loop. */
+       if (gd->gc.gc_proc != RPCSEC_SSPI_DATA) {
+               if (gr.gr_token.length != 0)
+#if 0
+                       gss_release_buffer(&min_stat, &gr.gr_token);
+#else
+            sspi_release_buffer(&gr.gr_token);
+#endif
+               authsspi_destroy(auth);
+               auth = NULL;
+               rpc_createerr.cf_stat = RPC_AUTHERROR;
+
+               return (FALSE);
+       }
+       return (TRUE);
+}
+
+bool_t
+authsspi_service(AUTH *auth, int svc)
+{
+       struct rpc_sspi_data    *gd;
+
+       log_debug("in authgss_service()");
+
+       if (!auth) 
+        return(FALSE);
+       gd = AUTH_PRIVATE(auth);
+       if (!gd || !gd->established)
+               return (FALSE);
+       gd->sec->svc = svc;
+       gd->gc.gc_svc = svc;
+       return (TRUE);
+}
+
+static void
+authsspi_destroy_context(AUTH *auth)
+{
+       struct rpc_sspi_data *gd;
+
+       log_debug("in authgss_destroy_context()");
+
+       gd = AUTH_PRIVATE(auth);
+    if (gd == NULL) return;
+
+       if (SecIsValidHandle(&gd->ctx)) {
+               if (gd->established) {
+                       gd->gc.gc_proc = RPCSEC_SSPI_DESTROY;
+                       clnt_call(gd->clnt, NULLPROC, (xdrproc_t)xdr_void, NULL,
+                                 (xdrproc_t)xdr_void, NULL, AUTH_TIMEOUT);
+            DeleteSecurityContext(&gd->ctx);
+               }
+        sspi_release_buffer(&gd->gc.gc_ctx);
+        SecInvalidateHandle(&gd->ctx);
+#if 0
+               gss_release_buffer(&min_stat, &gd->gc.gc_ctx);
+               /* XXX ANDROS check size of context  - should be 8 */
+               memset(&gd->gc.gc_ctx, 0, sizeof(gd->gc.gc_ctx));
+               gss_delete_sec_context(&min_stat, &gd->ctx, NULL);
+#endif
+       }
+
+       /* free saved wire verifier (if any) */
+       mem_free(gd->gc_wire_verf.value, gd->gc_wire_verf.length);
+       gd->gc_wire_verf.value = NULL;
+       gd->gc_wire_verf.length = 0;
+
+       gd->established = FALSE;
+}
+
+static void
+authsspi_destroy(AUTH *auth)
+{
+       struct rpc_sspi_data *gd;
+
+       log_debug("in authgss_destroy()");
+
+       gd = AUTH_PRIVATE(auth);
+    if (gd == NULL) return;
+
+       authsspi_destroy_context(auth);
+
+#if 0
+    if (gd->name != SSPI_C_NO_NAME)
+               gss_release_name(&min_stat, &gd->name);
+#else
+    free(gd->name);
+#endif
+    FreeCredentialsHandle(&gd->sec->cred);
+    free(gd->sec);
+       free(gd);
+       free(auth);
+}
+
+bool_t
+authsspi_wrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr)
+{
+       struct rpc_sspi_data    *gd;
+
+       log_debug("in authgss_wrap()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (!gd->established || gd->sec->svc == RPCSEC_SSPI_SVC_NONE) {
+               return ((*xdr_func)(xdrs, xdr_ptr));
+       }
+       return (xdr_rpc_sspi_data(xdrs, xdr_func, xdr_ptr,
+                                &gd->ctx, gd->sec->qop,
+                                gd->sec->svc, gd->gc.gc_seq));
+}
+
+bool_t
+authsspi_unwrap(AUTH *auth, XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr, u_int seq)
+{
+       struct rpc_sspi_data    *gd;
+
+       log_debug("in authgss_unwrap()");
+
+       gd = AUTH_PRIVATE(auth);
+
+       if (!gd->established || gd->sec->svc == RPCSEC_SSPI_SVC_NONE) {
+               return ((*xdr_func)(xdrs, xdr_ptr));
+       }
+       return (xdr_rpc_sspi_data(xdrs, xdr_func, xdr_ptr,
+                                &gd->ctx, gd->sec->qop,
+                                gd->sec->svc, seq));
+}
+
+#ifdef __REACTOS__
+uint32_t sspi_get_mic(void *dummy, u_int qop, u_int seq, 
+                        sspi_buffer_desc *bufin, sspi_buffer_desc *bufout)
+{
+    PCtxtHandle ctx = dummy;
+#else
+uint32_t sspi_get_mic(PCtxtHandle ctx, u_int qop, u_int seq, 
+                        sspi_buffer_desc *bufin, sspi_buffer_desc *bufout)
+{
+#endif
+    uint32_t maj_stat;
+    SecPkgContext_Sizes ContextSizes;
+    SecBufferDesc desc;
+    SecBuffer sec_tkn[2];    
+
+    log_hexdump(0, "sspi_get_mic: calculating checksum of", bufin->value, bufin->length, 0);
+
+    memset(&ContextSizes, 0, sizeof(ContextSizes));
+    maj_stat = QueryContextAttributesA(ctx, SECPKG_ATTR_SIZES, &ContextSizes);
+    if (maj_stat != SEC_E_OK) return maj_stat;
+
+    if (ContextSizes.cbMaxSignature == 0) return SEC_E_INTERNAL_ERROR;
+
+    desc.cBuffers = 2;
+    desc.pBuffers = sec_tkn;
+    desc.ulVersion = SECBUFFER_VERSION;
+    sec_tkn[0].BufferType = SECBUFFER_DATA;
+    sec_tkn[0].cbBuffer = bufin->length;
+    sec_tkn[0].pvBuffer = bufin->value;
+    sec_tkn[1].BufferType = SECBUFFER_TOKEN;
+    sec_tkn[1].cbBuffer = ContextSizes.cbMaxSignature;
+    sec_tkn[1].pvBuffer = calloc(ContextSizes.cbMaxSignature, sizeof(char));
+    if (sec_tkn[1].pvBuffer == NULL) return SEC_E_INSUFFICIENT_MEMORY;
+
+    maj_stat = MakeSignature(ctx, 0, &desc, seq);
+    if (maj_stat == SEC_E_OK) {
+        bufout->length = sec_tkn[1].cbBuffer;
+        bufout->value = sec_tkn[1].pvBuffer;
+        log_hexdump(0, "sspi_get_mic: verifier is", bufout->value, bufout->length, 0);
+    } else
+        free(sec_tkn[1].pvBuffer);
+
+    return maj_stat;
+}
+
+#ifndef __REACTOS__
+uint32_t sspi_verify_mic(PCtxtHandle ctx, u_int seq, sspi_buffer_desc *bufin, 
+                            sspi_buffer_desc *bufout, u_int *qop_state)
+{
+#else
+uint32_t sspi_verify_mic(void *dummy, u_int seq, sspi_buffer_desc *bufin, 
+                            sspi_buffer_desc *bufout, u_int *qop_state)
+{
+    PCtxtHandle ctx = dummy;
+#endif
+    SecBufferDesc desc;
+    SecBuffer sec_tkn[2];    
+
+    desc.cBuffers = 2;
+    desc.pBuffers = sec_tkn;
+    desc.ulVersion = SECBUFFER_VERSION;
+    sec_tkn[0].BufferType = SECBUFFER_DATA;
+    sec_tkn[0].cbBuffer = bufin->length;
+    sec_tkn[0].pvBuffer = bufin->value;
+    sec_tkn[1].BufferType = SECBUFFER_TOKEN;
+    sec_tkn[1].cbBuffer = bufout->length;
+    sec_tkn[1].pvBuffer = bufout->value;
+
+    log_hexdump(0, "sspi_verify_mic: calculating checksum over", bufin->value, bufin->length, 0);
+    log_hexdump(0, "sspi_verify_mic: received checksum ", bufout->value, bufout->length, 0);
+
+    return VerifySignature(ctx, &desc, seq, qop_state);
+}
+
+void sspi_release_buffer(sspi_buffer_desc *buf)
+{
+    if (buf->value)
+        free(buf->value);
+    buf->value = NULL;
+    buf->length = 0;
+}
+
+uint32_t sspi_import_name(sspi_buffer_desc *name_in, sspi_name_t *name_out)
+{
+    *name_out = calloc(name_in->length + 5, sizeof(char));
+    if (*name_out == NULL)
+        return SEC_E_INSUFFICIENT_MEMORY;
+
+    strcpy(*name_out, "nfs/");
+    strncat(*name_out, name_in->value, name_in->length);
+
+    log_debug("imported service name is: %s\n", *name_out);
+
+    return SEC_E_OK;
+}
+
+#ifndef __REACTOS__
+uint32_t sspi_wrap(PCtxtHandle ctx, u_int seq, sspi_buffer_desc *bufin, 
+                   sspi_buffer_desc *bufout, u_int *conf_state)
+{
+#else
+uint32_t sspi_wrap(void *dummy, u_int seq, sspi_buffer_desc *bufin, 
+                   sspi_buffer_desc *bufout, u_int *conf_state)
+{
+    PCtxtHandle ctx = dummy;
+#endif
+    uint32_t maj_stat;
+    SecBufferDesc BuffDesc;
+    SecBuffer SecBuff[3];
+    ULONG ulQop = 0;
+    SecPkgContext_Sizes ContextSizes;
+    PBYTE p;
+
+    maj_stat = QueryContextAttributes(ctx, SECPKG_ATTR_SIZES,
+       &ContextSizes);
+    if (maj_stat != SEC_E_OK) 
+        goto out;
+
+    BuffDesc.ulVersion = 0;
+    BuffDesc.cBuffers = 3;
+    BuffDesc.pBuffers = SecBuff;
+
+    SecBuff[0].cbBuffer = ContextSizes.cbSecurityTrailer;
+    SecBuff[0].BufferType = SECBUFFER_TOKEN;
+    SecBuff[0].pvBuffer = malloc(ContextSizes.cbSecurityTrailer);
+
+    SecBuff[1].cbBuffer = bufin->length;
+    SecBuff[1].BufferType = SECBUFFER_DATA;
+    SecBuff[1].pvBuffer = bufin->value;
+    log_hexdump(0, "plaintext:", bufin->value, bufin->length, 0);
+
+    SecBuff[2].cbBuffer = ContextSizes.cbBlockSize;
+    SecBuff[2].BufferType = SECBUFFER_PADDING;
+    SecBuff[2].pvBuffer = malloc(ContextSizes.cbBlockSize);
+
+    maj_stat = EncryptMessage(ctx, ulQop, &BuffDesc, seq);
+    if (maj_stat != SEC_E_OK)
+        goto out_free;
+
+    bufout->length = SecBuff[0].cbBuffer + SecBuff[1].cbBuffer + SecBuff[2].cbBuffer;
+    p = bufout->value = malloc(bufout->length);
+    memcpy(p, SecBuff[0].pvBuffer, SecBuff[0].cbBuffer);
+    p += SecBuff[0].cbBuffer;
+    memcpy(p, SecBuff[1].pvBuffer, SecBuff[1].cbBuffer);
+    p += SecBuff[1].cbBuffer;
+    memcpy(p, SecBuff[2].pvBuffer, SecBuff[2].cbBuffer);
+out_free:
+    free(SecBuff[0].pvBuffer);
+    free(SecBuff[2].pvBuffer);
+
+    if (!maj_stat)
+        log_hexdump(0, "cipher:", bufout->value, bufout->length, 0);
+out:
+    return maj_stat;
+}
+
+#ifndef __REACTOS__
+uint32_t sspi_unwrap(PCtxtHandle ctx, u_int seq, sspi_buffer_desc *bufin, 
+                     sspi_buffer_desc *bufout, u_int *conf_state, 
+                     u_int *qop_state)
+{
+#else
+uint32_t sspi_unwrap(void *dummy, u_int seq, sspi_buffer_desc *bufin, 
+                     sspi_buffer_desc *bufout, u_int *conf_state, 
+                     u_int *qop_state)
+{
+    PCtxtHandle ctx = dummy;
+#endif
+    uint32_t maj_stat;
+    SecBufferDesc BuffDesc;
+    SecBuffer SecBuff[2];
+    ULONG ulQop = 0;
+
+    BuffDesc.ulVersion    = 0;
+    BuffDesc.cBuffers     = 2;
+    BuffDesc.pBuffers     = SecBuff;
+
+    SecBuff[0].cbBuffer   = bufin->length;
+    SecBuff[0].BufferType = SECBUFFER_STREAM;
+    SecBuff[0].pvBuffer   = bufin->value;
+
+    SecBuff[1].cbBuffer   = 0;
+    SecBuff[1].BufferType = SECBUFFER_DATA;
+    SecBuff[1].pvBuffer   = NULL;
+
+    log_hexdump(0, "cipher:", bufin->value, bufin->length, 0);
+
+    maj_stat = DecryptMessage(ctx, &BuffDesc, seq, &ulQop);
+    if (maj_stat != SEC_E_OK) return maj_stat;
+
+    bufout->length = SecBuff[1].cbBuffer;
+    bufout->value = malloc(bufout->length);
+    memcpy(bufout->value, SecBuff[1].pvBuffer, bufout->length);
+
+    log_hexdump(0, "data:", bufout->value, bufout->length, 0);
+
+    *conf_state = 1;
+    *qop_state = 0;
+
+    return SEC_E_OK;
+}
+
+/* useful as i add more mechanisms */
+#define DEBUG
+#ifdef DEBUG
+#define fd_out stdout
+void print_rpc_gss_sec(struct rpc_sspi_sec *ptr)
+{
+    int i;
+    char *p;
+
+       fprintf(fd_out, "rpc_gss_sec:");
+       if(ptr->mech == NULL)
+               fprintf(fd_out, "NULL gss_OID mech");
+       else {
+               fprintf(fd_out, "     mechanism_OID: {");
+               p = (char *)ptr->mech->elements;
+               for (i=0; i < ptr->mech->length; i++)
+                       /* First byte of OIDs encoded to save a byte */
+                       if (i == 0) {
+                               int first, second;
+                               if (*p < 40) {
+                                       first = 0;
+                                       second = *p;
+                               }
+                               else if (40 <= *p && *p < 80) {
+                                       first = 1;
+                                       second = *p - 40;
+                               }
+                               else if (80 <= *p && *p < 127) {
+                                       first = 2;
+                                       second = *p - 80;
+                               }
+                               else {
+                                       /* Invalid value! */
+                                       first = -1;
+                                       second = -1;
+                               }
+                               fprintf(fd_out, " %u %u", first, second);
+                               p++;
+                       }
+                       else {
+                               fprintf(fd_out, " %u", (unsigned char)*p++);
+                       }
+               fprintf(fd_out, " }\n");
+       }
+       fprintf(fd_out, "     qop: %d\n", ptr->qop);
+       fprintf(fd_out, "     service: %d\n", ptr->svc);
+       fprintf(fd_out, "     cred: %p\n", ptr->cred);
+}
+
+void print_negotiated_attrs(PCtxtHandle ctx)
+{
+    SecPkgContext_Sizes ContextSizes;
+    unsigned long  flags;
+    uint32_t maj_stat;
+
+    maj_stat = QueryContextAttributesA(ctx, SECPKG_ATTR_FLAGS, &flags);
+    if (maj_stat != SEC_E_OK) return;
+
+    log_debug("negotiated flags %x\n", flags);
+    if (flags & ISC_REQ_DELEGATE) log_debug("ISC_REQ_DELEGATE");
+    if (flags & ISC_REQ_MUTUAL_AUTH) log_debug("ISC_REQ_MUTUAL_AUTH");
+    if (flags & ISC_REQ_REPLAY_DETECT) log_debug("ISC_REQ_REPLAY_DETECT");
+    if (flags & ISC_REQ_SEQUENCE_DETECT) log_debug("ISC_REQ_SEQUENCE_DETECT");
+    if (flags & ISC_REQ_CONFIDENTIALITY) log_debug("ISC_REQ_CONFIDENTIALITY");
+    if (flags & ISC_REQ_USE_SESSION_KEY) log_debug("ISC_REQ_USE_SESSION_KEY");
+    if (flags & ISC_REQ_PROMPT_FOR_CREDS) log_debug("ISC_REQ_PROMPT_FOR_CREDS");
+    if (flags & ISC_REQ_USE_SUPPLIED_CREDS) log_debug("ISC_REQ_USE_SUPPLIED_CREDS");
+    if (flags & ISC_REQ_ALLOCATE_MEMORY) log_debug("ISC_REQ_ALLOCATE_MEMORY");
+    if (flags & ISC_REQ_USE_DCE_STYLE) log_debug("ISC_REQ_USE_DCE_STYLE");
+    if (flags & ISC_REQ_DATAGRAM) log_debug("ISC_REQ_DATAGRAM");
+    if (flags & ISC_REQ_CONNECTION) log_debug("ISC_REQ_CONNECTION");
+    if (flags & ISC_REQ_CALL_LEVEL) log_debug("ISC_REQ_CALL_LEVEL");
+    if (flags & ISC_REQ_FRAGMENT_SUPPLIED) log_debug("ISC_REQ_FRAGMENT_SUPPLIED");
+    if (flags & ISC_REQ_EXTENDED_ERROR) log_debug("ISC_REQ_EXTENDED_ERROR");
+    if (flags & ISC_REQ_STREAM) log_debug("ISC_REQ_STREAM");
+    if (flags & ISC_REQ_INTEGRITY) log_debug("ISC_REQ_INTEGRITY");
+    if (flags & ISC_REQ_IDENTIFY) log_debug("ISC_REQ_IDENTIFY");
+    if (flags & ISC_REQ_NULL_SESSION) log_debug("ISC_REQ_NULL_SESSION");
+    if (flags & ISC_REQ_MANUAL_CRED_VALIDATION) log_debug("ISC_REQ_MANUAL_CRED_VALIDATION");
+
+    maj_stat = QueryContextAttributesA(ctx, SECPKG_ATTR_SIZES, &ContextSizes);
+    if (maj_stat != SEC_E_OK) return;
+
+    log_debug("signature size is %d\n", ContextSizes.cbMaxSignature);
+
+}
+
+void log_hexdump(bool_t on, const u_char *title, const u_char *buf, 
+                    int len, int offset)
+{
+       int i, j, jm, c;
+
+    if (!on) return;
+
+       fprintf(fd_out, "%04x: %s (len=%d)\n", GetCurrentThreadId(), title, len);
+       for (i = 0; i < len; i += 0x10) {
+               fprintf(fd_out, "  %04x: ", (u_int)(i + offset));
+               jm = len - i;
+               jm = jm > 16 ? 16 : jm;
+
+               for (j = 0; j < jm; j++) {
+                       if ((j % 2) == 1)
+                               fprintf(fd_out, "%02x ", (u_int) buf[i+j]);
+                       else
+                               fprintf(fd_out, "%02x", (u_int) buf[i+j]);
+               }
+               for (; j < 16; j++) {
+                       if ((j % 2) == 1) fprintf(fd_out, "   ");
+                       else fprintf(fd_out, "  ");
+               }
+               fprintf(fd_out, " ");
+
+               for (j = 0; j < jm; j++) {
+                       c = buf[i+j];
+                       c = isprint(c) ? c : '.';
+                       fprintf(fd_out, "%c", c);
+               }
+               fprintf(fd_out, "\n");
+       }
+    fflush(fd_out);
+}
+
+void log_debug(const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+       fprintf(fd_out, "%04x: rpcsec_gss: ", GetCurrentThreadId());
+       vfprintf(fd_out, fmt, ap);
+       fprintf(fd_out, "\n");
+    fflush(fd_out);
+       va_end(ap);
+}
+#else
+void print_rpc_gss_sec(struct rpc_sspi_sec *ptr) { return; }
+void print_negotiated_flags(unsigned long  flags) {return; }
+void log_hexdump(bool_t on, const u_char *title, const u_char *buf, 
+                    int len, int offset) { return; }
+void log_debug(const char *fmt, ...) { return; }
+#endif
diff --git a/reactos/dll/win32/libtirpc/src/auth_time.c b/reactos/dll/win32/libtirpc/src/auth_time.c
new file mode 100644 (file)
index 0000000..ad8e521
--- /dev/null
@@ -0,0 +1,504 @@
+/*
+ *     auth_time.c
+ *
+ * This module contains the private function __rpc_get_time_offset()
+ * which will return the difference in seconds between the local system's
+ * notion of time and a remote server's notion of time. This must be
+ * possible without calling any functions that may invoke the name
+ * service. (netdir_getbyxxx, getXbyY, etc). The function is used in the
+ * synchronize call of the authdes code to synchronize clocks between
+ * NIS+ clients and their servers.
+ *
+ * Note to minimize the amount of duplicate code, portions of the
+ * synchronize() function were folded into this code, and the synchronize
+ * call becomes simply a wrapper around this function. Further, if this
+ * function is called with a timehost it *DOES* recurse to the name
+ * server so don't use it in that mode if you are doing name service code.
+ *
+ *     Copyright (c) 1992 Sun Microsystems Inc.
+ *     All rights reserved.
+ *
+ * Side effects :
+ *     When called a client handle to a RPCBIND process is created
+ *     and destroyed. Two strings "netid" and "uaddr" are malloc'd
+ *     and returned. The SIGALRM processing is modified only if
+ *     needed to deal with TCP connections.
+ */
+
+//#include <sys/cdefs.h>
+#include <wintirpc.h>
+//#include <syslog.h>
+#include <string.h>
+#include <stdlib.h>
+//#include <unistd.h>
+//#include <netdb.h>
+//#include <sys/signal.h>
+#include <errno.h>
+//#include <sys/socket.h>
+//#include <netinet/in.h>
+//#include <arpa/inet.h>
+
+#include <rpc/rpc.h>
+#include <rpc/rpc_com.h>
+#include <rpc/rpcb_prot.h>
+//#include <clnt_soc.h>
+//#include <sys/select.h>
+#undef NIS
+#include <rpcsvc/nis.h>
+
+
+#ifdef TESTING
+#define        msg(x)  printf("ERROR: %s\n", x)
+/* #define msg(x) syslog(LOG_ERR, "%s", x) */
+#else
+#define        msg(x)
+#endif
+
+static int saw_alarm = 0;
+
+static void
+alarm_hndler(s)
+       int     s;
+{
+       saw_alarm = 1;
+       return;
+}
+
+/*
+ * The internet time server defines the epoch to be Jan 1, 1900
+ * whereas UNIX defines it to be Jan 1, 1970. To adjust the result
+ * from internet time-service time, into UNIX time we subtract the
+ * following offset :
+ */
+#define        NYEARS  (1970 - 1900)
+#define        TOFFSET ((u_long)60*60*24*(365*NYEARS + (NYEARS/4)))
+
+
+/*
+ * Stolen from rpc.nisd:
+ * Turn a 'universal address' into a struct sockaddr_in.
+ * Bletch.
+ */
+static int uaddr_to_sockaddr(uaddr, sin)
+#ifdef foo
+       endpoint                *endpt;
+#endif
+       char                    *uaddr;
+       struct sockaddr_in      *sin;
+{
+       unsigned char           p_bytes[2];
+       int                     i;
+       unsigned long           a[6];
+
+       i = sscanf(uaddr, "%lu.%lu.%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2],
+                                               &a[3], &a[4], &a[5]);
+
+       if (i < 6)
+               return(1);
+
+       for (i = 0; i < 4; i++)
+               sin->sin_addr.s_addr |= (a[i] & 0x000000FF) << (8 * i);
+
+       p_bytes[0] = (unsigned char)a[4] & 0x000000FF;
+       p_bytes[1] = (unsigned char)a[5] & 0x000000FF;
+
+       sin->sin_family = AF_INET; /* always */
+       bcopy((char *)&p_bytes, (char *)&sin->sin_port, 2);
+
+       return (0);
+}
+
+/*
+ * free_eps()
+ *
+ * Free the strings that were strduped into the eps structure.
+ */
+static void
+free_eps(eps, num)
+       endpoint        eps[];
+       int             num;
+{
+       int             i;
+
+       for (i = 0; i < num; i++) {
+               free(eps[i].uaddr);
+               free(eps[i].proto);
+               free(eps[i].family);
+       }
+       return;
+}
+
+/*
+ * get_server()
+ *
+ * This function constructs a nis_server structure description for the
+ * indicated hostname.
+ *
+ * NOTE: There is a chance we may end up recursing here due to the
+ * fact that gethostbyname() could do an NIS search. Ideally, the
+ * NIS+ server will call __rpc_get_time_offset() with the nis_server
+ * structure already populated.
+ */
+static nis_server *
+get_server(sin, host, srv, eps, maxep)
+       struct sockaddr_in *sin;
+       char            *host;  /* name of the time host        */
+       nis_server      *srv;   /* nis_server struct to use.    */
+       endpoint        eps[];  /* array of endpoints           */
+       int             maxep;  /* max array size               */
+{
+       char                    hname[256];
+       int                     num_ep = 0, i;
+       struct hostent          *he;
+       struct hostent          dummy;
+       char                    *ptr[2];
+
+       if (host == NULL && sin == NULL)
+               return (NULL);
+
+       if (sin == NULL) {
+               he = gethostbyname(host);
+               if (he == NULL)
+                       return(NULL);
+       } else {
+               he = &dummy;
+               ptr[0] = (char *)&sin->sin_addr.s_addr;
+               ptr[1] = NULL;
+               dummy.h_addr_list = ptr;
+       }
+
+       /*
+        * This is lame. We go around once for TCP, then again
+        * for UDP.
+        */
+       for (i = 0; (he->h_addr_list[i] != NULL) && (num_ep < maxep);
+                                               i++, num_ep++) {
+               struct in_addr *a;
+
+               a = (struct in_addr *)he->h_addr_list[i];
+               snprintf(hname, sizeof(hname), "%s.0.111", inet_ntoa(*a));
+               eps[num_ep].uaddr = strdup(hname);
+               eps[num_ep].family = strdup("inet");
+               eps[num_ep].proto =  strdup("tcp");
+       }
+
+       for (i = 0; (he->h_addr_list[i] != NULL) && (num_ep < maxep);
+                                               i++, num_ep++) {
+               struct in_addr *a;
+
+               a = (struct in_addr *)he->h_addr_list[i];
+               snprintf(hname, sizeof(hname), "%s.0.111", inet_ntoa(*a));
+               eps[num_ep].uaddr = strdup(hname);
+               eps[num_ep].family = strdup("inet");
+               eps[num_ep].proto =  strdup("udp");
+       }
+
+       srv->name = (nis_name) host;
+       srv->ep.ep_len = num_ep;
+       srv->ep.ep_val = eps;
+       srv->key_type = NIS_PK_NONE;
+       srv->pkey.n_bytes = NULL;
+       srv->pkey.n_len = 0;
+       return (srv);
+}
+
+/*
+ * __rpc_get_time_offset()
+ *
+ * This function uses a nis_server structure to contact the a remote
+ * machine (as named in that structure) and returns the offset in time
+ * between that machine and this one. This offset is returned in seconds
+ * and may be positive or negative.
+ *
+ * The first time through, a lot of fiddling is done with the netconfig
+ * stuff to find a suitable transport. The function is very aggressive
+ * about choosing UDP or at worst TCP if it can. This is because
+ * those transports support both the RCPBIND call and the internet
+ * time service.
+ *
+ * Once through, *uaddr is set to the universal address of
+ * the machine and *netid is set to the local netid for the transport
+ * that uaddr goes with. On the second call, the netconfig stuff
+ * is skipped and the uaddr/netid pair are used to fetch the netconfig
+ * structure and to then contact the machine for the time.
+ *
+ * td = "server" - "client"
+ */
+int
+__rpc_get_time_offset(td, srv, thost, uaddr, netid)
+       struct timeval  *td;     /* Time difference                     */
+       nis_server      *srv;    /* NIS Server description              */
+       char            *thost;  /* if no server, this is the timehost  */
+       char            **uaddr; /* known universal address             */
+       struct sockaddr_in *netid; /* known network identifier          */
+{
+       CLIENT                  *clnt;          /* Client handle        */
+       endpoint                *ep,            /* useful endpoints     */
+                               *useep = NULL;  /* endpoint of xp       */
+       char                    *useua = NULL;  /* uaddr of selected xp */
+       int                     epl, i;         /* counters             */
+       enum clnt_stat          status;         /* result of clnt_call  */
+       long                    thetime;
+       long                    delta;
+       int                     needfree = 0;
+       struct timeval          tv;
+       int                     time_valid;
+       int                     udp_ep = -1, tcp_ep = -1;
+       int                     a1, a2, a3, a4;
+       char                    ut[64], ipuaddr[64];
+       endpoint                teps[32];
+       nis_server              tsrv;
+       void                    (*oldsig)() = NULL; /* old alarm handler */
+       struct sockaddr_in      sin;
+       SOCKET                  s = RPC_ANYSOCK;
+       socklen_t len;
+       int                     type = 0;
+
+       td->tv_sec = 0;
+       td->tv_usec = 0;
+
+       /*
+        * First check to see if we need to find and address for this
+        * server.
+        */
+       if (*uaddr == NULL) {
+               if ((srv != NULL) && (thost != NULL)) {
+                       msg("both timehost and srv pointer used!");
+                       return (0);
+               }
+               if (! srv) {
+                       srv = get_server(netid, thost, &tsrv, teps, 32);
+                       if (srv == NULL) {
+                               msg("unable to contruct server data.");
+                               return (0);
+                       }
+                       needfree = 1;   /* need to free data in endpoints */
+               }
+
+               ep = srv->ep.ep_val;
+               epl = srv->ep.ep_len;
+
+               /* Identify the TCP and UDP endpoints */
+               for (i = 0;
+                       (i < epl) && ((udp_ep == -1) || (tcp_ep == -1)); i++) {
+                       if (strcasecmp(ep[i].proto, "udp") == 0)
+                               udp_ep = i;
+                       if (strcasecmp(ep[i].proto, "tcp") == 0)
+                               tcp_ep = i;
+               }
+
+               /* Check to see if it is UDP or TCP */
+               if (tcp_ep > -1) {
+                       useep = &ep[tcp_ep];
+                       useua = ep[tcp_ep].uaddr;
+                       type = SOCK_STREAM;
+               } else if (udp_ep > -1) {
+                       useep = &ep[udp_ep];
+                       useua = ep[udp_ep].uaddr;
+                       type = SOCK_DGRAM;
+               }
+
+               if (useep == NULL) {
+                       msg("no acceptable transport endpoints.");
+                       if (needfree)
+                               free_eps(teps, tsrv.ep.ep_len);
+                       return (0);
+               }
+       }
+
+       /*
+        * Create a sockaddr from the uaddr.
+        */
+       if (*uaddr != NULL)
+               useua = *uaddr;
+
+       /* Fixup test for NIS+ */
+       sscanf(useua, "%d.%d.%d.%d.", &a1, &a2, &a3, &a4);
+       sprintf(ipuaddr, "%d.%d.%d.%d.0.111", a1, a2, a3, a4);
+       useua = &ipuaddr[0];
+
+       bzero((char *)&sin, sizeof(sin));
+       if (uaddr_to_sockaddr(useua, &sin)) {
+               msg("unable to translate uaddr to sockaddr.");
+               if (needfree)
+                       free_eps(teps, tsrv.ep.ep_len);
+               return (0);
+       }
+
+       /*
+        * Create the client handle to rpcbind. Note we always try
+        * version 3 since that is the earliest version that supports
+        * the RPCB_GETTIME call. Also it is the version that comes
+        * standard with SVR4. Since most everyone supports TCP/IP
+        * we could consider trying the rtime call first.
+        */
+       clnt = clnttcp_create(&sin, RPCBPROG, RPCBVERS, &s, 0, 0);
+       if (clnt == NULL) {
+               msg("unable to create client handle to rpcbind.");
+               if (needfree)
+                       free_eps(teps, tsrv.ep.ep_len);
+               return (0);
+       }
+
+       tv.tv_sec = 5;
+       tv.tv_usec = 0;
+       time_valid = 0;
+       status = clnt_call(clnt, RPCBPROC_GETTIME, (xdrproc_t)xdr_void, NULL,
+                                       (xdrproc_t)xdr_u_long, &thetime, tv);
+       /*
+        * The only error we check for is anything but success. In
+        * fact we could have seen PROGMISMATCH if talking to a 4.1
+        * machine (pmap v2) or TIMEDOUT if the net was busy.
+        */
+       if (status == RPC_SUCCESS)
+               time_valid = 1;
+       else {
+               int save;
+
+               /* Blow away possible stale CLNT handle. */
+               if (clnt != NULL) {
+                       clnt_destroy(clnt);
+                       clnt = NULL;
+               }
+
+               /*
+                * Convert PMAP address into timeservice address
+                * We take advantage of the fact that we "know" what
+                * the universal address looks like for inet transports.
+                *
+                * We also know that the internet timeservice is always
+                * listening on port 37.
+                */
+               sscanf(useua, "%d.%d.%d.%d.", &a1, &a2, &a3, &a4);
+               sprintf(ut, "%d.%d.%d.%d.0.37", a1, a2, a3, a4);
+
+               if (uaddr_to_sockaddr(ut, &sin)) {
+                       msg("cannot convert timeservice uaddr to sockaddr.");
+                       goto error;
+               }
+
+               s = socket(AF_INET, type, 0);
+               if (s == INVALID_SOCKET) {
+                       msg("unable to open fd to network.");
+                       goto error;
+               }
+
+               /*
+                * Now depending on whether or not we're talking to
+                * UDP we set a timeout or not.
+                */
+               if (type == SOCK_DGRAM) {
+                       struct timeval timeout = { 20, 0 };
+                       struct sockaddr_in from;
+                       fd_set readfds;
+                       int res;
+
+                       if (sendto(s, (const char *)&thetime, sizeof(thetime), 0,
+                               (struct sockaddr *)&sin, sizeof(sin)) == -1) {
+                               msg("udp : sendto failed.");
+                               goto error;
+                       }
+           &n