1: /*************************************************************************
2: * (C) 2012 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
6: * $Id: aitwww.h,v 1.2.2.2 2012/03/10 15:59:41 misho Exp $
7: *
8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #ifndef __AITWWW_H
47: #define __AITWWW_H
48:
49:
50: #include <sys/types.h>
51: #include <sys/queue.h>
52: #include <sys/uio.h>
53:
54:
55: /* URL staff ... */
56:
57: typedef struct _tagURLItem {
58: int vallen;
59: char *value;
60: } url_Item_t;
61:
62: struct tagIOURL {
63: unsigned char url_line[BUFSIZ];
64:
65: url_Item_t url_tech;
66: url_Item_t url_user;
67: url_Item_t url_pass;
68: url_Item_t url_host;
69: url_Item_t url_port;
70: url_Item_t url_path;
71: url_Item_t url_args;
72:
73: char *url_reserved;
74: };
75:
76: struct tagReqXML {
77: unsigned char xml_line[BUFSIZ];
78:
79: url_Item_t xml_namespace;
80: union {
81: url_Item_t container;
82: url_Item_t path;
83: } xml_node;
84: url_Item_t xml_data;
85: url_Item_t xml_attribute;
86: url_Item_t xml_value;
87: };
88:
89: /* CGI variables */
90:
91: struct tagCGI {
92: char *cgi_name;
93: char *cgi_value;
94:
95: SLIST_ENTRY(tagCGI) cgi_node;
96: };
97: typedef SLIST_HEAD(, tagCGI) cgi_t;
98:
99: struct tagMIME;
100: typedef SLIST_HEAD(, tagMIME) mime_t;
101:
102: struct tagMIME {
103: cgi_t mime_header;
104:
105: struct iovec mime_body;
106: struct iovec mime_prolog;
107: struct iovec mime_epilog;
108:
109: mime_t *mime_attach;
110:
111: SLIST_ENTRY(tagMIME) mime_node;
112: };
113:
114: typedef int (*list_cb_t)(struct tagCGI *, void *);
115:
116:
117: // www_GetErrno() Get error code of last operation
118: inline int www_GetErrno();
119: // www_GetError() Get error text of last operation
120: inline const char *www_GetError();
121:
122:
123: /*
124: * www_initCGI() - Init CGI program
125: *
126: * return: NULL error or allocated cgi session
127: */
128: cgi_t *www_initCGI(void);
129: /*
130: * www_closeCGI() - Close and free all CGI resources
131: *
132: * @cgi = Inited cgi session
133: * return: none
134: */
135: void www_closeCGI(cgi_t ** __restrict cgi);
136: /*
137: * www_parseQuery() - Parse CGI query string
138: *
139: * @str = String
140: * return: NULL error or allocated cgi session
141: */
142: cgi_t *www_parseQuery(const char *str);
143: /*
144: * www_parseMultiPart() - Parse Multi part POST CGI query string
145: *
146: * @str = String
147: * @ctlen = Content length
148: * @ct = Content type
149: * return: NULL error or allocated cgi session
150: */
151: cgi_t *www_parseMultiPart(const char *str, int ctlen, const char *ct);
152: /*
153: * www_getValue() - Get Value from CGI session
154: *
155: * @cgi = Inited cgi session
156: * @name = Name of cgi variable
157: * return: NULL not found or !=NULL value
158: */
159: inline const char *www_getValue(cgi_t * __restrict cgi, const char *name);
160: /*
161: * www_addValue() - Add new or update if exists CGI variable
162: *
163: * @cgi = Inited cgi session
164: * @name = Name of cgi variable
165: * @value = Value of cgi variable
166: * return: -1 error, 0 add new one or 1 updated variable
167: */
168: int www_addValue(cgi_t * __restrict cgi, const char *name, const char *value);
169: /*
170: * www_delPair() - Delete CGI variable from session
171: *
172: * @cgi = Inited cgi session
173: * @name = Name of cgi variable
174: * return: -1 error, 0 not found or 1 deleted ok
175: */
176: int www_delPair(cgi_t * __restrict cgi, const char *name);
177: /*
178: * www_listPairs() - Walk over CGI session variables
179: *
180: * @cgi = Cgi session
181: * @func = If !=NULL call function for each element
182: * @arg = Optional argument pass through callback
183: * return: -1 error or >-1 number of elements
184: */
185: inline int www_listPairs(cgi_t * __restrict cgi, list_cb_t func, void *arg);
186:
187: /*
188: * www_header() - Output initial html header
189: *
190: * @output = file handle
191: * return: <1 error or >0 writed bytes
192: */
193: inline int www_header(FILE *output);
194:
195: /*
196: * www_parseAttributes() - Parse attributes
197: *
198: * @ct = Content type
199: * return: NULL error or !=NULL attributes
200: */
201: inline cgi_t *www_parseAttributes(const char **ct);
202: /*
203: * www_freeAttributes() - Free attributes
204: *
205: * @attr = Attributes
206: * return: none
207: */
208: inline void www_freeAttributes(cgi_t ** __restrict attr);
209: /*
210: * www_getAttribute() - Get attribute by name
211: *
212: * @attr = Attributes
213: * @name = Name of attribute
214: * return: NULL not found or !=NULL attribute value
215: */
216: inline const char *www_getAttribute(cgi_t * __restrict attr, const char *name);
217:
218:
219: /*
220: * www_URLGet() - Parse and get data from input URL
221: *
222: * @csURL = Input URL line
223: * @url = Output parsed URL
224: * return: 0 error format not find tech:// and return URL like path;
225: * -1 error:: can`t read; >0 ok, up bits for known elements
226: */
227: int www_URLGet(const char *csURL, struct tagIOURL *url);
228: /*
229: * www_URLGetFile() - Get file from parsed URL
230: *
231: * @url = Input parsed URL
232: * @psValue = Return filename, if not specified file in url path, replace with /
233: * @valLen = Size of psValue array
234: * return: -1 error:: can`t read; 0 ok
235: */
236: int www_URLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen);
237:
238: /*
239: * www_XMLGet() - Parse and get data from input XML request string
240: * [ns:]container[|attribute[=value]][?data]
241: *
242: * @csXML = Input XML request line
243: * @xml = Output parsed XML request
244: * return: 0 error format incorrect, -1 error:: can`t read; >0 ok readed elements bits
245: */
246: int www_XMLGet(const char *csXML, struct tagReqXML *xml);
247:
248:
249: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>