1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
This commit is contained in:
stefanocasazza 2017-10-13 19:29:19 +02:00
parent 16be2e0658
commit 6b47e2f674
11 changed files with 161 additions and 56 deletions

View File

@ -67,7 +67,7 @@ public:
// manage arg operation // manage arg operation
p = argv[optind++]; p = argv[optind];
UString url(p, strlen(p)); UString url(p, strlen(p));

View File

@ -108,8 +108,11 @@ U_DO_PRAGMA(message ("Sorry I was compiled with http2 enabled so I cannot suppor
# undef U_HTTP_INOTIFY_SUPPORT # undef U_HTTP_INOTIFY_SUPPORT
U_DO_PRAGMA(message ("Sorry I was compiled with server captive portal mode enabled so I cannot support http inotify")) U_DO_PRAGMA(message ("Sorry I was compiled with server captive portal mode enabled so I cannot support http inotify"))
#endif #endif
#if defined(HAVE_CXX17) && defined(__GNUC__) && !defined(HAVE_CONFIG_H)
U_DO_PRAGMA(message ("ULib is configured with C++17 support, so you must use the -std=gnu++17 g++ option for compilation"))
#endif
#if defined(USE_HARDWARE_CRC32) && defined(__GNUC__) && !defined(HAVE_CONFIG_H) /* The built-in functions __builtin_ia32_crc32 are available when -mcrc32 is used */ #if defined(USE_HARDWARE_CRC32) && defined(__GNUC__) && !defined(HAVE_CONFIG_H) /* The built-in functions __builtin_ia32_crc32 are available when -mcrc32 is used */
U_DO_PRAGMA(message ("ULib is configured with support for crc32 intrinsics, so you must use the -mcrc32 g++ option for compilation")) U_DO_PRAGMA(message ("ULib is configured with crc32 intrinsics support, so you must use the -mcrc32 g++ option for compilation"))
#endif #endif
#include <stddef.h> #include <stddef.h>

View File

@ -764,7 +764,8 @@ public:
UString getContent( bool brdonly = true, bool bstat = false, bool bmap = false); UString getContent( bool brdonly = true, bool bstat = false, bool bmap = false);
UString _getContent(bool bsize = true, bool brdonly = false, bool bmap = false); UString _getContent(bool bsize = true, bool brdonly = false, bool bmap = false);
static UString contentOf(const UString& _pathname, int flags = O_RDONLY, bool bstat = false, const UString* environment = U_NULLPTR); static UString contentOf(const UString& pathname, const UString& pinclude);
static UString contentOf(const UString& pathname, int flags = O_RDONLY, bool bstat = false, const UString* environment = U_NULLPTR);
static char* mmap(uint32_t* plength, int _fd = -1, int prot = PROT_READ | PROT_WRITE, int flags = MAP_SHARED | MAP_ANONYMOUS, uint32_t offset = 0); static char* mmap(uint32_t* plength, int _fd = -1, int prot = PROT_READ | PROT_WRITE, int flags = MAP_SHARED | MAP_ANONYMOUS, uint32_t offset = 0);

View File

@ -894,6 +894,35 @@ UString UFile::contentOf(const UString& _pathname, int flags, bool bstat, const
U_RETURN_STRING(content); U_RETURN_STRING(content);
} }
UString UFile::contentOf(const UString& _pathname, const UString& pinclude)
{
U_TRACE(0, "UFile::contentOf(%V,%V)", _pathname.rep, pinclude.rep)
UFile file;
UString content;
file.reset();
file.setPath(_pathname);
if (file.open(O_RDONLY))
{
content = file.getContent();
U_RETURN_STRING(content);
}
if (pinclude)
{
file.reset();
file.setPath(pinclude + '/' + UStringExt::basename(_pathname));
if (file.open(O_RDONLY)) content = file.getContent();
}
U_RETURN_STRING(content);
}
void UFile::printf(const char* format, uint32_t fmt_size, ...) void UFile::printf(const char* format, uint32_t fmt_size, ...)
{ {
U_TRACE(0, "UFile::printf(%.*S,%u)", fmt_size, format, fmt_size) U_TRACE(0, "UFile::printf(%.*S,%u)", fmt_size, format, fmt_size)

View File

@ -1,2 +1 @@
<!--#define HEADER plaintext.usp --> <!--#include plaintext.usp -->
<!--#include HEADER -->

View File

@ -59,7 +59,7 @@ test "$libsuffix" || libsuffix=so
export UMEMPOOL="0,0,0,48,-20,-20,-20,-20,0" export UMEMPOOL="0,0,0,48,-20,-20,-20,-20,0"
export PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin" export PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin"
@ULIB_PREFIXDIR@/bin/usp_translator $file.usp && @ULIB_PREFIXDIR@/bin/usp_translator ${local_includedir} $file.usp &&
@ULIB_PREFIXDIR@/bin/usp_libtool.sh --silent --tag=CXX --mode=compile \ @ULIB_PREFIXDIR@/bin/usp_libtool.sh --silent --tag=CXX --mode=compile \
@CXX@ ${local_includedir} -IULIB_PREFIXDIR@/include -DHAVE_CONFIG_H @CPPFLAGS@ @CXXFLAGS@ @USP_FLAGS@ -MT $basen.lo -MD -MP -c -o $basen.lo $basen.cpp && @CXX@ ${local_includedir} -IULIB_PREFIXDIR@/include -DHAVE_CONFIG_H @CPPFLAGS@ @CXXFLAGS@ @USP_FLAGS@ -MT $basen.lo -MD -MP -c -o $basen.lo $basen.cpp &&
@ULIB_PREFIXDIR@/bin/usp_libtool.sh --silent --tag=CXX --mode=link \ @ULIB_PREFIXDIR@/bin/usp_libtool.sh --silent --tag=CXX --mode=link \

View File

@ -24,8 +24,9 @@
#undef ARGS #undef ARGS
#define ARGS "[filename usp]" #define ARGS "[filename usp]"
#define U_OPTIONS ""
#define U_PURPOSE "program for dynamic page translation ([xxx].usp => [xxx].cpp)" #define U_PURPOSE "program for dynamic page translation ([xxx].usp => [xxx].cpp)"
#define U_OPTIONS \
"option I include 1 \"path of local include directory\" \"\"\n"
#include <ulib/application.h> #include <ulib/application.h>
@ -221,30 +222,30 @@ public:
if (bdefine || if (bdefine ||
binclude) binclude)
{ {
uint32_t pos; const char* ptr = usp.data();
const char* ptr; UString content, x(U_CAPACITY);
UString block(100U + token.size()); uint32_t pos2 = t.getDistance(),
pos1 = pos2 - token.size() - U_CONSTANT_SIZE("<!--->");
block.snprintf(U_CONSTANT_TO_PARAM("<!-%v-->"), token.rep); U_INTERNAL_DUMP("pos1(%u) = %.10S pos2(%u) = %.10S", pos1, usp.c_pointer(pos1), pos2, t.getPointer())
pos = t.getDistance() - block.size(); U_INTERNAL_ASSERT_MAJOR(pos2, 0)
U_INTERNAL_DUMP("usp(%u) = %.10S", pos, t.getPointer()) if (pos1) (void) x.append(ptr, pos1);
for (ptr = t.getPointer(); u__isspace(*ptr); ++ptr) block.push_back(*ptr); ptr += pos2;
if (bdefine) if (bdefine)
{ {
vdefine.push_back(block);
vdefine.push_back(UString::getStringNull());
setDirectiveItem(directive, U_CONSTANT_SIZE("define")); setDirectiveItem(directive, U_CONSTANT_SIZE("define"));
ptr = token.data(); U_INTERNAL_ASSERT(token)
do { ++ptr; } while (u__isspace(*ptr) == false); const char* ptr1 = token.data();
pos = token.distance(ptr); do { ++ptr1; } while (u__isspace(*ptr1) == false);
uint32_t pos = token.distance(ptr1);
UString id(token, 0, pos), UString id(token, 0, pos),
value(token, pos); value(token, pos);
@ -256,23 +257,27 @@ public:
{ {
setDirectiveItem(directive, U_CONSTANT_SIZE("include")); setDirectiveItem(directive, U_CONSTANT_SIZE("include"));
UString content = UFile::contentOf(token); U_INTERNAL_ASSERT(token)
content = UFile::contentOf(token, pinclude);
if (content.empty()) if (content.empty())
{ {
U_WARNING("load of include usp %V failed", token.rep); U_ERROR("load of include usp %V failed: path = %V", token.rep, pinclude.rep);
} }
else
{ (void) x.append(content);
}
(void) x.append(ptr, usp.remain(ptr));
# ifdef DEBUG # ifdef DEBUG
token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE...
# endif # endif
t.setData((usp = UStringExt::substitute(usp, block, content))); t.setData((usp = x));
t.setDistance(pos); t.setDistance(pos1);
}
}
} }
return; return;
@ -286,6 +291,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("declaration")); setDirectiveItem(directive, U_CONSTANT_SIZE("declaration"));
U_INTERNAL_ASSERT(token)
declaration = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t")); declaration = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t"));
} }
else if (strncmp(directive, U_CONSTANT_TO_PARAM("session")) == 0) else if (strncmp(directive, U_CONSTANT_TO_PARAM("session")) == 0)
@ -357,6 +364,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("vcode")); setDirectiveItem(directive, U_CONSTANT_SIZE("vcode"));
U_INTERNAL_ASSERT(token)
token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t")); token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t"));
vcode.setBuffer(20U + token.size()); vcode.setBuffer(20U + token.size());
@ -369,6 +378,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("pcode")); setDirectiveItem(directive, U_CONSTANT_SIZE("pcode"));
U_INTERNAL_ASSERT(token)
token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t")); token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t"));
(void) output0.reserve(20U + token.size()); (void) output0.reserve(20U + token.size());
@ -383,6 +394,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("lcode")); setDirectiveItem(directive, U_CONSTANT_SIZE("lcode"));
U_INTERNAL_ASSERT(token)
token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t")); token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t"));
(void) output0.reserve(20U + token.size()); (void) output0.reserve(20U + token.size());
@ -401,6 +414,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("code")); setDirectiveItem(directive, U_CONSTANT_SIZE("code"));
U_INTERNAL_ASSERT(token)
token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t")); token = UStringExt::substitute(token, '\n', U_CONSTANT_TO_PARAM("\n\t"));
(void) output0.reserve(20U + token.size()); (void) output0.reserve(20U + token.size());
@ -413,6 +428,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("number")); setDirectiveItem(directive, U_CONSTANT_SIZE("number"));
U_INTERNAL_ASSERT(token)
(void) output0.reserve(100U + token.size()); (void) output0.reserve(100U + token.size());
output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUStringExt::appendNumber32(*UClientImage_Base::wbuffer, (%v));\n\t"), token.rep); output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUStringExt::appendNumber32(*UClientImage_Base::wbuffer, (%v));\n\t"), token.rep);
@ -423,6 +440,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("puts")); setDirectiveItem(directive, U_CONSTANT_SIZE("puts"));
U_INTERNAL_ASSERT(token)
(void) output0.reserve(100U + token.size()); (void) output0.reserve(100U + token.size());
output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append((%v));\n\t"), token.rep); output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append((%v));\n\t"), token.rep);
@ -433,6 +452,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("xmlputs")); setDirectiveItem(directive, U_CONSTANT_SIZE("xmlputs"));
U_INTERNAL_ASSERT(token)
(void) output0.reserve(100U + token.size()); (void) output0.reserve(100U + token.size());
output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_XML_PUTS((%v));\n\t"), token.rep); output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_XML_PUTS((%v));\n\t"), token.rep);
@ -445,6 +466,8 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("cout")); setDirectiveItem(directive, U_CONSTANT_SIZE("cout"));
U_INTERNAL_ASSERT(token)
(void) output0.reserve(200U + token.size()); (void) output0.reserve(200U + token.size());
output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tusp_sz = UObject2String((%v), usp_buffer, sizeof(usp_buffer));" output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tusp_sz = UObject2String((%v), usp_buffer, sizeof(usp_buffer));"
@ -460,6 +483,8 @@ public:
setDirectiveItem(directive, (bfor ? U_CONSTANT_SIZE("printfor") : U_CONSTANT_SIZE("print"))); setDirectiveItem(directive, (bfor ? U_CONSTANT_SIZE("printfor") : U_CONSTANT_SIZE("print")));
U_INTERNAL_ASSERT(token)
(void) output0.reserve(200U + token.size()); (void) output0.reserve(200U + token.size());
UVector<UString> vec(token, ';'); UVector<UString> vec(token, ';');
@ -584,9 +609,15 @@ loop: distance = t.getDistance();
UApplication::run(argc, argv, env); UApplication::run(argc, argv, env);
if (argv[1] == U_NULLPTR) U_ERROR("filename usp not specified"); // manage options
UString filename(argv[1]); if (UApplication::isOptions()) pinclude = opt['I'];
// manage arg
if (argv[optind] == U_NULLPTR) U_ERROR("filename usp not specified");
UString filename(argv[optind]);
usp = UFile::contentOf(filename); usp = UFile::contentOf(filename);
@ -764,7 +795,7 @@ loop: distance = t.getDistance();
private: private:
UTokenizer t; UTokenizer t;
UVector<UString> vdefine; UVector<UString> vdefine;
UString usp, token, output0, output1, declaration, vcode, http_header; UString pinclude, usp, token, output0, output1, declaration, vcode, http_header;
bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bpreprocessing_failed; bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bpreprocessing_failed;
U_DISALLOW_COPY_AND_ASSIGN(Application) U_DISALLOW_COPY_AND_ASSIGN(Application)

