From a6b4c0df5f74d1238337f41d1d13f4f168ad01f1 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 1 Sep 2000 10:57:21 +0000 Subject: 2000-08-30 Joel Sherrill * Merged version 2.1 of GoAhead webserver. This update was submitted by Antti P Miettinen . * NOTES, base64.c, ejIntrn.h, emfdb.c, emfdb.h, md5.h, md5c.c, um.c, um.h: New files. * wbase64.c: Removed. * Makefile.am, asp.c, balloc.c, default.c, ej.h, ejlex.c, ejparse.c, form.c, h.c, handler.c, mime.c, misc.c, ringq.c, rom.c, security.c, socket.c, sym.c, uemf.c, uemf.h, url.c, value.c, webcomp.c, webmain.c, webpage.c, webrom.c, webs.c, webs.h, websuemf.c, wsIntrn.h: Modified. --- cpukit/httpd/uemf.h | 831 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 603 insertions(+), 228 deletions(-) (limited to 'cpukit/httpd/uemf.h') diff --git a/cpukit/httpd/uemf.h b/cpukit/httpd/uemf.h index 8945907dfb..59533aac00 100644 --- a/cpukit/httpd/uemf.h +++ b/cpukit/httpd/uemf.h @@ -1,7 +1,7 @@ /* - * uemf.h -- Go Ahead Micro Embedded Management Framework Header + * uemf.h -- GoAhead Micro Embedded Management Framework Header * - * Copyright (c) Go Ahead Software, Inc., 1995-1999 + * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved. * * See the file "license.txt" for usage and redistribution license requirements */ @@ -12,7 +12,7 @@ /******************************** Description *********************************/ /* - * Go Ahead Web Server header. This defines the Web public APIs + * GoAhead Web Server header. This defines the Web public APIs */ /******************************* Per O/S Includes *****************************/ @@ -29,7 +29,9 @@ #include #include #include -#endif + #include + #include +#endif /* WIN */ #if CE #include @@ -37,15 +39,26 @@ #include #include #include "CE/wincompat.h" -#endif + #include +#endif /* CE */ #if NW #include -#endif +#endif /* NW */ + +#if SCOV5 + #include + #include + #include "sys/socket.h" + #include "sys/select.h" + #include "netinet/in.h" + #include "arpa/inet.h" + #include "netdb.h" +#endif /* SCOV5 */ #if UNIX #include -#endif +#endif /* UNIX */ #if LINUX || __rtems__ #include @@ -61,7 +74,9 @@ #include #include #include -#endif + #include + #include +#endif /* LINUX */ #if LYNX #include @@ -74,13 +89,15 @@ #include #include #include -#endif + #include + #include +#endif /* LYNX */ #if UW #include -#endif +#endif /* UW */ -#if VXW486 +#if VXWORKS #include #include #include @@ -90,7 +107,25 @@ #include #include #include -#endif + #include + #include +#endif /* VXWORKS */ + +#if SOLARIS + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#endif /* SOLARIS */ #if QNX4 #include @@ -100,7 +135,20 @@ #include #include #include -#endif + #include + #include + #include + #include +#endif /* QNX4 */ + +#if ECOS + #include + #include + #include + #include + #include + #include +#endif /* ECOS */ /********************************** Includes **********************************/ @@ -108,6 +156,69 @@ #include #include +#if ! WEBS +#include "messages.h" +#endif /* ! WEBS */ + +/******************************* Per O/S Defines *****************************/ + +#if UW + #define __NO_PACK 1 +#endif /* UW */ + +#if SCOV5 || VXWORKS || LINUX || LYNX || __rtems__ +#ifndef O_BINARY +#define O_BINARY 0 +#endif /* O_BINARY */ +#define SOCKET_ERROR -1 +#endif /* SCOV5 || VXWORKS || LINUX || LYNX */ + +#if WIN || CE +/* + * __NO_FCNTL means can't access fcntl function. Fcntl.h is still available. + */ +#define __NO_FCNTL 1 + +#undef R_OK +#define R_OK 4 +#undef W_OK +#define W_OK 2 +#undef X_OK +#define X_OK 1 +#undef F_OK +#define F_OK 0 +#endif /* WIN || CE */ + +#if LINUX && !__rtems__ && ! _STRUCT_TIMEVAL +struct timeval +{ + time_t tv_sec; /* Seconds. */ + time_t tv_usec; /* Microseconds. */ +}; +#define _STRUCT_TIMEVAL 1 +#endif /* LINUX && ! _STRUCT_TIMEVAL */ + +#if ECOS + #define O_RDONLY 1 + #define O_BINARY 2 + + #define __NO_PACK 1 + #define __NO_EJ_FILE 1 + #define __NO_CGI_BIN 1 + #define __NO_FCNTL 1 + +/* + * #define LIBKERN_INLINE to avoid kernel inline functions + */ + #define LIBKERN_INLINE + +#endif /* ECOS */ + +#if QNX4 + typedef long fd_mask; + #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ +#endif /* QNX4 */ + /********************************** Unicode ***********************************/ /* * Constants and limits. Also FNAMESIZE and PATHSIZE are currently defined @@ -119,34 +230,85 @@ #define XML_MAX 4096 /* Maximum size for tags/tokens */ #define BUF_MAX 4096 /* General sanity check for bufs */ -/* - * Type for unicode systems - */ -#if UNICODE +#if LITTLEFOOT || WEBS +#define LF_BUF_MAX (510) +#define LF_PATHSIZE LF_BUF_MAX +#else +#define LF_BUF_MAX BUF_MAX +#define LF_PATHSIZE PATHSIZE +#define UPPATHSIZE PATHSIZE +#endif /* LITTLEFOOT || WEBS */ +#ifndef CHAR_T_DEFINED +#define CHAR_T_DEFINED 1 +#if UNICODE /* * To convert strings to UNICODE. We have a level of indirection so things * like T(__FILE__) will expand properly. */ -#define T(x) __TXT(x) -#define __TXT(s) L ## s -typedef unsigned short char_t; -typedef unsigned short uchar_t; +#define T(x) __TXT(x) +#define __TXT(s) L ## s +typedef unsigned short char_t; +typedef unsigned short uchar_t; /* * Text size of buffer macro. A buffer bytes will hold (size / char size) * characters. */ -#define TSZ(x) (sizeof(x) / sizeof(char_t)) +#define TSZ(x) (sizeof(x) / sizeof(char_t)) /* * How many ASCII bytes are required to represent this UNICODE string? */ -#define TASTRL(x) ((wcslen(x) + 1) * sizeof(char_t)) +#define TASTRL(x) ((wcslen(x) + 1) * sizeof(char_t)) + +#else +#define T(s) s +typedef char char_t; +#define TSZ(x) (sizeof(x)) +#define TASTRL(x) (strlen(x) + 1) +#if WIN +typedef unsigned char uchar_t; +#endif /* WIN */ +#endif /* UNICODE */ + +#endif /* ! CHAR_T_DEFINED */ + +/* + * "Boolean" constants + */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * GoAhead Copyright. + */ +#define GOAHEAD_COPYRIGHT \ + T("Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.") + +/* + * The following include has to be after the unicode defines. By putting it + * here, many modules in various parts of the tree are cleaner. + */ +#if LITTLEFOOT && INMEM + #include "lf/inmem.h" +#endif /* LITTLEFOOT && INMEM */ + +/* + * Type for unicode systems + */ +#if UNICODE #define gmain wmain +#define gasctime _wasctime #define gsprintf swprintf #define gprintf wprintf #define gfprintf fwprintf @@ -165,15 +327,23 @@ typedef unsigned short uchar_t; #define gstrrchr wcsrchr #define gstrtok wcstok #define gstrnset wcsnset +#define gstrrchr wcsrchr #define gstrstr wcsstr +#define gstrtol wcstol #define gfopen _wfopen #define gopen _wopen +#define gclose close #define gcreat _wcreat #define gfgets fgetws #define gfputs fputws +#define gfscanf fwscanf +#define ggets _getws +#define glseek lseek #define gunlink _wunlink +#define gread read #define grename _wrename +#define gwrite write #define gtmpnam _wtmpnam #define gtempnam _wtempnam #define gfindfirst _wfindfirst @@ -182,24 +352,34 @@ typedef unsigned short uchar_t; #define gfindclose _findclose #define gstat _wstat #define gaccess _waccess +#define gchmod _wchmod typedef struct _stat gstat_t; #define gmkdir _wmkdir #define gchdir _wchdir #define grmdir _wrmdir -#define gremove _wremove #define ggetcwd _wgetcwd #define gtolower towlower #define gtoupper towupper +#if CE +#define gisspace isspace +#define gisdigit isdigit +#define gisxdigit isxdigit +#define gisupper isupper +#define gislower islower +#define gisprint isprint +#else +#define gremove _wremove #define gisspace iswspace #define gisdigit iswdigit #define gisxdigit iswxdigit -#define gisalnum iswalnum -#define gisalpha iswalpha #define gisupper iswupper #define gislower iswlower +#endif /* if CE */ +#define gisalnum iswalnum +#define gisalpha iswalpha #define gatoi(s) wcstol(s, NULL, 10) #define gctime _wctime @@ -208,14 +388,57 @@ typedef struct _stat gstat_t; #else /* ! UNICODE */ -#define T(s) s -#define TSZ(x) (sizeof(x)) -#define TASTRL(x) (strlen(x) + 1) -typedef char char_t; -#if WIN -typedef unsigned char uchar_t; -#endif +#ifndef gopen +#if INMEM +#define gclose imClose +#define gclosedir imClosedir +#define gchdir imChdir +#define gchmod imChmod +#define ggetcwd imGetcwd +#define glseek imLseek +#define gloadModule imLoadModule +#define gmkdir imMkdir +#define gopen imOpen +#define gopendir imOpendir +#define gread imRead +#define greaddir imReaddir +#define grename imRename +#define grmdir imRmdir +#define gstat imStat +#define gunlink imUnlink +#define gwrite imWrite +#else +#define gclose close +#define gclosedir closedir +#if VXWORKS +#define gchdir vxchdir +#define gmkdir vxmkdir +#define grmdir vxrmdir +#else +#if LYNX || LINUX || SOLARIS +#define gmkdir(s) mkdir(s,0755) +#else +#define gmkdir mkdir +#endif /* LYNX || LINUX || SOLARIS */ +#define grmdir rmdir +#define gchdir chdir +#endif /* VXWORKS */ +#define gchmod chmod +#define ggetcwd getcwd +#define glseek lseek +#define gloadModule loadModule +#define gopen open +#define gopendir opendir +#define gread read +#define greaddir readdir +#define grename rename +#define gstat stat +#define gunlink unlink +#define gwrite write +#endif /* INMEM */ +#endif /* ! gopen */ +#define gasctime asctime #define gsprintf sprintf #define gprintf printf #define gfprintf fprintf @@ -229,36 +452,32 @@ typedef unsigned char uchar_t; #define gstrcat strcat #define gstrcmp strcmp #define gstrncmp strncmp -#define gstricmp stricmp +#define gstricmp strcmpci #define gstrchr strchr #define gstrrchr strrchr #define gstrtok strtok #define gstrnset strnset +#define gstrrchr strrchr #define gstrstr strstr +#define gstrtol strtol #define gfopen fopen -#define gopen open #define gcreat creat #define gfgets fgets #define gfputs fputs -#define gunlink unlink -#define grename rename +#define gfscanf fscanf +#define ggets gets #define gtmpnam tmpnam #define gtempnam tempnam #define gfindfirst _findfirst #define gfinddata_t _finddata_t #define gfindnext _findnext #define gfindclose _findclose -#define gstat stat #define gaccess access typedef struct stat gstat_t; -#define gmkdir mkdir -#define gchdir chdir -#define grmdir rmdir #define gremove remove -#define ggetcwd getcwd #define gtolower tolower #define gtoupper toupper @@ -274,16 +493,23 @@ typedef struct stat gstat_t; #define gctime ctime #define ggetenv getenv #define gexecvp execvp -#ifndef VXW486 +#ifndef VXWORKS #define gmain main -#endif -#endif +#endif /* ! VXWORKS */ +#if VXWORKS +#define fcntl(a, b, c) +#endif /* VXWORKS */ +#endif /* ! UNICODE */ /********************************** Defines ***********************************/ -#define FNAMESIZE 256 /* Max length of file names */ +#ifndef FNAMESIZE +#define FNAMESIZE 254 /* Max length of file names */ +#endif /* FNAMESIZE */ #define E_MAX_ERROR 4096 +#define URL_MAX 4096 + /* * Error types */ @@ -291,79 +517,84 @@ typedef struct stat gstat_t; #define E_LOG 0x2 /* Log error to log file */ #define E_USER 0x3 /* Error that must be displayed */ -#define E_L T(__FILE__), __LINE__ -#define E_ARGS_DEC char_t *file, int line -#define E_ARGS file, line +#define E_L T(__FILE__), __LINE__ +#define E_ARGS_DEC char_t *file, int line +#define E_ARGS file, line -#if ASSERT - #define a_assert(C) if (C) ; else error(E_L, E_ASSERT, T("%s"), #C) +#if ASSERT || ASSERT_CE + #define a_assert(C) if (C) ; else error(E_L, E_ASSERT, T("%s"), T(#C)) #else #define a_assert(C) if (1) ; else -#endif - -#define VALUE_VALID { {0}, integer, 1 } -#define VALUE_INVALID { {0}, undefined, 0 } - -/* - * Allocation flags - */ -#define VALUE_ALLOCATE 0x1 - -#define value_numeric(t) (t == integer) -#define value_str(t) (t >= string || t <= bytes) -#define value_ok(t) (t > undefined && t <= symbol) +#endif /* ASSERT || ASSERT_CE */ +/******************************************************************************/ +/* VALUE */ +/******************************************************************************/ /* * These values are not prefixed so as to aid code readability */ -#if !defined(UW) && !defined(__rtems__) -#pragma pack(2) -#endif typedef enum { undefined = 0, - integer = 1, - string = 2, - bytes = 3, - errmsg = 4 -} value_type_t; + byteint = 1, + shortint = 2, + integer = 3, + hex = 4, + percent = 5, + octal = 6, + big = 7, + flag = 8, + floating = 9, + string = 10, + bytes = 11, + symbol = 12, + errmsg = 13 +} vtype_t; + +#ifndef __NO_PACK +#pragma pack(2) +#endif /* _NO_PACK */ -/* - * In UW, bit fields default to unsigned unless explicitly defined as signed. - * Unfortunately, enum become ints, but not explicitly signed. Thus, if using - * an enum type in a bit field, it becomes unsigned, but we need signed. So - * for UW we declare value_type_t to be a signed int to make this all work. - */ typedef struct { union { + char flag; + char byteint; + short shortint; + char percent; long integer; + long hex; + long octal; + long big[2]; +#if FLOATING_POINT_SUPPORT + double floating; +#endif /* FLOATING_POINT_SUPPORT */ char_t *string; - char_t *bytes; + char *bytes; char_t *errmsg; void *symbol; } value; -#if UW - signed int type : 8; -#else - value_type_t type : 8; -#endif - - unsigned int valid : 1; - unsigned int user_def_1 : 1; - unsigned int allocated : 1; /* String was balloced */ + vtype_t type : 16; + unsigned int valid : 8; + unsigned int allocated : 8; /* String was balloced */ } value_t; +#ifndef __NO_PACK +#pragma pack() +#endif /* __NO_PACK */ + /* - * Extract a string from the value depending whether inline or via pointer + * Allocation flags */ -#define value_strget(v) \ - (((v)->type == bytes) ? (v)->value.bytes : (v)->value.string) +#define VALUE_ALLOCATE 0x1 -#if !defined(UW) && !defined(__rtems__) -#pragma pack() -#endif +#define value_numeric(t) (t >= byteint && t <= big) +#define value_str(t) (t >= string && t <= bytes) +#define value_ok(t) (t > undefined && t <= symbol) + +#define VALUE_VALID { {0}, integer, 1 } +#define VALUE_INVALID { {0}, undefined, 0 } /******************************************************************************/ /* @@ -417,16 +648,28 @@ typedef struct { } ringq_t; /* - * Block allocation definitions + * Block allocation (balloc) definitions */ -#define B_L __FILE__, __LINE__ -#define B_ARGS_DEC char *file, int line +#ifdef B_STATS +#ifndef B_L +#define B_L T(__FILE__), __LINE__ +#define B_ARGS_DEC char_t *file, int line #define B_ARGS file, line +#endif /* B_L */ +#endif /* B_STATS */ /* * Block classes are: 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, * 16384, 32768, 65536 */ +typedef struct { + union { + void *next; /* Pointer to next in q */ + int size; /* Actual requested size */ + } u; + int flags; /* Per block allocation flags */ +} bType; + #define B_SHIFT 4 /* Convert size to class */ #define B_ROUND ((1 << (B_SHIFT)) - 1) #define B_MAX_CLASS 13 /* Maximum class number + 1 */ @@ -438,13 +681,12 @@ typedef struct { #define B_MAX_BLOCKS (64 * 1024) /* Maximum allocated blocks */ /* - * Flags. The integer value is used as an arbitrary value to fill the flags. + * Flags. The integrity value is used as an arbitrary value to fill the flags. */ - -#define B_USE_MALLOC 0x1 /* Okay to use malloc if required */ -#define B_USER_BUF 0x2 /* User supplied buffer for mem */ #define B_INTEGRITY 0x8124000 /* Integrity value */ #define B_INTEGRITY_MASK 0xFFFF000 /* Integrity mask */ +#define B_USE_MALLOC 0x1 /* Okay to use malloc if required */ +#define B_USER_BUF 0x2 /* User supplied buffer for mem */ /* * The symbol table record for each symbol entry @@ -459,15 +701,68 @@ typedef struct sym_t { typedef int sym_fd_t; /* Returned by symOpen */ +/* + * Script engines + */ +#define EMF_SCRIPT_JSCRIPT 0 /* javascript */ +#define EMF_SCRIPT_TCL 1 /* tcl */ +#define EMF_SCRIPT_EJSCRIPT 2 /* Ejscript */ +#define EMF_SCRIPT_MAX 3 + +#define MAXINT INT_MAX +#define BITSPERBYTE 8 +#define BITS(type) (BITSPERBYTE * (int) sizeof(type)) +#define STRSPACE T("\t \n\r\t") + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif /* max */ + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif /* min */ + +/******************************************************************************/ +/* CRON */ +/******************************************************************************/ + +typedef struct { + char_t *minute; + char_t *hour; + char_t *day; + char_t *month; + char_t *dayofweek; +} cron_t; + +extern long cronUntil(cron_t *cp, int period, time_t testTime); +extern int cronAlloc(cron_t *cp, char_t *str); +extern int cronFree(cron_t *cp); + +/******************************************************************************/ +/* SOCKET */ +/******************************************************************************/ /* * Socket flags */ + +#if (WIN || CE) && WEBS +#define EWOULDBLOCK WSAEWOULDBLOCK +#define ENETDOWN WSAENETDOWN +#define ECONNRESET WSAECONNRESET +#endif /* (WIN || CE) && WEBS) */ + #define SOCKET_EOF 0x1 /* Seen end of file */ #define SOCKET_CONNECTING 0x2 /* Connect in progress */ #define SOCKET_BROADCAST 0x4 /* Broadcast mode */ #define SOCKET_PENDING 0x8 /* Message pending on this socket */ #define SOCKET_FLUSHING 0x10 /* Background flushing */ -#define SOCKET_LISTENING 0x20 /* Server socket listening */ +#define SOCKET_DATAGRAM 0x20 /* Use datagrams */ +#define SOCKET_ASYNC 0x40 /* Use async connect */ +#define SOCKET_BLOCK 0x80 /* Use blocking I/O */ +#define SOCKET_LISTENING 0x100 /* Socket is server listener */ +#define SOCKET_CLOSING 0x200 /* Socket is closing */ + +#define SOCKET_PORT_MAX 0xffff /* Max Port size */ /* * Socket error values @@ -485,181 +780,261 @@ typedef int sym_fd_t; /* Returned by symOpen */ #define SOCKET_READABLE 0x2 /* Make socket readable */ #define SOCKET_WRITABLE 0x4 /* Make socket writable */ #define SOCKET_EXCEPTION 0x8 /* Interested in exceptions */ +#define EMF_SOCKET_MESSAGE (WM_USER+13) -#define SOCKET_BUFSIZ 512 /* Underlying buffer size */ +#if LITTLEFOOT +#define SOCKET_BUFSIZ 510 /* Underlying buffer size */ +#else +#define SOCKET_BUFSIZ 1024 /* Underlying buffer size */ +#endif /* LITTLEFOOT */ typedef void (*socketHandler_t)(int sid, int mask, int data); -typedef int (*socketAccept_t)(int sid, char *ipaddr, int port); +typedef int (*socketAccept_t)(int sid, char *ipaddr, int port, + int listenSid); +typedef struct { + char host[64]; /* Host name */ + ringq_t inBuf; /* Input ring queue */ + ringq_t outBuf; /* Output ring queue */ + ringq_t lineBuf; /* Line ring queue */ + socketAccept_t accept; /* Accept handler */ + socketHandler_t handler; /* User I/O handler */ + int handler_data; /* User handler data */ + int handlerMask; /* Handler events of interest */ + int sid; /* Index into socket[] */ + int port; /* Port to listen on */ + int flags; /* Current state flags */ + int sock; /* Actual socket handle */ + int fileHandle; /* ID of the file handler */ + int interestEvents; /* Mask of events to watch for */ + int currentEvents; /* Mask of ready events (FD_xx) */ + int selectEvents; /* Events being selected */ + int saveMask; /* saved Mask for socketFlush */ + int error; /* Last error */ +} socket_t; +/********************************* Prototypes *********************************/ /* - * Script engines + * Balloc module + * */ -#define EMF_SCRIPT_JSCRIPT 0 /* javascript */ -#define EMF_SCRIPT_TCL 1 /* tcl */ -#define EMF_SCRIPT_EJSCRIPT 2 /* Ejscript */ -#define EMF_SCRIPT_MAX 3 -#define MAXINT INT_MAX -#define BITSPERBYTE 8 -#define BITS(type) (BITSPERBYTE * (int) sizeof(type)) - -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif +extern void bclose(); +extern int bopen(void *buf, int bufsize, int flags); -/******************************* Per O/S Defines ******************************/ +/* + * Define NO_BALLOC to turn off our balloc module altogether + * #define NO_BALLOC 1 + */ -#if VXW486 || LINUX || __rtems__ || LYNX -#ifndef O_BINARY -#define O_BINARY 0 -#endif -#define SOCKET_ERROR -1 -#endif +#if NO_BALLOC +#define balloc(B_ARGS, num) malloc(num) +#define bfree(B_ARGS, p) free(p) +#define bfreeSafe(B_ARGS, p) \ + if (p) { free(p); } else +#define brealloc(B_ARGS, p, num) realloc(p, num) +extern char_t *bstrdupNoBalloc(char_t *s); +extern char *bstrdupANoBalloc(char *s); +#define bstrdup(B_ARGS, s) bstrdupNoBalloc(s) +#define bstrdupA(B_ARGS, s) bstrdupANoBalloc(s) +#define gstrdup(B_ARGS, s) bstrdupNoBalloc(s) -#if WIN -#undef R_OK -#define R_OK 4 -#undef W_OK -#define W_OK 2 -#undef X_OK -#define X_OK 1 -#undef F_OK -#define F_OK 0 -#endif +#else /* BALLOC */ -/********************************* Prototypes *********************************/ +#ifndef B_STATS +#define balloc(B_ARGS, num) balloc(num) +#define bfree(B_ARGS, p) bfree(p) +#define bfreeSafe(B_ARGS, p) bfreeSafe(p) +#define brealloc(B_ARGS, p, size) brealloc(p, size) +#define bstrdup(B_ARGS, p) bstrdup(p) -extern void bclose(); -extern int bopen(void *buf, int bufsize, int flags); -#if NO_BALLOC -#undef B_L -#define B_L x -#define balloc(x, num) malloc(num) -#define bfree(x, p) free(p) -#define bfreeSafe(x, p) \ - if (p) { bfree(x, p); } else -#define brealloc(x, p, num) realloc(p, num) -extern char *bstrdupANoBalloc(char *s); -#define bstrdupA(x, s) bstrdupANoBalloc(s) #if UNICODE -extern char_t *bstrdupNoBalloc(char_t *s); -#define bstrdup(x, s) bstrdupNoBalloc(s) -#define gstrdup(x, s) bstrdupNoBalloc(s) -#else /* Not UNICODE */ -#define bstrdup(x, s) bstrdupANoBalloc(s) -#define gstrdup(x, s) bstrdupANoBalloc(s) +#define bstrdupA(B_ARGS, p) bstrdupA(p) +#else /* UNICODE */ +#define bstrdupA bstrdup #endif /* UNICODE */ -#else /* BALLOC */ +#endif /* B_STATS */ + +#define gstrdup bstrdup extern void *balloc(B_ARGS_DEC, int size); -extern void bfree(B_ARGS_DEC, void *mp); -extern void *brealloc(B_ARGS_DEC, void *buf, int newsize); -extern void bstats(int handle, void (*writefn)(int fd, char_t *fmt, ...)); -extern char_t *bstrdup(B_ARGS_DEC, char_t *s); -extern void bfreeSafe(B_ARGS_DEC, void* mp); -#define gstrdup(B_ARGS, s) bstrdup(B_ARGS, s) +extern void bfree(B_ARGS_DEC, void *mp); +extern void bfreeSafe(B_ARGS_DEC, void *mp); +extern void *brealloc(B_ARGS_DEC, void *buf, int newsize); +extern char_t *bstrdup(B_ARGS_DEC, char_t *s); + #if UNICODE extern char *bstrdupA(B_ARGS_DEC, char *s); -#else +#else /* UNICODE */ #define bstrdupA bstrdup #endif /* UNICODE */ #endif /* BALLOC */ +extern void bstats(int handle, void (*writefn)(int handle, char_t *fmt, ...)); + +/* + * Flags. The integrity value is used as an arbitrary value to fill the flags. + */ +#define B_USE_MALLOC 0x1 /* Okay to use malloc if required */ +#define B_USER_BUF 0x2 /* User supplied buffer for mem */ + + #if !LINUX && !__rtems__ -extern char_t* basename(char_t* name); -#endif +extern char_t *basename(char_t *name); +#endif /* !LINUX */ -extern void *emfCreateTimer(int delay, void (*routine)(long arg), long arg); -extern void emfDeleteTimer(void *id); -extern int emfInstGet(); -extern void emfInstSet(int inst); -extern void error(E_ARGS_DEC, int flags, char_t *fmt, ...); +#if UEMF && WEBS +/* + * The open source webserver uses a different callback/timer mechanism + * than other emf derivative products such as FieldUpgrader agents + * so redefine those API for webserver so that they can coexist in the + * same address space as the others. + */ +#define emfSchedCallback websSchedCallBack +#define emfUnschedCallback websUnschedCallBack +#define emfReschedCallback websReschedCallBack +#endif /* UEMF && WEBS */ + +typedef void (emfSchedProc)(void *data, int id); +extern int emfSchedCallback(int delay, emfSchedProc *proc, void *arg); +extern void emfUnschedCallback(int id); +extern void emfReschedCallback(int id, int delay); +extern void emfSchedProcess(); +extern int emfInstGet(); +extern void emfInstSet(int inst); +extern void error(E_ARGS_DEC, int flags, char_t *fmt, ...); +extern void (*errorSetHandler(void (*function)(int etype, char_t *msg))) \ + (int etype, char_t *msg); + +#if B_STATS +#define hAlloc(x) HALLOC(B_L, x) +#define hAllocEntry(x, y, z) HALLOCENTRY(B_L, x, y, z) +extern int HALLOC(B_ARGS_DEC, void ***map); +extern int HALLOCENTRY(B_ARGS_DEC, void ***list, int *max, int size); +#else +extern int hAlloc(void ***map); +extern int hAllocEntry(void ***list, int *max, int size); +#endif /* B_STATS */ -extern int hAlloc(void*** map); -extern int hFree(void*** map, int handle); -extern int hAllocEntry(void ***list, int *max, int size); +extern int hFree(void ***map, int handle); -extern int ringqOpen(ringq_t *rq, int increment, int maxsize); -extern void ringqClose(ringq_t *rq); -extern int ringqLen(ringq_t *rq); +extern int ringqOpen(ringq_t *rq, int increment, int maxsize); +extern void ringqClose(ringq_t *rq); +extern int ringqLen(ringq_t *rq); -extern int ringqPutc(ringq_t *rq, char_t c); -extern int ringqInsertc(ringq_t *rq, char_t c); -extern int ringqPutstr(ringq_t *rq, char_t *str); -extern int ringqGetc(ringq_t *rq); +extern int ringqPutc(ringq_t *rq, char_t c); +extern int ringqInsertc(ringq_t *rq, char_t c); +extern int ringqPutStr(ringq_t *rq, char_t *str); +extern int ringqGetc(ringq_t *rq); -extern int gvsnprintf(char_t **s, int n, char_t *fmt, va_list arg); -extern int gsnprintf(char_t **s, int n, char_t *fmt, ...); +extern int fmtValloc(char_t **s, int n, char_t *fmt, va_list arg); +extern int fmtAlloc(char_t **s, int n, char_t *fmt, ...); +extern int fmtStatic(char_t *s, int n, char_t *fmt, ...); #if UNICODE -extern int ringqPutcA(ringq_t* rq, char c); -extern int ringqInsertcA(ringq_t* rq, char c); -extern int ringqPutstrA(ringq_t* rq, char* str); -extern int ringqGetcA(ringq_t* rq); +extern int ringqPutcA(ringq_t *rq, char c); +extern int ringqInsertcA(ringq_t *rq, char c); +extern int ringqPutStrA(ringq_t *rq, char *str); +extern int ringqGetcA(ringq_t *rq); #else #define ringqPutcA ringqPutc #define ringqInsertcA ringqInsertc -#define ringqPutstrA ringqPutstr +#define ringqPutStrA ringqPutStr #define ringqGetcA ringqGetc -#endif - -extern int ringqPutBlk(ringq_t *rq, unsigned char *buf, int len); -extern int ringqPutBlkMax(ringq_t *rq); -extern void ringqPutBlkAdj(ringq_t *rq, int size); -extern int ringqGetBlk(ringq_t *rq, unsigned char *buf, int len); -extern int ringqGetBlkMax(ringq_t *rq); -extern void ringqGetBlkAdj(ringq_t *rq, int size); -extern void ringqFlush(ringq_t *rq); - -extern int scriptSetVar(int engine, char_t *var, char_t *value); -extern int scriptEval(int engine, char_t *cmd, char_t **rslt, int chan); +#endif /* UNICODE */ -extern void socketClose(); -extern void socketCloseConnection(int sid); -extern void socketCreateHandler(int sid, int mask, socketHandler_t +extern int ringqPutBlk(ringq_t *rq, unsigned char *buf, int len); +extern int ringqPutBlkMax(ringq_t *rq); +extern void ringqPutBlkAdj(ringq_t *rq, int size); +extern int ringqGetBlk(ringq_t *rq, unsigned char *buf, int len); +extern int ringqGetBlkMax(ringq_t *rq); +extern void ringqGetBlkAdj(ringq_t *rq, int size); +extern void ringqFlush(ringq_t *rq); +extern void ringqAddNull(ringq_t *rq); + +extern int scriptSetVar(int engine, char_t *var, char_t *value); +extern int scriptEval(int engine, char_t *cmd, char_t **rslt, int chan); + +extern void socketClose(); +extern void socketCloseConnection(int sid); +extern void socketCreateHandler(int sid, int mask, socketHandler_t handler, int arg); -extern void socketDeleteHandler(int sid); -extern int socketEof(int sid); -extern int socketFlush(int sid, int block); -extern int socketGets(int sid, char_t** buf); -extern int socketInputBuffered(int sid); -extern int socketOpen(); -extern int socketOpenConnection(char *host, int port, +extern void socketDeleteHandler(int sid); +extern int socketEof(int sid); +extern int socketCanWrite(int sid); +extern void socketSetBufferSize(int sid, int in, int line, int out); +extern int socketFlush(int sid); +extern int socketGets(int sid, char_t **buf); +extern int socketGetPort(int sid); +extern int socketInputBuffered(int sid); +extern int socketOpen(); +extern int socketOpenConnection(char *host, int port, socketAccept_t accept, int flags); -extern void socketProcess(); -extern int socketRead(int sid, char *buf, int len); -extern int socketReady(); -extern int socketWrite(int sid, char *buf, int len); -extern int socketWriteString(int sid, char_t *buf); -extern int socketSelect(); +extern void socketProcess(int hid); +extern int socketRead(int sid, char *buf, int len); +extern int socketReady(int hid); +extern int socketWrite(int sid, char *buf, int len); +extern int socketWriteString(int sid, char_t *buf); +extern int socketSelect(int hid, int timeout); +extern int socketGetHandle(int sid); +extern int socketSetBlock(int sid, int flags); +extern int socketGetBlock(int sid); +extern int socketAlloc(char *host, int port, socketAccept_t accept, + int flags); +extern void socketFree(int sid); +extern int socketGetError(); +extern socket_t *socketPtr(int sid); +extern int socketWaitForEvent(socket_t *sp, int events, int *errCode); +extern void socketRegisterInterest(socket_t *sp, int handlerMask); +extern int socketGetInput(int sid, char *buf, int toRead, int *errCode); extern char_t *strlower(char_t *string); extern char_t *strupper(char_t *string); extern char_t *stritoa(int n, char_t *string, int width); -extern sym_fd_t symOpen(int hash_size); -extern void symClose(sym_fd_t sd, void (*cleanup)(sym_t *sp)); +extern sym_fd_t symOpen(int hash_size); +extern void symClose(sym_fd_t sd); extern sym_t *symLookup(sym_fd_t sd, char_t *name); extern sym_t *symEnter(sym_fd_t sd, char_t *name, value_t v, int arg); -extern int symDelete(sym_fd_t sd, char_t *name); -extern void symWalk(sym_fd_t sd, void (*fn)(sym_t *symp)); - -extern void goahead_trace(int lev, char_t *fmt, ...); +extern int symDelete(sym_fd_t sd, char_t *name); +extern void symWalk(sym_fd_t sd, void (*fn)(sym_t *symp)); +extern sym_t *symFirst(sym_fd_t sd); +extern sym_t *symNext(sym_fd_t sd); +extern int symSubOpen(); +extern void symSubClose(); + +extern void trace(int lev, char_t *fmt, ...); +extern void traceRaw(char_t *buf); +extern void (*traceSetHandler(void (*function)(int level, char_t *buf))) + (int level, char_t *buf); -extern value_t valueInteger(long value); -extern value_t valueString(char_t *value, int flags); -extern value_t valueErrmsg(char_t *value); -extern void valueFree(value_t *v); +extern value_t valueInteger(long value); +extern value_t valueString(char_t *value, int flags); +extern value_t valueErrmsg(char_t *value); +extern void valueFree(value_t *v); +extern int vxchdir(char *dirname); + +extern unsigned int hextoi(char_t *hexstring); +extern unsigned int gstrtoi(char_t *s); +extern time_t timeMsec(); extern char_t *ascToUni(char_t *ubuf, char *str, int nBytes); extern char *uniToAsc(char *buf, char_t *ustr, int nBytes); -extern char_t *ballocAscToUni(char * cp); -extern char *ballocUniToAsc(char_t * unip, int ulen); +extern char_t *ballocAscToUni(char *cp, int alen); +extern char *ballocUniToAsc(char_t *unip, int ulen); + +extern char_t *basicGetHost(); +extern char_t *basicGetAddress(); +extern char_t *basicGetProduct(); +extern void basicSetHost(char_t *host); +extern void basicSetAddress(char_t *addr); + +extern int harnessOpen(char_t **argv); +extern void harnessClose(int status); +extern void harnessTesting(char_t *msg, ...); +extern void harnessPassed(); +extern void harnessFailed(int line); +extern int harnessLevel(); #endif /* _h_UEMF */ -- cgit v1.2.3