tux
TUX(2) System calls TUX(2)
NAME
tux - interact with the TUX kernel subsystem
SYNOPSIS
#include <sys/tuxmodule.h>
int tux (unsigned int action, user_req_t * req);
DESCRIPTION
The tux() system call calls the kernel to perform an action on behalf
of the currently executing user-space TUX module.
action can be one of:
enum tux_actions {
TUX_ACTION_STARTUP = 1,
TUX_ACTION_SHUTDOWN = 2,
TUX_ACTION_STARTTHREAD = 3,
TUX_ACTION_STOPTHREAD = 4,
TUX_ACTION_EVENTLOOP = 5,
TUX_ACTION_GET_OBJECT = 6,
TUX_ACTION_SEND_OBJECT = 7,
TUX_ACTION_READ_OBJECT = 8,
TUX_ACTION_FINISH_REQ = 9,
TUX_ACTION_FINISH_CLOSE_REQ = 10,
TUX_ACTION_REGISTER_MODULE = 11,
TUX_ACTION_UNREGISTER_MODULE = 12,
TUX_ACTION_CURRENT_DATE = 13,
TUX_ACTION_REGISTER_MIMETYPE = 14,
TUX_ACTION_READ_HEADERS = 15,
TUX_ACTION_POSTPONE_REQ = 16,
TUX_ACTION_CONTINUE_REQ = 17,
TUX_ACTION_REDIRECT_REQ = 18,
TUX_ACTION_READ_POST_DATA = 19,
TUX_ACTION_SEND_BUFFER = 20,
TUX_ACTION_WATCH_PROXY_SOCKET = 21,
TUX_ACTION_WAIT_PROXY_SOCKET = 22,
MAX_TUX_ACTION
};
The first action values listed below are administrative and are nor-
mally used only in the tux program.
TUX_ACTION_STARTUP starts the tux subsystem, and takes a NULL req.
TODO: Only root can use TUX_ACTION_STARTUP.
TUX_ACTION_SHUTDOWN stops the tux subsystem, and takes any req, even a
zero-filled req.
TUX_ACTION_STARTTHREAD is called once per thread with a req->thread_nr
element monotonically increasing from 0.
TUX_ACTION_STOPTHREAD is not currently used by the tux daemon because
all threads are automatically stopped on TUX_ACTION_SHUTDOWN. It
remains available because it may be useful in circumstances that the
tux daemon does not yet handle.
TUX_ACTION_REGISTER_MODULE Register a user-space module identified by
the req->modulename string. One VFS name can be registered only once.
req->version_major, req->version_minor, and req->version_patch have to
be set appropriately from TUX_MAJOR_VERSION, TUX_MINOR_VERSION, and
TUX_PATCHLEVEL_VERSION, respectively; the kernel will sanity-check
binary compatibility of the module.
TUX_ACTION_UNREGISTER_MODULE Unregister a user-space module identified
by the req->modulename string. Only registered modules can be unregis-
tered.
TUX_ACTION_CURRENT_DATE Set the current date string to req->new_date.
The date string must be RFC 1123-compliant and increase monotonically.
The tux daemon normally calls this once per second.
TUX_ACTION_REGISTER_MIMETYPE Sets the extension req->objectname to map
to mimetype req->object_addr. The tux daemon normally registers the
mime types in /etc/tux.mime.types, but modules could conceivably create
their own mimetype mappings.
The rest of the action values are used to respond to TUX events. The
general architecture is that TUX's event loop is invoked to catch HTTP
events, and then responses are generated in response to those events.
TUX_ACTION_EVENTLOOP invokes the TUX event loop¿the TUX subsystem will
either immediately return with a new request req, or will wait for new
requests to arrive.
TUX_ACTION_GET_OBJECT issues a request for the URL object named in
req->objectname. If the object is not immediately available then the
currently handled request is suspended, and a new request is returned,
or the TUX subsystem waits for new requests.
A URL object is a data stream that is accessed via a URL and is
directly associated with a file pointed to by that URL. (In the
future, we may extend the concept of a URL object.)
TUX_ACTION_SEND_OBJECT sends the current URL object to the client.
TUX_ACTION_READ_OBJECT reads the current URL object into the address
specified by req->object_addr. TUX_ACTION_READ_OBJECT must not be
called unless req->objectlen >= 0.
TUX_ACTION_READ_HEADERS reads a non-zero-delimited string into
req->object_addr, with the length of the string kept in req->objectlen.
This is a workaround used to read fields that tux does not currently
parse; if you need it, report it as a bug so that more fields can be
added to user_req (unless your use is so specialized that it will be of
no general utility).
TUX_ACTION_POSTPONE_REQ postpones the request, meaning that no tux sys-
tem calls will return data for this request until TUX_ACTION_CON-
TINUE_REQ is called.
TUX_ACTION_CONTINUE_REQ continues a postponed request. Unlike a normal
TUX_ACTION, it takes as its argument the socket descriptor (this allows
it to be called from a program that is unrelated to the program that
called TUX_ACTION_POSTPONE_REQ if necessary). It is called like this:
ret = tux(TUX_ACTION_CONTINUE_REQ, (user_req_t *)socket);
TUX_ACTION_READ_POST_DATA is an atomic action (it will always return
with the same request, no need to handle a new request) that puts the
non-zero-delimited POST data, up to the maximum set in req->objectlen
(and limited by /proc/sys/net/tux/max_header_len), into
req->object_addr, ands resets req->objectlen to the length.
TUX_ACTION_REDIRECT_REQ causes the request to be redirected to the sec-
ondary server. (No need to call TUX_ACTION_FINISH_REQ.)
TUX_ACTION_FINISH_REQ finishes and logs the request.
TUX_ACTION_FINISH_CLOSE_REQ is like TUX_ACTION_FINISH_REQ except that
it also closes HTTP 1.1 keepalive connections.
TUX_ACTION_SEND_BUFFER is like TUX_ACTION_SEND_OBJECT except that it
sends whatever is in the req->object_addr buffer. This can be used as
a generic output buffer.
TUX_ACTION_WATCH_PROXY_SOCKET sets up a non-TUX socket to be used with
TUX_ACTION_WAIT_PROXY_SOCKET. The socket must be a network socket. The
function is atomic. Repeated calls to this action will replace the pre-
vious proxy socket, so there is no need to deinitialize it. The socket
file descriptor must be put into req->object_addr.
TUX_ACTION_WAIT_PROXY_SOCKET postpones the current request until there
are input packets on the socket that was set up via
TUX_ACTION_WATCH_PROXY_SOCKET. The proxy socket has a keepalive timer
running. The request will be resumed once there is input activity on
the socket - the module can use nonblocking recv() on the socket to
process input packets.
user_req_t req is the request returned by the TUX subsystem. Defined
fields are:
typedef struct user_req_s {
int version_major;
int version_minor;
int version_patch;
int http_version;
int http_method;
int sock;
int event;
int thread_nr;
void *id;
void *priv;
int http_status;
int bytes_sent;
char *object_addr;
int module_index;
char modulename[MAX_MODULENAME_LEN];
unsigned int client_host;
unsigned int objectlen;
char query[MAX_URI_LEN];
char objectname[MAX_URI_LEN];
unsigned int cookies_len;
char cookies[MAX_COOKIE_LEN];
char content_type[MAX_FIELD_LEN];
char user_agent[MAX_FIELD_LEN];
char accept[MAX_FIELD_LEN];
char accept_charset[MAX_FIELD_LEN];
char accept_encoding[MAX_FIELD_LEN];
char accept_language[MAX_FIELD_LEN];
char cache_control[MAX_FIELD_LEN];
char if_modified_since[MAX_FIELD_LEN];
char negotiate[MAX_FIELD_LEN];
char pragma[MAX_FIELD_LEN];
char referer[MAX_FIELD_LEN];
char *post_data;
char new_date[DATE_LEN];
int keep_alive;
} user_req_t;
version_major
Always set to TUX_MAJOR_VERSION, used to flag binary incompati-
bility.
version_minor
Always set to TUX_MINOR_VERSION, used to flag binary incompati-
bility.
version_patch
Always set to TUX_PATCHLEVEL_VERSION, used to flag binary incom-
patibility.
http_version
One of HTTP_1_0 or HTTP_1_1
http_method
One of METHOD_NONE, METHOD_GET, METHOD_HEAD, METHOD_POST, or
METHOD_PUT
sock Socket file descriptor; writing to this will send data to the
connected client associated with this request. Do not read from
this socket file descriptor; you could potentially confuse the
HTTP engine.
event Private, per-request state for use in tux modules. The system
will preserve this value as long as a request is active.
thread_nr
Thread index; see discussion of TUX_ACTION_STARTTHREAD.
id A tux-daemon-internal value that is used to multiplex requests
to the correct modules.
priv Works just like event, except that it is a pointer to private
data instead of an integer.
http_status
Set the error status as an integer for error reporting. The
status is good by default, so it should not be modified except
to report errors.
bytes_sent
When you write to sock, you must set bytes_sent to the total
number of bytes sent since the last tux() operation on this req,
or the log entry's bytes sent counter will be incorrect. (This
may change or disappear in future versions of tux.)
object_addr
Set to an address for a buffer of at least req->objectlen size
into which to read an object from the URL cache with the
TUX_ACTION_READ_OBJECT action. TUX_ACTION_READ_OBJECT must not
be called unless req->objectlen >= 0, and TUX implicitly relies
on req->object_addr being at least req->objectlen in size.
module_index
Used by the tux(8) daemon to determine which loadable module to
associate with a req.
modulename
The name of the module as set by TUX_ACTION_REGISTER_MODULE;
private data to the tux daemon.
client_host
The IP address of the host to which sock is connected.
objectlen
The size of a file that satisfies the current request and which
is currently living in the URL cache. This is set if a request
returns after TUX_ACTION_GET_OBJECT. A module should make sure
that the buffer at req->object_addr is at least req->objectlen
in size before calling TUX_ACTION_READ_OBJECT.
query The full query string sent from the client.
objectname
Specifies the name of a URL to get with the
TUX_ACTION_GET_OBJECT action. If the URL is not immediately
available (that is, is not in the URL cache), the request is
queued and the tux subsystem may go on to other ready requests
while waiting.
cookies_len
If cookies are in the request header, cookies_len contains the
length of the cookies string
cookies
If cookies are in the request header, cookies is the string in
which the cookies are passed to the module.
content_type
The Content-Type header value for the request
user_agent
The User-Agent header value for the request
accept The Accept header value for the request
accept_charset
The Accept-Charset header value for the request
accept_encoding
The Accept-Encoding header value for the request
accept_language
The Accept-Language header value for the request
cache_control
The Cache-Control header value for the request
if_modified_since
The If-Modified-Since header value for the request
negotiate
The Negotiate header value for the request
pragma The Pragma header value for the request
referer
The Referer header value for the request
post_data
For POST requests, the incoming data is placed in post_data.
new_date
Returns the current date/time
keep_alive
The KeepAlive header value for the request
RETURN VALUE
tux() returns the following values:
enum tux_reactions {
TUX_RETURN_USERSPACE_REQUEST = 0,
TUX_RETURN_EXIT = 1,
TUX_RETURN_SIGNAL = 2,
};
TUX_RETURN_USERSPACE_REQUEST means that the kernel has put a new
request into req; the request must be responded to with one of
TUX_ACTION_GET_OBJECT, TUX_ACTION_SEND_OBJECT, TUX_ACTION_READ_OBJECT,
or TUX_ACTION_FINISH_REQ.
TUX_RETURN_EXIT means that TUX has been stopped.
TUX_RETURN_SIGNAL means that a signal has occured. No new request is
scheduled.
ERRORS
Any negative value (such as -EFAULT, -EINVAL) is an indication of an
error.
BUGS
This man page is incomplete.
Linux 19 Jul 2000 TUX(2)