pantheios_be_WindowsSyslog_parseArgs( size_t numArgs , pan_slice_t* const args , pan_be_WindowsSyslog_init_t* init ) { PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API((NULL != args || 0 == numArgs), "argument pointer must be non-null, or number of arguments must be 0"); PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(NULL != init, "initialisation structure pointer may not be null"); pantheios_be_WindowsSyslog_getDefaultAppInit(init); // 1. Parse the stock arguments int res = pantheios_be_parseStockArgs(numArgs, args, &init->flags); if(res >= 0) { pan_slice_t address; pan_slice_t port; pan_slice_t facility; // 2.a Parse the custom argument: "address" res = pantheios_be_parseStringArg(numArgs, args, PANTHEIOS_LITERAL_STRING("address"), &address); if(res > 0) { if(address.len > sizeof(init->hostNameBuff) - 1) { res = PANTHEIOS_BE_INIT_RC_ARGUMENT_TOO_LONG; } else { PANTHEIOS_char_copy(&init->hostNameBuff[0], address.ptr, STLSOFT_NUM_ELEMENTS(init->hostNameBuff)); init->hostNameBuff[address.len] = '\0'; init->hostName = &init->hostNameBuff[0]; init->addrSize = 0; } } if(res >= 0) { // 2.b Parse the custom argument: "port" res = pantheios_be_parseStringArg(numArgs, args, PANTHEIOS_LITERAL_STRING("port"), &port); if(res > 0) { pan_char_t sz[21]; int portNum; PANTHEIOS_char_copy(&sz[0], port.ptr, stlsoft::minimum(port.len, STLSOFT_NUM_ELEMENTS(sz) - 1)); sz[stlsoft::minimum(port.len, STLSOFT_NUM_ELEMENTS(sz) - 1)] = '\0'; portNum = pan_atoi_(sz); if( portNum > 0 && portNum < 65536) { init->port = static_cast<pan_uint16_t>(portNum); } else { res = PANTHEIOS_BE_INIT_RC_ARGUMENT_OUT_OF_RANGE; } } } if(res >= 0) { // 2.b Parse the custom argument: "facility" res = pantheios_be_parseStringArg(numArgs, args, PANTHEIOS_LITERAL_STRING("facility"), &facility); if(res > 0) { pan_char_t sz[21]; int facilityNum; PANTHEIOS_char_copy(&sz[0], facility.ptr, stlsoft::minimum(facility.len, STLSOFT_NUM_ELEMENTS(sz) - 1)); sz[stlsoft::minimum(facility.len, STLSOFT_NUM_ELEMENTS(sz) - 1)] = '\0'; facilityNum = pan_atoi_(sz); if( facilityNum >= 0 && facilityNum < 24) { init->facility = static_cast<pan_uint8_t>(facilityNum); } else { res = PANTHEIOS_BE_INIT_RC_ARGUMENT_OUT_OF_RANGE; } } } } if(res >= 0) { // 2.d Parse the custom argument: "useStderr" res = pantheios_be_parseBooleanArg(numArgs, args, PANTHEIOS_LITERAL_STRING("useStderr"), false, PANTHEIOS_BE_WINDOWSSYSLOG_F_PERROR, &init->flags); } if(res >= 0) { // 2.e Parse the custom argument: "useConsole" res = pantheios_be_parseBooleanArg(numArgs, args, PANTHEIOS_LITERAL_STRING("useConsole"), false, PANTHEIOS_BE_WINDOWSSYSLOG_F_CONS, &init->flags); } if(res >= 0) { // 2.f Parse the custom argument: "showPid" res = pantheios_be_parseBooleanArg(numArgs, args, PANTHEIOS_LITERAL_STRING("showPid"), false, PANTHEIOS_BE_WINDOWSSYSLOG_F_PID, &init->flags); } if(res >= 0) { // 2.g Parse the custom argument: "connectImmediately" res = pantheios_be_parseBooleanArg(numArgs, args, PANTHEIOS_LITERAL_STRING("connectImmediately"), false, PANTHEIOS_BE_WINDOWSSYSLOG_F_NDELAY, &init->flags); } return res; }
void pointer::construct_() { PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 == m_sz[0], "cannot construct if value is non-empty"); PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 == m_len, "cannot construct if length is non-0"); if(static_cast<void const*>(0) == m_value) { static const pan_char_t s_null[] = PANTHEIOS_LITERAL_STRING("(null)"); STLSOFT_STATIC_ASSERT(sizeof(m_sz) >= sizeof(s_null)); ::memcpy(&m_sz[0], &s_null[0], sizeof(s_null)); m_len = STLSOFT_NUM_ELEMENTS(s_null) - 1; } else { pan_char_t szFmt[101]; int width; pan_char_t const* zeroX; pan_char_t const* leadingMinus; pan_char_t const* zeroPad; if(m_minWidth < 0) { width = -m_minWidth; leadingMinus = PANTHEIOS_LITERAL_STRING("-"); } else { width = m_minWidth; leadingMinus = PANTHEIOS_LITERAL_STRING(""); } zeroX = (m_format & fmt::zeroXPrefix) ? PANTHEIOS_LITERAL_STRING("0x") : PANTHEIOS_LITERAL_STRING(""); zeroPad = (m_format & fmt::zeroPad) ? PANTHEIOS_LITERAL_STRING("0") : PANTHEIOS_LITERAL_STRING(""); if( 0 != width && fmt::zeroXPrefix == (m_format & (fmt::zeroXPrefix | fmt::zeroPad))) { // Special case pan_char_t szTemp[23]; // 23 is always big enough, since the width is 21 PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(0 == (m_format & fmt::zeroPad)); // Determine ptr-sized integer type #if defined(STLSOFT_COMPILER_IS_GCC) typedef unsigned long intptr_t_; #else /* ? compiler */ typedef stlsoft::int_size_traits<sizeof(void*)>::unsigned_type intptr_t_; #endif /* compiler */ int r = pantheios_util_snprintf( &szTemp[0] , STLSOFT_NUM_ELEMENTS(szTemp) , PANTHEIOS_LITERAL_STRING("0x%lx") , static_cast<intptr_t_>(stlsoft::union_cast<intptr_t_>(m_value)) ); if(r < 0) { return; } else { size_t n = static_cast<size_t>(r); PANTHEIOS_CONTRACT_ENFORCE_POSTCONDITION_RETURN_INTERNAL((n + 2) <= STLSOFT_NUM_ELEMENTS(szTemp), "snprintf() overwrote the local buffer capacity"); width += 2; if(static_cast<size_t>(width) > n) { if(m_minWidth < 0) { PANTHEIOS_char_copy(&m_sz[0], szTemp, n); std::fill_n(&m_sz[0] + n, size_t(width - n), ' '); m_sz[width] = '\0'; } else { std::fill_n(&m_sz[0], size_t(width - n), ' '); PANTHEIOS_char_copy(&m_sz[0] + (size_t(width) - n), szTemp, (n + 1)); } m_len = static_cast<size_t>(width); } else { PANTHEIOS_char_copy(&m_sz[0], szTemp, (n + 1)); m_len = n; } } } else { pantheios_util_snprintf(&szFmt[0] , STLSOFT_NUM_ELEMENTS(szFmt) , PANTHEIOS_LITERAL_STRING("%s%%%s%s%dx") , zeroX , leadingMinus , zeroPad , width); m_len = static_cast<size_t>(pantheios_util_snprintf(&m_sz[0], STLSOFT_NUM_ELEMENTS(m_sz), szFmt, m_value)); } } PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(0 != m_sz[0], "failed to set value to non-empty"); PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(m_len > 0, "failed to set length"); PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(m_len < 23, "pantheios::pointer string too long"); }
static int pantheios_be_WindowsSyslog_logEntry_a_( void* feToken , void* beToken , int severity , char const* entry , size_t cchEntry ) { STLSOFT_SUPPRESS_UNUSED(feToken); PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(NULL != beToken, "back-end token must be non-null"); static const char tm_fmt[] = "%b %d %I:%M:%S"; # ifdef PANTHEIOS_USING_SAFE_STR_FUNCTIONS static errno_t (*fns[2])(struct tm*, const time_t*) = { ::localtime_s, ::gmtime_s }; # else /* ? PANTHEIOS_USING_SAFE_STR_FUNCTIONS */ static struct tm* (*fns[2])(const time_t*) = { ::localtime, ::gmtime }; # endif /* PANTHEIOS_USING_SAFE_STR_FUNCTIONS */ WindowsSysLog_Context* ctxt = static_cast<WindowsSysLog_Context*>(beToken); char szPri_[6]; char* szPri; char szTime[31]; const int priority = (ctxt->facility * 8) + (severity % 8); /* This stock back-end ignores any custom severity information. */ time_t t = time(NULL); # ifdef PANTHEIOS_USING_SAFE_STR_FUNCTIONS struct tm tm_; struct tm* tm = &tm_; errno_t err = fns[0 != (ctxt->flags & PANTHEIOS_BE_WINDOWSSYSLOG_F_USE_SYSTEM_TIME)](tm, &t); if(0 != err) { char msg[1001]; if(0 != ::strerror_s(&msg[0], STLSOFT_NUM_ELEMENTS(msg), err)) { msg[0] = '\0'; } pantheios_onBailOut3(pantheios::critical, "failed to elicit time", msg); return 0; } # else /* ? PANTHEIOS_USING_SAFE_STR_FUNCTIONS */ struct tm* tm = fns[0 != (ctxt->flags & PANTHEIOS_BE_WINDOWSSYSLOG_F_USE_SYSTEM_TIME)](&t); # endif /* PANTHEIOS_USING_SAFE_STR_FUNCTIONS */ size_t cchPriority; size_t cchTime; size_t cchTotal; PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(priority < 1000); szPri = pri_print_(&szPri_[0], STLSOFT_NUM_ELEMENTS(szPri_), priority, cchPriority); cchTime = ::strftime(&szTime[0], STLSOFT_NUM_ELEMENTS(szTime), tm_fmt, tm); cchTotal = cchPriority + cchTime + 1 + ctxt->cchHostIdentity + 1 + ctxt->cchProcessIdentity + 1 + cchEntry; buffer_a_t buffer(1 + cchTotal); #ifndef STLSOFT_CF_THROW_BAD_ALLOC if(0 == buffer.size()) { return PANTHEIOS_INIT_RC_OUT_OF_MEMORY; } else #endif /* !STLSOFT_CF_THROW_BAD_ALLOC */ { // === "%s%s %s %s %s", szPri, szTime, ctxt->hostIdentity, ctxt->processIdentity, entry size_t cchWritten = 0; char* p = &buffer[0]; PANTHEIOS_char_copy(p, szPri, cchPriority); cchWritten += cchPriority; p += cchPriority; PANTHEIOS_char_copy(p, szTime, cchTime); cchWritten += cchTime; p += cchTime; *p++ = ' '; ++cchWritten; PANTHEIOS_char_copy(p, ctxt->hostIdentity, ctxt->cchHostIdentity); cchWritten += ctxt->cchHostIdentity; p += ctxt->cchHostIdentity; *p++ = ' '; ++cchWritten; PANTHEIOS_char_copy(p, ctxt->processIdentity, ctxt->cchProcessIdentity); cchWritten += ctxt->cchProcessIdentity; p += ctxt->cchProcessIdentity; *p++ = ' '; ++cchWritten; PANTHEIOS_char_copy(p, entry, cchEntry); cchWritten += cchEntry; p += cchEntry; PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(cchWritten == size_t(p - buffer.data())); PANTHEIOS_CONTRACT_ENFORCE_ASSUMPTION(cchWritten == cchTotal); STLSOFT_SUPPRESS_UNUSED(p); return ::send(ctxt->sk, buffer.data(), (int)cchWritten, 0); } }