| /* |
| * Copyright 2001-2004 Brandon Long |
| * All Rights Reserved. |
| * |
| * ClearSilver Templating System |
| * |
| * This code is made available under the terms of the ClearSilver License. |
| * http://www.clearsilver.net/license.hdf |
| * |
| */ |
| |
| /* |
| * cgiwrap.h |
| * The purpose of the cgiwrap is to abstract the CGI interface to allow |
| * for other than the default implementation. The default |
| * implementation is of course based on environment variables and stdio, |
| * but this can be used with server modules which can substitute their |
| * own implementation of these functions. |
| */ |
| |
| |
| #ifndef __CGIWRAP_H_ |
| #define __CGIWRAP_H_ 1 |
| |
| #include <stdarg.h> |
| #include "util/neo_err.h" |
| |
| __BEGIN_DECLS |
| |
| typedef int (*READ_FUNC)(void *, char *, int); |
| typedef int (*WRITEF_FUNC)(void *, const char *, va_list); |
| typedef int (*WRITE_FUNC)(void *, const char *, int); |
| typedef char *(*GETENV_FUNC)(void *, const char *); |
| typedef int (*PUTENV_FUNC)(void *, const char *, const char *); |
| typedef int (*ITERENV_FUNC)(void *, int, char **, char **); |
| |
| /* |
| * Function: cgiwrap_init_std - Initialize cgiwrap with default functions |
| * Description: cgiwrap_init_std will initialize the cgiwrap subsystem |
| * to use the default CGI functions, ie |
| * getenv/putenv/stdio. In reality, all this is doing is |
| * setting up the data for the cgiwrap_iterenv() function. |
| * Input: the arguments to main, namely argc/argv/envp |
| * Output: None |
| * Returns: None |
| */ |
| void cgiwrap_init_std (int argc, char **argv, char **envp); |
| |
| /* |
| * Function: cgiwrap_init_emu - initialize cgiwrap for emulated use |
| * Description: cgiwrap_init_emu sets up the cgiwrap subsystem for use |
| * in an emulated environment where you are providing |
| * routines to use in place of the standard routines, ie |
| * when used to interface with a server or scripting |
| * language. |
| * See cgi/cgiwrap.h for the exact definitions of the |
| * callback functions. |
| * Input: data - user data to be passed to the specified callbacks |
| * read_cb - a cb to replace fread(stdin) |
| * writef_cb - a cb to repalce fprintf(stdout) |
| * write_cb - a cb to replace fwrite(stdout) |
| * getenv_cb - a cb to replace getenv |
| * putenv_cb - a cb to replace putenv |
| * iterenv_cb - a cb to replace the default environment iteration |
| * function (which just wraps walking the envp array) |
| * Output: None |
| * Returns: None |
| */ |
| void cgiwrap_init_emu (void *data, READ_FUNC read_cb, |
| WRITEF_FUNC writef_cb, WRITE_FUNC write_cb, GETENV_FUNC getenv_cb, |
| PUTENV_FUNC putenv_cb, ITERENV_FUNC iterenv_cb); |
| |
| /* |
| * Function: cgiwrap_getenv - the wrapper for getenv |
| * Description: cgiwrap_getenv wraps the getenv function for access to |
| * environment variables, which are used to pass data to |
| * CGI scripts. This version differs from the system |
| * getenv in that it makes a copy of the value it returns, |
| * which gets around problems when wrapping this routine in |
| * garbage collected/reference counted languages by |
| * moving the ownership of the data to the calling |
| * function. |
| * Input: k - the environment variable to lookup |
| * Output: v - a newly allocated copy of the value of that variable, or |
| * NULL if not found. |
| * Returns: NERR_NOMEM if there isn't memory available to allocate the result |
| */ |
| NEOERR *cgiwrap_getenv (const char *k, char **v); |
| |
| /* |
| * Function: cgiwrap_putenv - wrap the putenv call |
| * Description: cgiwrap_putenv wraps the putenv call. This is mostly |
| * used by the cgi_debug_init function to create an |
| * artificial environment. This version differs from the |
| * system version by having separate arguments for the |
| * variable name and value, which makes life easier for the |
| * caller (usually), and keeps most wrapping callbacks from |
| * having to implement a parser to separate them. |
| * Input: k - the env var name |
| * v - the new value for env var k |
| * Output: None |
| * Returns: NERR_NOMEM |
| */ |
| NEOERR *cgiwrap_putenv (const char *k, const char *v); |
| |
| /* |
| * Function: cgiwrap_iterenv - iterater for env vars |
| * Description: cgiwrap_iterenv allows a program to iterate over all the |
| * environment variables. This is probably mostly used by |
| * the default debug output. |
| * Input: n - variable to return. This should start at 0 and increment |
| * until you receive a NULL return value. |
| * Output: k - a malloc'd copy of the variable name |
| * v - a malloc'd copy of the variable value |
| * Returns: NERR_NOMEM |
| */ |
| NEOERR *cgiwrap_iterenv (int n, char **k, char **v); |
| |
| /* |
| * Function: cgiwrap_writef - a wrapper for printf |
| * Description: cgiwrap_writef is the formatted output command that |
| * replaces printf or fprintf(stdout) in a standard CGI |
| * Input: fmt - standard printf fmt string and args |
| * Output: None |
| * Returns: NERR_SYSTEM |
| */ |
| NEOERR *cgiwrap_writef (const char *fmt, ...) |
| ATTRIBUTE_PRINTF(1,2); |
| |
| /* |
| * Function: cgiwrap_writevf - a wrapper for vprintf |
| * Description: cgiwrap_writevf is the formatted output command that |
| * replaces vprintf or fvprintf(stdout) in a standard CGI |
| * It is also used by cgiwrap_writef (the actual wrapped |
| * function is a v type function) |
| * Input: fmt - standard printf fmt string |
| * ap - stdarg argument pointer |
| * Output: None |
| * Returns: NERR_SYSTEM |
| */ |
| NEOERR *cgiwrap_writevf (const char *fmt, va_list ap); |
| |
| /* |
| * Function: cgiwrap_write - wrapper for the fwrite(stdout) |
| * Description: cgiwrap_write is the block data output function for |
| * cgiwrap that replaces fwrite(stdout) in regular CGIs |
| * Input: buf - a character buffer |
| * buf_len - the length of the buffer in buf |
| * Output: None |
| * Returns: NERR_IO |
| */ |
| NEOERR *cgiwrap_write (const char *buf, int buf_len); |
| |
| /* |
| * Function: cgiwrap_read - cgiwrap input function |
| * Description: cgiwrap_read is used to read incoming data from the |
| * client, usually from a POST or PUT HTTP request. It |
| * wraps the part of fread(stdin). |
| * Input: buf - a pre-allocated buffer to read the data into |
| * buf_len - the size of the pre-allocated buffer |
| * Output: read_len - the number of bytes read into buf |
| * Returns: None |
| */ |
| void cgiwrap_read (char *buf, int buf_len, int *read_len); |
| |
| __END_DECLS |
| |
| #endif /* __CGIWRAP_H_ */ |