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 2018-04-04 18:15:41 +02:00
parent 7f4ea259ca
commit 78c10b85ee
16 changed files with 359 additions and 226 deletions

View File

@ -36,6 +36,10 @@ aclocal_DATA = ULib.m4
##README.html: README.md
##@Markdown.pl README.md > README.html
configure: configure.ac
@echo "$< changed: you must re-run './autogen.sh'"
@false
test:
@cd $(top_builddir)/tests; $(MAKE) $(AM_MAKEFLAGS) test

View File

@ -982,6 +982,10 @@ uninstall-am: uninstall-aclocalDATA
.phony: doxy todo
configure: configure.ac
@echo "$< changed: you must re-run './autogen.sh'"
@false
test:
@cd $(top_builddir)/tests; $(MAKE) $(AM_MAKEFLAGS) test

View File

@ -18,11 +18,6 @@ static UString* allowed_web_hosts;
static UFile* file_LOG;
static UFile* file_WARNING;
/*
static UVector<UString>* vap;
*/
static UVector<UString>* vcaptive;
static UREDISClient_Base* rc;
static UHttpClient<UTCPSocket>* client;
@ -38,8 +33,15 @@ static uint8_t policySessionNotify;
static uint64_t counter, device_counter;
static uint32_t addr, created, lastUpdate, lastReset;
#define U_MAX_TRAFFIC_DAILY (500ULL * 1024ULL * 1024ULL) // 500M
#define U_MAX_TIME_NO_TRAFFIC (30 * 60) // 30m
#define U_TEST
#define U_CLEAN_INTERVAL (60 * 60) // 1h
#define U_MAX_TIME_NO_TRAFFIC (15 * 60) // 15m
#ifdef U_TEST
# define U_MAX_TRAFFIC_DAILY (50ULL * 1024ULL * 1024ULL) // 50M
#else
# define U_MAX_TRAFFIC_DAILY (500ULL * 1024ULL * 1024ULL) // 500M
#endif
#define U_LOGGER(fmt,args...) ULog::log(file_WARNING->getFd(), U_CONSTANT_TO_PARAM("%v: " fmt), UClientImage_Base::request_uri->rep , ##args)
@ -55,7 +57,7 @@ enum UPolicy {
class WiAuthClean : public UEventTime {
public:
WiAuthClean() : UEventTime(30L * 60L, 0L) // 30m
WiAuthClean() : UEventTime(U_CLEAN_INTERVAL, 0L)
{
U_TRACE_REGISTER_OBJECT(0, WiAuthClean, "", U_NULLPTR)
}
@ -80,6 +82,7 @@ public:
uint8_t status;
UString url(100U);
/*
for (uint32_t i = 0, n = vcaptive->size(); i < n; ++i)
{
url.snprintf(U_CONSTANT_TO_PARAM("http://%v:5280/ping"), vcaptive->at(i).rep);
@ -111,6 +114,7 @@ public:
client->reset();
}
*/
if (pid == 0) UServer_Base::endNewChild();
@ -218,9 +222,6 @@ static void usp_init_wi_auth2()
U_ASSERT_EQUALS(client->isPasswordAuthentication(), false)
// U_NEW(UVector<UString>, vap, UVector<UString>);
U_NEW(UVector<UString>, vcaptive, UVector<UString>);
UVector<UString> vnetmask;
UTokenizer tok(*db_anagrafica, ",\n");
UString lip, lnetmask, lbl, lnetmask1, lbl1;
@ -246,9 +247,6 @@ loop:
U_INTERNAL_ASSERT(lbl)
U_INTERNAL_ASSERT(lnetmask)
// vap->push_back(lbl);
vcaptive->push_back(lip);
U_ASSERT(vnetmask.empty())
vnetmask.push_back(lnetmask);
@ -259,13 +257,13 @@ loop:
(void) UIPAddress::getBinaryForm(ip->c_str(), addr, true);
(void) rc->hmset(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u name ???"), addr);
(void) rc->hmset(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u ip %v"), addr, ip->rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("CAPTIVE:byId 0 id:%u"), addr);
(void) rc->hmset(U_CONSTANT_TO_PARAM("AP:id:%v captiveId %u network %v"), lbl.rep, addr, lnetmask.rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("AP:byCaptiveId %u \"id:%v;network:%v\""), addr, lbl.rep, lnetmask.rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("AP:byCaptiveId %u id:%v;network:%v"), addr, lbl.rep, lnetmask.rep);
while (tok.next(lip, (bool*)U_NULLPTR))
{
@ -296,11 +294,9 @@ loop:
continue;
}
// vap->push_back(lbl1);
(void) rc->hmset(U_CONSTANT_TO_PARAM("AP:id:%v captiveId %u network %v"), lbl1.rep, addr, lnetmask1.rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("AP:byCaptiveId %u \"id:%v;network:%v\""), addr, lbl1.rep, lnetmask1.rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("AP:byCaptiveId %u id:%v;network:%v"), addr, lbl1.rep, lnetmask1.rep);
vnetmask.clear();
@ -308,8 +304,6 @@ loop:
lnetmask = lnetmask1;
}
vcaptive->sort(UStringExt::qscompver);
// CLEAN MONITORING
U_NEW(UPing, sockp, UPing(5000, UClientImage_Base::bIPv6));
@ -342,8 +336,6 @@ static void usp_end_wi_auth2()
delete policySessionId;
delete allowed_web_hosts;
// delete vap;
delete vcaptive;
delete db_anagrafica;
delete rc;
@ -614,7 +606,7 @@ static void writeSessionToLOG(const char* op, uint32_t op_len)
UString opt(200U);
opt.snprintf(U_CONSTANT_TO_PARAM(", traffic: %llu, elapsed: %u"), counter/(1024*1024), (u_now->tv_sec-created)/60);
opt.snprintf(U_CONSTANT_TO_PARAM(", traffic: %llu, elapsed: %u"), counter/1024, (u_now->tv_sec-created)/60);
writeToLOG(op, op_len, opt);
}
@ -624,8 +616,8 @@ static void deleteSession()
U_TRACE_NO_PARAM(5, "::deleteSession()")
(void) rc->del(U_CONSTANT_TO_PARAM("SESSION:%v"), key_session->rep);
(void) rc->zrem(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId \"deviceId:%v;ip:%v\""), mac->rep, ip->rep);
(void) rc->zrem(U_CONSTANT_TO_PARAM("SESSION:byLastUpdate \"%v\""), key_session->rep);
(void) rc->zrem(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId deviceId:%v;ip:%v"), mac->rep, ip->rep);
(void) rc->zrem(U_CONSTANT_TO_PARAM("SESSION:byLastUpdate %v"), key_session->rep);
}
static void resetDeviceDailyCounter()
@ -868,9 +860,13 @@ static void GET_start_ap()
}
}
if (vcaptive->findSorted(*ap_address) == U_NOT_FOUND)
UString x(200U);
x.snprintf(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u"), addr);
if (rc->exists(U_STRING_TO_PARAM(x)) == false)
{
U_LOGGER("*** CAPTIVE:%v NOT FOUND ***", ap_address->rep);
U_LOGGER("*** %v NOT FOUND ***", x.rep);
return;
}
@ -884,41 +880,45 @@ static void GET_start_ap()
(void) rc->hmset(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u name %v status 1 uptime %v since %u lastUpdate %u"), addr, ap_hostname->rep, uptime.rep, u_now->tv_sec, u_now->tv_sec);
UString x(200U);
x.snprintf(U_CONSTANT_TO_PARAM("%u"), addr);
x.snprintf(U_CONSTANT_TO_PARAM("%u%06u"), addr, ap_label->strtoul());
(void) rc->zrangebyscore(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId %v %v"), x.rep, x.rep);
(void) rc->zrangebyscore(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId %v000000 %v999999 WITHSCORES"), x.rep, x.rep);
uint32_t n = rc->vitem.size();
if (n)
{
const char* ptr1;
const char* ptr2;
UVector<UString> vec(n);
vec.copy(rc->vitem);
x.snprintf(U_CONSTANT_TO_PARAM("captiveId:%u;apId:%v;"), addr, ap_label->rep);
key_session->setBuffer(200U);
for (uint32_t i = 0; i < n; ++i)
x.snprintf(U_CONSTANT_TO_PARAM("captiveId:%u;apId:"), addr);
for (uint32_t i = 0; i < n; i += 2)
{
*key_session = x + vec[i];
ptr1 =
ptr2 = vec[i+1].pend()-6; // score (ex: 3232246838000064)
while (*ptr2 == '0') { ++ptr2; }
(void) ap_label->assign(ptr2, 6-(ptr2-ptr1));
key_session->snprintf(U_CONSTANT_TO_PARAM("%v%v;%v"), x.rep, ap_label->rep, vec[i].rep);
if (getSession())
{
addr = rc->getULong(6);
*ap_label = rc->getString(7);
*mac = rc->getString(8);
*ip = rc->getString(9);
U_ASSERT_EQUALS(addr, rc->getULong(6))
U_ASSERT_EQUALS(*ap_label, rc->getString(7))
*mac = rc->getString(8);
*ip = rc->getString(9);
U_INTERNAL_ASSERT(u_isIPv4Addr(U_STRING_TO_PARAM(*ip)))
*ap_address = UIPAddress::toString(addr);
(void) rc->hmget(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u name"), addr);
*ap_hostname = rc->getString();
writeSessionToLOG(U_CONSTANT_TO_PARAM("DENY_LOST"));
deleteSession();
@ -968,48 +968,51 @@ static void POST_login()
peer = U_NULLPTR;
UFlatBuffer fb;
bool ko = (getDataFromPOST(true) == false);
char buffer[2] = { '1'-ko, '0'+policySessionNotify }; // deny|permit: ('0'|'1') policy: notify|no_notify|strict_notify ('0'|'1'|'2')
writeToLOG(U_CONSTANT_TO_PARAM("PERMIT"), UString::getStringNull());
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v lastAccess %u"), mac->rep, u_now->tv_sec);
(void) rc->zadd(U_CONSTANT_TO_PARAM("DEVICE:bylastAccess %u id:%v"), u_now->tv_sec, mac->rep);
if (ko) writeSessionToLOG(U_CONSTANT_TO_PARAM("DENY_POLICY"));
else
if (*ap_address)
{
setSessionkey();
UFlatBuffer fb;
char buffer[2] = { '1'-ko, '0'+policySessionNotify }; // deny|permit: ('0'|'1') policy: notify|no_notify|strict_notify ('0'|'1'|'2')
(void) rc->hmset(U_CONSTANT_TO_PARAM("SESSION:%v captiveId %u apId %v deviceId %v ip %v created %u pId %v notify %c consume %c counter 0 lastUpdate %u"),
key_session->rep,
addr, ap_label->rep, mac->rep, ip->rep, u_now->tv_sec, policySessionId->rep, buffer[1], '0'+ap_consume, u_now->tv_sec);
writeToLOG(U_CONSTANT_TO_PARAM("PERMIT"), UString::getStringNull());
(void) rc->zadd(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId %u%06u \"deviceId:%v;ip:%v\""), addr, ap_label->strtoul(), mac->rep, ip->rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("SESSION:byLastUpdate %u \"%v\""), u_now->tv_sec, key_session->rep);
}
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v lastAccess %u"), mac->rep, u_now->tv_sec);
(void) rc->zadd(U_CONSTANT_TO_PARAM("DEVICE:bylastAccess %u id:%v"), u_now->tv_sec, mac->rep);
// $1 -> peer
// $2 -> deny|permit: ('0'|'1') policy: notify|no_notify|strict_notify ('0'|'1'|'2')
if (ko) writeSessionToLOG(U_CONSTANT_TO_PARAM("DENY_POLICY"));
else
{
setSessionkey();
(void) rc->hmset(U_CONSTANT_TO_PARAM("SESSION:%v captiveId %u apId %v deviceId %v ip %v created %u pId %v notify %c consume %c counter 0 lastUpdate %u"), key_session->rep,
addr, ap_label->rep, mac->rep, ip->rep, u_now->tv_sec, policySessionId->rep, buffer[1], '0'+ap_consume, u_now->tv_sec);
(void) rc->zadd(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId %u%06u deviceId:%v;ip:%v"), addr, ap_label->strtoul(), mac->rep, ip->rep);
(void) rc->zadd(U_CONSTANT_TO_PARAM("SESSION:byLastUpdate %u %v"), u_now->tv_sec, key_session->rep);
}
// $1 -> peer
// $2 -> deny|permit: ('0'|'1') policy: notify|no_notify|strict_notify ('0'|'1'|'2')
# ifdef HAVE_CXX11
(void) fb.encodeVector([&]() {
fb.UInt(U_PTR2INT(peer));
fb.String(buffer, sizeof(buffer));
});
# else
fb.StartBuild();
(void) fb.StartVector();
#ifdef HAVE_CXX11
(void) fb.encodeVector([&]() {
fb.UInt(U_PTR2INT(peer));
fb.String(buffer, sizeof(buffer));
});
#else
fb.StartBuild();
(void) fb.StartVector();
fb.UInt(U_PTR2INT(peer));
fb.String(buffer, sizeof(buffer));
fb.EndVector(0, false);
(void) fb.EndBuild();
# endif
fb.EndVector(0, false);
(void) fb.EndBuild();
#endif
(void) sendRequestToNodog(U_CONSTANT_TO_PARAM("login_validate"), fb.getResult());
(void) sendRequestToNodog(U_CONSTANT_TO_PARAM("login_validate"), fb.getResult());
}
}
static void POST_notify()
@ -1036,11 +1039,17 @@ static void POST_strict_notify()
if (getDataFromPOST(false))
{
(void) rc->hmget(U_CONSTANT_TO_PARAM("DEVICE:id:%v pNotify"), mac->rep);
UString x(200U);
x.snprintf(U_CONSTANT_TO_PARAM("DEVICE:id:%v pNotify"), mac->rep);
(void) rc->hmget(x);
if (rc->getUInt8() == 2) // (strict notify) => (notify)
{
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v pNotify 0"), mac->rep);
(void) x.append(U_CONSTANT_TO_PARAM(" 0"));
(void) rc->hmset(x);
}
writeToLOG(U_CONSTANT_TO_PARAM("STRICT_NOTIFIED"), UString::getStringNull());
@ -1100,8 +1109,9 @@ static void POST_info()
setAccessPoint())
{
const char* op;
UString x(200U);
UVector<UString> vec_logout;
uint32_t _ctime, ctraffic, time_no_traffic, op_len, midnigth = u_getLocalTime() / U_ONE_DAY_IN_SECOND;
uint32_t _ctime, ctraffic, time_no_traffic, ctime_no_traffic, op_len, midnigth = u_getLocalTime() / U_ONE_DAY_IN_SECOND;
(void) rc->hmset(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u status 1 lastUpdate %u"), addr, u_now->tv_sec);
@ -1133,67 +1143,64 @@ static void POST_info()
U_INTERNAL_DUMP("ap_label = %V mac = %V ip = %V", rc->getString(7).rep, rc->getString(8).rep, rc->getString(9).rep)
U_ASSERT_EQUALS(*ap_label, rc->getString(7))
U_ASSERT_EQUALS(*mac, rc->getString(8))
U_ASSERT_EQUALS(*ip, rc->getString(9))
U_INTERNAL_ASSERT_EQUALS(addr, rc->getULong(6))
U_ASSERT_EQUALS(*ap_label, rc->getString(7))
U_ASSERT_EQUALS(*mac, rc->getString(8))
U_ASSERT_EQUALS(*ip, rc->getString(9))
if (time_no_traffic >= U_MAX_TIME_NO_TRAFFIC)
if (ctraffic == 0)
{
U_INTERNAL_ASSERT_EQUALS(ctraffic, 0)
ctime_no_traffic = (u_now->tv_sec - lastUpdate);
U_DEBUG("Peer IP %v MAC %v has made no traffic for %u secs", ip->rep, mac->rep, time_no_traffic);
U_DEBUG("Peer IP %v MAC %v has made no traffic for %u secs", ip->rep, mac->rep, ctime_no_traffic);
op = "DENY_NO_TRAFFIC";
op_len = U_CONSTANT_SIZE("DENY_NO_TRAFFIC");
if (ctime_no_traffic >= U_MAX_TIME_NO_TRAFFIC) // (time_no_traffic >= U_MAX_TIME_NO_TRAFFIC)
{
op = "DENY_NO_TRAFFIC";
op_len = U_CONSTANT_SIZE("DENY_NO_TRAFFIC");
created += time_no_traffic;
created += ctime_no_traffic;
del_sess: writeSessionToLOG(op, op_len);
del_sess: writeSessionToLOG(op, op_len);
deleteSession();
deleteSession();
del_login: vec_logout.push_back(*ip);
vec_logout.push_back(*mac);
del_login: vec_logout.push_back(*ip);
vec_logout.push_back(*mac);
continue;
continue;
}
}
if ((u_get_localtime(lastUpdate) / U_ONE_DAY_IN_SECOND) < midnigth)
{
UString opt(200U);
opt.snprintf(U_CONSTANT_TO_PARAM(", traffic: %llu"), counter/(1024*1024));
writeToLOG(U_CONSTANT_TO_PARAM("RST_SESSION"), opt);
if (policySessionId->equal(U_CONSTANT_TO_PARAM("DAILY"))) resetDeviceDailyCounter();
counter = 0;
if (counter)
{
x.snprintf(U_CONSTANT_TO_PARAM(", traffic: %llu"), counter/1024);
writeToLOG(U_CONSTANT_TO_PARAM("RST_SESSION"), x);
counter = 0;
(void) rc->hmset(U_CONSTANT_TO_PARAM("SESSION:%v counter 0"), key_session->rep);
}
}
if (ctraffic)
{
if (ap_consume &&
policySessionId->equal(U_CONSTANT_TO_PARAM("DAILY")))
{
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v pCounter %llu"), mac->rep, device_counter);
device_counter += ctraffic;
if (device_counter >= U_MAX_TRAFFIC_DAILY)
{
op = "DENY_POLICY";
op_len = U_CONSTANT_SIZE("DENY_POLICY");
goto del_sess;
}
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v pCounter %llu"), mac->rep, device_counter);
}
(void) rc->hmset(U_CONSTANT_TO_PARAM("SESSION:%v counter %llu lastUpdate %u"), key_session->rep, counter+ctraffic, u_now->tv_sec);
if (ap_consume &&
policySessionId->equal(U_CONSTANT_TO_PARAM("DAILY")) &&
rc->hincrby(U_CONSTANT_TO_PARAM("DEVICE:id:%v pCounter %llu"), mac->rep, ctraffic) >= U_MAX_TRAFFIC_DAILY)
{
op = "DENY_POLICY";
op_len = U_CONSTANT_SIZE("DENY_POLICY");
goto del_sess;
}
}
}

View File

@ -1222,7 +1222,7 @@ protected:
U_ASSERT(isMapped())
# ifdef HAVE_ARCH64
U_INTERNAL_ASSERT_MINOR_MSG(map_size, (off_t)U_STRING_MAX_SIZE, "Sorry, I can't manage string size bigger than 4G...") // limit of UString
U_INTERNAL_ASSERT_MINOR_MSG((uint32_t)map_size, U_STRING_MAX_SIZE, "Sorry, I can't manage string size bigger than 4G...") // limit of UString
# endif
str.mmap(map, map_size);
@ -1239,7 +1239,7 @@ protected:
U_INTERNAL_ASSERT_MAJOR(count, 0)
U_INTERNAL_ASSERT_DIFFERS(map, MAP_FAILED)
if (count > (off_t)U_STRING_MAX_SIZE)
if ((uint64_t)count > U_STRING_MAX_SIZE)
{
U_WARNING("Sorry, I can't manage string size bigger than 4G...") // limit of UString

View File

@ -18,7 +18,7 @@
#define U_TIMEOUT_MS (30L * 1000L) // 30 second connection/read timeout
#define U_SSL_TIMEOUT_MS (10L * 1000L) // 10 second handshake timeout
#define U_STRING_MAX_SIZE (((U_NOT_FOUND-sizeof(ustringrep))/sizeof(char))-4096)
#define U_STRING_MAX_SIZE (U_NOT_FOUND-sizeof(ustringrep)-4096U)
#ifndef ENABLE_MEMPOOL
# define U_CAPACITY 1024

View File

@ -112,11 +112,11 @@ public:
U_RETURN(0);
}
void setUInt8(uint8_t& value, uint32_t i = 0, uint8_t _default = 0)
void setUInt8(uint8_t& value, uint32_t i = 0, uint8_t ldefault = 0)
{
U_TRACE(0, "UREDISClient_Base::setUInt8(%p,%u,%u)", &value, i, _default)
U_TRACE(0, "UREDISClient_Base::setUInt8(%p,%u,%u)", &value, i, ldefault)
value = (getResult(i) ? x.first_char()-'0' : _default);
value = (getResult(i) ? x.first_char()-'0' : ldefault);
}
long getLong(uint32_t i = 0)
@ -197,7 +197,16 @@ public:
return processRequest(U_RC_MULTIBULK, U_CONSTANT_TO_PARAM("MGET"), param, len);
}
bool hmget(const char* format, uint32_t fmt_size, ...) // HMGET myhash field1 field2 nofield
// HMGET myhash field1 field2 nofield
bool hmget(const UString& str)
{
U_TRACE(0, "UREDISClient_Base::hmget(%V)", str.rep)
return processRequest(U_RC_MULTIBULK, U_CONSTANT_TO_PARAM("HMGET"), U_STRING_TO_PARAM(str));
}
bool hmget(const char* format, uint32_t fmt_size, ...)
{
U_TRACE(0, "UREDISClient_Base::hmget(%.*S,%u)", fmt_size, format, fmt_size)
@ -213,6 +222,31 @@ public:
U_RETURN(ok);
}
// HMSET myhash field1 "Hello" field2 "World"
bool hmset(const UString& str)
{
U_TRACE(0, "UREDISClient_Base::hmset(%V)", str.rep)
return processRequest(U_RC_INLINE, U_CONSTANT_TO_PARAM("HMSET"), U_STRING_TO_PARAM(str));
}
bool hmset(const char* format, uint32_t fmt_size, ...)
{
U_TRACE(0, "UREDISClient_Base::hmset(%.*S,%u)", fmt_size, format, fmt_size)
bool ok;
va_list argp;
va_start(argp, fmt_size);
ok = processMethod(U_RC_INLINE, U_CONSTANT_TO_PARAM("HMSET"), format, fmt_size, argp);
va_end(argp);
U_RETURN(ok);
}
bool set(const char* key, uint32_t keylen, const char* value, uint32_t valuelen) // Set the string value of a key
{
U_TRACE(0, "UREDISClient_Base::set(%.*S,%u,%.*S,%u)", keylen, key, keylen, valuelen, value, valuelen)
@ -227,22 +261,6 @@ public:
return processRequest(U_RC_INLINE, U_CONSTANT_TO_PARAM("MSET"), param, len);
}
bool hmset(const char* format, uint32_t fmt_size, ...) // HMSET myhash field1 "Hello" field2 "World"
{
U_TRACE(0, "UREDISClient_Base::hmset(%.*S,%u)", fmt_size, format, fmt_size)
bool ok;
va_list argp;
va_start(argp, fmt_size);
ok = processMethod(U_RC_INLINE, U_CONSTANT_TO_PARAM("HMSET"), format, fmt_size, argp);
va_end(argp);
U_RETURN(ok);
}
bool operator[](const UString& key) { return get(U_STRING_TO_PARAM(key)); }
int operator+=(const char* key) // Increment the integer value of a key by one
@ -429,8 +447,6 @@ public:
return processRequest(U_RC_BULK, U_CONSTANT_TO_PARAM("RANDOMKEY"));
}
bool scan(const char* pattern, uint32_t len, vPFcs function); // Returns all keys matching pattern (scan 0 MATCH *11*)
bool del(const UString& keys) // Delete one or more key
{
U_TRACE(0, "UREDISClient_Base::del(%V)", keys.rep)
@ -438,8 +454,6 @@ public:
return processRequest(U_RC_INT, U_CONSTANT_TO_PARAM("DEL"), U_STRING_TO_PARAM(keys));
}
bool deleteKeys(const char* pattern, uint32_t len); // Delete all keys matching pattern
bool del(const char* format, uint32_t fmt_size, ...) // Delete one or more key
{
U_TRACE(0, "UREDISClient_Base::del(%.*S,%u)", fmt_size, format, fmt_size)
@ -456,6 +470,10 @@ public:
U_RETURN(ok);
}
bool deleteKeys(const char* pattern, uint32_t len); // Delete all keys matching pattern
bool scan(const char* pattern, uint32_t len, vPFcs function); // Returns all keys matching pattern (scan 0 MATCH *11*)
bool dump(const char* key, uint32_t keylen) // Return a serialized version of the value stored at the specified key
{
U_TRACE(0, "UREDISClient_Base::dump(%.*S,%u)", keylen, key, keylen)
@ -463,36 +481,57 @@ public:
return processRequest(U_RC_BULK, U_CONSTANT_TO_PARAM("DUMP"), key, keylen);
}
bool exists(const char* format, uint32_t fmt_size, ...) // EXISTS key1
bool exists(const char* key, uint32_t keylen) // EXISTS key1
{
U_TRACE(0, "UREDISClient_Base::exists(%.*S,%u)", fmt_size, format, fmt_size)
U_TRACE(0, "UREDISClient_Base::exists(%.*S,%u)", keylen, key, keylen)
bool ok;
if (processRequest(U_RC_INT, U_CONSTANT_TO_PARAM("EXISTS"), key, keylen) &&
getUInt8())
{
U_RETURN(true);
}
va_list argp;
va_start(argp, fmt_size);
ok = processMethod(U_RC_INT, U_CONSTANT_TO_PARAM("EXISTS"), format, fmt_size, argp);
va_end(argp);
U_RETURN(ok);
U_RETURN(false);
}
bool hexists(const char* format, uint32_t fmt_size, ...) // HEXISTS myhash field1
bool hexists(const char* key, uint32_t keylen, const char* field, uint32_t fieldlen) // HEXISTS myhash field1
{
U_TRACE(0, "UREDISClient_Base::hexists(%.*S,%u)", fmt_size, format, fmt_size)
U_TRACE(0, "UREDISClient_Base::hexists(%.*S,%u,%.*S,%u)", keylen, key, keylen, fieldlen, field, fieldlen)
if (processRequest(U_RC_INT, U_CONSTANT_TO_PARAM("HEXISTS"), key, keylen, field, fieldlen) &&
getUInt8())
{
U_RETURN(true);
}
U_RETURN(false);
}
uint64_t hincrby(const char* key, uint32_t keylen, const char* field, uint32_t fieldlen) // HINCRBY myhash field1
{
U_TRACE(0, "UREDISClient_Base::hincrby(%.*S,%u,%.*S,%u)", keylen, key, keylen, fieldlen, field, fieldlen)
if (processRequest(U_RC_INT, U_CONSTANT_TO_PARAM("HINCRBY"), key, keylen, field, fieldlen)) return getUInt64();
U_RETURN(0ULL);
}
uint64_t hincrby(const char* format, uint32_t fmt_size, ...)
{
U_TRACE(0, "UREDISClient_Base::hincrby(%.*S,%u)", fmt_size, format, fmt_size)
bool ok;
va_list argp;
va_start(argp, fmt_size);
ok = processMethod(U_RC_INT, U_CONSTANT_TO_PARAM("HEXISTS"), format, fmt_size, argp);
ok = processMethod(U_RC_INT, U_CONSTANT_TO_PARAM("HINCRBY"), format, fmt_size, argp);
va_end(argp);
U_RETURN(ok);
if (ok) return getUInt64();
U_RETURN(0ULL);
}
bool type(const char* key, uint32_t keylen) // Determine the type stored at key

View File

@ -213,7 +213,6 @@ protected:
static UVector<UString>* vLocalNetworkLabel;
static UVector<UIPAllow*>* vLocalNetworkMask;
static void sendLogin();
static void setNewPeer();
static void checkSystem();
static bool preallocatePeersFault();
@ -297,11 +296,15 @@ private:
U_DISALLOW_COPY_AND_ASSIGN(UNoDogPlugIn)
static void setMAC() U_NO_EXPORT;
static void erasePeer() U_NO_EXPORT;
static void sendLogin() U_NO_EXPORT;
static void getTraffic() U_NO_EXPORT;
static void sendNotify() U_NO_EXPORT;
static void eraseTimer() U_NO_EXPORT;
static void setLabelAndMAC() U_NO_EXPORT;
static void sendStrictNotify() U_NO_EXPORT;
static void printPeers(const char* fmt, uint32_t len) U_NO_EXPORT;
static void makeInfoData(UFlatBuffer* pfb, void* param) U_NO_EXPORT;
static void makeLoginData(UFlatBuffer* pfb, void* param) U_NO_EXPORT;
static void makeNotifyData(UFlatBuffer* pfb, void* param) U_NO_EXPORT;

View File

@ -2030,6 +2030,13 @@ private:
template <class T> friend class UFlatBufferTypeHandler;
};
#ifndef U_FLAT_BUFFERS_SPACE_STACK
#define U_FLAT_BUFFERS_SPACE_STACK (8U * 1024U)
#endif
#ifndef U_FLAT_BUFFERS_SPACE_BUFFER
#define U_FLAT_BUFFERS_SPACE_BUFFER (64U * 1024U)
#endif
class U_EXPORT UFlatBufferSpace {
public:
@ -2056,8 +2063,8 @@ protected:
uint32_t prev_stack_size,
prev_buffer_size;
uint8_t stack[ 8 * 1024],
buffer[64 * 1024];
uint8_t stack[U_FLAT_BUFFERS_SPACE_STACK],
buffer[U_FLAT_BUFFERS_SPACE_BUFFER];
};
// Template specialization

View File

@ -314,11 +314,18 @@ void u__memcpy(void* restrict dst, const void* restrict src, size_t n, const cha
U_INTERNAL_ASSERT_POINTER(dst)
U_INTERNAL_ASSERT_POINTER(called_by_function)
if (n == 0) U_WARNING("*** Zero copy in memcpy *** - %s", called_by_function);
if (n == 0) U_WARNING("*** Zero copy in memcpy(%p,%p,%u) *** - calleb by %s() dst = %#.*S src = %#.*S", dst, src, n, called_by_function, n, dst, n, src);
if (dst == src)
{
U_WARNING("*** Source and Destination are EQUALS in memcpy(%p,%p,%u) *** - calleb by %s() src = %#.*S", dst, src, n, called_by_function, n, src);
return;
}
if (u_is_overlap((const char* restrict)dst, (const char* restrict)src, n))
{
U_WARNING("*** Source and Destination OVERLAP in memcpy *** - %s", called_by_function);
U_WARNING("*** Source and Destination OVERLAP in memcpy(%p,%p,%u) *** - calleb by %s() dst = %#.*S src = %#.*S", dst, src, n, called_by_function, n, dst, n, src);
(void) apex_memmove(dst, src, n);
}
@ -1643,17 +1650,17 @@ uint32_t u__vsnprintf(char* restrict buffer, uint32_t buffer_size, const char* r
{
U_INTERNAL_ASSERT_MAJOR(fmt_size, 0)
u__memcpy(bp, fmark, fmt_size, __PRETTY_FUNCTION__);
bp += fmt_size;
(void) memcpy(bp, fmark, fmt_size);
bp += fmt_size;
break;
}
if ((n = (fp - fmark)))
{
u__memcpy(bp, fmark, n, __PRETTY_FUNCTION__);
bp += n;
fmt_size -= n;
(void) memcpy(bp, fmark, n);
bp += n;
fmt_size -= n;
}
/* init var */
@ -2191,7 +2198,7 @@ case_D: /* extension: print date and time in various format */
case_H: /* extension: print host name */
U_INTERNAL_ERROR(u_hostname_len, "HOSTNAME NULL at u__vsnprintf() - CHECK THE PARAMETERS - format = \"%.*s\"", format_size_save, format);
u__memcpy(bp, u_hostname, u_hostname_len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_hostname, u_hostname_len);
bp += u_hostname_len;
@ -2230,14 +2237,14 @@ case_M: /* extension: print memory dump */
continue;
case_N: /* extension: print program name */
u__memcpy(bp, u_progname, u_progname_len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_progname, u_progname_len);
bp += u_progname_len;
continue;
case_P: /* extension: print process pid */
u__memcpy(bp, u_pid_str, u_pid_str_len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_pid_str, u_pid_str_len);
bp += u_pid_str_len;
@ -2257,7 +2264,7 @@ case_R: /* extension: print msg - u_getSysError() */
{
len = u__strlen((const char* restrict)cp, __PRETTY_FUNCTION__);
u__memcpy(bp, cp, len, __PRETTY_FUNCTION__);
(void) memcpy(bp, cp, len);
bp += len;
}
@ -2279,7 +2286,7 @@ case_R: /* extension: print msg - u_getSysError() */
cp = getSysError_w32((uint32_t*)&len);
u__memcpy(bp, cp, len, __PRETTY_FUNCTION__);
(void) memcpy(bp, cp, len);
bp += len;
@ -2294,7 +2301,7 @@ case_R: /* extension: print msg - u_getSysError() */
u_getSysError((uint32_t*)&len);
u__memcpy(bp, u_err_buffer, len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_err_buffer, len);
bp += len;
@ -2310,7 +2317,7 @@ case_T: /* extension: print time_t */
case_U: /* extension: print user name */
U_INTERNAL_ERROR(u_user_name_len, "USER NAME NULL at u__vsnprintf() - CHECK THE PARAMETERS - format = \"%.*s\"", format_size_save, format);
u__memcpy(bp, u_user_name, u_user_name_len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_user_name, u_user_name_len);
bp += u_user_name_len;
@ -2336,7 +2343,7 @@ case_W: /* extension: print COLOR (ANSI ESCAPE STR) */
len = sizeof(U_RESET_STR) - (n == RESET);
u__memcpy(bp, tab_color[n], len, __PRETTY_FUNCTION__);
(void) memcpy(bp, tab_color[n], len);
bp += len;
}
@ -2444,7 +2451,7 @@ number: /* uint32_t conversions */
case_Y: /* extension: print u_getSysSignal(signo) */
u_getSysSignal(VA_ARG(int), (uint32_t*)&len);
u__memcpy(bp, u_err_buffer, len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_err_buffer, len);
bp += len;
@ -2581,7 +2588,7 @@ case_q: /* field length modifier: quad. This is a synonym for ll */
case_r: /* extension: print u_getExitStatus(exit_value) */
u_getExitStatus(VA_ARG(int), (uint32_t*)&len);
u__memcpy(bp, u_err_buffer, len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_err_buffer, len);
bp += len;
@ -2606,7 +2613,7 @@ case_v: /* extension: print ustring */
case_w: /* extension: print current working directory */
U_INTERNAL_ERROR(u_cwd_len, "CURRENT WORKING DIRECTORY NULL at u__vsnprintf() - CHECK THE PARAMETERS - format = \"%.*s\"", format_size_save, format);
u__memcpy(bp, u_cwd, u_cwd_len, __PRETTY_FUNCTION__);
(void) memcpy(bp, u_cwd, u_cwd_len);
bp += u_cwd_len;
@ -2710,7 +2717,7 @@ next:
U_INTERNAL_ERROR(ret <= buffer_size,
"BUFFER OVERFLOW at u__vsnprintf() ret = %u buffer_size = %u format = \"%.*s\"", ret, buffer_size, format_size_save, format);
u__memcpy(bp, cp, size, __PRETTY_FUNCTION__);
(void) memcpy(bp, cp, size);
bp += size;
}

View File

@ -695,39 +695,28 @@ bool UFile::memmap(int prot, UString* str, off_t start, off_t count)
map_size = 0;
}
map = (char*) U_SYSCALL(mmap, "%p,%u,%d,%d,%d,%I", U_NULLPTR, count, prot, flags, fd, start);
map = (char*) U_SYSCALL(mmap, "%p,%I,%d,%d,%d,%I", U_NULLPTR, count, prot, flags, fd, start);
if (map != (char*)MAP_FAILED)
{
map_size = count;
if (str)
if (str == U_NULLPTR) U_RETURN(true);
count -= resto;
U_INTERNAL_DUMP("count = %I U_STRING_MAX_SIZE = %u", count, U_STRING_MAX_SIZE)
if ((uint64_t)count < U_STRING_MAX_SIZE)
{
count -= resto;
if (count > (off_t)U_STRING_MAX_SIZE)
{
U_WARNING("Sorry, I can't manage string size bigger than 4G...") // limit of UString
U_RETURN(false);
}
str->mmap(map+resto, count);
map = (char*)MAP_FAILED; // transfer the ownership to string
U_RETURN(true);
}
/*
# if defined(U_LINUX) && defined(MADV_SEQUENTIAL)
if (prot == PROT_READ &&
length > (32 * PAGESIZE))
{
(void) U_SYSCALL(madvise, "%p,%I,%d", (void*)map, map_size, MADV_SEQUENTIAL);
}
# endif
*/
U_RETURN(true);
U_WARNING("Sorry, I can't manage string size bigger than 4G...") // limit of UString
}
U_RETURN(false);

View File

@ -198,7 +198,7 @@ void ULib::init(char** argv, const char* mempool)
if (ptr < u_buffer) u_buffer = (char*)ptr;
u_err_buffer = (char*) UMemoryPool::pop(U_SIZE_TO_STACK_INDEX(256));
if (u_err_buffer == U_NULLPTR) u_err_buffer = (char*) UMemoryPool::pop(U_SIZE_TO_STACK_INDEX(256));
U_INTERNAL_DUMP("ptr = %p u_buffer = %p diff = %ld", ptr, u_buffer, ptr - u_buffer)
@ -206,8 +206,9 @@ void ULib::init(char** argv, const char* mempool)
UMemoryError::pbuffer = (char*) UMemoryPool::pop(U_SIZE_TO_STACK_INDEX(U_MAX_SIZE_PREALLOCATE));
# endif
#else
u_buffer = (char*) U_SYSCALL(malloc, "%u", U_BUFFER_SIZE);
u_err_buffer = (char*) U_SYSCALL(malloc, "%u", 256);
u_buffer = (char*) U_SYSCALL(malloc, "%u", U_BUFFER_SIZE);
if (u_err_buffer == U_NULLPTR) u_err_buffer = (char*) U_SYSCALL(malloc, "%u", 256);
# ifdef DEBUG
UMemoryError::pbuffer = (char*) U_SYSCALL(malloc, "%u", U_MAX_SIZE_PREALLOCATE);

View File

@ -303,9 +303,12 @@ void UMemoryPool::allocateMemoryBlocks(const char* ptr)
if (UFile::rlimit_memfree == U_2M)
{
# ifdef DEBUG
char buffer[256];
if (u_err_buffer == U_NULLPTR)
{
static char buffer[256];
if (u_err_buffer == U_NULLPTR) u_err_buffer = buffer;
u_err_buffer = buffer;
}
# endif
// cat /proc/meminfo | grep Huge

View File

@ -11,6 +11,13 @@
//
// ============================================================================
#include <ulib/base/hash.h>
#ifndef HAVE_ARCH64
# define U_FLAT_BUFFERS_SPACE_STACK 1024U
# define U_FLAT_BUFFERS_SPACE_BUFFER 1024U
#endif
#include <ulib/date.h>
#include <ulib/file_config.h>
#include <ulib/utility/des3.h>
@ -198,7 +205,7 @@ U_NO_EXPORT void UNoDogPlugIn::getTraffic()
ip.snprintf(U_CONSTANT_TO_PARAM("%u.%u.%u.%u"), bytep[0], bytep[1], bytep[2], bytep[3]);
# endif
U_DEBUG("IP: %v SRC packets: %u bytes: %u DST packets: %u bytes: %u", ip.rep, entry->src_packets, entry->src_bytes, entry->dst_packets, entry->dst_bytes)
U_SRV_LOG("IP: %v SRC packets: %u bytes: %u DST packets: %u bytes: %u", ip.rep, entry->src_packets, entry->src_bytes, entry->dst_packets, entry->dst_bytes);
peer = (*peers)[ip];
@ -249,7 +256,7 @@ bool UNoDogPlugIn::getPeerInfo(UStringRep* key, void* value)
{
if (U_peer_permit == false)
{
U_WARNING("Peer IP %v MAC %v has made traffic(%u bytes) but it has status DENY", peer->ip.rep, peer->mac.rep, peer->ctraffic);
U_SRV_LOG("WARNING: Peer IP %v MAC %v has made traffic(%u bytes) but it has status DENY", peer->ip.rep, peer->mac.rep, peer->ctraffic);
}
pfb->UInt(_ctime);
@ -292,8 +299,8 @@ U_NO_EXPORT void UNoDogPlugIn::makeNotifyData(UFlatBuffer* _pfb, void* param)
U_INTERNAL_DUMP("peer->mac = %V peer->ip = %V peer->label = %V", peer->mac.rep, peer->ip.rep, peer->label.rep)
U_INTERNAL_ASSERT(u_isIPv4Addr(U_STRING_TO_PARAM(peer->ip)))
U_INTERNAL_ASSERT(u_isMacAddr(U_STRING_TO_PARAM(peer->mac)))
U_INTERNAL_ASSERT(u_isIPv4Addr(U_STRING_TO_PARAM(peer->ip)))
_pfb->String(getApInfo(peer->label));
_pfb->String(peer->getMAC());
@ -362,6 +369,7 @@ U_NO_EXPORT void UNoDogPlugIn::setMAC()
U_INTERNAL_DUMP("peer->mac = %V", peer->mac.rep)
U_INTERNAL_ASSERT(peer->mac)
U_INTERNAL_ASSERT(u_isMacAddr(U_STRING_TO_PARAM(peer->mac)))
U_ASSERT_EQUALS(peer->mac, USocketExt::getMacAddress(peer->ip))
}
}
@ -497,6 +505,35 @@ void UNoDogPlugIn::setNewPeer()
peers->insert(peer->ip, peer);
}
U_NO_EXPORT void UNoDogPlugIn::printPeers(const char* msg, uint32_t len)
{
U_TRACE(0, "UNoDogPlugIn::printPeers(%.*S,%u)", len, msg, len)
#if defined(DEBUG) && !defined(U_LOG_DISABLE)
if (UServer_Base::isLog())
{
typedef UHashMap<UModNoDogPeer*> uhashpeer;
UServer_Base::log->log(U_CONSTANT_TO_PARAM("[nodog] %.*S peers = %.*S"), len, msg, UObjectIO::buffer_output_len, UObject2String<uhashpeer>(*peers));
}
#endif
}
U_NO_EXPORT void UNoDogPlugIn::erasePeer()
{
U_TRACE_NO_PARAM(0, "UNoDogPlugIn::erasePeer()")
U_INTERNAL_ASSERT_POINTER(peer)
printPeers(U_CONSTANT_TO_PARAM("before erase"));
delete peers->erase(peer->ip);
printPeers(U_CONSTANT_TO_PARAM("after erase"));
U_ASSERT_EQUALS(peers->at(peer->ip), U_NULLPTR)
}
U_NO_EXPORT void UNoDogPlugIn::eraseTimer()
{
U_TRACE_NO_PARAM(0, "UNoDogPlugIn::eraseTimer()")
@ -509,6 +546,15 @@ U_NO_EXPORT void UNoDogPlugIn::eraseTimer()
}
}
U_NO_EXPORT void UNoDogPlugIn::sendLogin()
{
U_TRACE_NO_PARAM(0, "UNoDogPlugIn::sendLogin()")
UFlatBufferSpace space;
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeLoginData), *auth_login, true);
}
U_NO_EXPORT void UNoDogPlugIn::sendNotify()
{
U_TRACE_NO_PARAM(0, "UNoDogPlugIn::sendNotify()")
@ -517,6 +563,8 @@ U_NO_EXPORT void UNoDogPlugIn::sendNotify()
{
U_peer_flag |= U_PEER_NOTIFY_DISABLE;
UFlatBufferSpace space;
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeNotifyData), *auth_notify, true);
}
}
@ -529,6 +577,8 @@ U_NO_EXPORT void UNoDogPlugIn::sendStrictNotify()
{
U_peer_flag |= U_PEER_STRICT_NOTIFY_DISABLE;
UFlatBufferSpace space;
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeNotifyData), *auth_strict_notify, true);
}
}
@ -979,6 +1029,7 @@ int UNoDogPlugIn::handlerRequest()
U_INTERNAL_ASSERT(peer->mac)
U_INTERNAL_ASSERT(peer->welcome)
U_INTERNAL_ASSERT(u_isMacAddr(U_STRING_TO_PARAM(peer->mac)))
U_SRV_LOG("request to validate login for peer IP %v MAC %v: bdeny = %b policy = %C", peer->ip.rep, peer->mac.rep, bdeny, policy);
@ -988,7 +1039,7 @@ int UNoDogPlugIn::handlerRequest()
if (U_peer_permit) deny();
delete peers->erase(peer->ip);
erasePeer();
U_peer_flag |= U_PEER_ALLOW_DISABLE;
@ -1029,7 +1080,7 @@ int UNoDogPlugIn::handlerRequest()
if (data.empty())
{
U_WARNING("AUTH request to logout users tampered");
U_SRV_LOG("WARNING: AUTH request to logout users tampered");
goto bad;
}
@ -1073,7 +1124,7 @@ next: if (U_peer_permit) deny();
U_SRV_LOG("AUTH request to logout user with status DENY: IP %v MAC %v", peer->ip.rep, peer->mac.rep);
}
delete peers->erase(peer->ip);
erasePeer();
}
}
else if (U_HTTP_URI_STREQ("/ping"))
@ -1087,7 +1138,10 @@ bad: UHTTP::setBadRequest();
goto end;
}
if ((peer = peers->at(U_CLIENT_ADDRESS_TO_PARAM)))
printPeers(U_CONSTANT_TO_PARAM("user request"));
if (peers->empty() == false &&
(peer = peers->at(U_CLIENT_ADDRESS_TO_PARAM)))
{
// -----------------
// request from user
@ -1096,12 +1150,12 @@ bad: UHTTP::setBadRequest();
U_INTERNAL_ASSERT(peer->mac)
U_INTERNAL_ASSERT(peer->welcome)
U_ASSERT(peer->ip.equal(U_CLIENT_ADDRESS_TO_PARAM))
U_INTERNAL_ASSERT(u_isMacAddr(U_STRING_TO_PARAM(peer->mac)))
if (U_peer_allow_disable == false &&
U_HTTP_URI_MEMEQ("/nodog_peer_allow.sh"))
{
if (U_HTTP_QUERY_MEMEQ("url=") &&
UHTTP::processForm() == 2*2)
if (U_HTTP_QUERY_MEMEQ("url="))
{
/**
* open firewall, respond with redirect to original request
@ -1110,10 +1164,19 @@ bad: UHTTP::setBadRequest();
* $2 -> forced ('0'|'1')
*/
UHTTP::getFormValue(redirect, U_CONSTANT_TO_PARAM("url"), 0, 1, 4);
UHTTP::getFormValue(x, U_CONSTANT_TO_PARAM("forced"), 0, 3, 4);
bool forced = false;
uint32_t n = UHTTP::processForm();
if (x.first_char() == '1') // forced
UHTTP::getFormValue(redirect, U_CONSTANT_TO_PARAM("url"), 0, 1, n);
if (n == 2*2)
{
UHTTP::getFormValue(x, U_CONSTANT_TO_PARAM("forced"), 0, 3, 4);
if (x.first_char() == '1') forced = true;
}
if (forced)
{
sendStrictNotify();
@ -1125,12 +1188,12 @@ bad: UHTTP::setBadRequest();
if (T2 < 3600 &&
U_peer_policy != '2') // (strict notify)
{
sendNotify();
next1: eraseTimer();
if (U_peer_permit == false) permit();
sendNotify();
UHTTP::setRedirectResponse(UHTTP::NO_BODY, U_STRING_TO_PARAM(redirect));
}
}
@ -1190,7 +1253,7 @@ next1: eraseTimer();
setNewPeer();
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeLoginData), *auth_login, true);
sendLogin();
(void) redirect.reserve(8 + U_http_host_len + U_HTTP_URI_QUERY_LEN);

View File

@ -705,6 +705,8 @@ UStringRep* UStringRep::create(uint32_t length, uint32_t need, const char* ptr)
if (length &&
ptr)
{
U_INTERNAL_ASSERT_DIFFERS(_ptr, ptr)
U_MEMCPY((void*)_ptr, ptr, length);
_ptr[length] = '\0';

View File

@ -388,6 +388,10 @@ void UInterrupt::getSignalInfo(int signo, siginfo_t* info)
CYAN, (double)rss / (1024.0 * 1024.0), YELLOW);
}
# endif
#if defined(DEBUG) && defined(U_SERVER_CAPTIVE_PORTAL) && !defined(ENABLE_THREAD)
UError::stackDump();
#endif
}
__noreturn RETSIGTYPE UInterrupt::handlerInterruptWithInfo(int signo, siginfo_t* info, void* context)

View File

@ -74,7 +74,7 @@ EOF
DIR_CMD="../../examples/userver"
#STRACE=$TRUSS
VALGRIND='valgrind --leak-check=yes --track-origins=yes'
#VALGRIND='valgrind --leak-check=yes --track-origins=yes'
start_prg_background userver_tcp -c inp/webserver.cfg
wait_server_ready localhost 5280