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-12-14 17:52:45 +01:00
parent 372f0558e7
commit 42f5cee169
13 changed files with 206 additions and 56 deletions

View File

@ -28,7 +28,7 @@ extern U_EXPORT void runDynamicPage_wi_auth2();
U_TRACE_NO_PARAM(0, "::runDynamicPage_wi_auth2()")
static UHTTP::service_info GET_table[] = { // NB: the table must be ordered alphabetically for binary search...
GET_ENTRY(acceptTermsOfConditionsExpirationList),
GET_ENTRY(acceptTermsOfConditions),
GET_ENTRY(acceptTermsOfConditionsRenew),
GET_ENTRY(anagrafica),
GET_ENTRY(checkCaptive),
@ -41,7 +41,6 @@ extern U_EXPORT void runDynamicPage_wi_auth2();
};
static UHTTP::service_info POST_table[] = { // NB: the table must be ordered alphabetically for binary search...
POST_ENTRY(acceptTermsOfConditions),
POST_ENTRY(info),
POST_ENTRY(login),
POST_ENTRY(notify),

View File

@ -8,7 +8,7 @@ static void usp_config_wi_auth2();
-->
<!--#code
static UHTTP::service_info GET_table[] = { // NB: the table must be ordered alphabetically for binary search...
GET_ENTRY(acceptTermsOfConditionsExpirationList),
GET_ENTRY(acceptTermsOfConditions),
GET_ENTRY(acceptTermsOfConditionsRenew),
GET_ENTRY(anagrafica),
GET_ENTRY(checkCaptive),
@ -21,7 +21,6 @@ static UHTTP::service_info GET_table[] = { // NB: the table must be ordered alph
};
static UHTTP::service_info POST_table[] = { // NB: the table must be ordered alphabetically for binary search...
POST_ENTRY(acceptTermsOfConditions),
POST_ENTRY(info),
POST_ENTRY(login),
POST_ENTRY(notify),

View File

@ -32,11 +32,12 @@ static UPing* sockp;
static bool ap_consume;
static UString* policySessionId;
static uint8_t vwelcome_index[2][3]; // policy: (DAILY|FLAT), SessionNotify: (0,notify) (1,no_notify) (2,strict_notify)
static int facceptTermsOfConditionsRenew;
static uint64_t counter, device_counter, max_traffic_daily;
static uint8_t policySessionNotify, policySessionNotifyDefault;
static uint32_t addr, old_addr, ip_peer, created, lastUpdate, lastReset, idx, vec_logout[8192];
static uint32_t addr, old_addr, ip_peer, created, lastUpdate, lastReset, idx, duration_privacy_policy, vec_logout[8192];
#define U_CLEAN_INTERVAL (60U * 60U) // 1h
#define U_CLEAN_INTERVAL (60U * 60U) // 1h
#define U_MAX_TIME_NO_TRAFFIC (15U * 60U) // 15m
#define U_LOGGER(fmt,args...) ULog::log(file_WARNING->getFd(), U_CONSTANT_TO_PARAM("%v: " fmt), UClientImage_Base::request_uri->rep , ##args)
@ -177,6 +178,7 @@ static void usp_config_wi_auth2()
// WELCOME_INDEX vector of index for html files - policy: (DAILY|FLAT), SessionNotify: (0,notify) (1,no_notify) (2,strict_notify)
//
// MAX_TRAFFIC_DAILY
// DURATION_PRIVACY_POLICY numbers of days for expiration privacy policy
// POLICY_SESSION_NOTIFY_DEFAULT (0,notify) (1,no_notify) (2,strict_notify)
// --------------------------------------------------------------------------------------------------------------------------------------
@ -207,10 +209,11 @@ static void usp_config_wi_auth2()
const char* ptr1 = x.data();
uint8_t* ptr2 = (uint8_t*)vwelcome_index;
for (uint32_t i = 0, n = x.size(); i < n; ++i) *ptr2 = *ptr1 - '0';
for (uint32_t i = 0, n = x.size(); i < n; ++i) ptr2[i] = ptr1[i] - '0';
}
max_traffic_daily = UServer_Base::pcfg->readLong(U_CONSTANT_TO_PARAM("MAX_TRAFFIC_DAILY"), 500ULL * 1024ULL * 1024ULL); // 500M
duration_privacy_policy = UServer_Base::pcfg->readLong(U_CONSTANT_TO_PARAM("DURATION_PRIVACY_POLICY"), 365L) * U_ONE_DAY_IN_SECOND; // 1 year
policySessionNotifyDefault = UServer_Base::pcfg->readLong(U_CONSTANT_TO_PARAM("POLICY_SESSION_NOTIFY_DEFAULT"));
}
@ -556,8 +559,8 @@ static void setSessionPolicy()
policySessionNotify = policySessionNotifyDefault;
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v id %v pId DAILY pNotify 0 pCounter 0 lastAccess %u pLastReset %u created %u"),
mac->rep, mac->rep, u_now->tv_sec, u_now->tv_sec, u_now->tv_sec);
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v id %v pId DAILY pNotify %u pCounter 0 lastAccess %u pLastReset %u created %u"),
mac->rep, mac->rep, policySessionNotifyDefault, u_now->tv_sec, u_now->tv_sec, u_now->tv_sec);
(void) rc->zadd(U_CONSTANT_TO_PARAM("DEVICE:bylastAccess %u id:%v"), u_now->tv_sec, mac->rep);
}
@ -684,7 +687,7 @@ static void writeToLOG(const UString& label, const char* op, uint32_t op_len, co
ULog::log(file_LOG->getFd(),
U_CONSTANT_TO_PARAM("op: %.*s, mac: %v, ip: %v, ap: %.*s, policy: %v|%.*sconsume|%snotify%v"),
op_len, op, mac->rep, ip->rep, getApInfo(label, buffer), buffer, policySessionId->rep, (ap_consume ? 0 : 3), "no_", (policySessionNotify == 0 ? "" :
policySessionNotify == 1 ? "no_" : "strict_"), opt.rep);
policySessionNotify == 1 ? "no_" : "strict_"), opt.rep);
}
static void writeSessionToLOG(const UString& label, const char* op, uint32_t op_len)
@ -724,7 +727,7 @@ static void resetDeviceDailyCounter()
{
device_counter = 0;
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v pCounter 0 pLastReset %u"), mac->rep, u_now->tv_sec);
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v pLastReset %u"), mac->rep, u_now->tv_sec);
}
}
@ -965,14 +968,99 @@ static void sessionClean(const UString& key)
lostSession(2);
}
static void GET_acceptTermsOfConditionsExpirationList()
static void GET_acceptTermsOfConditions()
{
U_TRACE_NO_PARAM(5, "::GET_acceptTermsOfConditionsExpirationList()")
U_TRACE_NO_PARAM(5, "::GET_acceptTermsOfConditions()")
// $1 -> ap (with localization => '@')
// $2 -> mac
if (UHTTP::processForm() == 2*2)
{
ap->clear();
mac->clear();
UHTTP::getFormValue(*ap, U_CONSTANT_TO_PARAM("ap"), 0, 1, 4);
if (setAccessPoint())
{
UHTTP::getFormValue(*mac, U_CONSTANT_TO_PARAM("mac"), 0, 3, 4);
if (mac->isMacAddr())
{
char buffer[16];
u_getXMAC(mac->data(), buffer);
(void) mac->replace(buffer, 12);
}
U_ASSERT(mac->isXMacAddr())
(void) rc->hmset(U_CONSTANT_TO_PARAM("DEVICE:id:%v ExpirePrivacy %u"), mac->rep, u_now->tv_sec + duration_privacy_policy);
}
}
}
static void checkPrivacy(const UString& key)
{
U_TRACE(5, "::checkPrivacy(%V)", key.rep)
(void) rc->hmget(U_CONSTANT_TO_PARAM("%v ExpirePrivacy pNotify"), key.rep);
uint32_t expire = rc->getULong(0);
uint8_t policy = rc->getUInt8(1);
/**
* i) SE ["scadenza privacy policy" <= data corrente], ovvero è scaduta ALLORA [SET policy = "strict notify"] AND [SET "scadenza privacy policy" = null]
* (ovvero al prossimo accesso verrà ripresentata la richiesta di manifestazione del consenso)
*
* ii) SE ["scadenza privacy policy" = NULL] AND [policy = "notify"] ALLORA [SET policy = "strict notify"]
* (ovvero se si verifica che, per qualunque motivo, non è stato acquisito il consenso,
* allora al prossimo accesso di quel device-utente verrà ripresentata la richiesta tramite la pagina associata alla policy "strict notify")
*/
bool bexpired = (expire && expire <= u_now->tv_sec);
U_INTERNAL_DUMP("bexpired = %b expire = %u policy = %u", bexpired, expire, policy)
if (bexpired ||
(expire == 0 &&
policy == 0))
{
const char* op = "RESET2";
const char* ptr = key.c_pointer(U_CONSTANT_SIZE("DEVICE:id:"));
(void) rc->hmset(U_CONSTANT_TO_PARAM("%v pNotify 2"), key.rep);
if (bexpired)
{
op = "RESET1";
(void) rc->hdel(U_CONSTANT_TO_PARAM("%v ExpirePrivacy"), key.rep);
}
ULog::log(facceptTermsOfConditionsRenew, U_CONSTANT_TO_PARAM("op: %s, mac: %.12s pNotify: %u, ExpirePrivacy: %#3D"), op, ptr, policy, expire);
}
}
static void GET_acceptTermsOfConditionsRenew()
{
U_TRACE_NO_PARAM(5, "::GET_acceptTermsOfConditionsRenew()")
if (UServer_Base::isLocalHost() == false) UHTTP::setBadRequest();
else
{
UString pathname(200U);
pathname.snprintf(U_CONSTANT_TO_PARAM("../log/acceptTermsOfConditionsRenew.%4D.log"), 0);
facceptTermsOfConditionsRenew = UFile::creat(pathname.data(), O_TRUNC | O_WRONLY | O_APPEND);
(void) rc->scan(checkPrivacy, U_CONSTANT_TO_PARAM("DEVICE:id:*"));
UFile::close(facceptTermsOfConditionsRenew);
}
}
static void GET_anagrafica()
@ -1408,7 +1496,11 @@ static void GET_welcome()
{
// policy: (DAILY|FLAT), SessionNotify: (0,notify) (1,no_notify) (2,strict_notify)
UString x = vwelcome_file->at(vwelcome_index[policySessionId->equal(U_CONSTANT_TO_PARAM("FLAT"))][policySessionNotify]);
uint8_t index = vwelcome_index[policySessionId->equal(U_CONSTANT_TO_PARAM("FLAT"))][policySessionNotify];
U_INTERNAL_DUMP("index = %u policySessionId = %V policySessionNotify = %u", index, policySessionId->rep, policySessionNotify)
UString x = vwelcome_file->at(index);
UHTTP::UFileCacheData* welcome_html = UHTTP::getFileCachePointer(U_STRING_TO_PARAM(x));
@ -1420,11 +1512,6 @@ static void GET_welcome()
U_http_info.nResponseCode = HTTP_NO_CONTENT; // NB: to escape management after usp exit...
}
static void POST_acceptTermsOfConditions()
{
U_TRACE_NO_PARAM(5, "::POST_acceptTermsOfConditions()")
}
static void POST_login()
{
U_TRACE_NO_PARAM(5, "::POST_login()")

View File

@ -201,7 +201,8 @@ public:
// write without prefix
static void log(int lfd, const char* format, uint32_t fmt_size, ...); // (buffer write == 8196)
static void log(int lfd, const char* format, uint32_t fmt_size, ...); // (buffer write == 8196)
static void log(UString& buffer, const char* format, uint32_t fmt_size, ...); // (buffer write == 8196)
// logger

View File

@ -255,6 +255,24 @@ public:
U_RETURN(ok);
}
// HDEL key field [field ...]
bool hdel(const char* format, uint32_t fmt_size, ...)
{
U_TRACE(0, "UREDISClient_Base::hdel(%.*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("HDEL"), format, fmt_size, argp) ? getUInt8() : false);
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)

View File

@ -71,7 +71,7 @@ public:
Old = 0x002
};
USSLSocket(bool bSocketIsIPv6 = false, SSL_CTX* ctx = U_NULLPTR, bool server = false);
USSLSocket(bool bSocketIsIPv6 = false, SSL_CTX* ctx = U_NULLPTR, bool server = false, int fd = -1);
~USSLSocket();
bool secureConnection();

View File

@ -591,6 +591,35 @@ void ULog::log(int lfd, const char* fmt, uint32_t fmt_size, ...)
}
}
void ULog::log(UString& lbuffer, const char* fmt, uint32_t fmt_size, ...)
{
U_TRACE(0, "ULog::log(%V,%.*S,%u)", lbuffer.rep, fmt_size, fmt, fmt_size)
uint32_t len;
char buffer[8196];
va_list argp;
va_start(argp, fmt_size);
len = u__vsnprintf(buffer, U_CONSTANT_SIZE(buffer), fmt, fmt_size, argp);
va_end(argp);
U_INTERNAL_ASSERT_EQUALS(iov_vec[0].iov_len, 17)
U_INTERNAL_ASSERT_EQUALS(iov_vec[1].iov_len, 1)
U_INTERNAL_ASSERT_EQUALS(iov_vec[4].iov_len, 1)
iov_vec[3].iov_len = len;
iov_vec[3].iov_base = (caddr_t)buffer;
updateDate1();
for (int i = 0; i < 5; ++i)
{
if (iov_vec[i].iov_len) (void) lbuffer.append((const char*)iov_vec[i].iov_base, iov_vec[i].iov_len);
}
}
void ULog::log(const struct iovec* iov, const char* type, int ncount, const char* msg, uint32_t msg_len, const char* format, uint32_t fmt_size, ...)
{
U_TRACE(0, "ULog::log(%p,%S,%d,%.*S,%u,%.*S,%u)", iov, type, ncount, msg_len, msg, msg_len, fmt_size, format, fmt_size)

View File

@ -64,9 +64,9 @@ USSLSocket::stapling USSLSocket::staple;
* requiring a bi-directional message exchange; both SSL_read() and SSL_write() will try to continue any pending handshake
*/
USSLSocket::USSLSocket(bool bSocketIsIPv6, SSL_CTX* _ctx, bool bserver) : USocket(bSocketIsIPv6)
USSLSocket::USSLSocket(bool bSocketIsIPv6, SSL_CTX* _ctx, bool bserver, int fd) : USocket(bSocketIsIPv6, fd)
{
U_TRACE_CTOR(0, USSLSocket, "%b,%p,%b", bSocketIsIPv6, _ctx, bserver)
U_TRACE_CTOR(0, USSLSocket, "%b,%p,%b,%d", bSocketIsIPv6, _ctx, bserver, fd)
ciphersuite_model = Intermediate;

View File

@ -4511,6 +4511,7 @@ file_in_cache:
setDynamicResponse();
}
}
else if (U_http_info.nResponseCode == HTTP_NO_CONTENT) U_http_info.nResponseCode = HTTP_OK; // NB: to escape management after usp exit...
U_RESET_MODULE_NAME;

