ruby-lsapi 4.1 → 4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +6 -14
- data/ext/lsapi/extconf.rb +3 -0
- data/ext/lsapi/lsapidef.h +1 -9
- data/ext/lsapi/lsapilib.c +248 -77
- data/ext/lsapi/lsapilib.h +8 -9
- data/ext/lsapi/lsruby.c +8 -7
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NTg2NGQ5Zjc1NWUyYTExNDUzMTYzN2VhODAyMDI4N2Y0MDFhMTBiMThkMWNm
|
10
|
-
MWU3NDY0Njg4MzcxZDUyYmYzYjJjMjIyYTUxNGU4YTUyOGQ1ZDIxZDg1YWJh
|
11
|
-
YjZlNDJlNTJhMWJkMzZiOWVjMmE2ODQ2ZGNmMTkzMzk1MDRhMDg=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MzBmZDNhMmY5NGQ3NWY0NmJmMDIyMTgzNTUyMDBhZDczMzM2Y2MwY2I5YzAx
|
14
|
-
NGYxN2M0OWEyYTQ1YjYzNTEwNzlmNGQ3ZGY4ZDU1MGM3MTQ2NThlZDkwODBi
|
15
|
-
MjExZWRkOWIxZTI1NGVjMWEwMDNmYzBkNTBjMTBhNmFlZTc5ZTM=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7071cdbea2aaa5b5e3e15d81cb659dbcdd4f0ec2
|
4
|
+
data.tar.gz: c224835bd8b574e1a697cbe1754a21f01bec9a5f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b00c35195f8785e6196f1b2ab97d3bac71ad795b7290015e5bb2f419d1a2477d44b27088d019f329d4c13ba11b672417bf78c4189a43ecb9b1465c58c60c7046
|
7
|
+
data.tar.gz: a623cc9fcd25ab6ce7e6c41d50ddc8d19c5b020d23fff9ad5890483346a89ae01ab4ab466f85bef896745f74faddf7581f4a9b01c7ca8ef42122a69a36fa84cf
|
data/ext/lsapi/extconf.rb
CHANGED
data/ext/lsapi/lsapidef.h
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Copyright (c)
|
2
|
+
Copyright (c) 2002-2014, Lite Speed Technologies Inc.
|
3
3
|
All rights reserved.
|
4
4
|
|
5
5
|
Redistribution and use in source and binary forms, with or without
|
@@ -30,14 +30,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
30
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
*/
|
32
32
|
|
33
|
-
/***************************************************************************
|
34
|
-
$Id: lsapidef.h,v 1.17 2012/12/01 19:23:31 gwang Exp $
|
35
|
-
-------------------
|
36
|
-
begin : Thu Feb 10 2005
|
37
|
-
author : George Wang
|
38
|
-
email : gwang@litespeedtech.com
|
39
|
-
***************************************************************************/
|
40
|
-
|
41
33
|
#ifndef _LSAPIDEF_H_
|
42
34
|
#define _LSAPIDEF_H_
|
43
35
|
|
data/ext/lsapi/lsapilib.c
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Copyright (c)
|
2
|
+
Copyright (c) 2002-2015, Lite Speed Technologies Inc.
|
3
3
|
All rights reserved.
|
4
4
|
|
5
5
|
Redistribution and use in source and binary forms, with or without
|
@@ -30,14 +30,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
30
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
*/
|
32
32
|
|
33
|
-
/***************************************************************************
|
34
|
-
lsapilib.c - description
|
35
|
-
-------------------
|
36
|
-
begin : Mon Feb 21 2005
|
37
|
-
copyright : (C) 2005 by George Wang
|
38
|
-
email : gwang@litespeedtech.com
|
39
|
-
***************************************************************************/
|
40
|
-
|
41
33
|
|
42
34
|
#include <ctype.h>
|
43
35
|
#include <dlfcn.h>
|
@@ -114,6 +106,7 @@ static int s_ppid;
|
|
114
106
|
static int s_slow_req_msecs = 0;
|
115
107
|
static int s_keepListener = 0;
|
116
108
|
static int s_dump_debug_info = 0;
|
109
|
+
static int s_pid_dump_debug_info = 0;
|
117
110
|
|
118
111
|
LSAPI_Request g_req = { -1, -1 };
|
119
112
|
|
@@ -230,7 +223,6 @@ static void lsapi_enable_core_dump()
|
|
230
223
|
}
|
231
224
|
|
232
225
|
|
233
|
-
|
234
226
|
static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader,
|
235
227
|
char type, int len )
|
236
228
|
{
|
@@ -670,36 +662,6 @@ static int readSecret( const char * pSecretFile )
|
|
670
662
|
return 0;
|
671
663
|
}
|
672
664
|
|
673
|
-
static int lsapi_initSuEXEC()
|
674
|
-
{
|
675
|
-
int i;
|
676
|
-
struct passwd * pw;
|
677
|
-
pw = getpwnam( "nobody" );
|
678
|
-
s_defaultUid = pw->pw_uid;
|
679
|
-
s_defaultGid = pw->pw_gid;
|
680
|
-
if ( s_uid == 0 )
|
681
|
-
{
|
682
|
-
const char * p = getenv( "LSAPI_DEFAULT_UID" );
|
683
|
-
if ( p )
|
684
|
-
{
|
685
|
-
i = atoi( p );
|
686
|
-
if ( i > 0 )
|
687
|
-
s_defaultUid = i;
|
688
|
-
}
|
689
|
-
p = getenv( "LSAPI_DEFAULT_GID" );
|
690
|
-
if ( p )
|
691
|
-
{
|
692
|
-
i = atoi( p );
|
693
|
-
if ( i > 0 )
|
694
|
-
s_defaultGid = i;
|
695
|
-
}
|
696
|
-
p = getenv( "LSAPI_SECRET" );
|
697
|
-
if (( !p )||( readSecret(p) == -1 ))
|
698
|
-
return -1;
|
699
|
-
}
|
700
|
-
return 0;
|
701
|
-
}
|
702
|
-
|
703
665
|
int LSAPI_is_suEXEC_Daemon()
|
704
666
|
{
|
705
667
|
if (( !s_uid )&&( s_pSecret[0] ))
|
@@ -719,6 +681,29 @@ static int LSAPI_perror_r( LSAPI_Request * pReq, const char * pErr1, const char
|
|
719
681
|
return 0;
|
720
682
|
}
|
721
683
|
|
684
|
+
static int lsapi_lve_error( LSAPI_Request * pReq )
|
685
|
+
{
|
686
|
+
static const char * headers[] =
|
687
|
+
{
|
688
|
+
"Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0",
|
689
|
+
"Pragma: no-cache",
|
690
|
+
"Retry-After: 60",
|
691
|
+
"Content-Type: text/html",
|
692
|
+
NULL
|
693
|
+
};
|
694
|
+
static const char achBody[] =
|
695
|
+
"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
|
696
|
+
"<HTML><HEAD>\n<TITLE>508 Resource Limit Is Reached</TITLE>\n"
|
697
|
+
"</HEAD><BODY>\n" "<H1>Resource Limit Is Reached</H1>\n"
|
698
|
+
"The website is temporarily unable to service your request as it exceeded resource limit.\n"
|
699
|
+
"Please try again later.\n"
|
700
|
+
"<HR>\n"
|
701
|
+
"</BODY></HTML>\n";
|
702
|
+
|
703
|
+
LSAPI_ErrResponse_r( pReq, 508, headers, achBody, sizeof( achBody ) - 1 );
|
704
|
+
return 0;
|
705
|
+
}
|
706
|
+
|
722
707
|
static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid )
|
723
708
|
{
|
724
709
|
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
|
@@ -731,6 +716,7 @@ static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid )
|
|
731
716
|
{
|
732
717
|
fprintf( stderr, "Pid (%d): enter LVE (%d) : ressult: %d !\n", getpid(), uid, ret );
|
733
718
|
LSAPI_perror_r(pReq, "LSAPI: lve_enter() failure, reached resource limit.", NULL );
|
719
|
+
lsapi_lve_error( pReq );
|
734
720
|
return -1;
|
735
721
|
}
|
736
722
|
}
|
@@ -1031,18 +1017,52 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen )
|
|
1031
1017
|
}
|
1032
1018
|
|
1033
1019
|
//OPTIMIZATION
|
1034
|
-
static
|
1020
|
+
static char s_accept_notify = 0;
|
1021
|
+
static char s_schedule_notify = 0;
|
1022
|
+
static char s_notify_scheduled = 0;
|
1023
|
+
static char s_notified_pid = 0;
|
1035
1024
|
|
1036
|
-
static struct lsapi_packet_header
|
1025
|
+
static struct lsapi_packet_header s_ack = {'L', 'S',
|
1037
1026
|
LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} };
|
1038
|
-
|
1027
|
+
|
1028
|
+
|
1029
|
+
static inline int write_req_received_notification( int fd )
|
1039
1030
|
{
|
1040
|
-
if ( write( fd, &
|
1031
|
+
if ( write( fd, &s_ack, LSAPI_PACKET_HEADER_LEN )
|
1041
1032
|
< LSAPI_PACKET_HEADER_LEN )
|
1042
1033
|
return -1;
|
1043
1034
|
return 0;
|
1044
1035
|
}
|
1045
1036
|
|
1037
|
+
static void lsapi_sigalarm( int sig )
|
1038
|
+
{
|
1039
|
+
if ( s_notify_scheduled )
|
1040
|
+
{
|
1041
|
+
s_notify_scheduled = 0;
|
1042
|
+
if ( g_req.m_fd != -1 )
|
1043
|
+
write_req_received_notification( g_req.m_fd );
|
1044
|
+
}
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
static inline int lsapi_schedule_notify()
|
1048
|
+
{
|
1049
|
+
if ( !s_notify_scheduled )
|
1050
|
+
{
|
1051
|
+
alarm( 2 );
|
1052
|
+
s_notify_scheduled = 1;
|
1053
|
+
}
|
1054
|
+
return 0;
|
1055
|
+
}
|
1056
|
+
|
1057
|
+
static inline int notify_req_received( int fd )
|
1058
|
+
{
|
1059
|
+
if ( s_schedule_notify )
|
1060
|
+
return lsapi_schedule_notify();
|
1061
|
+
return write_req_received_notification( fd );
|
1062
|
+
|
1063
|
+
}
|
1064
|
+
|
1065
|
+
|
1046
1066
|
static inline int lsapi_notify_pid( int fd )
|
1047
1067
|
{
|
1048
1068
|
char achBuf[16];
|
@@ -1128,17 +1148,22 @@ static int readReq( LSAPI_Request * pReq )
|
|
1128
1148
|
fprintf( stderr, "%d: parseRequest error\n", getpid() );
|
1129
1149
|
return -1;
|
1130
1150
|
}
|
1151
|
+
|
1152
|
+
pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER;
|
1153
|
+
|
1131
1154
|
if ( !s_uid )
|
1132
1155
|
if ( lsapi_changeUGid( pReq ) )
|
1133
1156
|
return -1;
|
1134
1157
|
pReq->m_bufProcessed = packetLen;
|
1135
|
-
pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER;
|
1136
1158
|
|
1137
1159
|
//OPTIMIZATION
|
1138
|
-
if ( !s_accept_notify )
|
1160
|
+
if ( !s_accept_notify && !s_notified_pid )
|
1139
1161
|
return notify_req_received( pReq->m_fd );
|
1140
1162
|
else
|
1163
|
+
{
|
1164
|
+
s_notified_pid = 0;
|
1141
1165
|
return 0;
|
1166
|
+
}
|
1142
1167
|
}
|
1143
1168
|
|
1144
1169
|
|
@@ -1178,6 +1203,7 @@ int LSAPI_IsRunning(void)
|
|
1178
1203
|
|
1179
1204
|
int LSAPI_InitRequest( LSAPI_Request * pReq, int fd )
|
1180
1205
|
{
|
1206
|
+
int newfd;
|
1181
1207
|
if ( !pReq )
|
1182
1208
|
return -1;
|
1183
1209
|
memset( pReq, 0, sizeof( LSAPI_Request ) );
|
@@ -1191,7 +1217,14 @@ int LSAPI_InitRequest( LSAPI_Request * pReq, int fd )
|
|
1191
1217
|
pReq->m_respPktHeaderEnd = &pReq->m_respPktHeader[5];
|
1192
1218
|
if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 )
|
1193
1219
|
return -1;
|
1194
|
-
|
1220
|
+
|
1221
|
+
if ( fd == STDIN_FILENO )
|
1222
|
+
{
|
1223
|
+
fd = dup( fd );
|
1224
|
+
newfd = open( "/dev/null", O_RDWR );
|
1225
|
+
dup2( newfd, STDIN_FILENO );
|
1226
|
+
}
|
1227
|
+
|
1195
1228
|
if ( isPipe( fd ) )
|
1196
1229
|
{
|
1197
1230
|
pReq->m_fdListen = -1;
|
@@ -1339,10 +1372,12 @@ char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex )
|
|
1339
1372
|
off = pReq->m_pHeaderIndex->m_headerOff[ headerIndex ];
|
1340
1373
|
if ( !off )
|
1341
1374
|
return NULL;
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1375
|
+
if ( *(pReq->m_pHttpHeader + off
|
1376
|
+
+ pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) )
|
1377
|
+
{
|
1378
|
+
*( pReq->m_pHttpHeader + off
|
1379
|
+
+ pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0;
|
1380
|
+
}
|
1346
1381
|
return pReq->m_pHttpHeader + off;
|
1347
1382
|
}
|
1348
1383
|
|
@@ -1608,7 +1643,7 @@ ssize_t gsendfile( int fdOut, int fdIn, off_t *off, size_t size )
|
|
1608
1643
|
++n;
|
1609
1644
|
|
1610
1645
|
size_t written;
|
1611
|
-
ssize_t ret =
|
1646
|
+
ssize_t ret = sendfilev( fdOut, vec, n, &written );
|
1612
1647
|
if (( !ret )||( errno == EAGAIN ))
|
1613
1648
|
ret = written;
|
1614
1649
|
if ( ret > 0 )
|
@@ -1779,12 +1814,21 @@ ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t le
|
|
1779
1814
|
static char * GetHeaderVar( LSAPI_Request * pReq, const char * name )
|
1780
1815
|
{
|
1781
1816
|
int i;
|
1817
|
+
char * pValue;
|
1782
1818
|
for( i = 0; i < H_TRANSFER_ENCODING; ++i )
|
1783
1819
|
{
|
1784
1820
|
if ( pReq->m_pHeaderIndex->m_headerOff[i] )
|
1785
1821
|
{
|
1786
1822
|
if ( strcmp( name, CGI_HEADERS[i] ) == 0 )
|
1787
|
-
|
1823
|
+
{
|
1824
|
+
pValue = pReq->m_pHttpHeader
|
1825
|
+
+ pReq->m_pHeaderIndex->m_headerOff[i];
|
1826
|
+
if ( *(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) != '\0')
|
1827
|
+
{
|
1828
|
+
*(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) = '\0';
|
1829
|
+
}
|
1830
|
+
return pValue;
|
1831
|
+
}
|
1788
1832
|
}
|
1789
1833
|
}
|
1790
1834
|
if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 )
|
@@ -1811,7 +1855,15 @@ static char * GetHeaderVar( LSAPI_Request * pReq, const char * name )
|
|
1811
1855
|
++p; ++pKey;
|
1812
1856
|
}
|
1813
1857
|
if (( pKey == pKeyEnd )&& (!*p ))
|
1814
|
-
|
1858
|
+
{
|
1859
|
+
pValue = pReq->m_pHttpHeader + pCur->valueOff;
|
1860
|
+
|
1861
|
+
if ( *(pValue + pCur->valueLen) != '\0')
|
1862
|
+
{
|
1863
|
+
*(pValue + pCur->valueLen) = '\0';
|
1864
|
+
}
|
1865
|
+
return pValue;
|
1866
|
+
}
|
1815
1867
|
++pCur;
|
1816
1868
|
}
|
1817
1869
|
}
|
@@ -1861,9 +1913,13 @@ int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq,
|
|
1861
1913
|
int ret;
|
1862
1914
|
int count = 0;
|
1863
1915
|
struct _headerInfo headers[512];
|
1916
|
+
|
1864
1917
|
if ( !pReq || !fn )
|
1865
1918
|
return -1;
|
1866
|
-
|
1919
|
+
|
1920
|
+
if ( !pReq->m_pHeaderIndex )
|
1921
|
+
return 0;
|
1922
|
+
|
1867
1923
|
for( i = 0; i < H_TRANSFER_ENCODING; ++i )
|
1868
1924
|
{
|
1869
1925
|
if ( pReq->m_pHeaderIndex->m_headerOff[i] )
|
@@ -1894,6 +1950,7 @@ int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq,
|
|
1894
1950
|
{
|
1895
1951
|
pKey = pReq->m_pHttpHeader + pCur->nameOff;
|
1896
1952
|
keyLen = pCur->nameLen;
|
1953
|
+
*(pKey + keyLen ) = 0;
|
1897
1954
|
|
1898
1955
|
pValue = pReq->m_pHttpHeader + pCur->valueOff;
|
1899
1956
|
*(pValue + pCur->valueLen ) = 0;
|
@@ -2353,6 +2410,8 @@ typedef struct _lsapi_prefork_server
|
|
2353
2410
|
int m_iAvoidFork;
|
2354
2411
|
|
2355
2412
|
lsapi_child_status * m_pChildrenStatus;
|
2413
|
+
lsapi_child_status * m_pChildrenStatusCur;
|
2414
|
+
lsapi_child_status * m_pChildrenStatusEnd;
|
2356
2415
|
|
2357
2416
|
}lsapi_prefork_server;
|
2358
2417
|
|
@@ -2388,7 +2447,7 @@ int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork )
|
|
2388
2447
|
if ( g_prefork_server->m_iMaxIdleChildren == 0 )
|
2389
2448
|
g_prefork_server->m_iMaxIdleChildren = 1;
|
2390
2449
|
g_prefork_server->m_iChildrenMaxIdleTime = 300;
|
2391
|
-
g_prefork_server->m_iMaxReqProcessTime =
|
2450
|
+
g_prefork_server->m_iMaxReqProcessTime = 3600;
|
2392
2451
|
return 0;
|
2393
2452
|
}
|
2394
2453
|
|
@@ -2441,11 +2500,15 @@ static void lsapi_cleanup(int signal)
|
|
2441
2500
|
static lsapi_child_status * find_child_status( int pid )
|
2442
2501
|
{
|
2443
2502
|
lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus;
|
2444
|
-
lsapi_child_status * pEnd = g_prefork_server->
|
2503
|
+
lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusEnd;
|
2445
2504
|
while( pStatus < pEnd )
|
2446
2505
|
{
|
2447
2506
|
if ( pStatus->m_pid == pid )
|
2507
|
+
{
|
2508
|
+
if ( pStatus + 1 > g_prefork_server->m_pChildrenStatusCur )
|
2509
|
+
g_prefork_server->m_pChildrenStatusCur = pStatus + 1;
|
2448
2510
|
return pStatus;
|
2511
|
+
}
|
2449
2512
|
++pStatus;
|
2450
2513
|
}
|
2451
2514
|
return NULL;
|
@@ -2470,13 +2533,22 @@ static void lsapi_sigchild( int signal )
|
|
2470
2533
|
int dump = WCOREDUMP( status );
|
2471
2534
|
fprintf( stderr, "Child process with pid: %d was killed by signal: %d, core dump: %d\n", pid, sig_num, dump );
|
2472
2535
|
}
|
2536
|
+
if ( pid == s_pid_dump_debug_info )
|
2537
|
+
{
|
2538
|
+
pid = 0;
|
2539
|
+
continue;
|
2540
|
+
}
|
2473
2541
|
child_status = find_child_status( pid );
|
2474
2542
|
if ( child_status )
|
2475
2543
|
{
|
2476
2544
|
child_status->m_pid = 0;
|
2477
2545
|
--g_prefork_server->m_iCurChildren;
|
2546
|
+
|
2478
2547
|
}
|
2479
2548
|
}
|
2549
|
+
while(( g_prefork_server->m_pChildrenStatusCur > g_prefork_server->m_pChildrenStatus )
|
2550
|
+
&&( g_prefork_server->m_pChildrenStatusCur[-1].m_pid == 0 ))
|
2551
|
+
--g_prefork_server->m_pChildrenStatusCur;
|
2480
2552
|
|
2481
2553
|
}
|
2482
2554
|
|
@@ -2485,7 +2557,7 @@ static int lsapi_init_children_status()
|
|
2485
2557
|
int size = 4096;
|
2486
2558
|
|
2487
2559
|
char * pBuf;
|
2488
|
-
size = g_prefork_server->m_iMaxChildren * sizeof( lsapi_child_status ) * 2;
|
2560
|
+
size = (g_prefork_server->m_iMaxChildren + g_prefork_server->m_iExtraChildren ) * sizeof( lsapi_child_status ) * 2;
|
2489
2561
|
size = (size + 4095 ) / 4096 * 4096;
|
2490
2562
|
pBuf =( char*) mmap( NULL, size, PROT_READ | PROT_WRITE,
|
2491
2563
|
MAP_ANON | MAP_SHARED, -1, 0 );
|
@@ -2495,16 +2567,22 @@ static int lsapi_init_children_status()
|
|
2495
2567
|
return -1;
|
2496
2568
|
}
|
2497
2569
|
memset( pBuf, 0, size );
|
2498
|
-
g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf;
|
2570
|
+
g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf;
|
2571
|
+
g_prefork_server->m_pChildrenStatusCur = (lsapi_child_status *)pBuf;
|
2572
|
+
g_prefork_server->m_pChildrenStatusEnd = (lsapi_child_status *)pBuf + size / sizeof( lsapi_child_status );
|
2499
2573
|
return 0;
|
2500
2574
|
}
|
2501
2575
|
|
2502
2576
|
static void dump_debug_info( lsapi_child_status * pStatus, long tmCur )
|
2503
2577
|
{
|
2504
2578
|
char achCmd[1024];
|
2505
|
-
|
2506
|
-
|
2507
|
-
|
2579
|
+
if ( s_pid_dump_debug_info )
|
2580
|
+
{
|
2581
|
+
if ( kill( s_pid_dump_debug_info, 0 ) == 0 )
|
2582
|
+
return;
|
2583
|
+
}
|
2584
|
+
s_pid_dump_debug_info = fork();
|
2585
|
+
|
2508
2586
|
fprintf( stderr, "[%s] Possible runaway process, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld\n",
|
2509
2587
|
ctime(&tmCur), getpid(), pStatus->m_pid, pStatus->m_iReqCounter,
|
2510
2588
|
tmCur - pStatus->m_tmReqBegin, tmCur - pStatus->m_tmLastCheckPoint, tmCur - pStatus->m_tmStart );
|
@@ -2521,7 +2599,7 @@ static void lsapi_check_child_status( long tmCur )
|
|
2521
2599
|
int dying = 0;
|
2522
2600
|
int count = 0;
|
2523
2601
|
lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus;
|
2524
|
-
lsapi_child_status * pEnd = g_prefork_server->
|
2602
|
+
lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusCur;
|
2525
2603
|
while( pStatus < pEnd )
|
2526
2604
|
{
|
2527
2605
|
tobekilled = 0;
|
@@ -2534,13 +2612,15 @@ static void lsapi_check_child_status( long tmCur )
|
|
2534
2612
|
if (( g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren)||
|
2535
2613
|
( idle > g_prefork_server->m_iMaxIdleChildren ))
|
2536
2614
|
{
|
2537
|
-
|
2615
|
+
++pStatus->m_iKillSent;
|
2616
|
+
//tobekilled = SIGUSR1;
|
2538
2617
|
}
|
2539
2618
|
else
|
2540
2619
|
{
|
2541
2620
|
if (( s_max_idle_secs> 0)&&(tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5 ))
|
2542
2621
|
{
|
2543
|
-
|
2622
|
+
++pStatus->m_iKillSent;
|
2623
|
+
//tobekilled = SIGUSR1;
|
2544
2624
|
}
|
2545
2625
|
}
|
2546
2626
|
if ( !tobekilled )
|
@@ -2567,14 +2647,21 @@ static void lsapi_check_child_status( long tmCur )
|
|
2567
2647
|
}
|
2568
2648
|
if ( tobekilled )
|
2569
2649
|
{
|
2570
|
-
kill( pStatus->m_pid, tobekilled )
|
2571
|
-
|
2572
|
-
|
2650
|
+
if (( kill( pStatus->m_pid, tobekilled ) == -1 )&&( errno == ESRCH ))
|
2651
|
+
{
|
2652
|
+
pStatus->m_pid = 0;
|
2653
|
+
--count;
|
2654
|
+
}
|
2655
|
+
else
|
2656
|
+
{
|
2657
|
+
++pStatus->m_iKillSent;
|
2658
|
+
++dying;
|
2659
|
+
}
|
2573
2660
|
}
|
2574
2661
|
}
|
2575
2662
|
++pStatus;
|
2576
2663
|
}
|
2577
|
-
if ( g_prefork_server->m_iCurChildren
|
2664
|
+
if ( abs( g_prefork_server->m_iCurChildren - count ) > 1 )
|
2578
2665
|
{
|
2579
2666
|
fprintf( stderr, "Children tracking is wrong: PID: %d, Cur Childen: %d, count: %d, idle: %d, dying: %d\n", getpid(),
|
2580
2667
|
g_prefork_server->m_iCurChildren, count, idle, dying );
|
@@ -2616,6 +2703,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2616
2703
|
fd_set readfds;
|
2617
2704
|
struct timeval timeout;
|
2618
2705
|
|
2706
|
+
sigset_t mask;
|
2707
|
+
sigset_t orig_mask;
|
2708
|
+
|
2619
2709
|
lsapi_init_children_status();
|
2620
2710
|
|
2621
2711
|
setsid();
|
@@ -2664,6 +2754,8 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2664
2754
|
|
2665
2755
|
if ( pServer->m_iCurChildren >= (pServer->m_iMaxChildren + pServer->m_iExtraChildren ) )
|
2666
2756
|
{
|
2757
|
+
fprintf( stderr, "Reached max children process limit: %d, extra: %d, current: %d, please increase LSAPI_CHILDREN.\n",
|
2758
|
+
pServer->m_iMaxChildren, pServer->m_iExtraChildren, pServer->m_iCurChildren );
|
2667
2759
|
usleep( 100000 );
|
2668
2760
|
continue;
|
2669
2761
|
}
|
@@ -2702,9 +2794,21 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2702
2794
|
child_status = find_child_status( 0 );
|
2703
2795
|
if ( child_status )
|
2704
2796
|
memset( child_status, 0, sizeof( *child_status ) );
|
2797
|
+
|
2798
|
+
sigemptyset( &mask );
|
2799
|
+
sigaddset( &mask, SIGCHLD );
|
2800
|
+
|
2801
|
+
if ( sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0 )
|
2802
|
+
{
|
2803
|
+
perror( "sigprocmask(SIG_BLOCK) to block SIGCHLD" );
|
2804
|
+
}
|
2805
|
+
|
2705
2806
|
pid = fork();
|
2807
|
+
|
2706
2808
|
if ( !pid )
|
2707
2809
|
{
|
2810
|
+
if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0)
|
2811
|
+
perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK in child" );
|
2708
2812
|
g_prefork_server = NULL;
|
2709
2813
|
s_ppid = getppid();
|
2710
2814
|
s_req_processed = 0;
|
@@ -2723,8 +2827,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2723
2827
|
sigaction( SIGUSR1, &old_usr1, 0 );
|
2724
2828
|
//init_conn_key( pReq->m_fd );
|
2725
2829
|
lsapi_notify_pid( pReq->m_fd );
|
2726
|
-
|
2727
|
-
|
2830
|
+
s_notified_pid = 1;
|
2831
|
+
//if ( s_accept_notify )
|
2832
|
+
// return notify_req_received( pReq->m_fd );
|
2728
2833
|
return 0;
|
2729
2834
|
}
|
2730
2835
|
else if ( pid == -1 )
|
@@ -2744,6 +2849,9 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2744
2849
|
close( pReq->m_fd );
|
2745
2850
|
pReq->m_fd = -1;
|
2746
2851
|
|
2852
|
+
if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0)
|
2853
|
+
perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK" );
|
2854
|
+
|
2747
2855
|
}
|
2748
2856
|
else
|
2749
2857
|
{
|
@@ -2754,8 +2862,8 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
2754
2862
|
}
|
2755
2863
|
}
|
2756
2864
|
sigaction( SIGUSR1, &old_usr1, 0 );
|
2757
|
-
kill( -getpgrp(), SIGUSR1 );
|
2758
|
-
lsapi_all_children_must_die(); /* Sorry, children ;-) */
|
2865
|
+
//kill( -getpgrp(), SIGUSR1 );
|
2866
|
+
//lsapi_all_children_must_die(); /* Sorry, children ;-) */
|
2759
2867
|
return -1;
|
2760
2868
|
|
2761
2869
|
}
|
@@ -2808,7 +2916,7 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
|
|
2808
2916
|
{
|
2809
2917
|
if ( !g_running )
|
2810
2918
|
return -1;
|
2811
|
-
if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent ))
|
2919
|
+
if ((s_req_processed)&&( s_pChildStatus )&&( s_pChildStatus->m_iKillSent ))
|
2812
2920
|
return -1;
|
2813
2921
|
FD_ZERO( &readfds );
|
2814
2922
|
FD_SET( fd, &readfds );
|
@@ -2836,7 +2944,7 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
|
|
2836
2944
|
}
|
2837
2945
|
else if ( ret >= 1 )
|
2838
2946
|
{
|
2839
|
-
if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent ))
|
2947
|
+
if (s_req_processed && ( s_pChildStatus )&&( s_pChildStatus->m_iKillSent ))
|
2840
2948
|
return -1;
|
2841
2949
|
if ( fd == pReq->m_fdListen )
|
2842
2950
|
{
|
@@ -2969,6 +3077,51 @@ static void unset_lsapi_envs()
|
|
2969
3077
|
}
|
2970
3078
|
}
|
2971
3079
|
|
3080
|
+
static int lsapi_initSuEXEC()
|
3081
|
+
{
|
3082
|
+
int i;
|
3083
|
+
struct passwd * pw;
|
3084
|
+
s_defaultUid = 0;
|
3085
|
+
s_defaultGid = 0;
|
3086
|
+
if ( s_uid == 0 )
|
3087
|
+
{
|
3088
|
+
const char * p = getenv( "LSAPI_DEFAULT_UID" );
|
3089
|
+
if ( p )
|
3090
|
+
{
|
3091
|
+
i = atoi( p );
|
3092
|
+
if ( i > 0 )
|
3093
|
+
s_defaultUid = i;
|
3094
|
+
}
|
3095
|
+
p = getenv( "LSAPI_DEFAULT_GID" );
|
3096
|
+
if ( p )
|
3097
|
+
{
|
3098
|
+
i = atoi( p );
|
3099
|
+
if ( i > 0 )
|
3100
|
+
s_defaultGid = i;
|
3101
|
+
}
|
3102
|
+
p = getenv( "LSAPI_SECRET" );
|
3103
|
+
if (( !p )||( readSecret(p) == -1 ))
|
3104
|
+
return -1;
|
3105
|
+
if ( g_prefork_server )
|
3106
|
+
{
|
3107
|
+
if ( g_prefork_server->m_iMaxChildren < 100 )
|
3108
|
+
g_prefork_server->m_iMaxChildren = 100;
|
3109
|
+
if ( g_prefork_server->m_iExtraChildren < 1000 )
|
3110
|
+
g_prefork_server->m_iExtraChildren = 1000;
|
3111
|
+
}
|
3112
|
+
}
|
3113
|
+
if ( !s_defaultUid || !s_defaultGid )
|
3114
|
+
{
|
3115
|
+
pw = getpwnam( "nobody" );
|
3116
|
+
if ( !s_defaultUid )
|
3117
|
+
s_defaultUid = pw->pw_uid;
|
3118
|
+
if ( !s_defaultGid )
|
3119
|
+
s_defaultGid = pw->pw_gid;
|
3120
|
+
}
|
3121
|
+
return 0;
|
3122
|
+
}
|
3123
|
+
|
3124
|
+
|
2972
3125
|
int LSAPI_Init_Env_Parameters( fn_select_t fp )
|
2973
3126
|
{
|
2974
3127
|
const char *p;
|
@@ -3082,7 +3235,25 @@ int LSAPI_Init_Env_Parameters( fn_select_t fp )
|
|
3082
3235
|
}
|
3083
3236
|
|
3084
3237
|
|
3085
|
-
|
3238
|
+
int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders,
|
3239
|
+
const char * pBody, int bodyLen )
|
3240
|
+
{
|
3241
|
+
LSAPI_SetRespStatus_r( pReq, code );
|
3242
|
+
if ( pRespHeaders )
|
3243
|
+
{
|
3244
|
+
while( *pRespHeaders )
|
3245
|
+
{
|
3246
|
+
LSAPI_AppendRespHeader_r( pReq, *pRespHeaders, strlen( *pRespHeaders ) );
|
3247
|
+
++pRespHeaders;
|
3248
|
+
}
|
3249
|
+
}
|
3250
|
+
if ( pBody &&( bodyLen > 0 ))
|
3251
|
+
{
|
3252
|
+
LSAPI_Write_r( pReq, pBody, bodyLen );
|
3253
|
+
}
|
3254
|
+
LSAPI_Finish_r( pReq );
|
3255
|
+
return 0;
|
3256
|
+
}
|
3086
3257
|
|
3087
3258
|
|
3088
3259
|
static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]);
|
@@ -3206,7 +3377,7 @@ void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *ctx)
|
|
3206
3377
|
lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in);
|
3207
3378
|
byteReverse((unsigned char *) ctx->buf, 4);
|
3208
3379
|
memmove(digest, ctx->buf, 16);
|
3209
|
-
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
|
3380
|
+
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
|
3210
3381
|
}
|
3211
3382
|
|
3212
3383
|
/* The four core functions - F1 is optimized somewhat */
|
data/ext/lsapi/lsapilib.h
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Copyright (c)
|
2
|
+
Copyright (c) 2002-2015, Lite Speed Technologies Inc.
|
3
3
|
All rights reserved.
|
4
4
|
|
5
5
|
Redistribution and use in source and binary forms, with or without
|
@@ -30,14 +30,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
30
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
*/
|
32
32
|
|
33
|
-
/***************************************************************************
|
34
|
-
lsapilib.h - description
|
35
|
-
-------------------
|
36
|
-
begin : Mon Feb 21 2005
|
37
|
-
copyright : (C) 2005 by George Wang
|
38
|
-
email : gwang@litespeedtech.com
|
39
|
-
***************************************************************************/
|
40
|
-
|
41
33
|
|
42
34
|
#ifndef _LSAPILIB_H_
|
43
35
|
#define _LSAPILIB_H_
|
@@ -182,6 +174,9 @@ int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len )
|
|
182
174
|
int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName,
|
183
175
|
const char * pHeaderValue );
|
184
176
|
|
177
|
+
int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders,
|
178
|
+
const char * pBody, int bodyLen );
|
179
|
+
|
185
180
|
static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code )
|
186
181
|
{
|
187
182
|
if ( !pReq )
|
@@ -253,6 +248,7 @@ static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq )
|
|
253
248
|
}
|
254
249
|
|
255
250
|
|
251
|
+
|
256
252
|
int LSAPI_Is_Listen(void);
|
257
253
|
|
258
254
|
static inline int LSAPI_Accept( void )
|
@@ -332,6 +328,9 @@ static inline int LSAPI_AppendRespHeader( char * pBuf, int len )
|
|
332
328
|
static inline int LSAPI_SetRespStatus( int code )
|
333
329
|
{ return LSAPI_SetRespStatus_r( &g_req, code ); }
|
334
330
|
|
331
|
+
static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen )
|
332
|
+
{ return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen ); }
|
333
|
+
|
335
334
|
int LSAPI_IsRunning(void);
|
336
335
|
|
337
336
|
int LSAPI_CreateListenSock( const char * pBind, int backlog );
|
data/ext/lsapi/lsruby.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
#include "ruby.h"
|
3
3
|
|
4
|
-
#
|
4
|
+
#if defined( RUBY_19 ) || defined( RUBY_2 )
|
5
5
|
#include <ruby/util.h>
|
6
6
|
#else
|
7
7
|
#include "util.h"
|
@@ -43,7 +43,7 @@ typedef struct lsapi_data
|
|
43
43
|
{
|
44
44
|
LSAPI_Request * req;
|
45
45
|
VALUE env;
|
46
|
-
|
46
|
+
ssize_t (* fn_write)( LSAPI_Request *, const char * , size_t );
|
47
47
|
|
48
48
|
}lsapi_data;
|
49
49
|
|
@@ -217,7 +217,7 @@ static VALUE lsapi_eval_string_wrap(VALUE self, VALUE str)
|
|
217
217
|
}
|
218
218
|
else
|
219
219
|
{
|
220
|
-
|
220
|
+
SafeStringValue(str);
|
221
221
|
}
|
222
222
|
return rb_eval_string_wrap(StringValuePtr(str), NULL);
|
223
223
|
}
|
@@ -307,7 +307,7 @@ static VALUE lsapi_printf(int argc, VALUE *argv, VALUE out)
|
|
307
307
|
|
308
308
|
static VALUE lsapi_puts _((int, VALUE*, VALUE));
|
309
309
|
|
310
|
-
#
|
310
|
+
#if defined( RUBY_19 ) || defined( RUBY_2 )
|
311
311
|
static VALUE lsapi_puts_ary(VALUE ary, VALUE out, int recur )
|
312
312
|
{
|
313
313
|
VALUE tmp;
|
@@ -365,7 +365,7 @@ static VALUE lsapi_puts(int argc, VALUE *argv, VALUE out)
|
|
365
365
|
line = rb_str_new2("nil");
|
366
366
|
break;
|
367
367
|
case T_ARRAY:
|
368
|
-
#
|
368
|
+
#if defined( RUBY_19 ) || defined( RUBY_2 )
|
369
369
|
rb_exec_recursive(lsapi_puts_ary, argv[i], out);
|
370
370
|
#else
|
371
371
|
rb_protect_inspect(lsapi_puts_ary, argv[i], out);
|
@@ -502,7 +502,7 @@ static VALUE lsapi_eof(VALUE self)
|
|
502
502
|
}
|
503
503
|
Data_Get_Struct(self, lsapi_data, data);
|
504
504
|
*/
|
505
|
-
return (
|
505
|
+
return (LSAPI_GetReqBodyRemain_r( &g_req ) <= 0) ? Qtrue : Qfalse;
|
506
506
|
}
|
507
507
|
|
508
508
|
static VALUE lsapi_binmode(VALUE self)
|
@@ -561,7 +561,8 @@ void Init_lsapi()
|
|
561
561
|
|
562
562
|
LSAPI_Init();
|
563
563
|
|
564
|
-
LSAPI_Init_Env_Parameters( rb_thread_select );
|
564
|
+
//LSAPI_Init_Env_Parameters( rb_thread_select );
|
565
|
+
LSAPI_Init_Env_Parameters( select );
|
565
566
|
|
566
567
|
s_pid = getpid();
|
567
568
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '4.
|
4
|
+
version: '4.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LiteSpeed Technologies Inc.
|
@@ -38,17 +38,17 @@ require_paths:
|
|
38
38
|
- lib
|
39
39
|
required_ruby_version: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - '>='
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '0'
|
44
44
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - '>='
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
requirements: []
|
50
50
|
rubyforge_project: ruby-lsapi
|
51
|
-
rubygems_version: 2.0.
|
51
|
+
rubygems_version: 2.0.3
|
52
52
|
signing_key:
|
53
53
|
specification_version: 4
|
54
54
|
summary: A ruby extension for fast communication with LiteSpeed Web Server.
|