View File

@ -4105,6 +4105,14 @@ void UServer_Base::runLoop(const char* user)
{ {
# if !defined(U_LOG_DISABLE) && defined(DEBUG) # if !defined(U_LOG_DISABLE) && defined(DEBUG)
last_event = u_now->tv_sec; last_event = u_now->tv_sec;
# ifndef _MSWINDOWS_
if (monitoring_process &&
U_SYSCALL_NO_PARAM(getppid) == 1)
{
U_ERROR("the monitoring process has crashed, exiting...");
}
# endif
# endif # endif
UTimer::updateTimeToExpire(ptime); UTimer::updateTimeToExpire(ptime);
@ -4274,7 +4282,7 @@ void UServer_Base::run()
UInterrupt::setHandlerForSignal(SIGHUP, (sighandler_t)SIG_IGN); // NB: we can't use UInterrupt::erase() because it restore the old action (UInterrupt::init)... UInterrupt::setHandlerForSignal(SIGHUP, (sighandler_t)SIG_IGN); // NB: we can't use UInterrupt::erase() because it restore the old action (UInterrupt::init)...
# ifdef U_LINUX # ifdef U_LINUX
(void) U_SYSCALL(prctl, "%d,%lu", PR_SET_PDEATHSIG, SIGINT); (void) U_SYSCALL(prctl, "%d,%lu", PR_SET_PDEATHSIG, SIGTERM);
# endif # endif
runLoop(user); runLoop(user);

View File

@ -318,8 +318,8 @@ UString UStringExt::substitute(const char* s, uint32_t len, UVector<UString>& ve
char c; char c;
int32_t i; int32_t i;
UString item; UString item;
bool breserve = false, bdigit = false, bspace = false; bool breserve = false, bdigit = false, bspace = false, bdollar;
uint32_t n1 = 0, n2 = 0, capacity, mask_lower = 0, mask_upper = 0; uint32_t n1 = 0, n2 = 0, capacity, mask_lower = 0, mask_upper = 0, dollar = 0;
uint32_t maskFirstChar[] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, uint32_t maskFirstChar[] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010,
0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200,
@ -337,13 +337,23 @@ UString UStringExt::substitute(const char* s, uint32_t len, UVector<UString>& ve
c = item.first_char(); c = item.first_char();
if (c == '$')
{
++dollar;
continue;
}
if (u__islower(c)) mask_lower |= maskFirstChar[c-'a']; if (u__islower(c)) mask_lower |= maskFirstChar[c-'a'];
else if (u__isupper(c)) mask_upper |= maskFirstChar[c-'A']; else if (u__isupper(c)) mask_upper |= maskFirstChar[c-'A'];
else if (u__isdigit(c)) bdigit = true; else if (u__isdigit(c)) bdigit = true;
else if (u__isspace(c)) bspace = true; else if (u__isspace(c)) bspace = true;
} }
U_INTERNAL_DUMP("n1 = %u n2 = %u mask_lower = %B mask_upper = %B bdigit = %b bspace = %b", n1, n2, mask_lower, mask_upper, bdigit, bspace) bdollar = (dollar == n);
U_INTERNAL_DUMP("n1 = %u n2 = %u mask_lower = %B mask_upper = %B bdigit = %b bspace = %b dollar = %u bdollar = %b",
n1, n2, mask_lower, mask_upper, bdigit, bspace, dollar, bdollar)
if (n2 <= n1) capacity = len; if (n2 <= n1) capacity = len;
else else
@ -364,19 +374,26 @@ loop:
{ {
c = *p1; c = *p1;
if ((u__islower(c) && U_INTERNAL_DUMP("c = %C p1 = %.10S", c, p1)
(mask_lower & maskFirstChar[c-'a']) == 0) ||
(u__isupper(c) && if (c == '$')
(mask_upper & maskFirstChar[c-'A']) == 0) || {
(u__isdigit(c) && if (dollar) goto chk;
bdigit == false) ||
(u__isspace(c) && continue;
bspace == false)) }
if (bdollar) continue;
if ((u__isdigit(c) && bdigit == false) ||
(u__isspace(c) && bspace == false) ||
(u__islower(c) && (mask_lower & maskFirstChar[c-'a']) == 0) ||
(u__isupper(c) && (mask_upper & maskFirstChar[c-'A']) == 0))
{ {
continue; continue;
} }
for (i = 0; i < (int32_t)n; i += 2) chk: for (i = 0; i < (int32_t)n; i += 2)
{ {
item = vec[i]; item = vec[i];

View File

@ -1,8 +1,16 @@
HTTP/1.1 200 OK HTTP/1.1 200 OK
Date: Thu, 12 Oct 2017 15:11:29 GMT Date: Fri, 13 Oct 2017 16:14:16 GMT
Server: ULib Server: ULib
Content-Type: text/html; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Length: 332 Content-Length: 340
<html> <html>
<head></head> <head></head>
@ -26,10 +34,18 @@ Content-Length: 332
</body> </body>
</html>HTTP/1.1 200 OK </html>HTTP/1.1 200 OK
Date: Thu, 12 Oct 2017 15:11:29 GMT Date: Fri, 13 Oct 2017 16:14:16 GMT
Server: ULib Server: ULib
Content-Type: text/html; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Length: 332 Content-Length: 340
<html> <html>
<head></head> <head></head>

View File

@ -48,11 +48,12 @@ wait_server_ready localhost 8080
#echo "PID = `cat /var/run/userver_tcp.pid`" #echo "PID = `cat /var/run/userver_tcp.pid`"
#exit 0 #exit 0
$SLEEP
send_req $NCAT localhost 8080 inp/http/usp_include.req usp_include 2 kill send_req $NCAT localhost 8080 inp/http/usp_include.req usp_include 2 kill
kill_server userver_tcp kill_server userver_tcp
mv err/userver_tcp.err err/one.err mv err/userver_tcp.err err/usp_include.err
# Test against expected output # Test against expected output
test_output_wc l usp_include test_output_wc l usp_include