diff options
Diffstat (limited to 'include/public/nsapi.h')
-rw-r--r-- | include/public/nsapi.h | 3481 |
1 files changed, 3481 insertions, 0 deletions
diff --git a/include/public/nsapi.h b/include/public/nsapi.h new file mode 100644 index 00000000..3544fd20 --- /dev/null +++ b/include/public/nsapi.h @@ -0,0 +1,3481 @@ +/** BEGIN COPYRIGHT BLOCK + * Copyright 2001 Sun Microsystems, Inc. + * Portions copyright 1999, 2001-2003 Netscape Communications Corporation. + * All rights reserved. + * END COPYRIGHT BLOCK **/ +#ifndef PUBLIC_NSAPI_H +#define PUBLIC_NSAPI_H + +/* + * File: nsapi.h + * + * Description: + * + * This file defines an interface for extending the server with + * in-process plug-ins. + */ + +#include "base/systems.h" + +#if defined(FILE_UNIX_MMAP) || defined(FILE_WIN32_MMAP) +#define FILE_MMAP +#endif + +/* --- Begin miscellaneous definitions --- */ + +/* Used in some places as a length limit on error messages */ +#define MAGNUS_ERROR_LEN 1024 + +/* Carriage return and line feed */ +#define CR 13 +#define LF 10 +#ifdef XP_WIN32 +#define ENDLINE "\r\n" +#else +#define ENDLINE "\n" +#endif + +/* mime.types file identification line */ +#define NCC_MT_MAGIC "#--Netscape Communications Corporation MIME Information" +#define NCC_MT_MAGIC_LEN 55 + +/* Deprecated */ +#define MCC_MT_MAGIC "#--Mosaic Communications Corporation MIME Information" +#define MCC_MT_MAGIC_LEN 53 + +/* The character which separates extensions with cinfo_find */ +#define CINFO_SEPARATOR '.' + +/* The maximum length of a line in a mime.types file */ +#define CINFO_MAX_LEN 1024 + +/* + * The maximum length of an error message. NOT RUN-TIME CHECKED + */ + +#define MAX_ERROR_LEN 1024 + +/* A warning is a minor mishap, such as a 404 being issued. */ +#define LOG_WARN 0 + +/* + * A misconfig is when there is a syntax error or permission violation in + * a config. file. + */ +#define LOG_MISCONFIG 1 + +/* + * Security warnings are issued when authentication fails, or a host is + * given a 403 return code. + */ +#define LOG_SECURITY 2 + +/* + * A failure is when a request could not be fulfilled due to an internal + * problem, such as a CGI script exiting prematurely, or a filesystem + * permissions problem. + */ +#define LOG_FAILURE 3 + +/* + * A catastrophe is a fatal server error such as running out of + * memory or processes, or a system call failing, or even a server crash. + * The server child cannot recover from a catastrophe. + */ +#define LOG_CATASTROPHE 4 + +/* + * Informational message, of no concern. + */ +#define LOG_INFORM 5 + +/* + * Internal log messages to be logged. Internal use only. + * Enable with "LogVerbose on" in magnus.conf + */ +#define LOG_VERBOSE 6 + +/* + * The time format to use in the error log + */ + +#define ERR_TIMEFMT "[%d/%b/%Y:%H:%M:%S]" + + +/* The fd you will get if you are reporting errors to SYSLOG */ + +#define ERRORS_TO_SYSLOG -1 + +/* Return codes from file I/O routines */ +#define IO_OKAY 1 +#define IO_ERROR -1 +#define IO_EOF 0 +#define NETBUF_EOF -1 +#define NETBUF_ERROR -2 + +/* The disk page size on this machine. */ +#define FILE_BUFFERSIZE 4096 + +#ifdef XP_UNIX + +#define FILE_PATHSEP '/' +#define FILE_PARENT "../" + +#elif defined(XP_WIN32) + +#define FILE_PATHSEP '/' +#define FILE_PARENT "..\\" + +#endif /* XP_WIN32 */ + +#define NET_INFINITE_TIMEOUT 0 +#define NET_ZERO_TIMEOUT -1 + + +/* + * The following macros allow code to be written to use either the + * shell expression API defined here, or the regular expression + * pattern matching API defined in regexp.h. Regular expressions + * have a more complicated syntax, but also are more powerful. + * Define the symbol, USE_REGEX to use regular expressions. You + * can include either or both of shexp.h and regexp.h, regardless + * of whether USE_REGEX is defined or not, and the WILDPAT macros + * will be defined appropriately. + */ + +#ifdef USE_REGEX + +#define WILDPAT_VALID(exp) regexp_valid(exp) +#define WILDPAT_MATCH(str, exp) regexp_match(str, exp) +#define WILDPAT_CMP(str, exp) regexp_cmp(str, exp) +#define WILDPAT_CASECMP(str, exp) regexp_casecmp(str, exp) +#define WILDPAT_USES_REGEXP 1 + +/* Define return codes from WILDPAT_VALID */ +#define NON_WILDPAT -1 /* exp is ordinary string */ +#define INVALID_WILDPAT -2 /* exp is an invalid pattern */ +#define VALID_WILDPAT 1 /* exp is a valid pattern */ + +#else + +/* WILDPAT uses shell expressions */ +#define WILDPAT_VALID(exp) shexp_valid(exp) +#define WILDPAT_MATCH(str, exp) shexp_match(str, exp) +#define WILDPAT_CMP(str, exp) shexp_cmp(str, exp) +#define WILDPAT_CASECMP(str, exp) shexp_casecmp(str, exp) +#define WILDPAT_USES_SHEXP 1 + +/* Define return codes from WILDPAT_VALID */ +#define NON_WILDPAT -1 /* exp is ordinary string */ +#define INVALID_WILDPAT -2 /* exp is an invalid pattern */ +#define VALID_WILDPAT 1 /* exp is a valid pattern */ + +#endif /* USE_REGEX */ + +/* Define return codes from regexp_valid and shexp_valid */ +#define NON_SXP NON_WILDPAT /* exp is an ordinary string */ +#define INVALID_SXP INVALID_WILDPAT /* exp is an invalid shell exp */ +#define VALID_SXP VALID_WILDPAT /* exp is a valid shell exp */ + +#ifdef USE_REGEX +/* and regexp versions */ +#define NON_REGEXP NON_SXP +#define INVALID_REGEXP INVALID_SXP +#define VALID_REGEXP VALID_SXP +#endif + +#define SYSTHREAD_DEFAULT_PRIORITY 16 + +/* The longest line in the configuration file */ +#define CONF_MAXLEN 16384 + +#define HTTP_DATE_LEN 128 +#ifdef XP_UNIX +#define HTTP_DATE_FMT "%A, %d-%b-%y %T GMT" +#else /* XP_WIN32 */ +#define HTTP_DATE_FMT "%A, %d-%b-%y %H:%M:%S GMT" +#endif /* XP_WIN32 */ + +/* HTTP status codes */ +#define PROTOCOL_CONTINUE 100 /* HTTP/1.1 */ +#define PROTOCOL_SWITCHING 101 /* HTTP/1.1 */ +#define PROTOCOL_OK 200 +#define PROTOCOL_CREATED 201 +#define PROTOCOL_NO_RESPONSE 204 +#define PROTOCOL_PARTIAL_CONTENT 206 +#define PROTOCOL_REDIRECT 302 +#define PROTOCOL_NOT_MODIFIED 304 +#define PROTOCOL_BAD_REQUEST 400 +#define PROTOCOL_UNAUTHORIZED 401 +#define PROTOCOL_FORBIDDEN 403 +#define PROTOCOL_NOT_FOUND 404 +#define PROTOCOL_METHOD_NOT_ALLOWED 405 /*HTTP/1.1 */ +#define PROTOCOL_PROXY_UNAUTHORIZED 407 +#define PROTOCOL_CONFLICT 409 /* HTTP/1.1 */ +#define PROTOCOL_LENGTH_REQUIRED 411 /*HTTP/1.1 */ +#define PROTOCOL_PRECONDITION_FAIL 412 /*HTTP/1.1 */ +#define PROTOCOL_ENTITY_TOO_LARGE 413 /*HTTP/1.1 */ +#define PROTOCOL_URI_TOO_LARGE 414 /*HTTP/1.1 */ +#define PROTOCOL_SERVER_ERROR 500 +#define PROTOCOL_NOT_IMPLEMENTED 501 +#define PROTOCOL_VERSION_NOT_SUPPORTED 505 /*HTTP/1.1 */ + +#define CURRENT_PROTOCOL_VERSION 101 + +/* Definitions for HTTP over SSL */ +#define HTTPS_PORT 443 +#define HTTPS_URL "https" + +/* Definitions for HTTP over TCP */ +#define HTTP_PORT 80 +#define HTTP_URL "http" + + +#define REQ_MAX_LINE 4096 + +/* + * The REQ_ return codes. These codes are used to determine what the server + * should do after a particular module completes its task. + * + * Func type functions return these as do many internal functions. + */ + +/* The function performed its task, proceed with the request */ +#define REQ_PROCEED 0 +/* The entire request should be aborted: An error occurred */ +#define REQ_ABORTED -1 +/* The function performed no task, but proceed anyway. */ +#define REQ_NOACTION -2 +/* Tear down the session and exit */ +#define REQ_EXIT -3 +/* Restart the entire request-response process */ +#define REQ_RESTART -4 + +/* --- End miscellaneous definitions --- */ + +/* --- Begin native platform includes --- */ + +#if defined(FILE_UNIX) || defined(FILE_UNIX_MMAP) +#include <sys/types.h> /* caddr_t */ +#include <sys/file.h> +#include <fcntl.h> +#include <unistd.h> +#endif + +#ifdef FILE_WIN32 +#include <direct.h> +#endif /* FILE_WIN32 */ + +#ifdef NET_WINSOCK +#include <winsock.h> +struct iovec { + char *iov_base; + unsigned iov_len; +}; +#else +#if !defined(SUNOS4) && !defined(HPUX) && !defined(LINUX) +#include <sys/select.h> +#endif +#include <sys/time.h> /* struct timeval */ +#include <sys/socket.h> +#include <netinet/in.h> /* sockaddr and in_addr */ +#include <sys/uio.h> +#endif /* NET_WINSOCK */ + +#include <sys/stat.h> + +#include <ctype.h> /* isspace */ +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <time.h> + +#ifdef XP_UNIX +#include <dirent.h> +#include <pwd.h> /* struct passwd */ +#endif /* XP_UNIX */ +#include "libadminutil/psetc.h" + +/* --- End native platform includes --- */ + +/* --- Begin type definitions --- */ + +#ifndef SYS_FILE_T +typedef void *SYS_FILE; +#define SYS_FILE_T void * +#endif /* !SYS_FILE_T */ + +#define SYS_ERROR_FD ((SYS_FILE)-1) + +#ifndef SYS_NETFD_T +typedef void *SYS_NETFD; +#define SYS_NETFD_T void * +#endif /* !SYS_NETFD_T */ + +/* Error value for a SYS_NETFD */ +#ifndef SYS_NET_ERRORFD +#define SYS_NET_ERRORFD ((SYS_NETFD)-1) +#endif /* !SYS_NET_ERRORFD */ + +/* + * Type: filebuffer, filebuf_t + * + * Description: + * + * This structure is used to represent a buffered file. On some + * systems the file may be memory-mapped. A filebuffer is created + * by filebuf_open(), and destroyed by filebuf_close(). + * + * Notes: + * + * Direct access to the members of this structure, not using + * macros defined here, is discouraged. + * + * The filebuf alias that used to be defined for this type was + * found to conflict with a C++ class of the same name, so it + * has been renamed to filebuf_t. + * + * The inbuf field used to be (char *), but is now (unsigned char *) + * to simplify handling of 8-bit data. The value returned by the + * filebuf_getc() macro is the (unsigned char) casted to (int), or + * an error code. Unfortunately, IO_EOF cannot be distinguished + * from a zero byte, but a new function, filebuf_iseof(), is + * provided that will indicate definitively whether EOF has been + * reached. + */ + +#ifdef FILE_MMAP + +/* Version of filebuffer when memory-mapped files are supported */ +typedef struct { + SYS_FILE fd; +#ifdef FILE_UNIX_MMAP + caddr_t fp; +#else /* FILE_WIN32_MMAP */ + HANDLE fdmap; + char *fp; +#endif /* FILE_UNIX_MMAP */ + int len; + + unsigned char *inbuf; /* for buffer_grab */ + int cursize; + + int pos; + char *errmsg; +} filebuffer; + +/* Return next character or IO_EOF */ +#define filebuf_getc(b) ((b)->pos == (b)->len ? IO_EOF : (int)((unsigned char *)(b)->fp)[(b)->pos++]) + +#define filebuf_iseof(b) ((b)->pos == (b)->len) + +#else + +/* Version of filebuffer with no memory-mapped file support */ +typedef struct { + SYS_FILE fd; + + int pos, cursize, maxsize; + unsigned char *inbuf; + char *errmsg; +} filebuffer; + +/* Return next character, IO_EOF, or IO_ERROR */ +#define filebuf_getc(b) \ + ((b)->pos != (b)->cursize ? (int)((b)->inbuf[(b)->pos++]) : filebuf_next(b,1)) + +#endif /* FILE_MMAP */ + +/* C++ streamio defines a filebuf class. */ +typedef filebuffer filebuf_t; + +#ifdef XP_WIN32 +/* Use a filebuffer to read data from a pipe */ +#define pipebuf_getc(b) \ + ((b)->pos != (b)->cursize ? (int)((b)->inbuf[(b)->pos++]) : pipebuf_next(b,1)) +#endif /* XP_WIN32 */ + +/* + * Type: netbuf + * + * Description: + * + * This structure is used to represent a buffered network socket. + * It is created by netbuf_open(), and destroyed by netbuf_close(). + * + * Notes: + * + * Direct access to the members of this structure, not using + * macros defined here, is discouraged. + * + * The inbuf field used to be (unsigned char *), but is now + * simply (char *). The value returned by the netbuf_getc() + * macro is (int). + */ + +typedef struct { + SYS_NETFD sd; + + int pos, cursize, maxsize, rdtimeout; +#ifdef XP_WIN32 + CHAR address[64]; +#endif /* XP_WIN32 */ + unsigned char *inbuf; + char *errmsg; +#ifndef XP_WIN32 + char address[64]; +#endif /* !XP_WIN32 */ +} netbuf; + +/* + * netbuf_getc gets a character from the given network buffer and returns + * it. (as an integer). + * + * It will return (int) IO_ERROR for an error and (int) IO_EOF for + * an error condition or EOF respectively. + */ + +#define netbuf_getc(b) \ + ((b)->pos != (b)->cursize ? (int)((b)->inbuf[(b)->pos++]) : netbuf_next(b,1)) + +/* + * buffer_error returns the last error that occurred with buffer. Don't use + * this unless you know an error occurred. Independent of network/file type. + */ + +#define buffer_error(b) ((b)->errmsg) + +/* + * Type: cinfo + * + * Description: + * + * This is a structure that captures the information in the name/value + * pairs on one line of a mime.types file. A cinfo structure is + * stored in the memory-resident database, indexed by each of the + * file extensions specified in the "exts" name/value pair. It + * defines various attributes of resources with names containing + * the specified file extensions. + * + * Notes: + * + * Pointers to cinfo structures returned by this API may or may not + * need to freed by the caller. See the individual function + * descriptions. + * + * The strings referenced by the fields of cinfo structures returned + * by this API should be considered read-only, and do not need to be + * freed by the caller, even when the cinfo structure does. + */ + +typedef struct { + char *type; + char *encoding; + char *language; +} cinfo; + + +typedef void* CONDVAR; +typedef void *COUNTING_SEMAPHORE; +typedef void* CRITICAL; + +#ifdef XP_UNIX +typedef struct passwd *PASSWD; +typedef DIR* SYS_DIR; +typedef struct dirent SYS_DIRENT; +#endif /* XP_UNIX */ + +#ifdef XP_WIN32 + +typedef struct { + char *d_name; +} dirent_s; + +typedef struct { + HANDLE dp; + WIN32_FIND_DATA fdata; + dirent_s de; +} dir_s; + +typedef dir_s* SYS_DIR; +typedef dirent_s SYS_DIRENT; + +#endif /* XP_WIN32 */ + +typedef struct { + char *name,*value; +} pb_param; + +struct pb_entry { + pb_param *param; + struct pb_entry *next; +}; + +typedef struct { + int hsize; + struct pb_entry **ht; +} pblock; + +#ifndef POOL_HANDLE_T +#define POOL_HANDLE_T +typedef void *pool_handle_t; +#endif + +#ifndef SEMAPHORE_T +typedef void *SEMAPHORE; +#define SEMAPHORE_T void * +#endif /* !SEMAPHORE_T */ + +#define SESSION_HASHSIZE 5 + +typedef struct PListStruct_s PListStruct_s; +typedef struct ACLListHandle ACLListHandle; + +typedef struct Session { + /* Client-specific information */ + pblock *client; + + SYS_NETFD csd; + netbuf *inbuf; + int csd_open; + + struct in_addr iaddr; + +#ifdef MCC_PROXY + int req_cnt; +#endif + +#ifdef MALLOC_POOLS + pool_handle_t *pool; +#endif /* MALLOC_POOLS */ + + void *clauth; /* ACL client authentication information */ + struct Session *next; + int fill; + struct sockaddr_in local_addr; /* local addr for this session*/ + + PListStruct_s *subject; +} Session; + +#if defined (SHMEM_UNIX_MMAP) || defined (SHMEM_WIN32_MMAP) +typedef struct { + void *data; /* the data */ +#ifdef SHMEM_WIN32_MMAP + HANDLE fdmap; +#endif /* SHMEM_WIN32_MMAP */ + int size; /* the maximum length of the data */ + + char *name; /* internal use: filename to unlink if exposed */ + SYS_FILE fd; /* internal use: file descriptor for region */ +} shmem_s; +#endif /* SHMEM_UNIX_MMAP || SHMEM_WIN32_MMAP */ + + +/* Define a handle for a thread */ +typedef void* SYS_THREAD; + +/* Define an error value for the thread handle */ +#define SYS_THREAD_ERROR NULL + +/* + * Hierarchy of httpd_object + * + * An object contains dtables. + * + * Each dtable is a table of directives that were entered of a certain type. + * There is one dtable for each unique type of directive. + * + * Each dtable contains an array of directives, each of which is equivalent + * to one directive that occurred in a config. file. + * + * It is up to the caller to determine how many dtables will be allocated + * and to keep track of which of their directive types maps to which dtable + * number. + */ + + +/* + * directive is a structure containing the protection and parameters to an + * instance of a directive within an httpd_object. + * + * param is the parameters, client is the protection. + */ + +typedef struct { + pblock *param; + pblock *client; +} directive; + +/* + * dtable is a structure for creating tables of directives + */ + +typedef struct { + int ni; + directive *inst; +} dtable; + +/* + * The httpd_object structure. + * + * The name pblock array contains the names for this object, such as its + * virtual location, its physical location, or its identifier. + * + * tmpl contains any templates allocated to this object. + */ + +typedef struct { + pblock *name; + + int nd; + dtable *dt; +} httpd_object; + +/* + * httpd_objset is a container for a bunch of objects. obj is a + * NULL-terminated array of objects. pos points to the entry after the last + * one in the array. You should not mess with pos, but can read it to find + * the last entry. + * + * The initfns array is a NULL-terminated array of the Init functions + * associated with this object set. If there are no Init functions associated + * with this object set, initfns can be NULL. Each pblock specifies the + * parameters which are passed to the function when it's executed. + */ + +typedef struct { + int pos; + httpd_object **obj; + + pblock **initfns; +} httpd_objset; + + +typedef struct { + + /* What port we listen to */ + int Vport; +#define server_portnum conf_getglobals()->Vport + + /* What address to bind to */ + char *Vaddr; + + /* User to run as */ +#define user_pw conf_getglobals()->Vuserpw + struct passwd *Vuserpw; + + /* Directory to chroot to */ + char *Vchr; + + /* Where to log our pid to */ + char *Vpidfn; + +#define pool_max conf_getglobals()->Vpool_max + int Vpool_max; /* OBSOLETE */ +#define pool_min conf_getglobals()->Vpool_min + int Vpool_min; /* OBSOLETE */ +#define pool_life conf_getglobals()->Vpool_life + int Vpool_life; /* OBSOLETE */ + + /* For multiprocess UNIX servers, the maximum threads per process */ +#define pool_maxthreads conf_getglobals()->Vpool_maxthreads + int Vpool_maxthreads; + +#define pool_minthreads conf_getglobals()->Vpool_minthreads + int Vpool_minthreads; /* OBSOLETE */ + + char *Vsecure_keyfn; + char *Vsecure_certfn; + +#define security_active conf_getglobals()->Vsecurity_active + int Vsecurity_active; +#define ssl3_active conf_getglobals()->Vssl3_active + int Vssl3_active; +#define ssl2_active conf_getglobals()->Vssl2_active + int Vssl2_active; + int Vsecure_auth; +#define security_session_timeout conf_getglobals()->Vsecurity_session_timeout + int Vsecurity_session_timeout; +#define ssl3_session_timeout conf_getglobals()->Vssl3_session_timeout + long Vssl3_session_timeout; + + /* The server's hostname as should be reported in self-ref URLs */ +#define server_hostname conf_getglobals()->Vserver_hostname + char *Vserver_hostname; + + /* The main object from which all are derived */ +#define root_object conf_getglobals()->Vroot_object + char *Vroot_object; + + /* The object set the administrator has asked us to load */ +#define std_os conf_getglobals()->Vstd_os + httpd_objset *Vstd_os; + + /* The root of ACL data structures */ + void *Vacl_root; +#define acl_root conf_getglobals()->Vacl_root + + /* The main error log, where all errors are logged */ +#define master_error_log conf_getglobals()->Vmaster_error_log + char *Vmaster_error_log; + + /* The server root ( in which the server sits while executing ) */ +#define server_root conf_getglobals()->Vserver_root + char *Vserver_root; + + /* This server's id */ +#define server_id conf_getglobals()->Vserver_id + char *Vserver_id; + + int single_accept; /* daemon mode Internal use only */ + int num_keep_alives; /* number of KA threads Internal use only */ + int log_verbose; /* Flag to log LOG_VERBOSE messages */ + int mmap_flags; /* mmap flags for file cache mmaping - internal use only */ + int mmap_prots; /* mmap prots for file cache mmaping - internal use only */ + int unused1; + int unused2; + + /* Begin Enterprise 3.0 fields */ + int accept_language; /* turn accept-language on/off */ + + char *mtahost; /* Hostname of the Mail Transport Agent : + * typically "localhost" for the Unix boxes, + * or the hostname of a POP server otherwise. + * Needed by the Agents subsystem. + */ + char *nntphost; /* NNTP server -> for Agents */ + + /* The root of ACL data structures */ + void *Vacl_root_30; +#define acl_root_30 conf_getglobals()->Vacl_root_30 + + /* This is for the agent subsystem */ + /* The name of tha configuration parameter is: "AgentsFilePath" */ + char* agentFilePath; /* path to agent.conf */ +#define AgentFilePath (conf_getglobals()->agentFilePath) + + /* Default allowed methods - */ + int Allowed; +#define AllowedMethods (conf_getglobals()->Allowed) + + pblock *genericGlobals; /* See conf_api.h for details on accessing + * these + */ + + /*Agents ACL file */ + char* agentsACLFile; + int wait_for_cgi; + int cgiwatch_timeout; + +#ifdef FORTEZZA + uint32 fortezza_card_mask; + char *fortezza_personality; + char *krlname; +#endif +} conf_global_vars_s; + +typedef struct { + /* Server working variables */ + pblock *vars; + + /* The method, URI, and protocol revision of this request */ + pblock *reqpb; + /* Protocol specific headers */ + int loadhdrs; + pblock *headers; + + /* Server's response headers */ + int senthdrs; + pblock *srvhdrs; + + /* The object set constructed to fulfill this request */ + httpd_objset *os; + /* Array of objects that were created from .nsconfig files */ + httpd_objset *tmpos; + + /* The stat last returned by request_stat_path */ + char *statpath; + char *staterr; + struct stat *finfo; + + /* access control state */ + int aclstate; /* ACL decision state */ + int acldirno; /* deciding ACL directive number */ + char * aclname; /* name of deciding ACL */ + pblock * aclpb; /* parameter block for ACL PathCheck */ + /* 3.0 ACL list pointer */ + ACLListHandle *acllist; + +#ifdef MCC_PROXY + struct hostent *hp; /* proxy NSAPI: DNS resolution result */ + char * host; /* proxy NSAPI: host to resolve/connect to */ + int port; /* proxy NSAPI: port to connect to */ + + void * socks_rq; /* SOCKS request data */ +#endif + + int request_is_cacheable; /* default TRUE */ + int directive_is_cacheable; /* default FALSE */ + + char *cached_headers; + int cached_headers_len; /* length of the valid headers */ + char *unused; + + /* HTTP/1.1 features */ + time_t req_start; /* Time request arrived - used for determining weak or*/ + /* strong cache validation */ +#define REQ_TIME(x) (x)->req_start + short protv_num; /* Protocol Version number */ + short method_num; /* Method number */ + struct rq_attr { +#ifdef AIX + unsigned abs_uri:1; /* 1=Absolute URI was used */ + unsigned chunked:1; /* chunked transfer-coding */ + unsigned keep_alive:1; /* connection keek-alive */ + unsigned pipelined:1; /* request packet is pipelined */ + unsigned reserved:28; /* If you add a bit flag, make */ + /* sure to subtract one from this */ +#else + unsigned long abs_uri:1; /* 1=Absolute URI was used */ + unsigned long chunked:1; /* chunked transfer-coding */ + unsigned long keep_alive:1; /* connection keek-alive */ + unsigned pipelined:1; /* request packet is pipelined */ + unsigned long reserved:28; /* If you add a bit flag, make */ + /* sure to subtract one from this */ +#endif + }rq_attr; + char * hostname; /* Not NULL if abs_uri */ + int allowed; /* Allowed METHODs for this server */ + int byterange; /* number of byte ranges */ + short status_num; /* Status code */ + + int staterrno; /* used for rqstat */ +} Request; + +/* Request attribute macros */ +#define ABS_URI(x) (x)->rq_attr.abs_uri +#define CHUNKED(x) (x)->rq_attr.chunked +#define KEEP_ALIVE(x) (x)->rq_attr.keep_alive +#define PIPELINED(x) (x)->rq_attr.pipelined + +/* Define METHODS for HTTP/1.1 */ +#define METHOD_HEAD 0 +#define METHOD_GET 1 +#define METHOD_PUT 2 +#define METHOD_POST 3 +#define METHOD_DELETE 4 +#define METHOD_TRACE 5 +#define METHOD_OPTIONS 6 +/* The following methods are Netscape method extensions */ +#define METHOD_MOVE 7 +#define METHOD_INDEX 8 +#define METHOD_MKDIR 9 +#define METHOD_RMDIR 10 +#define METHOD_COPY 11 +#define METHOD_MAX 12 /* Number of methods available on this server */ + +#define ISMGET(r) ((r)->method_num == METHOD_GET) +#define ISMHEAD(r) ((r)->method_num == METHOD_HEAD) +#define ISMPUT(r) ((r)->method_num == METHOD_PUT) +#define ISMPOST(r) ((r)->method_num == METHOD_POST) +#define ISMDELETE(r) ((r)->method_num == METHOD_DELETE) +#define ISMMOVE(r) ((r)->method_num == METHOD_MOVE) +#define ISMINDEX(r) ((r)->method_num == METHOD_INDEX) +#define ISMMKDIR(r) ((r)->method_num == METHOD_MKDIR) +#define ISMRMDIR(r) ((r)->method_num == METHOD_RMDIR) +#define ISMCOPY(r) ((r)->method_num == METHOD_COPY) +#define ISMTRACE(r) ((r)->method_num == METHOD_TRACE) +#define ISMOPTIONS(r) ((r)->method_num == METHOD_OPTIONS) + +/* + * FuncPtr is a pointer to our kind of functions + */ + +#ifdef XP_UNIX +typedef int Func(pblock *, Session *, Request *); +#else /* XP_WIN32 */ +typedef int _cdecl Func(pblock *, Session *, Request *); +#endif /* XP_WIN32 */ + +typedef Func *FuncPtr; + +/* + * FuncStruct is a structure used in the static declaration of the + * functions. This static declaration is parsed into a hash table at + * startup. You should initialize the next entry to NULL. + */ + +struct FuncStruct { + char *name; + FuncPtr func; + struct FuncStruct *next; + int flags; +}; + +/* --- End type definitions --- */ + +/* --- Begin dispatch vector table definition --- */ + +typedef struct nsapi_dispatch_s nsapi_dispatch_t; +struct nsapi_dispatch_s { + char *(*f_system_version)(); + void *(*f_system_malloc)(int size); + void *(*f_system_calloc)(int size); + void *(*f_system_realloc)(void *ptr, int size); + void (*f_system_free)(void *ptr); + char *(*f_system_strdup)(const char *ptr); + void *(*f_system_malloc_perm)(int size); + void *(*f_system_calloc_perm)(int size); + void *(*f_system_realloc_perm)(void *ptr, int size); + void (*f_system_free_perm)(void *ptr); + char *(*f_system_strdup_perm)(const char *ptr); + int (*f_getThreadMallocKey)(void); + void (*f_magnus_atrestart)(void (*fn)(void *), void *data); + filebuf_t *(*f_filebuf_open)(SYS_FILE fd, int sz); + netbuf *(*f_netbuf_open)(SYS_NETFD sd, int sz); + filebuf_t *(*f_filebuf_create)(SYS_FILE fd, caddr_t mmap_ptr, + int mmap_len, int bufsz); + void (*f_filebuf_close_buffer)(filebuf_t *buf, int clean_mmap); +#ifdef FILE_MMAP + filebuf_t *(*f_filebuf_open_nostat)(SYS_FILE fd, int sz, + struct stat *finfo); +#else + void *(*f_filebuf_open_nostat)(void); +#endif +#ifdef XP_WIN32 + filebuf_t *(*f_pipebuf_open)(SYS_FILE fd, int sz, struct stat *finfo); +#else + void *(*f_pipebuf_open)(void); +#endif /* XP_WIN32 */ +#ifndef FILE_MMAP + int (*f_filebuf_next)(filebuf_t *buf, int advance); +#else + int (*f_filebuf_next)(void); +#endif /* !FILE_MMAP */ + int (*f_netbuf_next)(netbuf *buf, int advance); +#ifdef XP_WIN32 + int (*f_pipebuf_next)(filebuf_t *buf, int advance); +#else + int (*f_pipebuf_next)(void); +#endif /* XP_WIN32 */ + void (*f_filebuf_close)(filebuf_t *buf); + void (*f_netbuf_close)(netbuf *buf); +#ifdef XP_WIN32 + void (*f_pipebuf_close)(filebuf_t *buf); +#else + void (*f_pipebuf_close)(void); +#endif /* XP_WIN32 */ + int (*f_filebuf_grab)(filebuf_t *buf, int sz); + int (*f_netbuf_grab)(netbuf *buf, int sz); +#ifdef XP_WIN32 + int (*f_pipebuf_grab)(filebuf_t *buf, int sz); +#else + int (*f_pipebuf_grab)(void); +#endif /* XP_WIN32 */ + int (*f_netbuf_buf2sd)(netbuf *buf, SYS_NETFD sd, int len); + int (*f_filebuf_buf2sd)(filebuf_t *buf, SYS_NETFD sd); +#ifdef XP_WIN32 + int (*f_pipebuf_buf2sd)(filebuf_t *buf, SYS_NETFD sd, int len); + int (*f_pipebuf_netbuf2sd)(netbuf *buf, SYS_FILE sd, int len); + int (*f_pipebuf_netbuf2pipe)(netbuf *buf, SYS_NETFD sd, int len); +#else + int (*f_pipebuf_buf2sd)(void); + int (*f_pipebuf_netbuf2sd)(void); + int (*f_pipebuf_netbuf2pipe)(void); +#endif /* XP_WIN32 */ + void (*f_cinfo_init)(void); + void (*f_cinfo_terminate)(void); + char *(*f_cinfo_merge)(char *fn); + cinfo *(*f_cinfo_find)(char *uri); + cinfo *(*f_cinfo_lookup)(char *type); + void (*f_cinfo_dump_database)(FILE *dump); + CRITICAL (*f_crit_init)(void); + void (*f_crit_enter)(CRITICAL id); + void (*f_crit_exit)(CRITICAL id); + void (*f_crit_terminate)(CRITICAL id); + CONDVAR (*f_condvar_init)(CRITICAL id); + void (*f_condvar_wait)(CONDVAR cv); + void (*f_condvar_notify)(CONDVAR cv); + void (*f_condvar_notifyAll)(CONDVAR cv); + void (*f_condvar_terminate)(CONDVAR cv); + COUNTING_SEMAPHORE (*f_cs_init)(int initial_count); + void (*f_cs_terminate)(COUNTING_SEMAPHORE csp); + int (*f_cs_wait)(COUNTING_SEMAPHORE csp); + int (*f_cs_trywait)(COUNTING_SEMAPHORE csp); + int (*f_cs_release)(COUNTING_SEMAPHORE csp); + void (*f_daemon_atrestart)(void (*fn)(void *), void *data); +#ifdef FORTEZZA + /* THIS IS BOGUS... WHO Decided to export servssl_init!!! It should not + * be a public function. + */ + void (*f_servssl_init)(void); +#else + void (*f_servssl_init)(PsetHndl pset, PRFileDesc *fd, char *admRoot); +#endif + int (*f_ereport)(int degree, char *fmt, ...); + int (*f_ereport_v)(int degree, char *fmt, va_list args); + char *(*f_ereport_init)(char *err_fn, char *email, + PASSWD pwuser, char *version); + void (*f_ereport_terminate)(void); + SYS_FILE (*f_ereport_getfd)(void); + SYS_FILE (*f_system_fopenRO)(char *path); + SYS_FILE (*f_system_fopenWA)(char *path); + SYS_FILE (*f_system_fopenRW)(char *path); + SYS_FILE (*f_system_fopenWT)(char *path); + int (*f_system_fread)(SYS_FILE fd, char *buf, int sz); + int (*f_system_fwrite)(SYS_FILE fd,char *buf,int sz); + int (*f_system_fwrite_atomic)(SYS_FILE fd, char *buf, int sz); + int (*f_system_lseek)(SYS_FILE fd, int off, int wh); + int (*f_system_fclose)(SYS_FILE fd); + int (*f_system_stat)(char *name, struct stat *finfo); + int (*f_system_rename)(char *oldpath, char *newpath); + int (*f_system_unlink)(char *path); + int (*f_system_tlock)(SYS_FILE fd); + int (*f_system_flock)(SYS_FILE fd); + int (*f_system_ulock)(SYS_FILE fd); +#ifdef XP_WIN32 + SYS_DIR (*f_dir_open)(char *path); + SYS_DIRENT *(*f_dir_read)(SYS_DIR ds); + void (*f_dir_close)(SYS_DIR ds); +#else + void *(*f_dir_open)(void); + void *(*f_dir_read)(void); + void (*f_dir_close)(void); +#endif /* XP_WIN32 */ + int (*f_dir_create_all)(char *dir); +#ifdef XP_WIN32 + char *(*f_system_winsockerr)(void); + char *(*f_system_winerr)(void); + int (*f_system_pread)(SYS_FILE fd, char *buf, int sz); + int (*f_system_pwrite)(SYS_FILE fd, char *buf, int sz); + void (*f_file_unix2local)(char *path, char *p2); +#else + void *(*f_system_winsockerr)(void); + void *(*f_system_winerr)(void); + int (*f_system_pread)(void); + int (*f_system_pwrite)(void); + void (*f_file_unix2local)(void); +#endif /* XP_WIN32 */ + int (*f_system_nocoredumps)(void); + int (*f_file_setinherit)(SYS_FILE fd, int value); + int (*f_file_notfound)(void); + char *(*f_system_errmsg)(void); + int (*f_system_errmsg_fn)(char **buff, size_t maxlen); + SYS_NETFD (*f_net_socket)(int domain, int type, int protocol); + int (*f_net_listen)(SYS_NETFD s, int backlog); + SYS_NETFD (*f_net_create_listener)(char *ipaddr, int port); + int (*f_net_connect)(SYS_NETFD s, const void *sockaddr, int namelen); + int (*f_net_getpeername)(SYS_NETFD s, struct sockaddr *name, int *namelen); + int (*f_net_close)(SYS_NETFD s); + int (*f_net_bind)(SYS_NETFD s, const struct sockaddr *name, int namelen); + SYS_NETFD (*f_net_accept)(SYS_NETFD s, struct sockaddr *addr, int *addrlen); + int (*f_net_read)(SYS_NETFD sd, char *buf, int sz, int timeout); + int (*f_net_write)(SYS_NETFD sd, char *buf, int sz); + int (*f_net_writev)(SYS_NETFD sd, struct iovec *iov, int iovlen); + int (*f_net_isalive)(SYS_NETFD sd); + char *(*f_net_ip2host)(char *ip, int verify); + int (*f_net_getsockopt)(SYS_NETFD s, int level, int optname, + void *optval, int *optlen); + int (*f_net_setsockopt)(SYS_NETFD s, int level, int optname, + const void *optval, int optlen); + int (*f_net_select)(int nfds, fd_set *r, fd_set *w, fd_set *e, + struct timeval *timeout); + int (*f_net_ioctl)(SYS_NETFD s, int tag, void *result); + pb_param *(*f_param_create)(char *name, char *value); + int (*f_param_free)(pb_param *pp); + pblock *(*f_pblock_create)(int n); + void (*f_pblock_free)(pblock *pb); + char *(*f_pblock_findval)(const char *name, pblock *pb); + pb_param *(*f_pblock_nvinsert)(const char *name, const char *value, pblock *pb); + pb_param *(*f_pblock_nninsert)(const char *name, int value, pblock *pb); + void (*f_pblock_pinsert)(pb_param *pp, pblock *pb); + int (*f_pblock_str2pblock)(const char *str, pblock *pb); + char *(*f_pblock_pblock2str)(pblock *pb, char *str); + void (*f_pblock_copy)(pblock *src, pblock *dst); + pblock *(*f_pblock_dup)(pblock *src); + char **(*f_pblock_pb2env)(pblock *pb, char **env); + pb_param *(*f_pblock_fr)(const char *name, pblock *pb, int remove); + char * (*f_pblock_replace)(const char *name,char * new_value,pblock *pb); + pool_handle_t *(*f_pool_create)(void); + void (*f_pool_destroy)(pool_handle_t *pool_handle); + int (*f_pool_enabled)(void); + void *(*f_pool_malloc)(pool_handle_t *pool_handle, size_t size ); + void (*f_pool_free)(pool_handle_t *pool_handle, void *ptr ); + void *(*f_pool_calloc)(pool_handle_t *pool_handle, size_t nelem, size_t elsize); + void *(*f_pool_realloc)(pool_handle_t *pool_handle, void *ptr, size_t size ); + char *(*f_pool_strdup)(pool_handle_t *pool_handle, const char *orig_str ); +#if defined(MCC_PROXY) && defined(USE_REGEX) + int (*f_regexp_valid)(char *exp); + int (*f_regexp_match)(char *str, char *exp); + int (*f_regexp_cmp)(char *str, char *exp); + int (*f_regexp_casecmp)(char *str, char *exp); +#else + int (*f_regexp_valid)(void); + int (*f_regexp_match)(void); + int (*f_regexp_cmp)(void); + int (*f_regexp_casecmp)(void); +#endif + SEMAPHORE (*f_sem_init)(char *name, int number); + void (*f_sem_terminate)(SEMAPHORE id); + int (*f_sem_grab)(SEMAPHORE id); + int (*f_sem_tgrab)(SEMAPHORE id); + int (*f_sem_release)(SEMAPHORE id); + Session *(*f_session_alloc)(SYS_NETFD csd, struct sockaddr_in *sac); /* internal */ + Session *(*f_session_fill)(Session *sn); /* internal */ + Session *(*f_session_create)(SYS_NETFD csd, struct sockaddr_in *sac); + void (*f_session_free)(Session *sn); + char *(*f_session_dns_lookup)(Session *sn, int verify); + int (*f_shexp_valid)(char *exp); + int (*f_shexp_match)(char *str, char *exp); + int (*f_shexp_cmp)(char *str, char *exp); + int (*f_shexp_casecmp)(char *str, char *exp); +#if defined (SHMEM_UNIX_MMAP) || defined (SHMEM_WIN32_MMAP) + shmem_s *(*f_shmem_alloc)(char *name, int size, int expose); + void (*f_shmem_free)(shmem_s *region); +#else + void *(*f_shmem_alloc)(void); + void (*f_shmem_free)(void); +#endif /* SHMEM_UNIX_MMAP || SHMEM_WIN32_MMAP */ + SYS_THREAD (*f_systhread_start)(int prio, int stksz, void (*fn)(void *), void *arg); + SYS_THREAD (*f_systhread_current)(void); + void (*f_systhread_yield)(void); + SYS_THREAD (*f_systhread_attach)(void); + void (*f_systhread_detach)(SYS_THREAD thr); + void (*f_systhread_terminate)(SYS_THREAD thr); + void (*f_systhread_sleep)(int milliseconds); + void (*f_systhread_init)(char *name); + void (*f_systhread_timerset)(int usec); + int (*f_systhread_newkey)(void); + void *(*f_systhread_getdata)(int key); + void (*f_systhread_setdata)(int key, void *data); + void (*f_systhread_set_default_stacksize)(unsigned long size); + int (*f_util_getline)(filebuffer *buf, int lineno, int maxlen, char *l); + char **(*f_util_env_create)(char **env, int n, int *pos); + char *(*f_util_env_str)(char *name, char *value); + void (*f_util_env_replace)(char **env, char *name, char *value); + void (*f_util_env_free)(char **env); + char **(*f_util_env_copy)(char **src, char **dst); + char *(*f_util_env_find)(char **env, char *name); + char *(*f_util_hostname)(void); + int (*f_util_chdir2path)(char *path); + int (*f_util_is_mozilla)(char *ua, char *major, char *minor); + int (*f_util_is_url)(char *url); + int (*f_util_later_than)(struct tm *lms, char *ims); + int (*f_util_time_equal)(struct tm *lms, char *ims); + int (*f_util_str_time_equal)(char *t1, char *t2); + int (*f_util_uri_is_evil)(char *t); + void (*f_util_uri_parse)(char *uri); + void (*f_util_uri_unescape)(char *s); + char *(*f_util_uri_escape)(char *d, char *s); + char *(*f_util_url_escape)(char *d, char *s); + char *(*f_util_sh_escape)(char *s); + int (*f_util_mime_separator)(char *sep); + int (*f_util_itoa)(int i, char *a); + int (*f_util_vsprintf)(char *s, register const char *fmt, va_list args); + int (*f_util_sprintf)(char *s, const char *fmt, ...); + int (*f_util_vsnprintf)(char *s, int n, register const char *fmt, + va_list args); + int (*f_util_snprintf)(char *s, int n, const char *fmt, ...); + int (*f_util_strftime)(char *s, const char *format, const struct tm *t); + char *(*f_util_strtok)(char *s1, const char *s2, char **lasts); + struct tm *(*f_util_localtime)(const time_t *clock, struct tm *res); + char *(*f_util_ctime)(const time_t *clock, char *buf, int buflen); + char *(*f_util_strerror)(int errnum, char *msg, int buflen); + struct tm *(*f_util_gmtime)(const time_t *clock, struct tm *res); + char *(*f_util_asctime)(const struct tm *tm,char *buf, int buflen); +#ifdef NEED_STRCASECMP + int (*f_util_strcasecmp)(CASECMPARG_T char *one, CASECMPARG_T char *two); +#else + int (*f_util_strcasecmp)(void); +#endif /* NEED_STRCASECMP */ +#ifdef NEED_STRNCASECMP + int (*f_util_strncasecmp)(CASECMPARG_T char *one, CASECMPARG_T char *two, int n); +#else + int (*f_util_strncasecmp)(void); +#endif /* NEED_STRNCASECMP */ +#ifdef XP_UNIX + int (*f_util_can_exec)(struct stat *finfo, uid_t uid, gid_t gid); + struct passwd *(*f_util_getpwnam)(const char *name, struct passwd + *result, char *buffer, int buflen); + pid_t (*f_util_waitpid)(pid_t pid, int *statptr, int options); +#else + int (*f_util_can_exec)(void); + void *(*f_util_getpwnam)(void); + int (*f_util_waitpid)(void); +#endif /* XP_UNIX */ +#ifdef XP_WIN32 + VOID (*f_util_delete_directory)(char *FileName, BOOL delete_directory); +#else + void (*f_util_delete_directory)(void); +#endif /* XP_WIN32 */ + char *(*f_conf_init)(char *cfn); + char *(*f_conf_run_init_functions)(void); + void (*f_conf_terminate)(void); + conf_global_vars_s *(*f_conf_getglobals)(void); + void (*f_func_init)(struct FuncStruct *func_standard); + FuncPtr (*f_func_find)(char *name); + int (*f_func_exec)(pblock *pb, Session *sn, Request *rq); + struct FuncStruct *(*f_func_insert)(char *name, FuncPtr fn); + int (*f_object_execute)(directive *inst, Session *sn, void *rq); + Request *(*f_http_find_request)(netbuf *buf, Session *sn, int *reply); + int (*f_http_parse_request)(char *t, Request *rq, Session *sn); + int (*f_http_scan_headers)(Session *sn, netbuf *buf, char *t, + pblock *headers); + int (*f_http_start_response)(Session *sn, Request *rq); + char **(*f_http_hdrs2env)(pblock *pb); + void (*f_http_status)(Session *sn, Request *rq, int n, char *r); + int (*f_http_set_finfo)(Session *sn, Request *rq, struct stat *finfo); + char *(*f_http_dump822)(pblock *pb, char *t, int *pos, int tsz); + void (*f_http_finish_request)(Session *sn, Request *rq); + void (*f_http_handle_session)(Session *sn); + char *(*f_http_uri2url)(const char *prefix, const char *suffix); + char *(*f_http_uri2url_dynamic)(const char *prefix, const char *suffix, + Session *sn, Request *rq); + void (*f_http_set_keepalive_timeout)(int secs); + int (*f_log_error_v)(int degree, char *func, Session *sn, Request *rq, + char *fmt, va_list args); + int (*f_log_error)(int degree, char *func, Session *sn, Request *rq, + char *fmt, ...); + int (*f_log_ereport_v)(int degree, char *fmt, va_list args); + int (*f_log_ereport)(int degree, char *fmt, ...); + httpd_object *(*f_object_create)(int nd, pblock *name); + void (*f_object_free)(httpd_object *obj); + void (*f_object_add_directive)(int dc, pblock *p, pblock *c, + httpd_object *obj); + httpd_objset *(*f_objset_scan_buffer)(filebuffer *buf, char *errstr, + httpd_objset *os); + httpd_objset *(*f_objset_create)(void); + void (*f_objset_free)(httpd_objset *os); + void (*f_objset_free_setonly)(httpd_objset *os); + httpd_object *(*f_objset_new_object)(pblock *name, httpd_objset *os); + void (*f_objset_add_object)(httpd_object *obj, httpd_objset *os); + void (*f_objset_add_init)(pblock *initfn, httpd_objset *os); + httpd_object *(*f_objset_findbyname)(char *name, httpd_objset *ign, + httpd_objset *os); + httpd_object *(*f_objset_findbyppath)(char *ppath, httpd_objset *ign, + httpd_objset *os); + Request *(*f_request_create)(void); + void (*f_request_free)(Request *req); + Request *(*f_request_restart_internal)(char *uri, Request *rq); + int (*f_request_header)(char *name, char **value, Session *sn, + Request *rq); + struct stat *(*f_request_stat_path)(char *path, Request *rq); + char *(*f_conf_getServerString)(void); + FuncPtr (*f_func_replace)(char *funcname, FuncPtr fn); + int (*f_net_socketpair)(SYS_NETFD *pair); +#ifdef XP_UNIX + SYS_NETFD (*f_net_dup2)(SYS_NETFD prfd, int osfd); + int (*f_net_is_STDOUT)(SYS_NETFD prfd); + int (*f_net_is_STDIN)(SYS_NETFD prfd); +#else + void *(*f_net_dup2)(void); + int (*f_net_is_STDOUT)(void); + int (*f_net_is_STDIN)(void); +#endif /* XP_UNIX */ + int (*f_func_set_native_thread_flag)(char *name, int flags); + void *(*f_random_create)(void); + void (*f_random_update)(void *rctx, unsigned char *inbuf, int length); + void (*f_random_generate)(void *rctx, unsigned char *outbuf, int length); + void (*f_random_destroy)(void *rctx); + void *(*f_md5hash_create)(void); + void *(*f_md5hash_copy)(void *hctx); + void (*f_md5hash_begin)(void *hctx); + void (*f_md5hash_update)(void *hctx, unsigned char *inbuf, int length); + void (*f_md5hash_end)(void *hctx, unsigned char *outbuf); + void (*f_md5hash_destroy)(void *hctx); + void (*f_md5hash_data)(unsigned char *outbuf, unsigned char *src, int length); + int (*f_ACL_SetupEval)(struct ACLListHandle *acllist, Session *sn, Request *rq, char **rights, char **map_generic, const char *user); + int (*f_netbuf_getbytes)(netbuf *buf, char *buffer, int size); + char *(*f_servact_translate_uri)(char *uri, Session *sn); + +}; + +/* --- End dispatch vector table definition --- */ + +/* --- Begin API macro definitions --- */ + +#ifndef INTNSAPI + +#define system_version (*__nsapi30_table->f_system_version) + +/* + Depending on the system, memory allocated via these macros may come from + an arena. If these functions are called from within an Init function, they + will be allocated from permanent storage. Otherwise, they will be freed + when the current request is finished. + */ + +#define MALLOC (*__nsapi30_table->f_system_malloc) +#define system_malloc (*__nsapi30_table->f_system_malloc) + +#define CALLOC (*__nsapi30_table->f_system_calloc) +#define system_calloc (*__nsapi30_table->f_system_calloc) + +#define REALLOC (*__nsapi30_table->f_system_realloc) +#define system_realloc (*__nsapi30_table->f_system_realloc) + +#define FREE (*__nsapi30_table->f_system_free) +#define system_free (*__nsapi30_table->f_system_free) + +#define STRDUP (*__nsapi30_table->f_system_strdup) +#define system_strdup (*__nsapi30_table->f_system_strdup) + +#ifndef NS_MALLOC_DEBUG + +/* + These macros always provide permanent storage, for use in global variables + and such. They are checked at runtime to prevent them from returning NULL. + */ + +#define PERM_MALLOC (*__nsapi30_table->f_system_malloc_perm) +#define system_malloc_perm (*__nsapi30_table->f_system_malloc_perm) + +#define PERM_CALLOC (*__nsapi30_table->f_system_calloc_perm) +#define system_calloc_perm (*__nsapi30_table->f_system_calloc_perm) + +#define PERM_REALLOC (*__nsapi30_table->f_system_realloc_perm) +#define system_realloc_perm (*__nsapi30_table->f_system_realloc_perm) + +#define PERM_FREE (*__nsapi30_table->f_system_free_perm) +#define system_free_perm (*__nsapi30_table->f_system_free_perm) + +#define PERM_STRDUP (*__nsapi30_table->f_system_strdup_perm) +#define system_strdup_perm (*__nsapi30_table->f_system_strdup_perm) + +#endif /* !NS_MALLOC_DEBUG */ + +/* Thread-Private data key index for accessing the thread-private memory pool. + * Each thread creates its own pool for allocating data. The MALLOC/FREE/etc + * macros have been defined to check the thread private data area with the + * thread_malloc_key index to find the address for the pool currently in use. + * + * If a thread wants to use a different pool, it must change the thread-local- + * storage[thread_malloc_key]. + */ + +#define getThreadMallocKey (*__nsapi30_table->f_getThreadMallocKey) + +#define magnus_atrestart (*__nsapi30_table->f_magnus_atrestart) + +/* + * buffer_open opens a new buffer reading the specified file, with an I/O + * buffer of size sz, and returns a new buffer structure which will hold + * the data. + * + * If FILE_UNIX_MMAP is defined, this may return NULL. If it does, check + * system_errmsg to get a message about the error. + */ + +#define filebuf_open (*__nsapi30_table->f_filebuf_open) +#define netbuf_open (*__nsapi30_table->f_netbuf_open) + +/* + * filebuf_open_nostat is a convenience function for mmap() buffer opens, + * if you happen to have the stat structure already. + */ + +#ifdef FILE_MMAP +#define filebuf_open_nostat (*__nsapi30_table->f_filebuf_open_nostat) +#endif /* FILE_MMAP */ + +/* + * filebuf_create is a convenience function if the file is already open + * or mmap'd. It creates a new filebuf for use with the mmap'd file. + * If mmap_ptr is NULL, or MMAP is not supported on this system, it + * creates a buffer with buffer size bufsz. + */ + +#define filebuf_create (*__nsapi30_table->f_filebuf_create) + +/* + * filebuf_close_buffer is provided to cleanup a filebuf without closing + * the underlying file. If clean_mmap is 1, and the file is memory mapped, + * the file will be unmapped. If clean_mmap is 0, the file will not + * be unmapped. + */ +#define filebuf_close_buffer (*__nsapi30_table->f_filebuf_close_buffer) + +#ifdef FILE_MMAP +#define filebuf_open_nostat (*__nsapi30_table->f_filebuf_open_nostat) +#endif + +#ifdef XP_WIN32 +#define pipebuf_open (*__nsapi30_table->f_pipebuf_open) +#endif /* XP_WIN32 */ + +/* + * buffer_next loads size more bytes into the given buffer and returns the + * first one, or BUFFER_EOF on EOF and BUFFER_ERROR on error. + */ + +#ifndef FILE_MMAP +#define filebuf_next (*__nsapi30_table->f_filebuf_next) +#endif /* !FILE_MMAP */ +#define netbuf_next (*__nsapi30_table->f_netbuf_next) +#ifdef XP_WIN32 +#define pipebuf_next (*__nsapi30_table->f_pipebuf_next) +#endif /* XP_WIN32 */ + +/* + * buffer_close deallocates a buffer and closes its associated files + * (does not close a network socket). + */ + +#define filebuf_close (*__nsapi30_table->f_filebuf_close) +#define netbuf_close (*__nsapi30_table->f_netbuf_close) +#ifdef XP_WIN32 +#define pipebuf_close (*__nsapi30_table->f_pipebuf_close) +#endif /* XP_WIN32 */ + +/* + * buffer_grab will set the buffer's inbuf array to an array of sz bytes + * from the buffer's associated object. It returns the number of bytes + * actually read (between 1 and sz). It returns IO_EOF upon EOF or IO_ERROR + * upon error. The cursize entry of the structure will reflect the size + * of the iobuf array. + * + * The buffer will take care of allocation and deallocation of this array. + */ + +#define filebuf_grab (*__nsapi30_table->f_filebuf_grab) +#define netbuf_grab (*__nsapi30_table->f_netbuf_grab) +#ifdef XP_WIN32 +#define pipebuf_grab (*__nsapi30_table->f_pipebuf_grab) +#endif /* XP_WIN32 */ + +/* + * netbuf_getbytes will read bytes from the netbuf into the user + * supplied buffer. Up to size bytes will be read. + * If the call is successful, the number of bytes read is returned. + * NETBUF_EOF is returned when no more data will arrive on the socket, + * and NETBUF_ERROR is returned in the event of an error. + * + */ +#define netbuf_getbytes (*__nsapi30_table->f_netbuf_getbytes) + + +/* + * netbuf_buf2sd will send n bytes from the (probably previously read) + * buffer and send them to sd. If sd is -1, they are discarded. If n is + * -1, it will continue until EOF is recieved. Returns IO_ERROR on error + * and the number of bytes sent any other time. + */ + +#define netbuf_buf2sd (*__nsapi30_table->f_netbuf_buf2sd) + +/* + * filebuf_buf2sd assumes that nothing has been read from the filebuf, + * and just sends the file out to the given socket. Returns IO_ERROR on error + * and the number of bytes sent otherwise. + * + * Does not currently support you having read from the buffer previously. This + * can be changed transparently. + */ + +#define filebuf_buf2sd (*__nsapi30_table->f_filebuf_buf2sd) + +#ifdef XP_WIN32 + +/* + * NT pipe version of filebuf_buf2sd. + */ +#define pipebuf_buf2sd (*__nsapi30_table->f_pipebuf_buf2sd) + +/* + * NT pipe version of netbuf_buf2sd. + */ + +#define pipebuf_netbuf2sd (*__nsapi30_table->f_pipebuf_netbuf2sd) +#define pipebuf_netbuf2pipe (*__nsapi30_table->f_pipebuf_netbuf2pipe) +#endif /* XP_WIN32 */ + +/* + * Notes: + * + * Format of a mime.types file + * + * A mime.types file passed to cinfo_merge() should begin with + * a line containing NCC_MT_MAGIC as defined below (MCC_MT_MAGIC + * is also still supported). Lines containing only whitespace + * and lines beginning with "#" are ignored. Other lines contain + * one or more name/value pairs, separated by whitespace. The + * format of each of these is NAME=VALUE, where NAME is one of: + * + * type - VALUE is a mime type, e.g. text/html + * exts - VALUE is a list of file extensions, e.g. htm,html + * enc - VALUE specifies a content encoding, e.g. x-gzip + * lang - VALUE specifies a content language, e.g. en-US + * (see RFC1766) + * + * The VALUE may be enclosed in quotes (" "), and should be if it + * contains whitespace. + * + * Each line in the file that contains at least one name/value + * pair causes a cinfo structure to be created, containing the + * specified information. These structures are kept in memory + * and can be queried using cinfo_find(). + * + * Related information + * + * See the NSAPI "load-types" function. + */ + +/* + * Function: cinfo_init + * + * Description: + * + * This function initializes the memory resident content information + * database to be empty. + * + * Notes: + * + * This function is called by the NSAPI "load-types" function, + * which also sets up a call to cinfo_terminate() on server restart. + * If "load-types" is used, it should be unnecessary to call this + * function. + */ + +#define cinfo_init (*__nsapi30_table->f_cinfo_init) + +/* + * Function: cinfo_terminate + * + * Description: + * + * This function frees all dynamic memory associated with the + * memory resident content information database, and leaves the + * database empty. cinfo_init() should be called before using + * the database again. + */ + +#define cinfo_terminate (*__nsapi30_table->f_cinfo_terminate) + +/* + * Function: cinfo_merge + * + * Description: + * + * This function reads a mime.types formatted file of the specified + * name. Content information in the file is merged into the + * memory resident content information database. + * + * Arguments: + * + * fn - name of mime.types formatted file + * + * Returns: + * + * If successful, NULL is returned. If an error occurs, the return + * value is a pointer to a descriptive error string, which should + * be freed by the caller (using FREE()). Information processed + * prior to the error will still be added to the database. + */ + +#define cinfo_merge (*__nsapi30_table->f_cinfo_merge) + + +/* + * Function: cinfo_find + * + * Description: + * + * This function is used to retrieve content information based on + * a file extension contained in the argument string, which might + * be either a URI or a file name. It ignores any text up to and + * including the last FILE_PATHSEP character in the argument + * string. It looks for one or more file extensions in the + * remaining string, each one starting with a CINFO_SEPARATOR + * character. Each file extension is looked up in the database + * and any information found there is used to build a composite + * cinfo structure, containing information derived from each of + * the file extensions. If more than one file extensions present + * have a particular piece of information associated with them + * in the database (e.g. type or language), the value returned in + * the composite cinfo structure is taken from the data for the + * last file extension to provide that attribute. + * + * Arguments: + * + * uri - pointer to the argument string + * + * Returns: + * + * If successful, a pointer to the composite cinfo structure is + * returned. The fields of this structure reference values of + * those fields in one or more cinfo structures in the database, + * so these values should be copied if they are going to be + * modified. The cinfo structure itself should be freed by the + * caller using FREE(). If an error occurs, a null pointer is + * returned. If no information is found for any of the extensions, + * a null pointer is returned, although this is not necessarily + * an error. + * + * Notes: + * + * The matching of extensions in the argument string to extensions + * in the database is case-insensitive. + * + * The argument string is modified during parsing, but only + * temporarily. It should be intact on return. + */ + +#define cinfo_find (*__nsapi30_table->f_cinfo_find) + +/* + * Function: cinfo_lookup + * + * Description: + * + * This function returns a pointer to the last cinfo structure + * added to the database for a specified mime type. Unlike + * cinfo_find(), the returned pointer references a cinfo structure + * that is part of the database, and corresponds to a single line + * in a mime.types file. This structure should be considered + * read-only, and should not be freed by the caller. + * + * Arguments: + * + * type - a pointer to a mime type string + * + * Returns: + * + * If the specified type is found, a pointer to the cinfo structure + * returned. Otherwise a null pointer is returned. + * + * Notes: + * + * The search for the type is case-insensitive. + */ + +#define cinfo_lookup (*__nsapi30_table->f_cinfo_lookup) + +/* + * Function: cinfo_dump_database + * + * Description: + * + * This function outputs, to a specified file, formatted text + * describing the contents of the content information database. + * This is intended for debugging purposes. It is not in mime.types + * format. + * + * Arguments: + * + * dump - handle for already open output file + */ + +#define cinfo_dump_database (*__nsapi30_table->f_cinfo_dump_database) + +/* + * Critical section abstraction. Used in threaded servers to protect + * areas where two threads can interfere with each other. + * + * Condvars are condition variables that are used for thread-thread + * synchronization. + */ + +/* + * crit_init creates and returns a new critical section variable. At the + * time of creation no one has entered it. + */ +#define crit_init (*__nsapi30_table->f_crit_init) + +/* + * crit_enter enters a critical section. If someone is already in the + * section, the calling thread is blocked until that thread exits. + */ +#define crit_enter (*__nsapi30_table->f_crit_enter) + +/* + * crit_exit exits a critical section. If another thread is blocked waiting + * to enter, it will be unblocked and given ownership of the section. + */ +#define crit_exit (*__nsapi30_table->f_crit_exit) + +/* + * crit_terminate removes a previously allocated critical section variable. + */ +#define crit_terminate (*__nsapi30_table->f_crit_terminate) + +/* + * condvar_init initializes and returns a new condition variable. You + * must provide a critical section to be associated with this condition + * variable. + */ +#define condvar_init (*__nsapi30_table->f_condvar_init) + +/* + * condvar_wait blocks on the given condition variable. The calling thread + * will be blocked until another thread calls condvar_notify on this variable. + * The caller must have entered the critical section associated with this + * condition variable prior to waiting for it. + */ +#define condvar_wait (*__nsapi30_table->f_condvar_wait) + +/* + * condvar_notify awakens any threads blocked on the given condition + * variable. The caller must have entered the critical section associated + * with this variable first. + */ +#define condvar_notify (*__nsapi30_table->f_condvar_notify) + +/* + * condvar_notify awakens all threads blocked on the given condition + * variable. The caller must have entered the critical section associated + * with this variable first. + */ +#define condvar_notifyAll (*__nsapi30_table->f_condvar_notifyAll) + +/* + * condvar_terminate frees the given previously allocated condition variable + */ +#define condvar_terminate (*__nsapi30_table->f_condvar_terminate) + +/* + * Create a counting semaphore. + * Return non-zero on success, 0 on failure. + */ +#define cs_init (*__nsapi30_table->f_cs_init) + +/* + * Destroy a counting semaphore + */ +#define cs_terminate (*__nsapi30_table->f_cs_terminate) + +/* + * Wait to "enter" the semaphore. + * Return 0 on success, -1 on failure. + */ +#define cs_wait (*__nsapi30_table->f_cs_wait) + +/* + * Enter the semaphore if the count is > 0. Otherwise return -1. + * + */ +#define cs_trywait (*__nsapi30_table->f_cs_trywait) + +/* + * Release the semaphore- allowing a thread to enter. + * Return 0 on success, -1 on failure. + */ +#define cs_release (*__nsapi30_table->f_cs_release) + +/* + * daemon_atrestart registers a function to be called fn, with the given + * void pointer as an argument, when the server is restarted. + */ +#define daemon_atrestart (*__nsapi30_table->f_daemon_atrestart) + +#define servssl_init (*__nsapi30_table->f_servssl_init) + +/* + * ereport logs an error of the given degree and formats the arguments with + * the printf() style fmt. Returns whether the log was successful. Records + * the current date. + */ + +#define ereport (*__nsapi30_table->f_ereport) +#define ereport_v (*__nsapi30_table->f_ereport_v) + +/* + * ereport_init initializes the error logging subsystem and opens the static + * file descriptors. It returns NULL upon success and an error string upon + * error. If a userpw is given, the logs will be chowned to that user. + * + * email is the address of a person to mail upon catastrophic error. It + * can be NULL if no e-mail is desired. ereport_init will not duplicate + * its own copy of this string; you must make sure it stays around and free + * it when you shut down the server. + */ + +#define ereport_init (*__nsapi30_table->f_ereport_init) + +/* + * log_terminate closes the error and common log file descriptors. + */ +#define ereport_terminate (*__nsapi30_table->f_ereport_terminate) + +/* For restarts */ +#define ereport_getfd (*__nsapi30_table->f_ereport_getfd) + +/* FUNCTION: system_fopenXX + * DESCRIPTION: + * system_fopenRO - Open a disk file for read-only access. + * system_fopenWA - Open a disk file for write and append access. + * system_fopenRW - Open a disk file for read-write access. + * system_fopenWT - Open a disk file for write and truncate access. + * INPUTS: + * path- the name of the file + * OUTPUTS: + * none + * RETURNS: + * SYS_ERRORFD on failure + * A opaque file handle on success + * RESTRICTIONS: + * The return from this function should not be interpreted as a native + * file handle. It may only be used in other calls to system_xxx(). + * + * Note for unix programmers: Although this routine is called + * "system_fopen" do not consider it to be equivalent to the unix + * "fopen" call, which opens a buffered-IO file. + */ +#define system_fopenRO (*__nsapi30_table->f_system_fopenRO) +#define system_fopenWA (*__nsapi30_table->f_system_fopenWA) +#define system_fopenRW (*__nsapi30_table->f_system_fopenRW) +#define system_fopenWT (*__nsapi30_table->f_system_fopenWT) + +/* FUNCTION: system_fread + * DESCRIPTION: + * Read from a file + * INPUTS: + * fd- an open file handle to read from + * buf- a buffer to receive data + * sz- the number of bytes to read from the file + * OUTPUTS: + * none + * RETURNS: + * less-than-zero on failure + * 0 for end-of-file + * positive for number of bytes read + * RESTRICTIONS: + */ +#define system_fread (*__nsapi30_table->f_system_fread) + +/* FUNCTION: system_write + * DESCRIPTION: + * Writes sz bytes from buf to file fd. + * INPUTS: + * fd- the file to write to + * buf- the buffer containing data to be written + * sz- the size of data to write. + * OUTPUTS: + * none + * RETURNS: + * IO_OKAY on success + * IO_ERROR on failure + * RESTRICTIONS: + * There is no way to determine if bytes were written when this call fails. + * For more specific information, use PR_WRITE(). + */ +#define system_fwrite (*__nsapi30_table->f_system_fwrite) + +/* FUNCTION: system_fwrite_atomic + * DESCRIPTION: + * system_fwrite_atomic locks the given fd before writing to it. This + * avoids interference between simultaneous writes. + * INPUTS: + * fd- the file to write to + * buf- the buffer containing data to be written + * sz- the size of data to write. + * OUTPUTS: + * none + * RETURNS: + * IO_OKAY on success + * IO_ERROR on failure + * RESTRICTIONS: + */ +#define system_fwrite_atomic (*__nsapi30_table->f_system_fwrite_atomic) + +/* FUNCTION: system_lseek + * DESCRIPTION: + * Seek to a position in a file + * INPUTS: + * fd- an open file handle + * off + * wh + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + */ +#define system_lseek (*__nsapi30_table->f_system_lseek) + +/* FUNCTION: system_fclose + * DESCRIPTION: + * Close a file. + * INPUTS: + * fd- an open file handle from a previous system_fopenXX call. + * OUTPUTS: + * none + * RETURNS: + * IO_OKAY on success + * IO_ERROR on failure + * RESTRICTIONS: + */ +#define system_fclose (*__nsapi30_table->f_system_fclose) + +/* FUNCTION: system_stat + * DESCRIPTION: + * Get information about a file on disk + * INPUTS: + * name- the name of the file to be queried + * OUTPUTS: + * finfo- a buffer to receive the file information. + * RETURN: + * less-than-zero on failure. + * 0 on success. + * RESTRICTIONS: + * Within the stat structure, this routine is only guaranteed to return + * st_mode, st_size, st_ctime, and st_mtime. Other stat fields are + * undefined. + */ +#define system_stat (*__nsapi30_table->f_system_stat) + +/* --- File manipulation --------------------------------------------- */ + +/* FUNCTION: system_rename + * DESCRIPTION: + * Rename a file on disk. + * INPUTS: + * oldpath- old file name + * newpath- new file name + * OUTPUTS: + * none + * RETURNS: + * less-than-zero on failure + * 0 on success + * RESTRICTIONS: + * Not guaranteed to work portably on files which are in use. + */ +#define system_rename (*__nsapi30_table->f_system_rename) + +/* FUNCTION: system_unlink + * DESCRIPTION: + * Remove a file from disk. + * INPUTS: + * path- the file to delete + * OUTPUTS: + * none + * RETURNS: + * less-than-zero on failure + * 0 on success + * RESTRICTIONS: + * Not guaranteed to work portably on files which are in use. + */ +#define system_unlink (*__nsapi30_table->f_system_unlink) + +/* --- File locking -------------------------------------------------- */ + +#define system_initlock(fd) (0) + +/* FUNCTION: system_tlock + * DESCRIPTION: + * Test for a file lock and grab it if it is available + * INPUTS: + * fd- the file to lock + * OUTPUTS: + * none + * RETURNS: + * 0 - if we now hold the lock + * less-than-zero if the lock is held by someone else + * RESTRICTIONS: + * 1. file locking is process based. Two threads in the same process + * requesting exclusive access will both be allowed to access the file + * at the same time. + */ +#define system_tlock (*__nsapi30_table->f_system_tlock) + +/* FUNCTION: system_flock + * DESCRIPTION: + * Wait for exclusive access to a file + * INPUTS: + * fd- the file to lock + * OUTPUTS: + * none + * RETURNS: + * 0 - if we now hold the lock + * less-than-zero if an error occurred + * RESTRICTIONS: + * 1. file locking is process based. Two threads in the same process + * requesting exclusive access will both be allowed to access the file + * at the same time. + */ +#define system_flock (*__nsapi30_table->f_system_flock) + +/* FUNCTION: system_ulock + * DESCRIPTION: + * Release exclusive access to a file + * INPUTS: + * fd- the file to lock + * OUTPUTS: + * none + * RETURNS: + * 0 - if we released the lock + * less-than-zero if an error occurred + * RESTRICTIONS: + * 1. file locking is process based. Two threads in the same process + * requesting exclusive access will both be allowed to access the file + * at the same time. + */ +#define system_ulock (*__nsapi30_table->f_system_ulock) + +/* --- Directory manipulation routines ---------------------------------- */ + +#ifdef XP_WIN32 +#define dir_open (*__nsapi30_table->f_dir_open) +#define dir_read (*__nsapi30_table->f_dir_read) +#define dir_close (*__nsapi30_table->f_dir_close) +#endif /* XP_WIN32 */ + +/* + * create a directory and any of its parents + */ +#define dir_create_all (*__nsapi30_table->f_dir_create_all) + +#ifdef XP_WIN32 +#define system_winsockerr (*__nsapi30_table->f_system_winsockerr) +#define system_winerr (*__nsapi30_table->f_system_winerr) +#define system_pread (*__nsapi30_table->f_system_pread) +#define system_pwrite (*__nsapi30_table->f_system_pwrite) +#define file_unix2local (*__nsapi30_table->f_file_unix2local) +#endif /* XP_WIN32 */ + +#define system_nocoredumps (*__nsapi30_table->f_system_nocoredumps) +#define file_setinherit (*__nsapi30_table->f_file_setinherit) +#define file_notfound (*__nsapi30_table->f_file_notfound) +#define system_errmsg (*__nsapi30_table->f_system_errmsg) +#define system_errmsg_fn (*__nsapi30_table->f_system_errmsg_fn) + +/* FUNCTION: net_socket + * DESCRIPTION: + * Create a new socket. + * INPUTS: + * domain- only supported type is AF_INET + * type- only supported type is SOCK_STREAM + * protocol- only supported value is 0 + * OUTPUTS: + * none + * RETURNS: + * SYS_NET_ERRORFD on errro + * a valid SYS_NETFD on success + * RESTRICTIONS: + */ +#define net_socket (*__nsapi30_table->f_net_socket) + +/* FUNCTION: net_listen + * DESCRIPTION: + * Set listen backlog for a socket. + * INPUTS: + * s- the socket + * backlog- value of backlog to set + * OUTPUTS: + * RETURNS: + * 0 on success + * less-than-zero on failure + * RESTRICTIONS: + * Some systems do not return errors even when the requested backlog + * cannot be set (it is too high). Consult your system manual for + * details on the maximum value of the backlog. + */ +#define net_listen (*__nsapi30_table->f_net_listen) + +/* FUNCTION: net_create_listener + * DESCRIPTION: + * Creates a socket for accepting new connection. + * INPUTS: + * OUTPUTS: + * RETURNS: + * SYS_NET_ERRORFD on error. + * RESTRICTIONS: + * This is a convenience routine which creates a socket, binds to + * an IP address and port, and sets the listen backlog to + * net_listenqsize. + */ +#define net_create_listener (*__nsapi30_table->f_net_create_listener) + +/* FUNCTION: net_connect + * DESCRIPTION: + * Connect a socket to a remote listener + * INPUTS: + * OUTPUTS: + * RETURNS: + * 0 on success + * less-than-zero on error + * RESTRICTIONS: + */ +#define net_connect (*__nsapi30_table->f_net_connect) + +/* FUNCTION: net_getpeername + * DESCRIPTION: + * Get the socket address (IP address/port) of the remote host. + * INPUTS: + * s- the socket + * name - the socket address of the remote + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + */ +#define net_getpeername (*__nsapi30_table->f_net_getpeername) + +/* FUNCTION: net_close + * DESCRIPTION: + * Close an open socket + * INPUTS: + * s- the socket to close + * OUTPUTS: + * none + * RETURNS: + * 0 on success + * less-than-zero on failure + * RESTRICTIONS: + */ +#define net_close (*__nsapi30_table->f_net_close) + +/* FUNCTION: net_bind + * DESCRIPTION: + * Bind to a socket address + * INPUTS: + * s- + * name- + * namelen- + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + */ +#define net_bind (*__nsapi30_table->f_net_bind) + +/* FUNCTION: net_accept + * DESCRIPTION: + * Accept a connection on a listener socket. + * INPUTS: + * s + * addr + * OUTPUTS: + * addrlen + * RETURNS: + * RESTRICTIONS: + */ +#define net_accept (*__nsapi30_table->f_net_accept) + +/* FUNCTION: net_read + * DESCRIPTION: + * sd + * buf + * sz + * timeout + * INPUTS: + * OUTPUTS: + * RETURNS: + * IO_ERROR on error + * 0 if the remote closes the socket + * positive representing the number of bytes successfully read + * RESTRICTIONS: + * timeout must be NET_ZERO_TIMEOUT, NET_INFINITE_TIMEOUT, or a positive + * value in seconds + */ +#define net_read (*__nsapi30_table->f_net_read) + +/* FUNCTION: net_write + * DESCRIPTION: + * Write data to a socket. + * INPUTS: + * sd + * buf + * sz + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * net_write() is unbuffered. Specifying many calls to net_write() for + * small amounts of data is inefficient. + */ +#define net_write (*__nsapi30_table->f_net_write) + +/* FUNCTION: net_writev + * DESCRIPTION: + * Write vectored data to the socket. + * INPUTS: + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * net_writev() is unbuffered. Specifying many calls to net_writev() for + * small amounts of data is inefficient. + */ +#define net_writev (*__nsapi30_table->f_net_writev) + +/* FUNCTION: net_isalive + * DESCRIPTION: + * Checks to see if the given socket is still connected to a remote + * host. The remote host does not see any side effects from this call. + * INPUTS: + * sd - the socket + * OUTPUTS: + * none + * RETURNS: + * 0 if the socket is no longer connected + * 1 if the socket is still connected. + * RESTRICTIONS: + */ +#define net_isalive (*__nsapi30_table->f_net_isalive) + +/* FUNCTION: net_ip2host + * DESCRIPTION: + * Transforms the given textual IP number into a fully qualified domain + * name (FQDN). This is similar to calling gethostbyaddr(). + * INPUTS: + * verify- If 1, specifies that the function should verify the hostname + * returned from the lookup. This is similar to calling + * gethostbyname() on the result of the call to gethostbyaddr(). + * OUTPUTS: + * RETURNS: + * The fully qualified domain name, or whatever it can find. + * If it cannot resolve the name at all, returns NULL. + * RESTRICTIONS: + * This function is governed by the use of the Server DNS cache. If caching + * is enabled it can take as long as 20 minutes before this function + * does the lookup again. + */ +#define net_ip2host (*__nsapi30_table->f_net_ip2host) + + +/* --- OBSOLETE ---------------------------------------------------------- + * The following macros/functions are obsolete and are only maintained for + * compatibility. Do not use them. + * ----------------------------------------------------------------------- + */ + +/* FUNCTION: net_getsockopt + * DESCRIPTION: + * Get socket options + * INPUTS: + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_getsockopt (*__nsapi30_table->f_net_getsockopt) + +/* FUNCTION: net_setsockopt + * DESCRIPTION: + * Set socket options + * INPUTS: + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_setsockopt (*__nsapi30_table->f_net_setsockopt) + +/* FUNCTION: net_select + * DESCRIPTION: + * Wait for IO on a set of sockets. + * INPUTS: + * OUTPUTS: + * RETURNS: + * -1 on error + * 0 on timeout + * positive value representing the number of IOs ready + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_select (*__nsapi30_table->f_net_select) + +/* FUNCTION: net_ioctl + * DESCRIPTION: + * Set socket options. + * INPUTS: + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_ioctl (*__nsapi30_table->f_net_ioctl) + +/* FUNCTION: net_socketpair + * DESCRIPTION: + * Creates a TCP socketpair. + * INPUTS: + * OUTPUTS: + * RETURNS: + * 0 on success + * -1 on failure + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_socketpair (*__nsapi30_table->f_net_socketpair) + +#ifdef XP_UNIX +/* FUNCTION: net_dup2 + * DESCRIPTION: + * Duplicates a socket to a specific file descriptor + * INPUTS: + * OUTPUTS: + * RETURNS: + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_dup2 (*__nsapi30_table->f_net_dup2) + +/* FUNCTION: net_is_STDOUT + * DESCRIPTION: + * Checks if the underlying OS file descriptor for the given + * SYS_NETFD is the STDOUT filedescriptor + * INPUTS: + * OUTPUTS: + * RETURNS: + * 1 if it is STDOUT (1) + * 0 otherwise + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_is_STDOUT (*__nsapi30_table->f_net_is_STDOUT) + +/* FUNCTION: net_is_STDIN + * DESCRIPTION: + * Checks if the underlying OS file descriptor for the given + * SYS_NETFD is the STDIN filedescriptor + * INPUTS: + * OUTPUTS: + * RETURNS: + * 1 if it is STDIN (0) + * 0 otherwise + * RESTRICTIONS: + * Because this function is not portable (not all systems support the + * same options), it should be used with caution. + */ +#define net_is_STDIN (*__nsapi30_table->f_net_is_STDIN) +#endif /* XP_UNIX */ + +/* + * A parameter block is a set of name=value pairs which are generally used + * as parameters, but can be anything. They are kept in a hash table for + * reasonable speed, but if you are doing any intensive modification or + * access of them you should probably make a local copy of each parameter + * while working. + * + * When creating a pblock, you specify the hash table size for that pblock. + * You should set this size larger if you know that many items will be in + * that pblock, and smaller if only a few will be used or if speed is not + * a concern. + */ + +/* + * param_create creates a parameter with the given name and value. If name + * and value are non-NULL, they are copied and placed into the new pb_param + * struct. + */ + +#define param_create (*__nsapi30_table->f_param_create) + +/* + * param_free frees a given parameter if it's non-NULL, and returns 1 if + * p was non-NULL, and 0 if p was NULL. + * + * Useful for error checking pblock_remove. + */ + +#define param_free (*__nsapi30_table->f_param_free) + +/* + * pblock_create creates a new pblock with hash table size n. + * + * It returns the newly allocated pblock. + */ + +#define pblock_create (*__nsapi30_table->f_pblock_create) + +/* + * pblock_free frees the given pblock and any entries inside it. + * + * If you want to save anything in a pblock, remove its entities with + * pblock_remove first and save the pointers you get. + */ + +#define pblock_free (*__nsapi30_table->f_pblock_free) + +/* + * pblock_findval finds the entry with the given name in pblock pb, and + * returns its value, otherwise returns NULL. + */ + +#define pblock_findval (*__nsapi30_table->f_pblock_findval) + +/* + * pblock_nvinsert creates a new parameter with the given name and value + * and inserts it into pblock pb. The name and value in the parameter are + * also newly allocated. Returns the pb_param it allocated (in case you + * need it). + * + * pblock_nninsert inserts a numerical value. + */ + +#define pblock_nvinsert (*__nsapi30_table->f_pblock_nvinsert) +#define pblock_nninsert (*__nsapi30_table->f_pblock_nninsert) + +/* + * pblock_pinsert inserts a pb_param into a pblock. + */ + +#define pblock_pinsert (*__nsapi30_table->f_pblock_pinsert) + +/* + * pblock_str2pblock scans the given string str for parameter pairs + * name=value, or name="value". Any \ must be followed by a literal + * character. If a string value is found, with no unescaped = signs, it + * will be added with the name 1, 2, 3, etc. depending on whether it was + * first, second, third, etc. in the stream (zero doesn't count). + * + * Returns the number of parameters added to the table, or -1 upon error. + */ + +#define pblock_str2pblock (*__nsapi30_table->f_pblock_str2pblock) + +/* + * pblock_pblock2str places all of the parameters in the given pblock + * into the given string (NULL if it needs creation). It will re-allocate + * more space for the string. Each parameter is separated by a space and of + * the form name="value" + */ + +#define pblock_pblock2str (*__nsapi30_table->f_pblock_pblock2str) + +/* + * pblock_copy copies the entries in the given source pblock to the + * destination one. The entries are newly allocated so that the original + * pblock may be freed or the new one changed without affecting the other. + */ + +#define pblock_copy (*__nsapi30_table->f_pblock_copy) + +/* + * pblock_dup creates a new pblock and copies the given source pblock + * into it. The entries are newly allocated so that the original pblock + * may be freed or the new one changed without affecting the other. + */ + +#define pblock_dup (*__nsapi30_table->f_pblock_dup) + +/* + * pblock_pb2env copies the given pblock into the given environment, with + * one new env entry for each name/value pair in the pblock. + */ + +#define pblock_pb2env (*__nsapi30_table->f_pblock_pb2env) + +/* --------------------------- Internal things ---------------------------- */ +#define pblock_fr (*__nsapi30_table->f_pblock_fr) +#define pblock_replace (*__nsapi30_table->f_pblock_replace) + +/* pool_create() + * Function to create a new pool. + * Returns non-NULL on success, NULL on failure. + */ +#define pool_create (*__nsapi30_table->f_pool_create) + +/* pool_destroy() + * Frees all memory associated with a pool and destroys the pool. + */ +#define pool_destroy (*__nsapi30_table->f_pool_destroy) + +/* pool_enabled() + * Check if the pools are enabled and a pool is currently set + * for this thread. Return 1 if enabled, 0 if not enabled. + */ +#define pool_enabled (*__nsapi30_table->f_pool_enabled) + +#define pool_malloc (*__nsapi30_table->f_pool_malloc) +#define pool_free (*__nsapi30_table->f_pool_free) +#define pool_calloc (*__nsapi30_table->f_pool_calloc) +#define pool_realloc (*__nsapi30_table->f_pool_realloc) +#define pool_strdup (*__nsapi30_table->f_pool_strdup) + +/* + * regexp_valid takes a regular expression exp as input. It returns: + * + * NON_REGEXP if exp is a standard string + * (above not used -- always returns VALID_REGEXP!!) + * INVALID_REGEXP if exp is a regular expression, but invalid + * VALID_REGEXP if exp is a valid regular expression + */ + +#define regexp_valid (*__nsapi30_table->f_regexp_valid) + +/* + * regexp_match + * + * Takes a prevalidated shell expression exp, and a string str. + * + * Returns 0 on match and 1 on non-match. + */ + +#define regexp_match (*__nsapi30_table->f_regexp_match) + +/* + * regexp_cmp + * + * Same as above, but validates the exp first. 0 on match, 1 on non-match, + * -1 on invalid exp. regexp_casecmp does the same thing but is case + * insensitive. + */ + +#define regexp_cmp (*__nsapi30_table->f_regexp_cmp) +#define regexp_casecmp (*__nsapi30_table->f_regexp_casecmp) + +/* + * sem_init creates a semaphore using the given name and unique + * identification number. filename should be a file accessible to the + * process. Returns SEM_ERROR on error. + */ + +#define sem_init (*__nsapi30_table->f_sem_init) + +/* + * sem_terminate de-allocates the given semaphore. + */ + +#define sem_terminate (*__nsapi30_table->f_sem_terminate) + +/* + * sem_grab attempts to gain exclusive access to the given semaphore. If + * it can't get it, the caller will block. Returns -1 on error. + */ + +#define sem_grab (*__nsapi30_table->f_sem_grab) +#define sem_tgrab (*__nsapi30_table->f_sem_tgrab) + +/* + * sem_release releases this process's exclusive control over the given + * semaphore. Returns -1 on error. + */ + +#define sem_release (*__nsapi30_table->f_sem_release) + +/* + * session_create creates a new request structure for the client with the + * given socket descriptor and sockaddr. + */ + +#define session_alloc (*__nsapi30_table->f_session_alloc) +#define session_fill (*__nsapi30_table->f_session_fill) +#define session_create (*__nsapi30_table->f_session_create) + +/* + * session_free frees the given session + */ + +#define session_free (*__nsapi30_table->f_session_free) + +#define session_dns_lookup (*__nsapi30_table->f_session_dns_lookup) + +/* + * This describes the API for matching a string with a "shell expression". + * The expressions accepted are based loosely on the expressions accepted + * by zsh. A shell expression is a string pattern made up of ordinary + * characters and any of the types of pattern sequences listed below. + * + * Pattern Matches + * * zero or more characters + * ? exactly one character + * $ matches the end of string + * [abc] matches one instance of any of the characters + * enclosed in [] + * [a-z] matches one instance of any character in the + * specified range of characters + * [^abc] matches one instance of any character not + * in the enclosed set + * + * Backslash (\) is used to quote a character that would otherwise be + * considered part of a pattern sequence, e.g. "2\*2=4". + * + * The following composite shell expression structures are also + * recognized: + * + * shexp1~shexp2 matches any string that matches shexp1, + * unless the string also matches shexp2 + * + * Example: "*~*.netscape.com" matches any string that does + * not end with ".netscape.com" + * + * (shexp1|...|shexpN) matches any string that matches any one of + * the ()-enclosed, |-separated shell + * expressions. + */ + +/* Determine whether exp is a valid shell expression */ +#define shexp_valid (*__nsapi30_table->f_shexp_valid) + +/* + * shexp_match + * + * Takes a prevalidated shell expression exp, and a string str. + * + * Returns 0 on match and 1 on non-match. + */ + +#define shexp_match (*__nsapi30_table->f_shexp_match) + + +/* + * shexp_cmp + * + * Same as above, but validates the exp first. 0 on match, 1 on non-match, + * -1 on invalid exp. shexp_casecmp does the same thing but is case + * insensitive. + */ + +#define shexp_cmp (*__nsapi30_table->f_shexp_cmp) +#define shexp_casecmp (*__nsapi30_table->f_shexp_casecmp) + +/* + * Regular expression API - Analogous to shell expression API + */ + +#define regexp_valid (*__nsapi30_table->f_regexp_valid) +#define regexp_match (*__nsapi30_table->f_regexp_match) +#define regexp_cmp (*__nsapi30_table->f_regexp_cmp) +#define regexp_casecmp (*__nsapi30_table->f_regexp_casecmp) + + +#if defined (SHMEM_UNIX_MMAP) || defined (SHMEM_WIN32_MMAP) + +/* + * shmem_alloc allocates a region of shared memory of the given size, using + * the given name to avoid conflicts between multiple regions within the + * program. The region will not be automatically grown if its boundaries + * are over-run, use shmem_realloc for that. + * + * If expose is non-zero and the underlying system supports it, the + * file used to create the shared region will be visible to other processes + * running on the system. + * + * name should be unique to the program which calls this routine, otherwise + * conflicts will arise. + * + * Returns a new shared memory region, with the data element being a + * pointer to the shared memory. This function must be called before any + * daemon workers are spawned, in order for the handle to the shared region + * to be inherited by the children. + * + * Because of the requirement that the region must be inherited by the + * children, the region cannot be re-allocated with a larger size when + * necessary. + */ +#define shmem_alloc (*__nsapi30_table->f_shmem_alloc) + +/* + * shmem_free de-allocates the specified region of shared memory. + */ +#define shmem_free (*__nsapi30_table->f_shmem_free) + +#endif /* SHMEM_UNIX_MMAP || SHMEM_WIN32_MMAP */ + +/* + * systhread_start creates a thread with the given priority, will allocate + * a stack of stksz bytes, and calls fn with arg as its argument. stksz + * of zero will allocate a default stack size. + * + * Returns a new SYS_THREAD pointer on success, SYS_THREAD_ERROR on failure. + * XXX Priorities are system dependent + */ + +#define systhread_start (*__nsapi30_table->f_systhread_start) + +/* + * systhread_current returns a handle for the current thread. + */ + +#define systhread_current (*__nsapi30_table->f_systhread_current) + +/* + * systhread_yield yields the processor to another thread + */ + +#define systhread_yield (*__nsapi30_table->f_systhread_yield) + +/* + * systhread_attach makes an existing thread an NSPR thread. + */ +#define systhread_attach (*__nsapi30_table->f_systhread_attach) + +/* + * Detaches a thread that was attached. + */ + +#define systhread_detach (*__nsapi30_table->f_systhread_detach) + +/* + * systhread_terminate terminates the thread that is passed in. + */ +#define systhread_terminate (*__nsapi30_table->f_systhread_terminate) + +/* + * systhread_sleep puts the calling thread to sleep for the given number + * of milliseconds. + */ +#define systhread_sleep (*__nsapi30_table->f_systhread_sleep) + +/* + * systhread_init initializes the threading system. name is a name for the + * program for debugging. + */ + +#define systhread_init (*__nsapi30_table->f_systhread_init) + +/* + * systhread_timerset starts or re-sets the interrupt timer for a thread + * system. This should be considered a suggestion as most systems don't allow + * the timer interval to be changed. + */ + +#define systhread_timerset (*__nsapi30_table->f_systhread_timerset) + +/* + * newkey allocates a new integer id for thread-private data. Use this + * key to identify a variable which you want to appear differently + * between threads, and then use setdata to associate a value with this + * key for each thread. + */ +#define systhread_newkey (*__nsapi30_table->f_systhread_newkey) + +/* + * Get data that has been previously associated with key in this thread. + * Returns NULL if setkey has not been called with this key by this + * thread previously, or the data that was previously used with setkey + * by this thread with this key. + */ +#define systhread_getdata (*__nsapi30_table->f_systhread_getdata) + +/* + * Associate data with the given key number in this thread. + */ +#define systhread_setdata (*__nsapi30_table->f_systhread_setdata) + +/* + * Set the default stack size for threads created via systhr_start + */ +#define systhread_set_default_stacksize (*__nsapi30_table->f_systhread_set_default_stacksize) + +/* + * A hodge podge of utility functions and standard functions which + * are unavailable on certain systems + */ + +/* + * getline scans in buf until it finds a LF or CRLF, storing the string in + * l. It will terminate the string and return: + * + * 0 when done, with the scanned line (minus CR or LF) in l + * 1 upon EOF, with the scanned line (minus CR or LF) in l + * -1 on error with the error description in l (uses lineno for information) + */ + +#define util_getline (*__nsapi30_table->f_util_getline) + +/* + * env_create creates a new environment with the given env, with n new + * entries, and places the current position that you should add your + * entries with at pos. + * + * If env is NULL, it will allocate a new one. If not, it will reallocate + * that one. + */ + +#define util_env_create (*__nsapi30_table->f_util_env_create) + +/* + * util_env_str allocates a string from the given name and value and + * returns it. It does not check for things like = signs in name. + */ + +#define util_env_str (*__nsapi30_table->f_util_env_str) + +/* + * env_replace replaces the occurrence of the given variable with the + * value you give. + */ + +#define util_env_replace (*__nsapi30_table->f_util_env_replace) + +/* + * util_env_free frees an environment. + */ + +#define util_env_free (*__nsapi30_table->f_util_env_free) + +/* + * util_env_copy copies an env + */ +#define util_env_copy (*__nsapi30_table->f_util_env_copy) + +/* + * util_env_find looks through env for the named string. Returns the + * corresponding value if the named string is found, or NULL if not. + */ +#define util_env_find (*__nsapi30_table->f_util_env_find) + +/* + * hostname gets the local hostname. Returns NULL if it can't find a FQDN. + * You are free to realloc or free this string. + */ + +#define util_hostname (*__nsapi30_table->f_util_hostname) + +/* + * chdir2path changes the current directory to the one that the file + * path is in. path should point to a file. Caveat: path must be a writable + * string. It won't get modified permanently. + */ + +#define util_chdir2path (*__nsapi30_table->f_util_chdir2path) + +/* + * is_mozilla checks if the given user-agent is mozilla, of at least + * the given major and minor revisions. These are strings to avoid + * ambiguities like 1.56 > 1.5 + */ + +#define util_is_mozilla (*__nsapi30_table->f_util_is_mozilla) + +/* + * is_url will return 1 if the given string seems to be a URL, or will + * return 0 otherwise. + * + * Because of stupid news URLs, this will return 1 if the string has + * all alphabetic characters up to the first colon and will not check for + * the double slash. + */ + +#define util_is_url (*__nsapi30_table->f_util_is_url) + +/* + * util_later_than checks the date in the string ims, and if that date is + * later than or equal to the one in the tm struct lms, then it returns 1. + * + * util_time_equal is above, but checks for exact equality. + * + * Handles RFC 822, 850, and ctime formats. + */ + +#define util_later_than (*__nsapi30_table->f_util_later_than) +#define util_time_equal (*__nsapi30_table->f_util_time_equal) + +/* + * util_str_time_equal checks the character-string dates are equal. + * Supports rfc1123 and rfc850 formats. t1 must be rfc1123 + * Returns 0 if equal, -1 otherwise + */ +#define util_str_time_equal (*__nsapi30_table->f_util_str_time_equal) + +/* + * util_uri_is_evil returns 1 if a URL has ../ or // in it. + */ +#define util_uri_is_evil (*__nsapi30_table->f_util_uri_is_evil) + +/* + * util_uri_parse gets rid of /../, /./, and //. + * + * Assumes that either the string starts with a /, or the string will + * not .. right off of its beginning. As such, ../foo.gif will + * not be changed, although /../foo.gif will become /foo.gif. + */ + +#define util_uri_parse (*__nsapi30_table->f_util_uri_parse) + +/* + * util_uri_unescape unescapes the given URI in place (% conversions only). + */ + +#define util_uri_unescape (*__nsapi30_table->f_util_uri_unescape) + +/* + * util_uri_escape escapes any nasty chars in s and copies the string into d. + * If d is NULL, it will allocate and return a properly sized string. + * Warning: does not check bounds on a given d. + * + * util_url_escape does the same thing but does it for a url, i.e. ?:+ is + * not escaped. + */ + +#define util_uri_escape (*__nsapi30_table->f_util_uri_escape) +#define util_url_escape (*__nsapi30_table->f_util_url_escape) + +/* + * util_sh_escape places a \ in front of any shell-special characters. + * Returns a newly-allocated copy of the string. + */ + +#define util_sh_escape (*__nsapi30_table->f_util_sh_escape) + +/* + * util_mime_separator generates a new MIME separator into the given buffer. + * The buffer should be more than 4 + 3*10 + 1 bytes long. A CRLF is prepended + * to the beginning of the string, along with two dashes. The string is null + * terminated, with no CRLF. The intent is that you create your content-type + * header by accessing &sep[4], and afterwards print sep followed by CRLF + * for message boundaries. + * + * Returns the length of the string. + */ +#define util_mime_separator (*__nsapi30_table->f_util_mime_separator) + +/* + * util_itoa converts the given integer to a string into a. + */ + +#define util_itoa (*__nsapi30_table->f_util_itoa) + +/* + * util_vsprintf and util_sprintf are simplified clones of the System V + * vsprintf and sprintf routines. + * + * Returns the number of characters printed. Only handles %d and %s, + * does not handle any width or precision. + */ + +#define util_vsprintf (*__nsapi30_table->f_util_vsprintf) +#define util_sprintf (*__nsapi30_table->f_util_sprintf) + +/* These routines perform bounds checks. */ +#define util_vsnprintf (*__nsapi30_table->f_util_vsnprintf) +#define util_snprintf (*__nsapi30_table->f_util_snprintf) + +/* util_strftime() + * Thread safe version of strftime. + * No bounds checking is done s. t must be a valid tm structure. + */ +#define util_strftime (*__nsapi30_table->f_util_strftime) + +/* Various thread safe routines. */ + +#define util_strtok (*__nsapi30_table->f_util_strtok) +#define util_localtime (*__nsapi30_table->f_util_localtime) +#define util_ctime (*__nsapi30_table->f_util_ctime) +#define util_strerror (*__nsapi30_table->f_util_strerror) +#define util_gmtime (*__nsapi30_table->f_util_gmtime) +#define util_asctime (*__nsapi30_table->f_util_asctime) + +#ifdef NEED_STRCASECMP +#define util_strcasecmp (*__nsapi30_table->f_util_strcasecmp) +#define strcasecmp(s1, s2) util_strcasecmp(s1, s2) +#endif /* NEED_STRCASECMP */ + +#ifdef NEED_STRNCASECMP +#define util_strncasecmp (*__nsapi30_table->f_util_strncasecmp) +#define strncasecmp(s1, s2, n) util_strncasecmp(s1, s2, n) +#endif /* NEED_STRNCASECMP */ + +#ifdef XP_UNIX + +/* + * can_exec returns 1 if you can execute the file described by finfo, and + * 0 if you can't. + */ + +#define util_can_exec (*__nsapi30_table->f_util_can_exec) + +/* + * Thread safe getpwnam + */ +#define util_getpwnam (*__nsapi30_table->f_util_getpwnam) + +#define util_waitpid (*__nsapi30_table->f_util_waitpid) + +#endif /* XP_UNIX */ + +#ifdef XP_WIN32 + +/* util_delete_directory() + * This routine deletes all the files in a directory. If delete_directory is + * TRUE it will also delete the directory itself. + */ +#define util_delete_directory (*__nsapi30_table->f_util_delete_directory) + +#endif /* XP_WIN32 */ + +/* + * conf_init reads the given configuration file and sets any non-default + * parameters to their given setting. + */ +#define conf_init (*__nsapi30_table->f_conf_init) +#define conf_run_init_functions (*__nsapi30_table->f_conf_run_init_functions) + +/* + * conf_terminate frees any data the conf routines may be holding. + */ +#define conf_terminate (*__nsapi30_table->f_conf_terminate) + +/* + * conf_getServerString returns the Server ID string + */ +#define conf_getServerString (*__nsapi30_table->f_conf_getServerString) + +/* + * Get a structure with the global variables for this server. + */ +#define conf_getglobals (*__nsapi30_table->f_conf_getglobals) + +/* + * func_init reads the static FuncStruct arrays and creates the global + * function table from them. + * + * func_init will only read from the static arrays defined in func.c. + */ +#define func_init (*__nsapi30_table->f_func_init) + +/* + * func_find returns a pointer to the function named name, or NULL if none + * exists. + */ +#define func_find (*__nsapi30_table->f_func_find) + +/* DO NOT USE this function. + */ +#define func_set_native_thread_flag (*__nsapi30_table->f_func_set_native_thread_flag) + +/* + * func_exec will try to execute the function whose name is the "fn" entry + * in the given pblock. If name is not found, it will log a misconfig of + * missing fn parameter. If it can't find it, it will log that. In these + * cases it will return REQ_ABORTED. Otherwise, it will return what the + * function being executed returns. + */ +#define func_exec (*__nsapi30_table->f_func_exec) + +/* + * func_replace will replace a function in the server's function table with + * another. Returns the FuncPtr to the old function if it replaces the + * function, otherwise it returns 0. + */ +#define func_replace (*__nsapi30_table->f_func_replace) + +/* + * func_insert dynamically inserts a named function into the server's + * table of functions. Returns the FuncStruct it keeps in internal + * databases, because on server restart you are responsible for freeing + * (or not) its contents. + */ +#define func_insert (*__nsapi30_table->f_func_insert) +#define object_execute (*__nsapi30_table->f_object_execute) + +/* + * gets the first line of an HTTP request + */ +#define http_find_request (*__nsapi30_table->f_http_find_request) + +/* + * parses the first line of an HTTP request + */ +#define http_parse_request (*__nsapi30_table->f_http_parse_request) + +/* + * Scans HTTP headers from the given netbuf, and places them in headers. + * If netbuf is NULL, the session's inbuf is used. + * + * Folded lines are joined and the linefeed removed (but not the whitespace). + * If there are any repeat headers they are joined and the two field bodies + * separated by a comma and space. + * + * t should be a string of length REQ_MAX_LINE. This is a convenience to + * req.c so that we don't use too much runtime stack. + * + * Session is an optional parameter. Use NULL if you wish. It's used for + * error logs. + */ +#define http_scan_headers (*__nsapi30_table->f_http_scan_headers) + +/* + * Starts the HTTP response. If HTTP/0.9, does nothing. If 1.0, sends header. + * If this returns REQ_NOACTION, the method was head and no body should be + * sent. Otherwise, it will return REQ_PROCEED. + */ +#define http_start_response (*__nsapi30_table->f_http_start_response) + +/* + * http_hdrs2env takes the entries from the given pblock and converts them + * to an environment. + * + * Each name entry will be made uppercase, prefixed with HTTP_ and any + * occurrence of - will be converted to _. + */ +#define http_hdrs2env (*__nsapi30_table->f_http_hdrs2env) + +/* + * http_status sets status to the code n, with reason string r. If r is + * NULL, the server will attempt to find one for the given status code. + * If it finds none, it will give "Because I felt like it." + */ +#define http_status (*__nsapi30_table->f_http_status) + +/* + * http_set_finfo sets content-length and last-modified + */ + +#define http_set_finfo (*__nsapi30_table->f_http_set_finfo) + +/* + * Takes the given pblock and prints headers into the given buffer at + * position pos. Returns the buffer, reallocated if needed. Modifies pos. + */ +#define http_dump822 (*__nsapi30_table->f_http_dump822) + +/* + * Finishes a request. For HTTP, this just closes the socket. + */ +#define http_finish_request (*__nsapi30_table->f_http_finish_request) + +/* + * http_handle_session processes each request generated by Session + */ +#define http_handle_session (*__nsapi30_table->f_http_handle_session) + +/* + * http_uri2url takes the give URI prefix and URI suffix and creates a + * newly-allocated full URL from them of the form + * http://(server):(port)(prefix)(suffix) + * + * If you want either prefix or suffix to be skipped, use "" instead of NULL. + * + * Normally, the server hostname is taken from the ServerName parameter in + * magnus.conf. The newer function http_uri2url_dynamic should be used when + * a Session and Request structure are available, to ensure that the browser + * gets redirected to the exact host they were originally referencing. + */ + +#define http_uri2url (*__nsapi30_table->f_http_uri2url) +#define http_uri2url_dynamic (*__nsapi30_table->f_http_uri2url_dynamic) + +/* + * http_set_keepalive_timeout sets the number of seconds to wait for a new + * request to come from a persistent connection. Returns nothing. Intended + * to be called at server startup only. + * + * Specifying a timeout of zero will disable persistent connections and allow + * browsers to request only one file per connection. + */ +#define http_set_keepalive_timeout (*__nsapi30_table->f_http_set_keepalive_timeout) + +/* + * log_error logs an error of the given degree from the function func + * and formats the arguments with the printf() style fmt. Returns whether the + * log was successful. Records the current date. + * + * sn and rq are optional parameters. If given, information about the client + * will be reported. + */ +#define log_error_v (*__nsapi30_table->f_log_error_v) +#define log_error (*__nsapi30_table->f_log_error) + +/* + * Internal use only + */ +#define log_ereport_v (*__nsapi30_table->f_log_ereport_v) +#define log_ereport (*__nsapi30_table->f_log_ereport) + +/* + * object_create will create a new object and return a pointer to it. + * It will allocate space for nd directive types and set name accordingly. + */ +#define object_create (*__nsapi30_table->f_object_create) + +/* + * object_free will free an object and any data associated with it. + */ +#define object_free (*__nsapi30_table->f_object_free) + +/* + * object_add_directive will add a new directive to the dtable for + * the directive class at position dc. + */ +#define object_add_directive (*__nsapi30_table->f_object_add_directive) + +/* + * Executes the directive specified by inst within the context of the + * given session and request structures. Returns what the executed function + * returned (one of the REQ_* codes defined in req.h). + * + * This prototype uses void * for Request * in order to avoid including + * all of req.h. + * + */ + +/* + * objset_scan_buffer will scan through buffer, looking for object + * configuration information, and adding them to the object set os if it + * finds any. If os is NULL it will allocate a new object set. + * + * If any error occurs (syntax error, premature EOF) this function will + * free os, print an error message into errstr, and return NULL. + * This is because a config. file error is viewed as a catastrophic error + * from which httpd should not try to recover. If httpd were to continue + * after an error, it would not behave as the admin. expected and he/she + * may not notice until it's too late. + * + * Upon EOF the file will not be closed. + */ +#define objset_scan_buffer (*__nsapi30_table->f_objset_scan_buffer) + +/* + * objset_create creates a new object set and returns a pointer to it. + */ +#define objset_create (*__nsapi30_table->f_objset_create) + +/* + * objset_free will free an object set, any associated objects, and any + * associated Init functions. + */ +#define objset_free (*__nsapi30_table->f_objset_free) + +/* + * objset_free_setonly frees only the object set, and not the associated + * objects or init functions. + */ +#define objset_free_setonly (*__nsapi30_table->f_objset_free_setonly) + +/* + * objset_new_object will add a new object to objset with the specified + * name. It returns a pointer to the new object (which may be anywhere in + * the objset). + */ +#define objset_new_object (*__nsapi30_table->f_objset_new_object) + +/* + * objset_add_object will add the existing object to os. + */ +#define objset_add_object (*__nsapi30_table->f_objset_add_object) + +/* + * objset_add_init will add the initialization function specified by + * initfn to the given object set. Modifies os->initfns. + */ +#define objset_add_init (*__nsapi30_table->f_objset_add_init) + +/* + * objset_findbyname will find the object in objset having the given name, + * and return the object if found, and NULL otherwise. + * ign is a set of objects to ignore. + */ +#define objset_findbyname (*__nsapi30_table->f_objset_findbyname) + +/* + * objset_findbyppath will find the object in objset having the given + * partial path entry. Returns object if found, NULL otherwise. + * ign is a set of objects to ignore. + */ +#define objset_findbyppath (*__nsapi30_table->f_objset_findbyppath) + +/* + * request_create creates a new request structure. + */ +#define request_create (*__nsapi30_table->f_request_create) + +/* + * request_free destroys a request structure. + */ +#define request_free (*__nsapi30_table->f_request_free) + +/* + * Restarts a request for a given URI internally. If rq is non-NULL, the + * function will keep the old request's headers and protocol, but with a new + * URI and method of GET. If the previous method was HEAD, this is preserved. + * Any other method becomes GET. You may assume that if you give it a request + * structure that it will use the same structure. + * + * Once you have this new Request, you must then do what you want with + * it (e.g. send the object back, perform uri2path translation, etc.) + */ +#define request_restart_internal (*__nsapi30_table->f_request_restart_internal) + +/* + * request_header finds the named header depending on the requesting + * protocol. If possible, it will not load headers until the first is + * requested. You have to watch out because this can return REQ_ABORTED. + */ +#define request_header (*__nsapi30_table->f_request_header) + +/* + * request_loadheaders just makes sure the headers have been loaded. + */ +#define request_loadheaders (*__nsapi30_table->f_request_loadheaders) + +/* + * request_stat_path tries to stat path. If path is NULL, it will look in + * the vars pblock for "path". If the stat is successful, it returns the stat + * structure. If not, returns NULL and leaves a message in rq->staterr. If a + * previous call to this function was successful, and path is the same, the + * function will simply return the previously found value. + * + * User functions should not free this structure. + */ + +#define request_stat_path (*__nsapi30_table->f_request_stat_path) + +/* + * Random number generation + * + * random_create - create a new random number context + * random_update - update a context with random data + * random_generate - generate random bytes + * random_destroy - destroy a random number context + */ + +#define random_create (*__nsapi30_table->f_random_create) +#define random_update (*__nsapi30_table->f_random_update) +#define random_generate (*__nsapi30_table->f_random_generate) +#define random_destroy (*__nsapi30_table->f_random_destroy) + +/* + * MD5 hash routines + * + * md5hash_create - create an MD5 hash context + * md5hash_copy - make a copy of an MD5 hash context + * md5hash_begin - initialize an MD5 hash context + * md5hash_update - update MD5 hash with more input data + * md5hash_end - finalize MD5 hash and get result + * md5hash_destroy - destroy an MD5 hash context + * md5hash_data - compute MD5 hash of data in one step + */ + +#define md5hash_create (*__nsapi30_table->f_md5hash_create) +#define md5hash_copy (*__nsapi30_table->f_md5hash_copy) +#define md5hash_begin (*__nsapi30_table->f_md5hash_begin) +#define md5hash_update (*__nsapi30_table->f_md5hash_update) +#define md5hash_end (*__nsapi30_table->f_md5hash_end) +#define md5hash_destroy (*__nsapi30_table->f_md5hash_destroy) +#define md5hash_data (*__nsapi30_table->f_md5hash_data) + +/* + * ACL_SetupEval - + * Setup environment and call ACL_EvalTestRights. + */ +#define ACL_SetupEval (*__nsapi30_table->f_ACL_SetupEval) + +/* + * servact_translate_uri + * Returns the translated path (filename) for the given uri, NULL otherwise. + * If authentication is required for the given uri, nothing is returned even + * if the current user has authenticated to that area. + */ +#define servact_translate_uri (*__nsapi30_table->f_servact_translate_uri) + +#endif /* !INTNSAPI */ + +#ifndef FILE_MMAP +#define filebuf_open_nostat(fd,sz,finfo) filebuf_open(fd,sz) +#endif + +#ifdef XP_UNIX +#define dir_open opendir +#define dir_read readdir +#define dir_close closedir +#define dir_create(path) mkdir(path, 0755) +#define dir_remove rmdir +#define system_chdir chdir +#define file_unix2local(path,p2) strcpy(p2,path) +#endif /* XP_UNIX */ + +#ifdef XP_WIN32 +#define dir_create _mkdir +#define dir_remove _rmdir +#define system_chdir SetCurrentDirectory +#endif /* XP_WIN32 */ + +/* + * Thread-safe variants of localtime and gmtime + */ +#define system_localtime(curtime, ret) util_localtime(curtime, ret) +#define system_gmtime(curtime, ret) util_gmtime(curtime, ret) + +/* + * pblock_find finds the entry with the given name in pblock pb. + * + * If it is successful, it returns the param block. If not, it returns NULL. + */ + +#define pblock_find(name, pb) (pblock_fr(name,pb,0)) + +/* + * pblock_remove behaves exactly like pblock_find, but removes the given + * entry from pb. + */ + +#define pblock_remove(name, pb) (pblock_fr(name,pb,1)) + +/* + * session_dns returns the DNS hostname of the client of this session, + * and inserts it into the client pblock. Returns NULL if unavailable. + */ + +#define session_dns(sn) session_dns_lookup(sn, 0) + +/* + * session_maxdns looks up a hostname from an IP address, and then verifies + * that the host is really who they claim to be. + */ + +#define session_maxdns(sn) session_dns_lookup(sn, 1) + +#define protocol_find_request http_find_request +#define protocol_parse_request http_parse_request +#define protocol_scan_headers http_scan_headers +#define protocol_start_response http_start_response +#define protocol_status http_status +#define protocol_set_finfo http_set_finfo +#define protocol_finish_request http_finish_request +#define protocol_handle_session http_handle_session +#define protocol_uri2url http_uri2url +#define protocol_uri2url_dynamic http_uri2url_dynamic +#define protocol_set_keepalive_timeout http_set_keepalive_timeout + +/* XXXrobm temporary compatibility */ +#define request_uri2path servact_uri2path +#define request_pathchecks servact_pathchecks +#define request_fileinfo servact_fileinfo +#define request_service servact_service + +#define request_handle_processed servact_handle_processed +#define request_translate_uri servact_translate_uri +#define request_finderror servact_finderror + +/* --- OBSOLETE ---------------------------------------------------------- + * The following macros/functions are obsolete and are only maintained for + * compatibility. Do not use them. 11-19-96 + * ----------------------------------------------------------------------- + */ + +#define SYS_STDERR STDERR_FILENO + +#ifdef XP_WIN32 + +typedef HANDLE pid_t; + +#define ERROR_PIPE \ + (ERROR_BROKEN_PIPE | ERROR_BAD_PIPE |\ + ERROR_PIPE_BUSY | ERROR_PIPE_LISTENING | ERROR_PIPE_NOT_CONNECTED) +#define CONVERT_TO_PRINTABLE_FORMAT(Filename) \ +{ \ + register char *s; \ + if (Filename) \ + for (s = Filename; *s; s++) \ + if ( *s == '\\') \ + *s = '/'; \ +} +#define CONVERT_TO_NATIVE_FS(Filename) \ +{ \ + register char *s; \ + if (Filename) \ + for (s = Filename; *s; s++) \ + if ( *s == '/') \ + *s = '\\'; \ +} + +#ifdef INTNSAPI +NSAPI_PUBLIC extern nsapi_dispatch_t *__nsapi30_table; +#else +__declspec(dllimport) nsapi_dispatch_t *__nsapi30_table; +#endif /* INTNSAPI */ + +#else /* !XP_WIN32 */ + +NSAPI_PUBLIC extern nsapi_dispatch_t *__nsapi30_table; + +#endif /* XP_WIN32 */ + +#endif /* !PUBLIC_NSAPI_H */ |