View File

@ -1 +1 @@
0441
0454

View File

@ -7,8 +7,8 @@ Debian 7.11 was released Saturday, 4th June 2016.
Debian 8.11, or jessie. Access this release through dists/oldstable
Debian 8.11 was released Saturday, 23rd June 2018.
Debian 9.5, or stretch. Access this release through dists/stable
Debian 9.5 was released Saturday, 14th July 2018.
Debian 9.6, or stretch. Access this release through dists/stable
Debian 9.6 was released Saturday, 10th November 2018.
Testing, or buster. Access this release through dists/testing. The
current tested development snapshot is named buster. Packages which

View File

@ -10,10 +10,10 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/bits/mman.h /usr/include/bits/mman-linux.h \
/usr/include/stdio.h /usr/include/bits/libc-header-start.h \
/usr/include/bits/types/__FILE.h /usr/include/bits/types/FILE.h \
/usr/include/libio.h /usr/include/_G_config.h \
/usr/include/bits/types/__mbstate_t.h \
/usr/include/bits/mman-shared.h /usr/include/stdio.h \
/usr/include/bits/libc-header-start.h /usr/include/bits/types/__FILE.h \
/usr/include/bits/types/FILE.h /usr/include/bits/libio.h \
/usr/include/bits/_G_config.h /usr/include/bits/types/__mbstate_t.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
/usr/include/bits/stdio.h /usr/include/bits/stdio2.h \
@ -46,14 +46,15 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
/usr/include/bits/setjmp.h /usr/include/signal.h \
/usr/include/bits/signum.h /usr/include/bits/signum-generic.h \
/usr/include/bits/types/sig_atomic_t.h \
/usr/include/bits/types/siginfo_t.h /usr/include/bits/types/sigval_t.h \
/usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \
/usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \
/usr/include/bits/siginfo-consts-arch.h \
/usr/include/bits/types/sigevent_t.h /usr/include/bits/sigevent-consts.h \
/usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h \
/usr/include/bits/types/stack_t.h /usr/include/sys/ucontext.h \
/usr/include/bits/sigstack.h /usr/include/bits/ss_flags.h \
/usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \
/usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \
/usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \
/usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \
/usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \
/usr/include/bits/ss_flags.h /usr/include/bits/types/struct_sigstack.h \
/usr/include/bits/sigthread.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/stdlib.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/cstdlib \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/x86_64-pc-linux-gnu/bits/c++config.h \
@ -61,8 +62,9 @@ plugin/product1.lo: plugin/product1.cpp /usr/include/stdc-predef.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/x86_64-pc-linux-gnu/bits/cpu_defines.h \
/usr/include/stdlib.h /usr/include/bits/waitflags.h \
/usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \
/usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \
/usr/include/bits/stdlib-float.h /usr/include/bits/stdlib.h \
/usr/include/bits/floatn-common.h /usr/include/alloca.h \
/usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \
/usr/include/bits/stdlib.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/bits/std_abs.h \
/usr/include/ctype.h ../../include/ulib/base/replace/replace.h \
/usr/src/linux/include/generated/uapi/linux/version.h \
@ -257,6 +259,8 @@ plugin/product.h:
/usr/include/bits/mman-linux.h:
/usr/include/bits/mman-shared.h:
/usr/include/stdio.h:
/usr/include/bits/libc-header-start.h:
@ -265,9 +269,9 @@ plugin/product.h:
/usr/include/bits/types/FILE.h:
/usr/include/libio.h:
/usr/include/bits/libio.h:
/usr/include/_G_config.h:
/usr/include/bits/_G_config.h:
/usr/include/bits/types/__mbstate_t.h:
@ -391,7 +395,7 @@ plugin/product.h:
/usr/include/bits/types/siginfo_t.h:
/usr/include/bits/types/sigval_t.h:
/usr/include/bits/types/__sigval_t.h:
/usr/include/bits/siginfo-arch.h:
@ -399,6 +403,8 @@ plugin/product.h:
/usr/include/bits/siginfo-consts-arch.h:
/usr/include/bits/types/sigval_t.h:
/usr/include/bits/types/sigevent_t.h:
/usr/include/bits/sigevent-consts.h:
@ -437,6 +443,8 @@ plugin/product.h:
/usr/include/bits/floatn.h:
/usr/include/bits/floatn-common.h:
/usr/include/alloca.h:
/usr/include/bits/stdlib-bsearch.h:

View File

@ -10,10 +10,10 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/bits/mman.h /usr/include/bits/mman-linux.h \
/usr/include/stdio.h /usr/include/bits/libc-header-start.h \
/usr/include/bits/types/__FILE.h /usr/include/bits/types/FILE.h \
/usr/include/libio.h /usr/include/_G_config.h \
/usr/include/bits/types/__mbstate_t.h \
/usr/include/bits/mman-shared.h /usr/include/stdio.h \
/usr/include/bits/libc-header-start.h /usr/include/bits/types/__FILE.h \
/usr/include/bits/types/FILE.h /usr/include/bits/libio.h \
/usr/include/bits/_G_config.h /usr/include/bits/types/__mbstate_t.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
/usr/include/bits/stdio.h /usr/include/bits/stdio2.h \
@ -46,14 +46,15 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
/usr/include/bits/setjmp.h /usr/include/signal.h \
/usr/include/bits/signum.h /usr/include/bits/signum-generic.h \
/usr/include/bits/types/sig_atomic_t.h \
/usr/include/bits/types/siginfo_t.h /usr/include/bits/types/sigval_t.h \
/usr/include/bits/types/siginfo_t.h /usr/include/bits/types/__sigval_t.h \
/usr/include/bits/siginfo-arch.h /usr/include/bits/siginfo-consts.h \
/usr/include/bits/siginfo-consts-arch.h \
/usr/include/bits/types/sigevent_t.h /usr/include/bits/sigevent-consts.h \
/usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h \
/usr/include/bits/types/stack_t.h /usr/include/sys/ucontext.h \
/usr/include/bits/sigstack.h /usr/include/bits/ss_flags.h \
/usr/include/bits/types/struct_sigstack.h /usr/include/bits/sigthread.h \
/usr/include/bits/types/sigval_t.h /usr/include/bits/types/sigevent_t.h \
/usr/include/bits/sigevent-consts.h /usr/include/bits/sigaction.h \
/usr/include/bits/sigcontext.h /usr/include/bits/types/stack_t.h \
/usr/include/sys/ucontext.h /usr/include/bits/sigstack.h \
/usr/include/bits/ss_flags.h /usr/include/bits/types/struct_sigstack.h \
/usr/include/bits/sigthread.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/stdlib.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/cstdlib \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/x86_64-pc-linux-gnu/bits/c++config.h \
@ -61,8 +62,9 @@ plugin/product2.lo: plugin/product2.cpp /usr/include/stdc-predef.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/x86_64-pc-linux-gnu/bits/cpu_defines.h \
/usr/include/stdlib.h /usr/include/bits/waitflags.h \
/usr/include/bits/waitstatus.h /usr/include/bits/floatn.h \
/usr/include/alloca.h /usr/include/bits/stdlib-bsearch.h \
/usr/include/bits/stdlib-float.h /usr/include/bits/stdlib.h \
/usr/include/bits/floatn-common.h /usr/include/alloca.h \
/usr/include/bits/stdlib-bsearch.h /usr/include/bits/stdlib-float.h \
/usr/include/bits/stdlib.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include/g++-v8/bits/std_abs.h \
/usr/include/ctype.h ../../include/ulib/base/replace/replace.h \
/usr/src/linux/include/generated/uapi/linux/version.h \
@ -257,6 +259,8 @@ plugin/product.h:
/usr/include/bits/mman-linux.h:
/usr/include/bits/mman-shared.h:
/usr/include/stdio.h:
/usr/include/bits/libc-header-start.h:
@ -265,9 +269,9 @@ plugin/product.h:
/usr/include/bits/types/FILE.h:
/usr/include/libio.h:
/usr/include/bits/libio.h:
/usr/include/_G_config.h:
/usr/include/bits/_G_config.h:
/usr/include/bits/types/__mbstate_t.h:
@ -391,7 +395,7 @@ plugin/product.h:
/usr/include/bits/types/siginfo_t.h:
/usr/include/bits/types/sigval_t.h:
/usr/include/bits/types/__sigval_t.h:
/usr/include/bits/siginfo-arch.h:
@ -399,6 +403,8 @@ plugin/product.h:
/usr/include/bits/siginfo-consts-arch.h:
/usr/include/bits/types/sigval_t.h:
/usr/include/bits/types/sigevent_t.h:
/usr/include/bits/sigevent-consts.h:
@ -437,6 +443,8 @@ plugin/product.h:
/usr/include/bits/floatn.h:
/usr/include/bits/floatn-common.h:
/usr/include/alloca.h:
/usr/include/bits/stdlib-bsearch.h: