1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-10-05 19:18:01 +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 ##README.html: README.md
##@Markdown.pl README.md > README.html ##@Markdown.pl README.md > README.html
configure: configure.ac
@echo "$< changed: you must re-run './autogen.sh'"
@false
test: test:
@cd $(top_builddir)/tests; $(MAKE) $(AM_MAKEFLAGS) test @cd $(top_builddir)/tests; $(MAKE) $(AM_MAKEFLAGS) test

View File

@ -982,6 +982,10 @@ uninstall-am: uninstall-aclocalDATA
.phony: doxy todo .phony: doxy todo
configure: configure.ac
@echo "$< changed: you must re-run './autogen.sh'"
@false
test: test:
@cd $(top_builddir)/tests; $(MAKE) $(AM_MAKEFLAGS) 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_LOG;
static UFile* file_WARNING; static UFile* file_WARNING;
/*
static UVector<UString>* vap;
*/
static UVector<UString>* vcaptive;
static UREDISClient_Base* rc; static UREDISClient_Base* rc;
static UHttpClient<UTCPSocket>* client; static UHttpClient<UTCPSocket>* client;
@ -38,8 +33,15 @@ static uint8_t policySessionNotify;
static uint64_t counter, device_counter; static uint64_t counter, device_counter;
static uint32_t addr, created, lastUpdate, lastReset; static uint32_t addr, created, lastUpdate, lastReset;
#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 # define U_MAX_TRAFFIC_DAILY (500ULL * 1024ULL * 1024ULL) // 500M
#define U_MAX_TIME_NO_TRAFFIC (30 * 60) // 30m #endif
#define U_LOGGER(fmt,args...) ULog::log(file_WARNING->getFd(), U_CONSTANT_TO_PARAM("%v: " fmt), UClientImage_Base::request_uri->rep , ##args) #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 { class WiAuthClean : public UEventTime {
public: public:
WiAuthClean() : UEventTime(30L * 60L, 0L) // 30m WiAuthClean() : UEventTime(U_CLEAN_INTERVAL, 0L)
{ {
U_TRACE_REGISTER_OBJECT(0, WiAuthClean, "", U_NULLPTR) U_TRACE_REGISTER_OBJECT(0, WiAuthClean, "", U_NULLPTR)
} }
@ -80,6 +82,7 @@ public:
uint8_t status; uint8_t status;
UString url(100U); UString url(100U);
/*
for (uint32_t i = 0, n = vcaptive->size(); i < n; ++i) 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); url.snprintf(U_CONSTANT_TO_PARAM("http://%v:5280/ping"), vcaptive->at(i).rep);
@ -111,6 +114,7 @@ public:
client->reset(); client->reset();
} }
*/
if (pid == 0) UServer_Base::endNewChild(); if (pid == 0) UServer_Base::endNewChild();
@ -218,9 +222,6 @@ static void usp_init_wi_auth2()
U_ASSERT_EQUALS(client->isPasswordAuthentication(), false) U_ASSERT_EQUALS(client->isPasswordAuthentication(), false)
// U_NEW(UVector<UString>, vap, UVector<UString>);
U_NEW(UVector<UString>, vcaptive, UVector<UString>);
UVector<UString> vnetmask; UVector<UString> vnetmask;
UTokenizer tok(*db_anagrafica, ",\n"); UTokenizer tok(*db_anagrafica, ",\n");
UString lip, lnetmask, lbl, lnetmask1, lbl1; UString lip, lnetmask, lbl, lnetmask1, lbl1;
@ -246,9 +247,6 @@ loop:
U_INTERNAL_ASSERT(lbl) U_INTERNAL_ASSERT(lbl)
U_INTERNAL_ASSERT(lnetmask) U_INTERNAL_ASSERT(lnetmask)
// vap->push_back(lbl);
vcaptive->push_back(lip);
U_ASSERT(vnetmask.empty()) U_ASSERT(vnetmask.empty())
vnetmask.push_back(lnetmask); vnetmask.push_back(lnetmask);
@ -259,13 +257,13 @@ loop:
(void) UIPAddress::getBinaryForm(ip->c_str(), addr, true); (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->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->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)) while (tok.next(lip, (bool*)U_NULLPTR))
{ {
@ -296,11 +294,9 @@ loop:
continue; 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->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(); vnetmask.clear();
@ -308,8 +304,6 @@ loop:
lnetmask = lnetmask1; lnetmask = lnetmask1;
} }
vcaptive->sort(UStringExt::qscompver);
// CLEAN MONITORING // CLEAN MONITORING
U_NEW(UPing, sockp, UPing(5000, UClientImage_Base::bIPv6)); U_NEW(UPing, sockp, UPing(5000, UClientImage_Base::bIPv6));
@ -342,8 +336,6 @@ static void usp_end_wi_auth2()
delete policySessionId; delete policySessionId;
delete allowed_web_hosts; delete allowed_web_hosts;
// delete vap;
delete vcaptive;
delete db_anagrafica; delete db_anagrafica;
delete rc; delete rc;
@ -614,7 +606,7 @@ static void writeSessionToLOG(const char* op, uint32_t op_len)
UString opt(200U); 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); writeToLOG(op, op_len, opt);
} }
@ -624,8 +616,8 @@ static void deleteSession()
U_TRACE_NO_PARAM(5, "::deleteSession()") U_TRACE_NO_PARAM(5, "::deleteSession()")
(void) rc->del(U_CONSTANT_TO_PARAM("SESSION:%v"), key_session->rep); (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: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:byLastUpdate %v"), key_session->rep);
} }
static void resetDeviceDailyCounter() 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; 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); (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 %v000000 %v999999 WITHSCORES"), x.rep, x.rep);
(void) rc->zrangebyscore(U_CONSTANT_TO_PARAM("SESSION:byCaptiveIdAndApId %v %v"), x.rep, x.rep);
uint32_t n = rc->vitem.size(); uint32_t n = rc->vitem.size();
if (n) if (n)
{ {
const char* ptr1;
const char* ptr2;
UVector<UString> vec(n); UVector<UString> vec(n);
vec.copy(rc->vitem); 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()) if (getSession())
{ {
addr = rc->getULong(6); U_ASSERT_EQUALS(addr, rc->getULong(6))
*ap_label = rc->getString(7); U_ASSERT_EQUALS(*ap_label, rc->getString(7))
*mac = rc->getString(8); *mac = rc->getString(8);
*ip = rc->getString(9); *ip = rc->getString(9);
U_INTERNAL_ASSERT(u_isIPv4Addr(U_STRING_TO_PARAM(*ip))) 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")); writeSessionToLOG(U_CONSTANT_TO_PARAM("DENY_LOST"));
deleteSession(); deleteSession();
@ -968,8 +968,11 @@ static void POST_login()
peer = U_NULLPTR; peer = U_NULLPTR;
UFlatBuffer fb;
bool ko = (getDataFromPOST(true) == false); bool ko = (getDataFromPOST(true) == false);
if (*ap_address)
{
UFlatBuffer fb;
char buffer[2] = { '1'-ko, '0'+policySessionNotify }; // deny|permit: ('0'|'1') policy: notify|no_notify|strict_notify ('0'|'1'|'2') 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()); writeToLOG(U_CONSTANT_TO_PARAM("PERMIT"), UString::getStringNull());
@ -982,12 +985,11 @@ static void POST_login()
{ {
setSessionkey(); 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"), (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,
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); 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: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->zadd(U_CONSTANT_TO_PARAM("SESSION:byLastUpdate %u %v"), u_now->tv_sec, key_session->rep);
} }
// $1 -> peer // $1 -> peer
@ -1011,6 +1013,7 @@ static void POST_login()
(void) sendRequestToNodog(U_CONSTANT_TO_PARAM("login_validate"), fb.getResult()); (void) sendRequestToNodog(U_CONSTANT_TO_PARAM("login_validate"), fb.getResult());
} }
}
static void POST_notify() static void POST_notify()
{ {
@ -1036,11 +1039,17 @@ static void POST_strict_notify()
if (getDataFromPOST(false)) 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) 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()); writeToLOG(U_CONSTANT_TO_PARAM("STRICT_NOTIFIED"), UString::getStringNull());
@ -1100,8 +1109,9 @@ static void POST_info()
setAccessPoint()) setAccessPoint())
{ {
const char* op; const char* op;
UString x(200U);
UVector<UString> vec_logout; 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); (void) rc->hmset(U_CONSTANT_TO_PARAM("CAPTIVE:id:%u status 1 lastUpdate %u"), addr, u_now->tv_sec);
@ -1133,22 +1143,23 @@ 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_INTERNAL_DUMP("ap_label = %V mac = %V ip = %V", rc->getString(7).rep, rc->getString(8).rep, rc->getString(9).rep)
U_INTERNAL_ASSERT_EQUALS(addr, rc->getULong(6))
U_ASSERT_EQUALS(*ap_label, rc->getString(7)) U_ASSERT_EQUALS(*ap_label, rc->getString(7))
U_ASSERT_EQUALS(*mac, rc->getString(8)) U_ASSERT_EQUALS(*mac, rc->getString(8))
U_ASSERT_EQUALS(*ip, rc->getString(9)) U_ASSERT_EQUALS(*ip, rc->getString(9))
U_INTERNAL_ASSERT_EQUALS(addr, rc->getULong(6)) if (ctraffic == 0)
if (time_no_traffic >= U_MAX_TIME_NO_TRAFFIC)
{ {
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);
if (ctime_no_traffic >= U_MAX_TIME_NO_TRAFFIC) // (time_no_traffic >= U_MAX_TIME_NO_TRAFFIC)
{
op = "DENY_NO_TRAFFIC"; op = "DENY_NO_TRAFFIC";
op_len = U_CONSTANT_SIZE("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);
@ -1159,41 +1170,37 @@ del_login: vec_logout.push_back(*ip);
continue; continue;
} }
}
if ((u_get_localtime(lastUpdate) / U_ONE_DAY_IN_SECOND) < midnigth) 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(); if (policySessionId->equal(U_CONSTANT_TO_PARAM("DAILY"))) resetDeviceDailyCounter();
if (counter)
{
x.snprintf(U_CONSTANT_TO_PARAM(", traffic: %llu"), counter/1024);
writeToLOG(U_CONSTANT_TO_PARAM("RST_SESSION"), x);
counter = 0; counter = 0;
(void) rc->hmset(U_CONSTANT_TO_PARAM("SESSION:%v counter 0"), key_session->rep);
}
} }
if (ctraffic) if (ctraffic)
{ {
(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 && if (ap_consume &&
policySessionId->equal(U_CONSTANT_TO_PARAM("DAILY"))) 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)
(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 = "DENY_POLICY";
op_len = U_CONSTANT_SIZE("DENY_POLICY"); op_len = U_CONSTANT_SIZE("DENY_POLICY");
goto del_sess; 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);
} }
} }

View File

@ -1222,7 +1222,7 @@ protected:
U_ASSERT(isMapped()) U_ASSERT(isMapped())
# ifdef HAVE_ARCH64 # 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 # endif
str.mmap(map, map_size); str.mmap(map, map_size);
@ -1239,7 +1239,7 @@ protected:
U_INTERNAL_ASSERT_MAJOR(count, 0) U_INTERNAL_ASSERT_MAJOR(count, 0)
U_INTERNAL_ASSERT_DIFFERS(map, MAP_FAILED) 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 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_TIMEOUT_MS (30L * 1000L) // 30 second connection/read timeout
#define U_SSL_TIMEOUT_MS (10L * 1000L) // 10 second handshake 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 #ifndef ENABLE_MEMPOOL
# define U_CAPACITY 1024 # define U_CAPACITY 1024

View File

@ -112,11 +112,11 @@ public:
U_RETURN(0); 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) long getLong(uint32_t i = 0)
@ -197,7 +197,16 @@ public:
return processRequest(U_RC_MULTIBULK, U_CONSTANT_TO_PARAM("MGET"), param, len); 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) U_TRACE(0, "UREDISClient_Base::hmget(%.*S,%u)", fmt_size, format, fmt_size)
@ -213,6 +222,31 @@ public:
U_RETURN(ok); 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 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) 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); 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)); } 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 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")); 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 bool del(const UString& keys) // Delete one or more key
{ {
U_TRACE(0, "UREDISClient_Base::del(%V)", keys.rep) 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)); 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 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) U_TRACE(0, "UREDISClient_Base::del(%.*S,%u)", fmt_size, format, fmt_size)
@ -456,6 +470,10 @@ public:
U_RETURN(ok); 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 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) 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); 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())
va_list argp; {
va_start(argp, fmt_size); U_RETURN(true);
ok = processMethod(U_RC_INT, U_CONSTANT_TO_PARAM("EXISTS"), format, fmt_size, argp);
va_end(argp);
U_RETURN(ok);
} }
bool hexists(const char* format, uint32_t fmt_size, ...) // HEXISTS myhash field1 U_RETURN(false);
}
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; bool ok;
va_list argp; va_list argp;
va_start(argp, fmt_size); 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); 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 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<UString>* vLocalNetworkLabel;
static UVector<UIPAllow*>* vLocalNetworkMask; static UVector<UIPAllow*>* vLocalNetworkMask;
static void sendLogin();
static void setNewPeer(); static void setNewPeer();
static void checkSystem(); static void checkSystem();
static bool preallocatePeersFault(); static bool preallocatePeersFault();
@ -297,11 +296,15 @@ private:
U_DISALLOW_COPY_AND_ASSIGN(UNoDogPlugIn) U_DISALLOW_COPY_AND_ASSIGN(UNoDogPlugIn)
static void setMAC() U_NO_EXPORT; 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 getTraffic() U_NO_EXPORT;
static void sendNotify() U_NO_EXPORT; static void sendNotify() U_NO_EXPORT;
static void eraseTimer() U_NO_EXPORT; static void eraseTimer() U_NO_EXPORT;
static void setLabelAndMAC() U_NO_EXPORT; static void setLabelAndMAC() U_NO_EXPORT;
static void sendStrictNotify() 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 makeInfoData(UFlatBuffer* pfb, void* param) U_NO_EXPORT;
static void makeLoginData(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; static void makeNotifyData(UFlatBuffer* pfb, void* param) U_NO_EXPORT;

View File

@ -2030,6 +2030,13 @@ private:
template <class T> friend class UFlatBufferTypeHandler; 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 { class U_EXPORT UFlatBufferSpace {
public: public:
@ -2056,8 +2063,8 @@ protected:
uint32_t prev_stack_size, uint32_t prev_stack_size,
prev_buffer_size; prev_buffer_size;
uint8_t stack[ 8 * 1024], uint8_t stack[U_FLAT_BUFFERS_SPACE_STACK],
buffer[64 * 1024]; buffer[U_FLAT_BUFFERS_SPACE_BUFFER];
}; };
// Template specialization // 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(dst)
U_INTERNAL_ASSERT_POINTER(called_by_function) 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)) 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); (void) apex_memmove(dst, src, n);
} }
@ -1643,7 +1650,7 @@ uint32_t u__vsnprintf(char* restrict buffer, uint32_t buffer_size, const char* r
{ {
U_INTERNAL_ASSERT_MAJOR(fmt_size, 0) U_INTERNAL_ASSERT_MAJOR(fmt_size, 0)
u__memcpy(bp, fmark, fmt_size, __PRETTY_FUNCTION__); (void) memcpy(bp, fmark, fmt_size);
bp += fmt_size; bp += fmt_size;
break; break;
@ -1651,7 +1658,7 @@ uint32_t u__vsnprintf(char* restrict buffer, uint32_t buffer_size, const char* r
if ((n = (fp - fmark))) if ((n = (fp - fmark)))
{ {
u__memcpy(bp, fmark, n, __PRETTY_FUNCTION__); (void) memcpy(bp, fmark, n);
bp += n; bp += n;
fmt_size -= n; fmt_size -= n;
} }
@ -2191,7 +2198,7 @@ case_D: /* extension: print date and time in various format */
case_H: /* extension: print host name */ 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_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; bp += u_hostname_len;
@ -2230,14 +2237,14 @@ case_M: /* extension: print memory dump */
continue; continue;
case_N: /* extension: print program name */ 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; bp += u_progname_len;
continue; continue;
case_P: /* extension: print process pid */ 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; 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__); len = u__strlen((const char* restrict)cp, __PRETTY_FUNCTION__);
u__memcpy(bp, cp, len, __PRETTY_FUNCTION__); (void) memcpy(bp, cp, len);
bp += len; bp += len;
} }
@ -2279,7 +2286,7 @@ case_R: /* extension: print msg - u_getSysError() */
cp = getSysError_w32((uint32_t*)&len); cp = getSysError_w32((uint32_t*)&len);
u__memcpy(bp, cp, len, __PRETTY_FUNCTION__); (void) memcpy(bp, cp, len);
bp += len; bp += len;
@ -2294,7 +2301,7 @@ case_R: /* extension: print msg - u_getSysError() */
u_getSysError((uint32_t*)&len); u_getSysError((uint32_t*)&len);
u__memcpy(bp, u_err_buffer, len, __PRETTY_FUNCTION__); (void) memcpy(bp, u_err_buffer, len);
bp += len; bp += len;
@ -2310,7 +2317,7 @@ case_T: /* extension: print time_t */
case_U: /* extension: print user name */ 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_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; bp += u_user_name_len;
@ -2336,7 +2343,7 @@ case_W: /* extension: print COLOR (ANSI ESCAPE STR) */
len = sizeof(U_RESET_STR) - (n == RESET); 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; bp += len;
} }
@ -2444,7 +2451,7 @@ number: /* uint32_t conversions */
case_Y: /* extension: print u_getSysSignal(signo) */ case_Y: /* extension: print u_getSysSignal(signo) */
u_getSysSignal(VA_ARG(int), (uint32_t*)&len); 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; 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) */ case_r: /* extension: print u_getExitStatus(exit_value) */
u_getExitStatus(VA_ARG(int), (uint32_t*)&len); 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; bp += len;
@ -2606,7 +2613,7 @@ case_v: /* extension: print ustring */
case_w: /* extension: print current working directory */ 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_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; bp += u_cwd_len;
@ -2710,7 +2717,7 @@ next:
U_INTERNAL_ERROR(ret <= buffer_size, 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); "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; bp += size;
} }

View File

@ -695,41 +695,30 @@ bool UFile::memmap(int prot, UString* str, off_t start, off_t count)
map_size = 0; 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) if (map != (char*)MAP_FAILED)
{ {
map_size = count; map_size = count;
if (str) if (str == U_NULLPTR) U_RETURN(true);
{
count -= resto; count -= resto;
if (count > (off_t)U_STRING_MAX_SIZE) U_INTERNAL_DUMP("count = %I U_STRING_MAX_SIZE = %u", count, 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
U_RETURN(false);
}
str->mmap(map+resto, count); str->mmap(map+resto, count);
map = (char*)MAP_FAILED; // transfer the ownership to string map = (char*)MAP_FAILED; // transfer the ownership to string
}
/*
# 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_RETURN(true);
} }
U_WARNING("Sorry, I can't manage string size bigger than 4G...") // limit of UString
}
U_RETURN(false); 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; 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) U_INTERNAL_DUMP("ptr = %p u_buffer = %p diff = %ld", ptr, u_buffer, ptr - u_buffer)
@ -207,7 +207,8 @@ void ULib::init(char** argv, const char* mempool)
# endif # endif
#else #else
u_buffer = (char*) U_SYSCALL(malloc, "%u", U_BUFFER_SIZE); u_buffer = (char*) U_SYSCALL(malloc, "%u", U_BUFFER_SIZE);
u_err_buffer = (char*) U_SYSCALL(malloc, "%u", 256);
if (u_err_buffer == U_NULLPTR) u_err_buffer = (char*) U_SYSCALL(malloc, "%u", 256);
# ifdef DEBUG # ifdef DEBUG
UMemoryError::pbuffer = (char*) U_SYSCALL(malloc, "%u", U_MAX_SIZE_PREALLOCATE); 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) if (UFile::rlimit_memfree == U_2M)
{ {
# ifdef DEBUG # 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 # endif
// cat /proc/meminfo | grep Huge // 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/date.h>
#include <ulib/file_config.h> #include <ulib/file_config.h>
#include <ulib/utility/des3.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]); ip.snprintf(U_CONSTANT_TO_PARAM("%u.%u.%u.%u"), bytep[0], bytep[1], bytep[2], bytep[3]);
# endif # 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]; peer = (*peers)[ip];
@ -249,7 +256,7 @@ bool UNoDogPlugIn::getPeerInfo(UStringRep* key, void* value)
{ {
if (U_peer_permit == false) 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); 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_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_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(getApInfo(peer->label));
_pfb->String(peer->getMAC()); _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_DUMP("peer->mac = %V", peer->mac.rep)
U_INTERNAL_ASSERT(peer->mac) 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)) U_ASSERT_EQUALS(peer->mac, USocketExt::getMacAddress(peer->ip))
} }
} }
@ -497,6 +505,35 @@ void UNoDogPlugIn::setNewPeer()
peers->insert(peer->ip, peer); 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_NO_EXPORT void UNoDogPlugIn::eraseTimer()
{ {
U_TRACE_NO_PARAM(0, "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_NO_EXPORT void UNoDogPlugIn::sendNotify()
{ {
U_TRACE_NO_PARAM(0, "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; U_peer_flag |= U_PEER_NOTIFY_DISABLE;
UFlatBufferSpace space;
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeNotifyData), *auth_notify, true); (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; U_peer_flag |= U_PEER_STRICT_NOTIFY_DISABLE;
UFlatBufferSpace space;
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeNotifyData), *auth_strict_notify, true); (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->mac)
U_INTERNAL_ASSERT(peer->welcome) 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); 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(); if (U_peer_permit) deny();
delete peers->erase(peer->ip); erasePeer();
U_peer_flag |= U_PEER_ALLOW_DISABLE; U_peer_flag |= U_PEER_ALLOW_DISABLE;
@ -1029,7 +1080,7 @@ int UNoDogPlugIn::handlerRequest()
if (data.empty()) if (data.empty())
{ {
U_WARNING("AUTH request to logout users tampered"); U_SRV_LOG("WARNING: AUTH request to logout users tampered");
goto bad; 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); 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")) else if (U_HTTP_URI_STREQ("/ping"))
@ -1087,7 +1138,10 @@ bad: UHTTP::setBadRequest();
goto end; 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 // request from user
@ -1096,12 +1150,12 @@ bad: UHTTP::setBadRequest();
U_INTERNAL_ASSERT(peer->mac) U_INTERNAL_ASSERT(peer->mac)
U_INTERNAL_ASSERT(peer->welcome) U_INTERNAL_ASSERT(peer->welcome)
U_ASSERT(peer->ip.equal(U_CLIENT_ADDRESS_TO_PARAM)) 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 && if (U_peer_allow_disable == false &&
U_HTTP_URI_MEMEQ("/nodog_peer_allow.sh")) U_HTTP_URI_MEMEQ("/nodog_peer_allow.sh"))
{ {
if (U_HTTP_QUERY_MEMEQ("url=") && if (U_HTTP_QUERY_MEMEQ("url="))
UHTTP::processForm() == 2*2)
{ {
/** /**
* open firewall, respond with redirect to original request * open firewall, respond with redirect to original request
@ -1110,10 +1164,19 @@ bad: UHTTP::setBadRequest();
* $2 -> forced ('0'|'1') * $2 -> forced ('0'|'1')
*/ */
UHTTP::getFormValue(redirect, U_CONSTANT_TO_PARAM("url"), 0, 1, 4); bool forced = false;
uint32_t n = UHTTP::processForm();
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); UHTTP::getFormValue(x, U_CONSTANT_TO_PARAM("forced"), 0, 3, 4);
if (x.first_char() == '1') // forced if (x.first_char() == '1') forced = true;
}
if (forced)
{ {
sendStrictNotify(); sendStrictNotify();
@ -1125,12 +1188,12 @@ bad: UHTTP::setBadRequest();
if (T2 < 3600 && if (T2 < 3600 &&
U_peer_policy != '2') // (strict notify) U_peer_policy != '2') // (strict notify)
{ {
sendNotify();
next1: eraseTimer(); next1: eraseTimer();
if (U_peer_permit == false) permit(); if (U_peer_permit == false) permit();
sendNotify();
UHTTP::setRedirectResponse(UHTTP::NO_BODY, U_STRING_TO_PARAM(redirect)); UHTTP::setRedirectResponse(UHTTP::NO_BODY, U_STRING_TO_PARAM(redirect));
} }
} }
@ -1190,7 +1253,7 @@ next1: eraseTimer();
setNewPeer(); setNewPeer();
(void) client->sendPOSTRequestAsync(UFlatBuffer::toVector(makeLoginData), *auth_login, true); sendLogin();
(void) redirect.reserve(8 + U_http_host_len + U_HTTP_URI_QUERY_LEN); (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 && if (length &&
ptr) ptr)
{ {
U_INTERNAL_ASSERT_DIFFERS(_ptr, ptr)
U_MEMCPY((void*)_ptr, ptr, length); U_MEMCPY((void*)_ptr, ptr, length);
_ptr[length] = '\0'; _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); CYAN, (double)rss / (1024.0 * 1024.0), YELLOW);
} }
# endif # 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) __noreturn RETSIGTYPE UInterrupt::handlerInterruptWithInfo(int signo, siginfo_t* info, void* context)

View File

@ -74,7 +74,7 @@ EOF
DIR_CMD="../../examples/userver" DIR_CMD="../../examples/userver"
#STRACE=$TRUSS #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 start_prg_background userver_tcp -c inp/webserver.cfg
wait_server_ready localhost 5280 wait_server_ready localhost 5280