xref: /php-src/sapi/litespeed/lsapilib.h (revision 01b3fc03)
1 /*
2    +----------------------------------------------------------------------+
3    | Copyright (c) The PHP Group                                          |
4    +----------------------------------------------------------------------+
5    | This source file is subject to version 3.01 of the PHP license,      |
6    | that is bundled with this package in the file LICENSE, and is        |
7    | available through the world-wide-web at the following url:           |
8    | https://www.php.net/license/3_01.txt                                 |
9    | If you did not receive a copy of the PHP license and are unable to   |
10    | obtain it through the world-wide-web, please send a note to          |
11    | license@php.net so we can mail you a copy immediately.               |
12    +----------------------------------------------------------------------+
13    | Author: George Wang <gwang@litespeedtech.com>                        |
14    +----------------------------------------------------------------------+
15 */
16 
17 /*
18 Copyright (c) 2002-2018, Lite Speed Technologies Inc.
19 All rights reserved.
20 
21 Redistribution and use in source and binary forms, with or without
22 modification, are permitted provided that the following conditions are
23 met:
24 
25     * Redistributions of source code must retain the above copyright
26       notice, this list of conditions and the following disclaimer.
27     * Redistributions in binary form must reproduce the above
28       copyright notice, this list of conditions and the following
29       disclaimer in the documentation and/or other materials provided
30       with the distribution.
31     * Neither the name of the Lite Speed Technologies Inc nor the
32       names of its contributors may be used to endorse or promote
33       products derived from this software without specific prior
34       written permission.
35 
36 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
37 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
39 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
40 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
46 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 */
48 
49 
50 #ifndef  _LSAPILIB_H_
51 #define  _LSAPILIB_H_
52 
53 #if defined (c_plusplus) || defined (__cplusplus)
54 extern "C" {
55 #endif
56 
57 #include "lsapidef.h"
58 
59 #include <stddef.h>
60 #include <sys/time.h>
61 #include <sys/types.h>
62 
63 struct LSAPI_key_value_pair
64 {
65     char * pKey;
66     char * pValue;
67     int    keyLen;
68     int    valLen;
69 };
70 
71 struct lsapi_child_status;
72 #define LSAPI_MAX_RESP_HEADERS  1000
73 
74 typedef struct lsapi_request
75 {
76     int               m_fdListen;
77     int               m_fd;
78 
79     long              m_lLastActive;
80     long              m_lReqBegin;
81 
82     char            * m_pReqBuf;
83     int               m_reqBufSize;
84 
85     char            * m_pRespBuf;
86     char            * m_pRespBufEnd;
87     char            * m_pRespBufPos;
88 
89     char            * m_pRespHeaderBuf;
90     char            * m_pRespHeaderBufEnd;
91     char            * m_pRespHeaderBufPos;
92     struct lsapi_child_status * child_status;
93 
94 
95     struct iovec    * m_pIovec;
96     struct iovec    * m_pIovecEnd;
97     struct iovec    * m_pIovecCur;
98     struct iovec    * m_pIovecToWrite;
99 
100     struct lsapi_packet_header      * m_respPktHeaderEnd;
101 
102     struct lsapi_req_header         * m_pHeader;
103     struct LSAPI_key_value_pair     * m_pEnvList;
104     struct LSAPI_key_value_pair     * m_pSpecialEnvList;
105     int                               m_envListSize;
106     int                               m_specialEnvListSize;
107 
108     struct lsapi_http_header_index  * m_pHeaderIndex;
109     struct lsapi_header_offset      * m_pUnknownHeader;
110 
111     char            * m_pScriptFile;
112     char            * m_pScriptName;
113     char            * m_pQueryString;
114     char            * m_pHttpHeader;
115     char            * m_pRequestMethod;
116     int               m_totalLen;
117     int               m_reqState;
118     off_t             m_reqBodyLen;
119     off_t             m_reqBodyRead;
120     int               m_bufProcessed;
121     int               m_bufRead;
122 
123     struct lsapi_packet_header        m_respPktHeader[5];
124 
125     struct lsapi_resp_header          m_respHeader;
126     short                             m_respHeaderLen[LSAPI_MAX_RESP_HEADERS];
127     void            * m_pAppData;
128 
129 }LSAPI_Request;
130 
131 extern LSAPI_Request g_req;
132 
133 
134 /* return: >0 continue, ==0 stop, -1 failed  */
135 typedef int (*LSAPI_CB_EnvHandler )( const char * pKey, int keyLen,
136                 const char * pValue, int valLen, void * arg );
137 
138 
139 int LSAPI_Init(void);
140 
141 void LSAPI_Stop(void);
142 
143 int LSAPI_Is_Listen_r( LSAPI_Request * pReq);
144 
145 int LSAPI_InitRequest( LSAPI_Request * pReq, int fd );
146 
147 int LSAPI_Accept_r( LSAPI_Request * pReq );
148 
149 void LSAPI_Reset_r( LSAPI_Request * pReq );
150 
151 int LSAPI_Finish_r( LSAPI_Request * pReq );
152 
153 int LSAPI_Release_r( LSAPI_Request * pReq );
154 
155 char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex );
156 
157 int LSAPI_ForeachHeader_r( LSAPI_Request * pReq,
158             LSAPI_CB_EnvHandler fn, void * arg );
159 
160 int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq,
161             LSAPI_CB_EnvHandler fn, void * arg );
162 
163 int LSAPI_ForeachEnv_r( LSAPI_Request * pReq,
164             LSAPI_CB_EnvHandler fn, void * arg );
165 
166 int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq,
167             LSAPI_CB_EnvHandler fn, void * arg );
168 
169 char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name );
170 
171 ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t len );
172 
173 int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq );
174 
175 int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF );
176 
177 
178 int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq );
179 
180 ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len );
181 
182 ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size );
183 
184 ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len );
185 
186 int LSAPI_Flush_r( LSAPI_Request * pReq );
187 
188 int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len );
189 
190 int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName,
191                               const char * pHeaderValue );
192 
193 int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders,
194                          const char * pBody, int bodyLen );
195 
LSAPI_SetRespStatus_r(LSAPI_Request * pReq,int code)196 static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code )
197 {
198     if ( !pReq )
199         return -1;
200     pReq->m_respHeader.m_respInfo.m_status = code;
201     return 0;
202 }
203 
LSAPI_SetAppData_r(LSAPI_Request * pReq,void * data)204 static inline int LSAPI_SetAppData_r( LSAPI_Request * pReq, void * data )
205 {
206     if ( !pReq )
207         return -1;
208     pReq->m_pAppData = data;
209     return 0;
210 }
211 
LSAPI_GetAppData_r(LSAPI_Request * pReq)212 static inline void * LSAPI_GetAppData_r( LSAPI_Request * pReq )
213 {
214     if ( !pReq )
215         return NULL;
216     return pReq->m_pAppData;
217 }
218 
LSAPI_GetQueryString_r(LSAPI_Request * pReq)219 static inline char * LSAPI_GetQueryString_r( LSAPI_Request * pReq )
220 {
221     if ( pReq )
222         return pReq->m_pQueryString;
223     return NULL;
224 }
225 
226 
LSAPI_GetScriptFileName_r(LSAPI_Request * pReq)227 static inline char * LSAPI_GetScriptFileName_r( LSAPI_Request * pReq )
228 {
229     if ( pReq )
230         return pReq->m_pScriptFile;
231     return NULL;
232 }
233 
234 
LSAPI_GetScriptName_r(LSAPI_Request * pReq)235 static inline char * LSAPI_GetScriptName_r( LSAPI_Request * pReq )
236 {
237     if ( pReq )
238         return pReq->m_pScriptName;
239     return NULL;
240 }
241 
242 
LSAPI_GetRequestMethod_r(LSAPI_Request * pReq)243 static inline char * LSAPI_GetRequestMethod_r( LSAPI_Request * pReq)
244 {
245     if ( pReq )
246         return pReq->m_pRequestMethod;
247     return NULL;
248 }
249 
250 
251 
LSAPI_GetReqBodyLen_r(LSAPI_Request * pReq)252 static inline off_t LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq )
253 {
254     if ( pReq )
255         return pReq->m_reqBodyLen;
256     return -1;
257 }
258 
LSAPI_GetReqBodyRemain_r(LSAPI_Request * pReq)259 static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq )
260 {
261     if ( pReq )
262         return pReq->m_reqBodyLen - pReq->m_reqBodyRead;
263     return -1;
264 }
265 
266 
267 int LSAPI_End_Response_r(LSAPI_Request * pReq);
268 
269 
270 
271 int LSAPI_Is_Listen(void);
272 
LSAPI_Accept(void)273 static inline int LSAPI_Accept( void )
274 {   return LSAPI_Accept_r( &g_req );                        }
275 
LSAPI_Finish(void)276 static inline int LSAPI_Finish(void)
277 {   return LSAPI_Finish_r( &g_req );                        }
278 
LSAPI_GetHeader(int headerIndex)279 static inline char * LSAPI_GetHeader( int headerIndex )
280 {   return LSAPI_GetHeader_r( &g_req, headerIndex );        }
281 
LSAPI_ForeachHeader(LSAPI_CB_EnvHandler fn,void * arg)282 static inline int LSAPI_ForeachHeader( LSAPI_CB_EnvHandler fn, void * arg )
283 {   return LSAPI_ForeachHeader_r( &g_req, fn, arg );        }
284 
LSAPI_ForeachOrgHeader(LSAPI_CB_EnvHandler fn,void * arg)285 static inline int LSAPI_ForeachOrgHeader(
286             LSAPI_CB_EnvHandler fn, void * arg )
287 {   return LSAPI_ForeachOrgHeader_r( &g_req, fn, arg );     }
288 
LSAPI_ForeachEnv(LSAPI_CB_EnvHandler fn,void * arg)289 static inline int LSAPI_ForeachEnv( LSAPI_CB_EnvHandler fn, void * arg )
290 {   return LSAPI_ForeachEnv_r( &g_req, fn, arg );           }
291 
LSAPI_ForeachSpecialEnv(LSAPI_CB_EnvHandler fn,void * arg)292 static inline int LSAPI_ForeachSpecialEnv( LSAPI_CB_EnvHandler fn, void * arg )
293 {   return LSAPI_ForeachSpecialEnv_r( &g_req, fn, arg );    }
294 
LSAPI_GetEnv(const char * name)295 static inline char * LSAPI_GetEnv( const char * name )
296 {   return LSAPI_GetEnv_r( &g_req, name );                  }
297 
LSAPI_GetQueryString(void)298 static inline char * LSAPI_GetQueryString(void)
299 {   return LSAPI_GetQueryString_r( &g_req );                }
300 
LSAPI_GetScriptFileName(void)301 static inline char * LSAPI_GetScriptFileName(void)
302 {   return LSAPI_GetScriptFileName_r( &g_req );             }
303 
LSAPI_GetScriptName(void)304 static inline char * LSAPI_GetScriptName(void)
305 {    return LSAPI_GetScriptName_r( &g_req );                }
306 
LSAPI_GetRequestMethod(void)307 static inline char * LSAPI_GetRequestMethod(void)
308 {   return LSAPI_GetRequestMethod_r( &g_req );              }
309 
LSAPI_GetReqBodyLen(void)310 static inline off_t LSAPI_GetReqBodyLen(void)
311 {   return LSAPI_GetReqBodyLen_r( &g_req );                 }
312 
LSAPI_GetReqBodyRemain(void)313 static inline off_t LSAPI_GetReqBodyRemain(void)
314 {   return LSAPI_GetReqBodyRemain_r( &g_req );                 }
315 
LSAPI_ReadReqBody(char * pBuf,size_t len)316 static inline ssize_t LSAPI_ReadReqBody( char * pBuf, size_t len )
317 {   return LSAPI_ReadReqBody_r( &g_req, pBuf, len );        }
318 
LSAPI_ReqBodyGetChar(void)319 static inline int LSAPI_ReqBodyGetChar(void)
320 {   return LSAPI_ReqBodyGetChar_r( &g_req );        }
321 
LSAPI_ReqBodyGetLine(char * pBuf,int len,int * getLF)322 static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF )
323 {   return LSAPI_ReqBodyGetLine_r( &g_req, pBuf, len, getLF );        }
324 
325 
326 
LSAPI_FinalizeRespHeaders(void)327 static inline int LSAPI_FinalizeRespHeaders(void)
328 {   return LSAPI_FinalizeRespHeaders_r( &g_req );           }
329 
LSAPI_Write(const char * pBuf,ssize_t len)330 static inline ssize_t LSAPI_Write( const char * pBuf, ssize_t len )
331 {   return LSAPI_Write_r( &g_req, pBuf, len );              }
332 
LSAPI_sendfile(int fdIn,off_t * off,size_t size)333 static inline ssize_t LSAPI_sendfile( int fdIn, off_t* off, size_t size )
334 {
335     return LSAPI_sendfile_r(&g_req, fdIn, off, size );
336 }
337 
LSAPI_Write_Stderr(const char * pBuf,ssize_t len)338 static inline ssize_t LSAPI_Write_Stderr( const char * pBuf, ssize_t len )
339 {   return LSAPI_Write_Stderr_r( &g_req, pBuf, len );       }
340 
LSAPI_Flush(void)341 static inline int LSAPI_Flush(void)
342 {   return LSAPI_Flush_r( &g_req );                         }
343 
LSAPI_AppendRespHeader(char * pBuf,int len)344 static inline int LSAPI_AppendRespHeader( char * pBuf, int len )
345 {   return LSAPI_AppendRespHeader_r( &g_req, pBuf, len );   }
346 
LSAPI_SetRespStatus(int code)347 static inline int LSAPI_SetRespStatus( int code )
348 {   return LSAPI_SetRespStatus_r( &g_req, code );           }
349 
LSAPI_ErrResponse(int code,const char ** pRespHeaders,const char * pBody,int bodyLen)350 static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen )
351 {   return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen );   }
352 
LSAPI_End_Response(void)353 static inline int LSAPI_End_Response(void)
354 {   return LSAPI_End_Response_r( &g_req );                         }
355 
356 int LSAPI_IsRunning(void);
357 
358 int LSAPI_CreateListenSock( const char * pBind, int backlog );
359 
360 typedef int (*fn_select_t)( int, fd_set *, fd_set *, fd_set *, struct timeval * );
361 
362 int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork );
363 
364 void LSAPI_Set_Server_fd( int fd );
365 
366 int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq );
367 
368 void LSAPI_No_Check_ppid(void);
369 
370 void LSAPI_Set_Max_Reqs( int reqs );
371 
372 void LSAPI_Set_Max_Idle( int secs );
373 
374 void LSAPI_Set_Max_Children( int maxChildren );
375 
376 void LSAPI_Set_Max_Idle_Children( int maxIdleChld );
377 
378 void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle );
379 
380 void LSAPI_Set_Max_Process_Time( int secs );
381 
382 int LSAPI_Init_Env_Parameters( fn_select_t fp );
383 
384 void LSAPI_Set_Slow_Req_Msecs( int msecs );
385 
386 int  LSAPI_Get_Slow_Req_Msecs(void);
387 
388 int LSAPI_is_suEXEC_Daemon(void);
389 
390 int LSAPI_Set_Restored_Parent_Pid(int pid);
391 
392 typedef void (*LSAPI_On_Timer_pf)(int *forked_child_pid);
393 void LSAPI_Register_Pgrp_Timer_Callback(LSAPI_On_Timer_pf);
394 
395 int LSAPI_Inc_Req_Processed(int cnt);
396 
397 int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq);
398 
399 int LSAPI_Postfork_Child(LSAPI_Request * pReq);
400 
401 int LSAPI_Postfork_Parent(LSAPI_Request * pReq);
402 
403 #define LSAPI_LOG_LEVEL_BITS    0xff
404 #define LSAPI_LOG_FLAG_NONE     0
405 #define LSAPI_LOG_FLAG_DEBUG    1
406 #define LSAPI_LOG_FLAG_INFO     2
407 #define LSAPI_LOG_FLAG_NOTICE   3
408 #define LSAPI_LOG_FLAG_WARN     4
409 #define LSAPI_LOG_FLAG_ERROR    5
410 #define LSAPI_LOG_FLAG_CRIT     6
411 #define LSAPI_LOG_FLAG_FATAL    7
412 
413 #define LSAPI_LOG_TIMESTAMP_BITS (0xff00)
414 #define LSAPI_LOG_TIMESTAMP_FULL (0x100)
415 #define LSAPI_LOG_TIMESTAMP_HMS  (0x200)
416 #define LSAPI_LOG_TIMESTAMP_STDERR  (0x400)
417 
418 #define LSAPI_LOG_PID            (0x10000)
419 
420 void LSAPI_Log(int flag, const char * fmt, ...)
421 #if __GNUC__
422         __attribute__((format(printf, 2, 3)))
423 #endif
424 ;
425 
426 
427 #if defined (c_plusplus) || defined (__cplusplus)
428 }
429 #endif
430 
431 
432 #endif
433