Revision: 75978
http://sourceforge.net/p/brlcad/code/75978
Author: starseeker
Date: 2020-05-29 00:49:05 +0000 (Fri, 29 May 2020)
Log Message:
-----------
Transcribe pkg.tr into Docbook
Modified Paths:
--------------
brlcad/trunk/doc/CMakeLists.txt
brlcad/trunk/doc/docbook/system/man3/CMakeLists.txt
Added Paths:
-----------
brlcad/trunk/doc/docbook/system/man3/libpkg.xml
Removed Paths:
-------------
brlcad/trunk/doc/pkg.tr
Modified: brlcad/trunk/doc/CMakeLists.txt
===================================================================
--- brlcad/trunk/doc/CMakeLists.txt 2020-05-28 22:07:37 UTC (rev 75977)
+++ brlcad/trunk/doc/CMakeLists.txt 2020-05-29 00:49:05 UTC (rev 75978)
@@ -201,7 +201,6 @@
notes/rounding.txt
notes/tool_categories.txt
old-mged.tr
- pkg.tr
)
ADD_DOC(documentation_mged_old_DATA mged_old)
Modified: brlcad/trunk/doc/docbook/system/man3/CMakeLists.txt
===================================================================
--- brlcad/trunk/doc/docbook/system/man3/CMakeLists.txt 2020-05-28 22:07:37 UTC
(rev 75977)
+++ brlcad/trunk/doc/docbook/system/man3/CMakeLists.txt 2020-05-29 00:49:05 UTC
(rev 75978)
@@ -1,6 +1,7 @@
set(man3_EN
libfb.xml
libplot3.xml
+ libpkg.xml
librt.xml
libwdb.xml
redblack.xml
Added: brlcad/trunk/doc/docbook/system/man3/libpkg.xml
===================================================================
--- brlcad/trunk/doc/docbook/system/man3/libpkg.xml
(rev 0)
+++ brlcad/trunk/doc/docbook/system/man3/libpkg.xml 2020-05-29 00:49:05 UTC
(rev 75978)
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<refentry xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="libpkg"
xmlns:xlink="http://www.w3.org/1999/xlink">
+<refmeta>
+ <refentrytitle>LIBPKG</refentrytitle>
+ <manvolnum>3</manvolnum>
+ <refmiscinfo class='source'>BRL-CAD</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+ <refname>libpkg</refname>
+ <refpurpose>
+ Message passing abstraction library supporting communication between
+ cooperating processes over TCP connections
+ </refpurpose>
+</refnamediv>
+
+<refsect1 xml:id='pkg_background'>
+ <title>BACKGROUND</title>
+ <para>
+ The following is a description of the libpkg routines kindly provided
+ by Peter B. Shames on 26 Sept 1986, and updated 14 Nov 1986 by PC Dykstra
to reflect
+ BRL extensions since the first writing. It was intended that an RFC
+ be published at some point, but at this point this document (plus the
+ source code) is all we have. In the CAD distribution, the remote
+ framebuffer interface (libfb/if_remote.c) and server (fbserv),
+ communicate using this protocol.
+ </para>
+</refsect1>
+
+<refsect1 xml:id='pkg_overview'>
+ <title>Overview</title>
+ <para>
+ A prototype interface that implements a fairly simple message passing
+ abstraction between cooperating processes running over TCP connections
+ has been developed by Mike Muuss, Charles Kennedy, and Phillip Dykstra
+ at BRL. Some experiments have been run at STScI to implement this
+ interface on a DECnet link with good success. A few changes have been
+ suggested to improve network throughput for data flows that consist of
+ short message traffic or byte-stream traffic.
+ </para>
+ <para>
+ This note describes the motivation for developing such an interface and
+ describes the subroutine interfaces and functionality. The interface
+ routine descriptions and portions of the textual descriptions have been
+ taken directly from the source code provided by Muuss and Kennedy
+ which has been the only available description to date.
+ </para>
+</refsect1>
+
+<refsect1 xml:id='why_pkg'>
+ <title>Why a message interface?</title>
+ <para>
+ The interface - PKG provides a simple interface for managing
+ client/server connections in a distributed environment. A server task
+ is initialized to wait for incoming requests from clients. Clients open
+ a connection to the server task which executes on some host processor
+ waiting for incoming requests. Messages with identifying type codes are
+ passed between processes, with optional appended data blocks. The
+ interface is non-blocking and accepts arbitrary data messages of
+ arbitrary length.
+ </para>
+ <para>
+ An example - interaction with a remote data archive may require request
+ for services, user authentication, permission granting, index hierarchy
+ queries - with manipulation of results, archive request processing,
+ delivery of output products - electronically or otherwise. The archive
+ is a server that responds to service requests from clients, how many
+ may be served at one time and whether public access and private services
+ are supported is an implementation issue. Since no direct interactive
+ support is required (if smart client agents are in use) the message
+ paradigm can support the requirements.
+ </para>
+ <para>
+ A [counter] example - Athena's XWindow uses a client-server model to
+ provide screen/window management services for distributed processes.
+ XWindow is very permissive of different window management policies and
+ provides hooks for implementing various user interfaces. At the lowest
+ level, XWindow requires a reliable duplex byte-stream, which can be
+ implemented in many operating environments. Because XWindow wants to
+ manage all process-window communications directly, it builds its own block
+ stream protocol to manage the connection. This permits the interactive
+ update required by some processes, but basically is the same paradigm as
+ PKG, defined within the window system.
+ </para>
+</refsect1>
+
+<refsect1 xml:id='pkg_desc'>
+ <title>PKG Interface description</title>
+ <para>
+ The PKG interface implements an client-server network connection that
+ multiplexes synchronous and asynchronous messages across stream
+ connections. Connection control is provided by open/ close routines,
+ where the client authentication is handled prior to establishing the
+ connection. Server side actions include initialization, client connection,
+ and client request servicing. Client side actions include server request,
+ reply processing, possible connection negotiation, and data transfer
+ processing.
+ </para>
+ <para>
+ A connection is established when a client issues an open to a server,
+ running on some host. Which hosts provide required services must be
+ determined prior to connection requests, using some service directory.
+ Default connection processing is stream oriented, where a process may
+ get data as it is available on the connection. A blocking read may
+ also be issued, waiting for any complete message, or just for messages
+ of a specified type. The connection remains open until explicitly
+ closed by either client or server.
+ </para>
+ <para>
+ Once the connection is established it may be used to process a full-
+ duplex asynchronous byte stream, or a buffered, synchronous query/reply
+ exchange. Message type multiplexing supports user actions based upon
+ message type, where the multiplexing is handled in the interface.
+ Different message type streams may operate using different flow control
+ over the same connection. Multiplexing is handled in the interface by
+ pre-pending a header block to the message before transmitting it
+ to the reader. Data is transmitted as received, but the header is
+ transmitted in Internet network byte/bit order.
+ </para>
+ <para>
+ An package connection may incur significant overhead if
+ many short messages are passed between processes, so
+ a buffered stream connection may be requested. The
+ application calls the pkg_stream interface rather than the usual pkg_send
+ request, and PKG builds a message buffer and passes it to the
+ client as it gets filled. A stream buffer may be flushed with an
+ explicit call to the pkg_flush routine.
+ </para>
+</refsect1>
+
+<refsect1 xml:id='pkg_def'>
+ <title>PKG Interface Definition</title>
+ <para>
+ Control Interfaces:
+
+ <variablelist>
+
+ <varlistentry><term>PKG_OPEN - Open a connection to a host</term>
+ <listitem>
+ <literallayout>
+ pkg_open( host, service, protocol, uname, passwd, pkg_switch, errlog )
+ returns ptr_to_connection
+ </literallayout>
+ <para>
+ We are a client, make a connection to a server running on some host.
+ The return value is the connection handle. Protocol, username, and
+ password are optional.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_CLOSE - Close a connection</term>
+ <listitem>
+ <literallayout>
+ pkg_close( ptr_to_connection )
+ returns VOID
+ </literallayout>
+ <para>
+ We are a client or server wishing to gracefully close a connection.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_TRANSERVER - Become a one-time network server
on the already accepted connection.</term>
+ <listitem>
+ <literallayout>
+ pkg_transerver( pkg_switch, errlog )
+ returns ptr_to_connection
+ </literallayout>
+ <para>
+ Given an established connection, this routine creates a pkg_conn
+ structure for it and initializes it to use the given pkg_switch
+ and error logging function. This routine is needed by servers
+ which get created by some other process after the connection is
+ established. Processes started by the UNIX "inetd" are one example.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_PERMSERVER - Create a network server and
listen for connections</term>
+ <listitem>
+ <literallayout>
+ pkg_permserver( service, protocol, backlog )
+ returns listen_file_desc
+ </literallayout>
+ <para>
+ The service port is determined and a listen is hung on the port
+ that is bound to the socket. The return value is the file descriptor
+ of the socket. For this kind of server, pkg_getclient is used to
+ accept connections from clients.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_GETCLIENT - Used by a server to accept a
client connection</term>
+ <listitem>
+ <literallayout>
+ pkg_getclient( listen_file_desc, pkg_switch, errlog, nodelay_flag )
+ returns ptr_to_connection or NULL or ERROR
+ </literallayout>
+ <para>
+ If possible, the connection request from the client is accepted,
+ a pkg_connection block is created and a ptr to it is returned to
+ the server. The server may request non-blocked service by
+ setting the nodelay_flag TRUE.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ <para>
+ I/O Interfaces:
+
+ <variablelist>
+
+ <varlistentry><term>PKG_GET - Read bytes from connection, assembling
message</term>
+ <listitem>
+ <literallayout>
+ pkg_get( ptr_to_connection ) returns
+ returns message_arrived, more_data_coming or ERROR.
+ </literallayout>
+ <para>
+ Get waits until a message header is received and the calls the user
+ specified message handler for that message type. This routine
+ should be called by a program whenever there is data waiting on a
+ connection and the program is not otherwise waiting on a specific
+ message type. The routine will return directly to the caller if
+ no header is available or if only a partial message is received,
+ otherwise it calls the user specified message type handler.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry><term>PKG_SEND - Send a message on the connection</term>
+ <listitem>
+ <literallayout>
+ pkg_send( message_type, data_buff, buff_len, ptr_to_connection )
+ returns bytes_sent or ERROR
+ </literallayout>
+ <para>
+ Send constructs a message header for the data buffer and transmits
+ it on the connection. If only part of the message can be sent the
+ actual number of bytes transmitted returned. Any data in the stream
+ buffer is first flushed. If the stream buffer needs flushing, and
+ the message is less than MAXQLEN (currently 512) bytes long, and
+ sufficient room is left in the stream buffer, this message gets
+ "piggybacked" on by copying it to the buffer before flushing. If
+ available, "writev" is used to send the header and data with one
+ syscall.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_2SEND - Send a two part message on the
connection</term>
+ <listitem>
+ <literallayout>
+ pkg_2send( message_type, data_buff1, buff1_len, data_buff2,
buff2_len, ptr_to_connection )
+ returns bytes_sent or ERROR
+ </literallayout>
+ <para>
+ 2Send performs the same job as pkg_send except the data comes in
+ two parts. This is often the case for say a command followed by
+ user data. User data copies can be avoided while still allowing
+ a single trip in and out of the kernel on the receiving end.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_STREAM - Send a buffered data stream on the
connection</term>
+ <listitem>
+ <literallayout>
+ pkg_stream( message_type, data_buff, buff_len, ptr_to_connection )
+ returns bytes_sent or ERROR
+ </literallayout>
+ <para>
+ Pkg_stream connections provide a low network overhead connection
+ where interactive responsiveness is not required.
+ </para>
+ <para>
+ Connections have a PKG_STREAMLEN (currently 4096) byte stream
+ buffer. If the current message is less than MAXQLEN (currently
+ 512) bytes in length, and space remains for it, it will be
+ appended onto the end of this buffer. Otherwise the buffer is
+ implicitly flushed by sending this message via PKG_SEND.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_FLUSH - Flush the stream buffer out on the
connection</term>
+ <listitem>
+ <literallayout>
+ pkg_flush( ptr_to_connection )
+ returns bytes_sent or ERROR
+ </literallayout>
+ <para>
+ Flush takes the current contents of the stream buffer being
+ constructed by stream and flushes it to the connection. This
+ allows programs explicit control over the stream interface
+ where required.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_BLOCK - Wait for a complete message of any
type</term>
+ <listitem>
+ <literallayout>
+ pkg_block( ptr_to_connection )
+ returns message_arrived or ERROR
+ </literallayout>
+ <para>
+ This routine blocks, waiting for a complete message of ant type
+ to arrive on the connection. The user message handler is called
+ to process the message. This routine can be called in a loop
+ waiting for asynchronous messages or for the arrival of messages
+ of uncertain type.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_WAITFOR - Wait for a message of specific type,
return in user buffer</term>
+ <listitem>
+ <literallayout>
+ pkg_waitfor( message_type, user_buff, buff_len, ptr_to_connection )
+ returns buff_len or ERROR
+ </literallayout>
+ <para>
+ This routine does a blocking read on the connection until a message
+ of message_type is received. Asynchronous messages and messages of
+ other types are processed while this routine waits. The message is
+ returned in the user's buffer.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_BWAITFOR - Wait for a message of specific
type, return in allocated buffer</term>
+ <listitem>
+ <literallayout>
+ pkg_bwaitfor( message_type, ptr_to_connection )
+ returns ptr_to_buffer or ERROR
+ </literallayout>
+ <para>
+ This routine does a blocking read on the connection until a message
+ of message_type is received. Asynchronous messages and messages of
+ other types are processed while this routine waits. The message is
+ returned in a newly allocated buffer that the caller must free.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para>
+
+ User Message Handler Interface:
+
+ <variablelist>
+
+ <varlistentry><term>PKG_SWITCH - Table of User Message Handler
Pointers</term>
+ <listitem>
+ <literallayout>
+ struct pkg_switch {
+ unsigned short pks_type; /* Type code */
+ int (*pks_handler)(); /* Message Handler */
+ char *pks_title; /* Description */
+ };
+ pks_handler( ptr_to_connection, message_buff )
+ returns ignored int
+ </literallayout>
+ <para>
+ The user may specify handlers for one or more message types. When
+ these routines are called they are passed a pointer to the connection
+ and a pointer to a buffer that contains the message. The user message
+ handler routine is responsible for freeing the message buffer after
+ processing it. If there is no message handler for that message type
+ the message is discarded and the buffered freed. The switch routine
+ uses an external message handler array, created by the caller, that
+ defines message types, handler entry points, and a message descriptor
+ field.
+ </para>
+ <para>
+ The pkg_switch list which is passed to some of the above functions
+ is a NULL terminated array of structures containing the message type,
+ a pointer to an function which handles messages of that type, and a
+ descriptive string. A separate pkg_switch array is kept for each
+ connection so that several entirely different PKG conversations can
+ be carried out by a single application at the same time.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry><term>PKG_CONN - Connection block structure</term>
+ <listitem>
+ <literallayout>
+ struct pkg_conn {
+ pkg_file_desc, pkg_magic, mess_len, ptr_to_buffer,
+ curr_buffer_pos, pkg_switch, errlog, stream_buff,
+ curr_stream_pos
+ };
+ </literallayout>
+ <para>
+ Connection block structures are created by pkg_open or pkg_getclient
+ when a connection is established, and are freed when a connection is
+ closed. This connection block is used during all I/O requests and
+ contains the pointer to the start of the current buffer and to the
+ current position in the buffer for incomplete read or writes. The
+ mess_len field specifies the number of bytes expected by get. The
+ pkg_switch array, and a pointer to an error logging function for this
+ connection is included. The stream buffer is also contained in the
+ structure.
+ </para>
+ <para>
+ See pkg.h for the actual names of the structure elements.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+
+</refsect1>
+
+<refsect1 xml:id='pkg_impl_notes'><title>Implementation Notes</title>
+<para>
+ At least two implementations of the PKG interface have been done, one based
on
+ TCP/IP connections, the other based on DECnet connections. Future releases of
+ PKG will be layered on top of a virtual stream library known as NET.
+</para>
+<para>
+ The implementation running on 4.2BSD UNIX takes advantage of the "writev"
+ syscall which can output the header and data in a single syscall/TCP_PUSH
+ cycle. The advantage of the short data copy is realized only when writev
+ can not be used, or when a pkg_flush is not required (a la PKG_STREAM).]
+</para>
+</refsect1>
+
+<refsect1 xml:id='pkg_future_devel'><title>Future Developments</title>
+<para>
+ Further development of the lower levels of the interface will be provided
+ so that this message passing abstraction can be provided on top of both
+ DECnet and TCP/IP network layers, with other implementations provided as
+ required. The program interface layer is to be as described in the body
+ of this note, the lower layers will interface to the network layers using
+ whatever subroutine interfaces are most appropriate for the system hosting
+ the interface. A simple read/write/open/close abstraction may be provided
+ at a lower layer to further isolate the network layers from the message
+ handling layer.
+</para>
+<para>
+ Where it is necessary to cross network protocol boundaries, message relay
+ processes will be created to reside on a Janus host that straddles the two
+ domains. Domain routing and relay point information will be maintained
+ above the network layer within the extended PKG interface. Clients and
+ servers will need to determine server host id information from some available
+ database. Server names must either carry domain information or such
+ information must be available as part of the server database. Within the
+ extended PKG interface routing information for domain boundary transits
+ must be maintained, and appropriate Janus host systems connected to provide
+ relay services.
+</para>
+<para>
+ It is not anticipated that full asynchronous I/O implementation will work
+ particularly well across domain boundaries, but all other forms of message
+ transfer should work quite well. As already noted, buffered stream I/O
+ may be perfectly satisfactory for many applications where full interaction
+ is not required. Where applicable, this mode of interface is to be
+ preferred over full asynchronous I/O. Further development of this interface
+ layer on other protocol families is possible, perhaps even on low level
+ networks like BITNET and certainly on connection oriented X.25 or OSI
+ networks.
+</para>
+</refsect1>
+
+<refsect1 xml:id='author'><title>AUTHOR</title>
+<para>Peter B. Shames</para>
+</refsect1>
+
+<refsect1 xml:id='bug_reports'><title>BUG REPORTS</title>
+<para>
+ Reports of inaccuracies should be submitted via electronic
+ mail to <email>[email protected]</email>
+</para>
+</refsect1>
+</refentry>
Property changes on: brlcad/trunk/doc/docbook/system/man3/libpkg.xml
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/xml
\ No newline at end of property
Deleted: brlcad/trunk/doc/pkg.tr
===================================================================
--- brlcad/trunk/doc/pkg.tr 2020-05-28 22:07:37 UTC (rev 75977)
+++ brlcad/trunk/doc/pkg.tr 2020-05-29 00:49:05 UTC (rev 75978)
@@ -1,367 +0,0 @@
-.\" @(#)$Header$ (BRL)
-.RT
-.nf
-The following is a description of the libpkg routines kindly provided
-by Peter B. Shames, updated to reflect BRL extensions since the first
-writing. It is intended that an RFC be published at some point,
-but for now this (plus the source code) is all the documentation we have.
-In the CAD distribution, the remote framebuffer interface (libfb/if_remote.c)
-and server (fbserv), communicate using this protocol.
-
-Contributors:
-
- BRL U.S.Army Ballistic Research Laboratory
- STScI Space Telescope Science Institute
-
-==================================================================
-
-PKG Interface Description 26 Sept 1986
-========================= PMB Shames
- [Updated: 14 Nov 1986
- PC Dykstra]
-Overview
---------
-
-A prototype interface that implements a fairly simple message passing
-abstraction between cooperating processes running over TCP connections
-has been developed by Mike Muuss, Charles Kennedy, and Phillip Dykstra
-at BRL. Some experiments have been run at STScI to implement this
-interface on a DECnet link with good success. A few changes have been
-suggested to improve network throughput for data flows that consist of
-short message traffic or byte-stream traffic.
-
-This note describes the motivation for developing such an interface and
-describes the subroutine interfaces and functionality. The interface
-routine descriptions and portions of the textual descriptions have been
-taken directly from the source code provided by Muuss and Kennedy
-which has been the only available description to date.
-
-Why a message interface?
-------------------------
-
-The interface - PKG provides a simple interface for managing
-client/server connections in a distributed environment. A server task
-is initialized to wait for incoming requests from clients. Clients open
-a connection to the server task which executes on some host processor
-waiting for incoming requests. Messages with identifying type codes are
-passed between processes, with optional appended data blocks. The
-interface is non-blocking and accepts arbitrary data messages of
-arbitrary length.
-
-An example - interaction with a remote data archive may require request
-for services, user authentication, permission granting, index hierarchy
-queries - with manipulation of results, archive request processing,
-delivery of output products - electronically or otherwise. The archive
-is a server that responds to service requests from clients, how many
-may be served at one time and whether public access and private services
-are supported is an implementation issue. Since no direct interactive
-support is required (if smart client agents are in use) the message
-paradigm can support the requirements.
-
-A [counter] example - Athena's XWindow uses a client-server model to
-provide screen/window management services for distributed processes.
-XWindow is very permissive of different window management policies and
-provides hooks for implementing various user interfaces. At the lowest
-level, XWindow requires a reliable duplex byte-stream, which can be
-implemented in many operating environments. Because XWindow wants to
-manage all process-window communications directly, it builds its own block
-stream protocol to manage the connection. This permits the interactive
-update required by some processes, but basically is the same paradigm as
-PKG, defined within the window system.
-
-PKG Interface description
--------------------------
-
-The PKG interface implements an client-server network connection that
-multiplexes synchronous and asynchronous messages across stream
-connections. Connection control is provided by open/ close routines,
-where the client authentication is handled prior to establishing the
-connection. Server side actions include initialization, client connection,
-and client request servicing. Client side actions include server request,
-reply processing, possible connection negotiation, and data transfer
-processing.
-
-A connection is established when a client issues an open to a server,
-running on some host. Which hosts provide required services must be
-determined prior to connection requests, using some service directory.
-Default connection processing is stream oriented, where a process may
-get data as it is available on the connection. A blocking read may
-also be issued, waiting for any complete message, or just for messages
-of a specified type. The connection remains open until explicitly
-closed by either client or server.
-
-Once the connection is established it may be used to process a full-
-duplex asynchronous byte stream, or a buffered, synchronous query/reply
-exchange. Message type multiplexing supports user actions based upon
-message type, where the multiplexing is handled in the interface.
-Different message type streams may operate using different flow control
-over the same connection. Multiplexing is handled in the interface by
-pre-pending a header block to the message before transmitting it
-to the reader. Data is transmitted as received, but the header is
-transmitted in Internet network byte/bit order.
-
-An package connection may incur significant overhead if
-many short messages are passed between processes, so
-a buffered stream connection may be requested. The
-application calls the pkg_stream interface rather than the usual pkg_send
-request, and PKG builds a message buffer and passes it to the
-client as it gets filled. A stream buffer may be flushed with an
-explicit call to the pkg_flush routine.
-
-PKG Interface Definition
-------------------------
-
-Control Interfaces -
-
-PKG_OPEN - Open a connection to a host
-
- pkg_open( host, service, protocol, uname, passwd, pkg_switch, errlog )
- returns ptr_to_connection
-
- We are a client, make a connection to a server running
- on some host. The return value is the connection handle.
- Protocol, username, and password are optional.
-
-PKG_CLOSE - Close a connection
-
- pkg_close( ptr_to_connection ) returns VOID
-
- We are a client or server wishing to gracefully close
- a connection.
-
-PKG_TRANSERVER - Become a one-time network server on the already
- accepted connection.
-
- pkg_transerver( pkg_switch, errlog ) returns ptr_to_connection
-
- Given an established connection, this routine creates a
- pkg_conn structure for it and initializes it to use the
- given pkg_switch and error logging function. This routine
- is needed by servers which get created by some other
- process after the connection is established. Processes
- started by the UNIX "inetd" are one example.
-
-PKG_PERMSERVER - Create a network server and listen for connections
-
- pkg_permserver( service, protocol, backlog ) returns listen_file_desc
-
- The service port is determined and a listen is hung on
- the port that is bound to the socket. The return value
- is the file descriptor of the socket.
- For this kind of server, pkg_getclient is used to
- accept connections from clients.
-
-PKG_GETCLIENT - Used by a server to accept a client connection
-
- pkg_getclient( listen_file_desc, pkg_switch, errlog, nodelay_flag )
- returns ptr_to_connection or NULL or ERROR
-
- If possible, the connection request from the client is
- accepted, a pkg_connection block is created and a ptr to
- it is returned to the server. The server may request
- non-blocked service by setting the nodelay_flag TRUE.
-
-I/O Interfaces -
-
-PKG_GET - Read bytes from connection, assembling message
-
- pkg_get( ptr_to_connection ) returns message_arrived,
- more_data_coming or ERROR.
-
- Get waits until a message header is received and the
- calls the user specified message handler for that message
- type. This routine should be called by a program whenever
- there is data waiting on a connection and the program is
- not otherwise waiting on a specific message type. The
- routine will return directly to the caller if no header
- is available or if only a partial message is received,
- otherwise it calls the user specified message type handler.
-
-PKG_SEND - Send a message on the connection
-
- pkg_send( message_type, data_buff, buff_len, ptr_to_connection )
- returns bytes_sent or ERROR
-
- Send constructs a message header for the data buffer
- and transmits it on the connection. If only part of the
- message can be sent the actual number of bytes transmitted
- returned.
- Any data in the stream buffer is first flushed. If the
- stream buffer needs flushing, and the message is less than
- MAXQLEN (currently 512) bytes long, and sufficient room
- is left in the stream buffer, this message gets "piggybacked"
- on by copying it to the buffer before flushing.
- If available, "writev" is used to send the header and data
- with one syscall.
-
-PKG_2SEND - Send a two part message on the connection
-
- pkg_2send( message_type, data_buff1, buff1_len,
- data_buff2, buff2_len, ptr_to_connection )
- returns bytes_sent or ERROR
-
- 2Send performs the same job as pkg_send except the data
- comes in two parts. This is often the case for say a
- command followed by user data. User data copies can be
- avoided while still allowing a single trip in and out of
- the kernel on the receiving end.
-
-PKG_STREAM - Send a buffered data stream on the connection
-
- pkg_stream( message_type, data_buff, buff_len, ptr_to_connection )
- returns bytes_sent or ERROR
-
- Pkg_stream connections provide a low network overhead
- connection where interactive responsiveness is not
- required.
- Connections have a PKG_STREAMLEN (currently 4096)
- byte stream buffer. If the current message is less
- than MAXQLEN (currently 512) bytes in length, and space
- remains for it, it will be appended onto the end of this
- buffer. Otherwise the buffer is implicitly flushed by
- sending this message via PKG_SEND.
-
-PKG_FLUSH - Flush the stream buffer out on the connection
-
- pkg_flush( ptr_to_connection ) returns bytes_sent or
- ERROR
-
- Flush takes the current contents of the stream buffer being
- constructed by stream and flushes it to the connection.
- This allows programs explicit control over the stream
- interface where required.
-
-PKG_BLOCK - Wait for a complete message of any type
-
- pkg_block( ptr_to_connection ) returns message_arrived or ERROR
-
- This routine blocks, waiting for a complete message of
- ant type to arrive on the connection. The user message
- handler is called to process the message. This routine
- can be called in a loop waiting for asynchronous messages
- or for the arrival of messages of uncertain type.
-
-PKG_WAITFOR - Wait for a message of specific type, return in
- user buffer
-
- pkg_waitfor( message_type, user_buff, buff_len, ptr_to_connection )
- returns buff_len or ERROR
-
- This routine does a blocking read on the connection until
- a message of message_type is received. Asynchronous
- messages and messages of other types are processed while
- this routine waits. The message is returned in the user's
- buffer.
-
-PKG_BWAITFOR - Wait for a message of specific type, return in
- allocated buffer
-
- pkg_bwaitfor( message_type, ptr_to_connection )
- returns ptr_to_buffer or ERROR
-
- This routine does a blocking read on the connection until
- a message of message_type is received. Asynchronous
- messages and messages of other types are processed while
- this routine waits. The message is returned in a newly
- allocated buffer that the caller must free.
-
-User Message Handler Interface -
-
-PKG_SWITCH - Table of User Message Handler Pointers
-
- struct pkg_switch {
- unsigned short pks_type; /* Type code */
- int (*pks_handler)(); /* Message Handler */
- char *pks_title; /* Description */
- };
-
- pks_handler( ptr_to_connection, message_buff ) returns ignored int.
-
- The user may specify handlers for one or more message types.
- When these routines are called they are passed a pointer
- to the connection and a pointer to a buffer that contains
- the message. The user message handler routine is responsible
- for freeing the message buffer after processing it. If there
- is no message handler for that message type the message is
- discarded and the buffered freed. The switch routine uses
- an external message handler array, created by the caller,
- that defines message types, handler entry points, and a
- message descriptor field.
- The pkg_switch list which is passed to some of the above
- functions is a NULL terminated array of structures containing
- the message type, a pointer to an function which handles
- messages of that type, and a descriptive string. A separate
- pkg_switch array is kept for each connection so that several
- entirely different PKG conversations can be carried out by a
- single application at the same time.
-
-PKG_CONN - Connection block structure
-
- struct pkg_conn {
- pkg_file_desc, pkg_magic, mess_len, ptr_to_buffer,
- curr_buffer_pos, pkg_switch, errlog, stream_buff,
- curr_stream_pos
- };
-
- Connection block structures are created by pkg_open or
- pkg_getclient when a connection is established, and are freed
- when a connection is closed. This connection block is used
- during all I/O requests and contains the pointer to the start
- of the current buffer and to the current position in the
- buffer for incomplete read or writes. The mess_len field
- specifies the number of bytes expected by get.
- The pkg_switch array, and a pointer to an error logging
- function for this connection is included. The stream
- buffer is also contained in the structure.
-
- See pkg.h for the actual names of the structure elements.
-
-Implementation Notes
---------------------
-
-At least two implementations of the PKG interface have been done, one
-based on TCP/IP connections, the other based on DECnet connections.
-Future releases of PKG will be layered on top of a virtual stream
-library known as NET.
-
-The implementation running on 4.2BSD UNIX takes advantage of
-the "writev" syscall which can output the header and data in a single
-syscall/TCP_PUSH cycle. The advantage of the short data copy is realized
-only when writev can not be used, or when a pkg_flush is not required
-(a la PKG_STREAM).]
-
-Future Developments
--------------------
-
-Further development of the lower levels of the interface will be provided
-so that this message passing abstraction can be provided on top of both
-DECnet and TCP/IP network layers, with other implementations provided
-as required. The program interface layer is to be as described in the
-body of this note, the lower layers will interface to the network layers
-using whatever subroutine interfaces are most appropriate for the system
-hosting the interface. A simple read/write/open/close abstraction may
-be provided at a lower layer to further isolate the network layers from
-the message handling layer.
-
-Where it is necessary to cross network protocol boundaries, message relay
-processes will be created to reside on a Janus host that straddles the
-two domains. Domain routing and relay point information will be
-maintained above the network layer within the extended PKG interface.
-Clients and servers will need to determine server host id information
-from some available database. Server names must either carry domain
-information or such information must be available as part of the server
-database. Within the extended PKG interface routing information for
-domain boundary transits must be maintained, and appropriate Janus
-host systems connected to provide relay services.
-
-It is not anticipated that full asynchronous I/O implementation will
-work particularly well across domain boundaries, but all other forms
-of message transfer should work quite well. As already noted, buffered
-stream I/O may be perfectly satisfactory for many applications where
-full interaction is not required. Where applicable, this mode of
-interface is to be preferred over full asynchronous I/O. Further
-development of this interface layer on other protocol families is
-possible, perhaps even on low level networks like BITNET and certainly
-on connection oriented X.25 or OSI networks.
-
-------
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits