1 /* 2 * Copyright 2001-2004 Brandon Long 3 * All Rights Reserved. 4 * 5 * ClearSilver Templating System 6 * 7 * This code is made available under the terms of the ClearSilver License. 8 * http://www.clearsilver.net/license.hdf 9 * 10 */ 11 12 /* 13 * cgiwrap.h 14 * The purpose of the cgiwrap is to abstract the CGI interface to allow 15 * for other than the default implementation. The default 16 * implementation is of course based on environment variables and stdio, 17 * but this can be used with server modules which can substitute their 18 * own implementation of these functions. 19 */ 20 21 22 #ifndef __CGIWRAP_H_ 23 #define __CGIWRAP_H_ 1 24 25 #include <stdarg.h> 26 #include "util/neo_err.h" 27 28 __BEGIN_DECLS 29 30 typedef int (*READ_FUNC)(void *, char *, int); 31 typedef int (*WRITEF_FUNC)(void *, const char *, va_list); 32 typedef int (*WRITE_FUNC)(void *, const char *, int); 33 typedef char *(*GETENV_FUNC)(void *, const char *); 34 typedef int (*PUTENV_FUNC)(void *, const char *, const char *); 35 typedef int (*ITERENV_FUNC)(void *, int, char **, char **); 36 37 /* 38 * Function: cgiwrap_init_std - Initialize cgiwrap with default functions 39 * Description: cgiwrap_init_std will initialize the cgiwrap subsystem 40 * to use the default CGI functions, ie 41 * getenv/putenv/stdio. In reality, all this is doing is 42 * setting up the data for the cgiwrap_iterenv() function. 43 * Input: the arguments to main, namely argc/argv/envp 44 * Output: None 45 * Returns: None 46 */ 47 void cgiwrap_init_std (int argc, char **argv, char **envp); 48 49 /* 50 * Function: cgiwrap_init_emu - initialize cgiwrap for emulated use 51 * Description: cgiwrap_init_emu sets up the cgiwrap subsystem for use 52 * in an emulated environment where you are providing 53 * routines to use in place of the standard routines, ie 54 * when used to interface with a server or scripting 55 * language. 56 * See cgi/cgiwrap.h for the exact definitions of the 57 * callback functions. 58 * Input: data - user data to be passed to the specified callbacks 59 * read_cb - a cb to replace fread(stdin) 60 * writef_cb - a cb to repalce fprintf(stdout) 61 * write_cb - a cb to replace fwrite(stdout) 62 * getenv_cb - a cb to replace getenv 63 * putenv_cb - a cb to replace putenv 64 * iterenv_cb - a cb to replace the default environment iteration 65 * function (which just wraps walking the envp array) 66 * Output: None 67 * Returns: None 68 */ 69 void cgiwrap_init_emu (void *data, READ_FUNC read_cb, 70 WRITEF_FUNC writef_cb, WRITE_FUNC write_cb, GETENV_FUNC getenv_cb, 71 PUTENV_FUNC putenv_cb, ITERENV_FUNC iterenv_cb); 72 73 /* 74 * Function: cgiwrap_getenv - the wrapper for getenv 75 * Description: cgiwrap_getenv wraps the getenv function for access to 76 * environment variables, which are used to pass data to 77 * CGI scripts. This version differs from the system 78 * getenv in that it makes a copy of the value it returns, 79 * which gets around problems when wrapping this routine in 80 * garbage collected/reference counted languages by 81 * moving the ownership of the data to the calling 82 * function. 83 * Input: k - the environment variable to lookup 84 * Output: v - a newly allocated copy of the value of that variable, or 85 * NULL if not found. 86 * Returns: NERR_NOMEM if there isn't memory available to allocate the result 87 */ 88 NEOERR *cgiwrap_getenv (const char *k, char **v); 89 90 /* 91 * Function: cgiwrap_putenv - wrap the putenv call 92 * Description: cgiwrap_putenv wraps the putenv call. This is mostly 93 * used by the cgi_debug_init function to create an 94 * artificial environment. This version differs from the 95 * system version by having separate arguments for the 96 * variable name and value, which makes life easier for the 97 * caller (usually), and keeps most wrapping callbacks from 98 * having to implement a parser to separate them. 99 * Input: k - the env var name 100 * v - the new value for env var k 101 * Output: None 102 * Returns: NERR_NOMEM 103 */ 104 NEOERR *cgiwrap_putenv (const char *k, const char *v); 105 106 /* 107 * Function: cgiwrap_iterenv - iterater for env vars 108 * Description: cgiwrap_iterenv allows a program to iterate over all the 109 * environment variables. This is probably mostly used by 110 * the default debug output. 111 * Input: n - variable to return. This should start at 0 and increment 112 * until you receive a NULL return value. 113 * Output: k - a malloc'd copy of the variable name 114 * v - a malloc'd copy of the variable value 115 * Returns: NERR_NOMEM 116 */ 117 NEOERR *cgiwrap_iterenv (int n, char **k, char **v); 118 119 /* 120 * Function: cgiwrap_writef - a wrapper for printf 121 * Description: cgiwrap_writef is the formatted output command that 122 * replaces printf or fprintf(stdout) in a standard CGI 123 * Input: fmt - standard printf fmt string and args 124 * Output: None 125 * Returns: NERR_SYSTEM 126 */ 127 NEOERR *cgiwrap_writef (const char *fmt, ...) 128 ATTRIBUTE_PRINTF(1,2); 129 130 /* 131 * Function: cgiwrap_writevf - a wrapper for vprintf 132 * Description: cgiwrap_writevf is the formatted output command that 133 * replaces vprintf or fvprintf(stdout) in a standard CGI 134 * It is also used by cgiwrap_writef (the actual wrapped 135 * function is a v type function) 136 * Input: fmt - standard printf fmt string 137 * ap - stdarg argument pointer 138 * Output: None 139 * Returns: NERR_SYSTEM 140 */ 141 NEOERR *cgiwrap_writevf (const char *fmt, va_list ap); 142 143 /* 144 * Function: cgiwrap_write - wrapper for the fwrite(stdout) 145 * Description: cgiwrap_write is the block data output function for 146 * cgiwrap that replaces fwrite(stdout) in regular CGIs 147 * Input: buf - a character buffer 148 * buf_len - the length of the buffer in buf 149 * Output: None 150 * Returns: NERR_IO 151 */ 152 NEOERR *cgiwrap_write (const char *buf, int buf_len); 153 154 /* 155 * Function: cgiwrap_read - cgiwrap input function 156 * Description: cgiwrap_read is used to read incoming data from the 157 * client, usually from a POST or PUT HTTP request. It 158 * wraps the part of fread(stdin). 159 * Input: buf - a pre-allocated buffer to read the data into 160 * buf_len - the size of the pre-allocated buffer 161 * Output: read_len - the number of bytes read into buf 162 * Returns: None 163 */ 164 void cgiwrap_read (char *buf, int buf_len, int *read_len); 165 166 __END_DECLS 167 168 #endif /* __CGIWRAP_H_ */ 169