source: rtems/c/src/libnetworking/rtems_webserver/uemf.h @ 19f4540e

Last change on this file since 19f4540e was fd16f5b5, checked in by Joel Sherrill <joel.sherrill@…>, on 06/01/00 at 21:50:37

Patch from Keith Outwater <vac4050@…> to rename
webserver trace() routine to goahead_trace() to avoid name conflicts
with ncurses.

  • Property mode set to 100644
File size: 17.9 KB
Line 
1/*
2 * uemf.h -- Go Ahead Micro Embedded Management Framework Header
3 *
4 * Copyright (c) Go Ahead Software, Inc., 1995-1999
5 *
6 * See the file "license.txt" for usage and redistribution license requirements
7 */
8
9#ifndef _h_UEMF
10#define _h_UEMF 1
11
12/******************************** Description *********************************/
13
14/*
15 *      Go Ahead Web Server header. This defines the Web public APIs
16 */
17
18/******************************* Per O/S Includes *****************************/
19
20#if WIN
21        #include        <direct.h>
22        #include        <io.h>
23        #include        <sys/stat.h>
24        #include        <limits.h>
25        #include        <tchar.h>
26        #include        <windows.h>
27        #include        <winnls.h>
28        #include        <time.h>
29        #include        <sys/types.h>
30        #include        <stdio.h>
31        #include        <stdlib.h>
32#endif
33
34#if CE
35        #include        <limits.h>
36        #include        <tchar.h>
37        #include        <windows.h>
38        #include        <winnls.h>
39        #include        "CE/wincompat.h"
40#endif
41
42#if NW
43        #include        <stdio.h>
44#endif
45
46#if UNIX
47        #include        <stdio.h>
48#endif
49
50#if LINUX || __rtems__
51        #include        <sys/types.h>
52        #include        <sys/stat.h>
53        #include        <sys/param.h>
54        #include        <limits.h>
55        #include        <stdio.h>
56        #include        <stdlib.h>
57        #include        <unistd.h>
58        #include        <sys/socket.h>
59        #include        <sys/select.h>
60        #include        <netinet/in.h>
61        #include        <arpa/inet.h>
62        #include        <netdb.h>
63        #include        <time.h>
64#endif
65
66#if LYNX
67        #include        <limits.h>
68        #include        <stdarg.h>
69        #include        <stdio.h>
70        #include        <stdlib.h>
71        #include        <unistd.h>
72        #include        <socket.h>
73        #include        <netinet/in.h>
74        #include        <arpa/inet.h>
75        #include        <netdb.h>
76        #include        <time.h>
77#endif
78
79#if UW
80        #include        <stdio.h>
81#endif
82
83#if VXW486
84        #include        <vxWorks.h>
85        #include        <sockLib.h>
86        #include        <selectLib.h>
87        #include        <inetLib.h>
88        #include        <ioLib.h>
89        #include        <stdio.h>
90        #include        <stat.h>
91        #include        <time.h>
92        #include        <usrLib.h>
93#endif
94
95#if QNX4
96        #include        <sys/types.h>
97        #include        <stdio.h>
98        #include        <sys/socket.h>
99        #include        <sys/select.h>
100        #include        <netinet/in.h>
101        #include        <arpa/inet.h>
102        #include        <netdb.h>
103#endif
104
105/********************************** Includes **********************************/
106
107#include        <ctype.h>
108#include        <stdarg.h>
109#include        <string.h>
110
111/********************************** Unicode ***********************************/
112/*
113 *      Constants and limits. Also FNAMESIZE and PATHSIZE are currently defined
114 *      in param.h to be 128 and 512
115 */
116#define TRACE_MAX                       (4096 - 48)
117#define VALUE_MAX_STRING        (4096 - 48)
118#define SYM_MAX                         (512)
119#define XML_MAX                         4096                    /* Maximum size for tags/tokens */
120#define BUF_MAX                         4096                    /* General sanity check for bufs */
121
122/*
123 *      Type for unicode systems
124 */
125#if UNICODE
126
127/*
128 *      To convert strings to UNICODE. We have a level of indirection so things
129 *      like T(__FILE__) will expand properly.
130 */
131#define T(x)            __TXT(x)
132#define __TXT(s)        L ## s
133typedef unsigned short char_t;
134typedef unsigned short uchar_t;
135
136/*
137 *      Text size of buffer macro. A buffer bytes will hold (size / char size)
138 *      characters.
139 */
140#define TSZ(x)          (sizeof(x) / sizeof(char_t))
141
142/*
143 *      How many ASCII bytes are required to represent this UNICODE string?
144 */
145#define TASTRL(x)               ((wcslen(x) + 1) * sizeof(char_t))
146
147
148#define gmain           wmain
149
150#define gsprintf        swprintf
151#define gprintf         wprintf
152#define gfprintf        fwprintf
153#define gsscanf         swscanf
154#define gvsprintf       vswprintf
155
156#define gstrcpy         wcscpy
157#define gstrncpy        wcsncpy
158#define gstrncat        wcsncat
159#define gstrlen         wcslen
160#define gstrcat         wcscat
161#define gstrcmp         wcscmp
162#define gstrncmp        wcsncmp
163#define gstricmp        wcsicmp
164#define gstrchr         wcschr
165#define gstrrchr        wcsrchr
166#define gstrtok         wcstok
167#define gstrnset        wcsnset
168#define gstrstr         wcsstr
169
170#define gfopen          _wfopen
171#define gopen           _wopen
172#define gcreat          _wcreat
173#define gfgets          fgetws
174#define gfputs          fputws
175#define gunlink         _wunlink
176#define grename         _wrename
177#define gtmpnam         _wtmpnam
178#define gtempnam        _wtempnam
179#define gfindfirst      _wfindfirst
180#define gfinddata_t     _wfinddata_t
181#define gfindnext       _wfindnext
182#define gfindclose      _findclose
183#define gstat           _wstat
184#define gaccess         _waccess
185
186typedef struct _stat gstat_t;
187
188#define gmkdir          _wmkdir
189#define gchdir          _wchdir
190#define grmdir          _wrmdir
191#define gremove         _wremove
192#define ggetcwd         _wgetcwd
193
194#define gtolower        towlower
195#define gtoupper        towupper
196#define gisspace        iswspace
197#define gisdigit        iswdigit
198#define gisxdigit       iswxdigit
199#define gisalnum        iswalnum
200#define gisalpha        iswalpha
201#define gisupper        iswupper
202#define gislower        iswlower
203#define gatoi(s)        wcstol(s, NULL, 10)
204
205#define gctime          _wctime
206#define ggetenv         _wgetenv
207#define gexecvp         _wexecvp
208
209#else /* ! UNICODE */
210
211#define T(s)            s
212#define TSZ(x)          (sizeof(x))
213#define TASTRL(x)       (strlen(x) + 1)
214typedef char char_t;
215#if WIN
216typedef unsigned char uchar_t;
217#endif
218
219#define gsprintf        sprintf
220#define gprintf         printf
221#define gfprintf        fprintf
222#define gsscanf         sscanf
223#define gvsprintf       vsprintf
224
225#define gstrcpy         strcpy
226#define gstrncpy        strncpy
227#define gstrncat        strncat
228#define gstrlen         strlen
229#define gstrcat         strcat
230#define gstrcmp         strcmp
231#define gstrncmp        strncmp
232#define gstricmp        stricmp
233#define gstrchr         strchr
234#define gstrrchr        strrchr
235#define gstrtok         strtok
236#define gstrnset        strnset
237#define gstrstr         strstr
238
239#define gfopen          fopen
240#define gopen           open
241#define gcreat          creat
242#define gfgets          fgets
243#define gfputs          fputs
244#define gunlink         unlink
245#define grename         rename
246#define gtmpnam         tmpnam
247#define gtempnam        tempnam
248#define gfindfirst      _findfirst
249#define gfinddata_t     _finddata_t
250#define gfindnext       _findnext
251#define gfindclose      _findclose
252#define gstat           stat
253#define gaccess         access
254
255typedef struct stat gstat_t;
256
257#define gmkdir          mkdir
258#define gchdir          chdir
259#define grmdir          rmdir
260#define gremove         remove
261#define ggetcwd         getcwd
262
263#define gtolower        tolower
264#define gtoupper        toupper
265#define gisspace        isspace
266#define gisdigit        isdigit
267#define gisxdigit       isxdigit
268#define gisalnum        isalnum
269#define gisalpha        isalpha
270#define gisupper        isupper
271#define gislower        islower
272#define gatoi           atoi
273
274#define gctime          ctime
275#define ggetenv         getenv
276#define gexecvp         execvp
277#ifndef VXW486
278#define gmain           main
279#endif
280#endif
281
282/********************************** Defines ***********************************/
283
284#define FNAMESIZE                       256                     /* Max length of file names */
285
286#define E_MAX_ERROR                     4096
287/*
288 * Error types
289 */
290#define E_ASSERT                        0x1                     /* Assertion error */
291#define E_LOG                           0x2                     /* Log error to log file */
292#define E_USER                          0x3                     /* Error that must be displayed */
293
294#define E_L                             T(__FILE__), __LINE__
295#define E_ARGS_DEC              char_t *file, int line
296#define E_ARGS                  file, line
297
298#if ASSERT
299        #define a_assert(C)             if (C) ; else error(E_L, E_ASSERT, T("%s"), #C)
300#else
301        #define a_assert(C)             if (1) ; else
302#endif
303
304#define VALUE_VALID                     { {0}, integer, 1 }
305#define VALUE_INVALID           { {0}, undefined, 0 }
306
307/*
308 *      Allocation flags
309 */
310#define VALUE_ALLOCATE          0x1
311
312#define value_numeric(t)        (t == integer)
313#define value_str(t)            (t >= string || t <= bytes)
314#define value_ok(t)             (t > undefined && t <= symbol)
315
316/*
317 *      These values are not prefixed so as to aid code readability
318 */
319#if !defined(UW) && !defined(__rtems__)
320#pragma pack(2)
321#endif
322
323typedef enum {
324        undefined       = 0,
325        integer         = 1,
326        string          = 2,
327        bytes           = 3,
328        errmsg          = 4
329} value_type_t;
330
331/*
332 *      In UW, bit fields default to unsigned unless explicitly defined as signed.
333 *      Unfortunately, enum become ints, but not explicitly signed. Thus, if using
334 *      an enum type in a bit field, it becomes unsigned, but we need signed. So
335 *      for UW we declare value_type_t to be a signed int to make this all work.
336 */
337typedef struct {
338
339        union {
340                long    integer;
341                char_t  *string;
342                char_t  *bytes;
343                char_t  *errmsg;
344                void    *symbol;
345        } value;
346
347#if UW
348        signed int              type            : 8;
349#else
350        value_type_t    type            : 8;
351#endif
352
353        unsigned int    valid           : 1;
354        unsigned int    user_def_1      : 1;
355        unsigned int    allocated       : 1;            /* String was balloced */
356} value_t;
357
358/*
359 *      Extract a string from the value depending whether inline or via pointer
360 */
361#define value_strget(v) \
362        (((v)->type == bytes) ? (v)->value.bytes : (v)->value.string)
363
364#if !defined(UW) && !defined(__rtems__)
365#pragma pack()
366#endif
367
368/******************************************************************************/
369/*
370 *      A ring queue allows maximum utilization of memory for data storage and is
371 *      ideal for input/output buffering. This module provides a highly effecient
372 *      implementation and a vehicle for dynamic strings.
373 *
374 *      WARNING:  This is a public implementation and callers have full access to
375 *      the queue structure and pointers.  Change this module very carefully.
376 *
377 *      This module follows the open/close model.
378 *
379 *      Operation of a ringq where rq is a pointer to a ringq :
380 *
381 *              rq->buflen contains the size of the buffer.
382 *              rq->buf will point to the start of the buffer.
383 *              rq->servp will point to the first (un-consumed) data byte.
384 *              rq->endp will point to the next free location to which new data is added
385 *              rq->endbuf will point to one past the end of the buffer.
386 *
387 *      Eg. If the ringq contains the data "abcdef", it might look like :
388 *
389 *      +-------------------------------------------------------------------+
390 *  |   |   |   |   |   |   |   | a | b | c | d | e | f |   |   |   |   |
391 *      +-------------------------------------------------------------------+
392 *    ^                           ^                       ^               ^
393 *    |                           |                       |               |
394 *  rq->buf                    rq->servp               rq->endp      rq->enduf
395 *     
396 *      The queue is empty when servp == endp.  This means that the queue will hold
397 *      at most rq->buflen -1 bytes.  It is the fillers responsibility to ensure
398 *      the ringq is never filled such that servp == endp.
399 *
400 *      It is the fillers responsibility to "wrap" the endp back to point to
401 *      rq->buf when the pointer steps past the end. Correspondingly it is the
402 *      consumers responsibility to "wrap" the servp when it steps to rq->endbuf.
403 *      The ringqPutc and ringqGetc routines will do this automatically.
404 */
405
406/*
407 *      Ring queue buffer structure
408 */
409typedef struct {
410        unsigned char   *buf;                           /* Holding buffer for data */
411        unsigned char   *servp;                         /* Pointer to start of data */
412        unsigned char   *endp;                          /* Pointer to end of data */
413        unsigned char   *endbuf;                        /* Pointer to end of buffer */
414        int                             buflen;                         /* Length of ring queue */
415        int                             maxsize;                        /* Maximum size */
416        int                             increment;                      /* Growth increment */
417} ringq_t;
418
419/*
420 *      Block allocation definitions
421 */
422#define B_L                             __FILE__, __LINE__
423#define B_ARGS_DEC              char *file, int line
424#define B_ARGS                  file, line
425
426/*
427 *      Block classes are: 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,
428 *                                         16384, 32768, 65536
429 */
430#define B_SHIFT                 4                                       /* Convert size to class */
431#define B_ROUND                 ((1 << (B_SHIFT)) - 1)
432#define B_MAX_CLASS             13                                      /* Maximum class number + 1 */
433#define B_MALLOCED              0x80000000                      /* Block was malloced */
434#define B_DEFAULT_MEM   (64 * 1024)                     /* Default memory allocation */
435#define B_MAX_FILES             (512)                           /* Maximum number of files */
436#define B_FILL_CHAR             (0x77)                          /* Fill byte for buffers */
437#define B_FILL_WORD             (0x77777777)            /* Fill word for buffers */
438#define B_MAX_BLOCKS    (64 * 1024)                     /* Maximum allocated blocks */
439
440/*
441 *      Flags. The integer value is used as an arbitrary value to fill the flags.
442 */
443
444#define B_USE_MALLOC            0x1                             /* Okay to use malloc if required */
445#define B_USER_BUF                      0x2                             /* User supplied buffer for mem */
446#define B_INTEGRITY                     0x8124000               /* Integrity value */
447#define B_INTEGRITY_MASK        0xFFFF000               /* Integrity mask */
448
449/*
450 *      The symbol table record for each symbol entry
451 */
452
453typedef struct sym_t {
454        struct sym_t    *forw;                                  /* Pointer to next hash list */
455        value_t                 name;                                   /* Name of symbol */
456        value_t                 content;                                /* Value of symbol */
457        int                             arg;                                    /* Parameter value */
458} sym_t;
459
460typedef int sym_fd_t;                                           /* Returned by symOpen */
461
462/*
463 *      Socket flags
464 */
465#define SOCKET_EOF                              0x1                     /* Seen end of file */
466#define SOCKET_CONNECTING               0x2                     /* Connect in progress */
467#define SOCKET_BROADCAST                0x4                     /* Broadcast mode */
468#define SOCKET_PENDING                  0x8                     /* Message pending on this socket */
469#define SOCKET_FLUSHING                 0x10            /* Background flushing */
470#define SOCKET_LISTENING                0x20            /* Server socket listening */
471
472/*
473 *      Socket error values
474 */
475#define SOCKET_WOULDBLOCK               1                       /* Socket would block on I/O */
476#define SOCKET_RESET                    2                       /* Socket has been reset */
477#define SOCKET_NETDOWN                  3                       /* Network is down */
478#define SOCKET_AGAIN                    4                       /* Issue the request again */
479#define SOCKET_INTR                             5                       /* Call was interrupted */
480#define SOCKET_INVAL                    6                       /* Invalid */
481
482/*
483 *      Handler event masks
484 */
485#define SOCKET_READABLE                 0x2                     /* Make socket readable */
486#define SOCKET_WRITABLE                 0x4                     /* Make socket writable */
487#define SOCKET_EXCEPTION                0x8                     /* Interested in exceptions */
488
489#define SOCKET_BUFSIZ                   512                     /* Underlying buffer size */
490
491typedef void    (*socketHandler_t)(int sid, int mask, int data);
492typedef int             (*socketAccept_t)(int sid, char *ipaddr, int port);
493
494/*
495 *      Script engines
496 */
497#define EMF_SCRIPT_JSCRIPT                      0               /* javascript */
498#define EMF_SCRIPT_TCL                          1               /* tcl */
499#define EMF_SCRIPT_EJSCRIPT             2               /* Ejscript */
500#define EMF_SCRIPT_MAX                          3
501
502#define MAXINT          INT_MAX
503#define BITSPERBYTE 8
504#define BITS(type)      (BITSPERBYTE * (int) sizeof(type))
505
506#ifndef max
507#define max(a,b)  (((a) > (b)) ? (a) : (b))
508#endif
509
510#ifndef min
511#define min(a,b)  (((a) < (b)) ? (a) : (b))
512#endif
513
514/******************************* Per O/S Defines ******************************/
515
516#if VXW486 || LINUX || __rtems__ || LYNX
517#ifndef O_BINARY
518#define O_BINARY                0
519#endif
520#define SOCKET_ERROR    -1
521#endif
522
523#if WIN
524#undef R_OK
525#define R_OK    4
526#undef W_OK
527#define W_OK    2
528#undef X_OK
529#define X_OK    1
530#undef F_OK
531#define F_OK    0
532#endif
533
534/********************************* Prototypes *********************************/
535
536extern void      bclose();
537extern int               bopen(void *buf, int bufsize, int flags);
538#if NO_BALLOC
539#undef B_L
540#define B_L x
541#define balloc(x, num) malloc(num)
542#define bfree(x, p) free(p)
543#define bfreeSafe(x, p) \
544        if (p) { bfree(x, p); } else
545#define brealloc(x, p, num) realloc(p, num)
546extern char *bstrdupANoBalloc(char *s);
547#define bstrdupA(x, s) bstrdupANoBalloc(s)
548#if UNICODE
549extern char_t *bstrdupNoBalloc(char_t *s);
550#define bstrdup(x, s) bstrdupNoBalloc(s)
551#define gstrdup(x, s) bstrdupNoBalloc(s)
552#else /* Not UNICODE */
553#define bstrdup(x, s) bstrdupANoBalloc(s)
554#define gstrdup(x, s) bstrdupANoBalloc(s)
555#endif /* UNICODE */
556
557#else /* BALLOC */
558extern void             *balloc(B_ARGS_DEC, int size);
559extern void      bfree(B_ARGS_DEC, void *mp);
560extern void     *brealloc(B_ARGS_DEC, void *buf, int newsize);
561extern void      bstats(int handle, void (*writefn)(int fd, char_t *fmt, ...));
562extern char_t   *bstrdup(B_ARGS_DEC, char_t *s);
563extern void              bfreeSafe(B_ARGS_DEC, void* mp);
564#define gstrdup(B_ARGS, s)      bstrdup(B_ARGS, s)
565#if UNICODE
566extern char *bstrdupA(B_ARGS_DEC, char *s);
567#else
568#define bstrdupA bstrdup
569#endif /* UNICODE */
570#endif /* BALLOC */
571
572#if !LINUX && !__rtems__
573extern char_t*  basename(char_t* name);
574#endif
575
576extern void             *emfCreateTimer(int delay, void (*routine)(long arg), long arg);
577extern void      emfDeleteTimer(void *id);
578extern int               emfInstGet();
579extern void              emfInstSet(int inst);
580extern void              error(E_ARGS_DEC, int flags, char_t *fmt, ...);
581
582extern int               hAlloc(void*** map);
583extern int               hFree(void*** map, int handle);
584extern int               hAllocEntry(void ***list, int *max, int size);
585
586extern int               ringqOpen(ringq_t *rq, int increment, int maxsize);
587extern void      ringqClose(ringq_t *rq);
588extern int               ringqLen(ringq_t *rq);
589
590extern int               ringqPutc(ringq_t *rq, char_t c);
591extern int               ringqInsertc(ringq_t *rq, char_t c);
592extern int               ringqPutstr(ringq_t *rq, char_t *str);
593extern int               ringqGetc(ringq_t *rq);
594
595extern int              gvsnprintf(char_t **s, int n, char_t *fmt, va_list arg);
596extern int              gsnprintf(char_t **s, int n, char_t *fmt, ...);
597
598#if UNICODE
599extern int              ringqPutcA(ringq_t* rq, char c);
600extern int              ringqInsertcA(ringq_t* rq, char c);
601extern int              ringqPutstrA(ringq_t* rq, char* str);
602extern int              ringqGetcA(ringq_t* rq);
603#else
604#define ringqPutcA ringqPutc
605#define ringqInsertcA ringqInsertc
606#define ringqPutstrA ringqPutstr
607#define ringqGetcA ringqGetc
608#endif
609
610extern int               ringqPutBlk(ringq_t *rq, unsigned char *buf, int len);
611extern int               ringqPutBlkMax(ringq_t *rq);
612extern void      ringqPutBlkAdj(ringq_t *rq, int size);
613extern int               ringqGetBlk(ringq_t *rq, unsigned char *buf, int len);
614extern int               ringqGetBlkMax(ringq_t *rq);
615extern void      ringqGetBlkAdj(ringq_t *rq, int size);
616extern void      ringqFlush(ringq_t *rq);
617
618extern int               scriptSetVar(int engine, char_t *var, char_t *value);
619extern int               scriptEval(int engine, char_t *cmd, char_t **rslt, int chan);
620
621extern void              socketClose();
622extern void              socketCloseConnection(int sid);
623extern void              socketCreateHandler(int sid, int mask, socketHandler_t
624                                        handler, int arg);
625extern void              socketDeleteHandler(int sid);
626extern int               socketEof(int sid);
627extern int               socketFlush(int sid, int block);
628extern int               socketGets(int sid, char_t** buf);
629extern int               socketInputBuffered(int sid);
630extern int               socketOpen();
631extern int               socketOpenConnection(char *host, int port,
632                                        socketAccept_t accept, int flags);
633extern void      socketProcess();
634extern int               socketRead(int sid, char *buf, int len);
635extern int               socketReady();
636extern int               socketWrite(int sid, char *buf, int len);
637extern int               socketWriteString(int sid, char_t *buf);
638extern int               socketSelect();
639
640extern char_t   *strlower(char_t *string);
641extern char_t   *strupper(char_t *string);
642
643extern char_t   *stritoa(int n, char_t *string, int width);
644
645extern sym_fd_t  symOpen(int hash_size);
646extern void              symClose(sym_fd_t sd, void (*cleanup)(sym_t *sp));
647extern sym_t    *symLookup(sym_fd_t sd, char_t *name);
648extern sym_t    *symEnter(sym_fd_t sd, char_t *name, value_t v, int arg);
649extern int               symDelete(sym_fd_t sd, char_t *name);
650extern void      symWalk(sym_fd_t sd, void (*fn)(sym_t *symp));
651
652extern void              goahead_trace(int lev, char_t *fmt, ...);
653 
654extern value_t   valueInteger(long value);
655extern value_t   valueString(char_t *value, int flags);
656extern value_t   valueErrmsg(char_t *value);
657extern void      valueFree(value_t *v);
658
659extern char_t   *ascToUni(char_t *ubuf, char *str, int nBytes);
660extern char     *uniToAsc(char *buf, char_t *ustr, int nBytes);
661extern char_t   *ballocAscToUni(char * cp);
662extern char             *ballocUniToAsc(char_t * unip, int ulen);
663
664#endif /* _h_UEMF */
665
666/******************************************************************************/
Note: See TracBrowser for help on using the repository browser.