void TopologyWriter::DeleteFiles(void) { // Delete all files, since zziplib interface doesn't handle file modes // properly if (strlen(filename)>0) { TCHAR fname[MAX_PATH]; ascii2unicode(filename, fname); _tcscat(fname, TEXT(".shp")); DeleteFile(fname); ascii2unicode(filename, fname); _tcscat(fname, TEXT(".shx")); DeleteFile(fname); ascii2unicode(filename, fname); _tcscat(fname, TEXT(".dbf")); DeleteFile(fname); } }
// --------------------------------------------------------------------------- // ImportNodeFromXML() // // --------------------------------------------------------------------------- void O2Boards:: ImportNodeFromXML(const O2Node &node, const char *in, size_t len) { wstring xml; size_t p = 0; size_t p1; size_t p2; ascii2unicode(in, len, xml); wstring domain_bbsname; O2BoardExMapIt exit; while (p < len) { p1 = xml.find(L"<board>", p); if (p1 == wstring::npos) break; p1 += 7; p2 = xml.find(L"</board>", p1); if (p2 == wstring::npos) break; if (p2 > p1) { domain_bbsname.assign(xml, p1, p2-p1); ExLock.Lock(); { exit = exmap.find(domain_bbsname); if (exit != exmap.end()) { exit->second->collectors.push(node); } } ExLock.Unlock(); } p = p2 + 8; } }
/* * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079) */ static void Set_Start_Key(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; lwip_sha1_context sha1Context; u_char Digest[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */ /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); lwip_sha1_init(&sha1Context); lwip_sha1_starts(&sha1Context); lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE); lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE); lwip_sha1_update(&sha1Context, rchallenge, 8); lwip_sha1_finish(&sha1Context, Digest); lwip_sha1_free(&sha1Context); /* Same key in both directions. */ mppe_set_key(pcb, &pcb->mppe_comp, Digest); mppe_set_key(pcb, &pcb->mppe_decomp, Digest); pcb->mppe_keys_set = 1; }
unsigned short* ts_strdup_ascii_to_unicode(const char* str) { unsigned short* result = (unsigned short*)malloc((strlen(str)+1)*2); if (result == NULL) return NULL; ascii2unicode(str, (wchar_t *)result); return result; }
unsigned short* ts_strcat(unsigned short* dest, const char* src) { unsigned short* p = dest; while (*p != '\0') p++; ascii2unicode(src, (wchar_t *)p); return dest; }
// ----------------------------------------------------------------------- // GetTargetBoardFromHeader // ----------------------------------------------------------------------- bool GetTargetBoardFromHeader(const HTTPHeader &header , wstring &board) { strmap::const_iterator it = header.fields.find(X_O2_TARGET_BOARD); if (it == header.fields.end()) return false; ascii2unicode(it->second, board); return true; }
static void ChapMS_NT(const u_char *rchallenge, const char *secret, int secret_len, u_char NTResponse[24]) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; /* Hash the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); ChallengeResponse(rchallenge, PasswordHash, NTResponse); }
static void GenerateAuthenticatorResponse(char *secret, int secret_len, u_char NTResponse[24], u_char PeerChallenge[16], u_char *rchallenge, char *username, u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) { /* * "Magic" constants used in response generation, from RFC 2759. */ u_char Magic1[39] = /* "Magic server to client signing constant" */ { 0x4D, 0x61, 0x67, 0x69, 0x63, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74 }; u_char Magic2[41] = /* "Pad to make it do more than one iteration" */ { 0x50, 0x61, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6F, 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E }; int i; SHA1_CTX sha1Context; u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; u_char Digest[SHA1_SIGNATURE_SIZE]; u_char Challenge[8]; /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); SHA1_Init(&sha1Context); SHA1_Update(&sha1Context, PasswordHashHash, sizeof(PasswordHashHash)); SHA1_Update(&sha1Context, NTResponse, 24); SHA1_Update(&sha1Context, Magic1, sizeof(Magic1)); SHA1_Final(Digest, &sha1Context); ChallengeHash(PeerChallenge, rchallenge, username, Challenge); SHA1_Init(&sha1Context); SHA1_Update(&sha1Context, Digest, sizeof(Digest)); SHA1_Update(&sha1Context, Challenge, sizeof(Challenge)); SHA1_Update(&sha1Context, Magic2, sizeof(Magic2)); SHA1_Final(Digest, &sha1Context); /* Convert to ASCII hex string. */ for (i = 0; i < MAX((MS_AUTH_RESPONSE_LENGTH / 2), sizeof(Digest)); i++) sprintf((char *)&authResponse[i * 2], "%02X", Digest[i]); }
// --------------------------------------------------------------------------- // AddEx() // // --------------------------------------------------------------------------- bool O2Boards:: AddEx(const char *url) { HTTPHeader h(0); h.SplitURL(url); if (h.paths.empty() || h.paths[0] == "/") return false; wstring hostname; ascii2unicode(h.hostname, hostname); const wchar_t *domain = host2domain(hostname.c_str()); if (!domain) return false; wstring bbsname; ascii2unicode(h.paths[0], bbsname); wstring domain_bbsname; domain_bbsname = domain; domain_bbsname += L':'; domain_bbsname += bbsname; O2BoardExMapIt exit = exmap.find(domain_bbsname); if (exit != exmap.end()) return false; ExLock.Lock(); { O2BoardEx *ex = new O2BoardEx(); ex->collectors.SetObject(Profile, Client); exmap.insert(O2BoardExMap::value_type(domain_bbsname, ex)); } ExLock.Unlock(); return true; }
/* * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079) */ static void Set_Start_Key(u_char *rchallenge, char *secret, int secret_len) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); mppe_set_keys(rchallenge, PasswordHashHash); }
void Topology::Open() { TCHAR ufname[MAX_PATH]; // 091105 shapefileopen = false; if (append) { if (msSHPOpenFile(&shpfile, (char*)"rb+", filename) == -1) { ascii2unicode(filename,ufname); // StartupStore(_T(". Topology: Open: append failed for <%s> (this can be normal)%s"),ufname,NEWLINE); return; } } else { if (msSHPOpenFile(&shpfile, (char*)"rb", filename) == -1) { ascii2unicode(filename,ufname); StartupStore(_T("------ Topology: Open FAILED for <%s>%s"),ufname,NEWLINE); return; } } ascii2unicode(filename,ufname); // 091105 // StartupStore(_T(". Topology: Open <%s>%s"),ufname,NEWLINE); scaleThreshold = 1000.0; shpCache = (XShape**)malloc(sizeof(XShape*)*shpfile.numshapes); if (shpCache) { shapefileopen = true; #ifdef TOPOFASTCACHE initCache(); #else for (int i=0; i<shpfile.numshapes; i++) { shpCache[i] = NULL; } #endif } else { StartupStore(_T("------ ERR Topology, malloc failed shpCache%s"), NEWLINE); } }
static BOOL wildcardFindFirst(const char* arg, HANDLE* findHandle, char** expandedArg) { WIN32_FIND_DATA findData; WCHAR argW[1024]; int filenameLen; ascii2unicode(arg, argW, 1024); *findHandle = FindFirstFile(argW, &findData); if (*findHandle == (HANDLE)0xffffffff) return FALSE; filenameLen = wcslen(findData.cFileName); *expandedArg = (char*)malloc(filenameLen+1); if (*expandedArg == NULL) return FALSE; unicode2ascii(findData.cFileName, *expandedArg, filenameLen+1); return TRUE; }
static void ChapMS2_NT(u_char *rchallenge, u_char PeerChallenge[16], char *username, char *secret, int secret_len, u_char NTResponse[24]) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char Challenge[8]; ChallengeHash(PeerChallenge, rchallenge, username, Challenge); /* Hash the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); ChallengeResponse(Challenge, PasswordHash, NTResponse); }
//******************************************************************************* // if VListView class is used, this function is incorporated within the class //******************************************************************************* void CVListView::lview_assign_column_headers(void) { DWORD styles = 0 ; if (style_flags & LVL_STY_EX_GRIDLINES) { styles |= LVS_EX_GRIDLINES ; } if (style_flags & LVL_STY_EX_FULL_ROW) { /// styles |= (LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS) ; styles |= LVS_EX_FULLROWSELECT ; } // LVS_EX_INFOTIP enables tooltips // LVS_EX_LABELTIP ensures the full tooltip is shown and is not partially hidden if (style_flags & LVL_STY_EX_TOOLTIPS) { styles |= (LVS_EX_INFOTIP | LVS_EX_LABELTIP) ; } if (styles != 0) ListView_SetExtendedListViewStyle(hwndVListView, styles) ; //lint !e522 // set extended styles // ListView_SetExtendedListViewStyle(tiSelf->hwndRxData, LVS_EX_ONECLICKACTIVATE) ; // initialize the column // Even though we've disabled column headers with LVS_NOCOLUMNHEADER, // we *still* need to insert the column. // Mind you, this should *only* be done ONCE... LVCOLUMN LvColumn; // Make Column struct for ListView memset (&LvColumn, 0, sizeof (LvColumn)); // Reset Column LvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; LvColumn.fmt = LVCFMT_LEFT; // shorten column by width of the vertical scroll bar, // so we don't get a horizontal scroll bar once the // vertical scroll bar gets drawn. // syslog("vertical scroll-bar width=%u pixels\n", iOffset) ; uint iOffset = GetSystemMetrics (SM_CXVSCROLL); iOffset += 6 ; LvColumn.cx = cxClient - iOffset ; // LvColumn.pszText = "comm-port terminal" ; #ifdef UNICODE LvColumn.pszText = ascii2unicode(".") ; #else LvColumn.pszText = "." ; //lint !e1778 asmt is not const safe #endif SendMessage(hwndVListView, LVM_INSERTCOLUMN, 0, (LPARAM)(const LV_COLUMN*)(&LvColumn)) ; }
static void GenerateAuthenticatorResponsePlain( const char *secret, int secret_len, u_char NTResponse[24], const u_char PeerChallenge[16], const u_char *rchallenge, const char *username, u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); GenerateAuthenticatorResponse(PasswordHashHash, NTResponse, PeerChallenge, rchallenge, username, authResponse); }
//***************************************************************************** void CVListView::set_header_text(uint idx, char *msg) { HWND hwndHeader = ListView_GetHeader(hwndVListView); if (hwndHeader) { HDITEM item; item.mask = HDI_TEXT ; #ifdef UNICODE item.pszText = ascii2unicode(msg) ; item.cchTextMax = _tcslen(item.pszText) ; #else item.pszText = msg ; item.cchTextMax = strlen(msg) ; #endif item.fmt = HDF_STRING | HDF_CENTER ; Header_SetItem(hwndHeader, idx, &item); //lint !e522 } else { //lint !e550 Symbol 'item' (line 753) not accessed syslog("ListView_GetHeader: %s\n", get_system_message()) ; } }
bool O2Profile:: ExportToXML(const O2ProfileSelectCondition cond, string &out) { wstring tmpstr; wchar_t tmp[32]; wstring xml; xml += L"<?xml version=\"1.0\" encoding=\""; xml += cond.charset; xml += L"\"?>" EOL; if (!cond.xsl.empty()) { xml += L"<?xml-stylesheet type=\"text/xsl\" href=\""; xml += cond.xsl; xml += L"\"?>" EOL; } xml += L"<"; xml += cond.rootelement; xml += L">" EOL; Lock(); //ID if (cond.mask & PROF_XMLELM_ID) { ID.to_string(tmpstr); xml += L" <ID>"; xml += tmpstr; xml += L"</ID>" EOL; } //IP if (cond.mask & PROF_XMLELM_IP) { ip2e(IP, tmpstr); xml += L" <IP>"; xml += tmpstr; xml += L"</IP>" EOL; } //NodeName if (cond.mask & PROF_XMLELM_NAME) { makeCDATA(NodeNameW, tmpstr); xml += L" <nodename>"; xml += tmpstr; xml += L"</nodename>" EOL; } //Comment if (cond.mask & PROF_XMLELM_COMMENT) { makeCDATA(Comment, tmpstr); xml += L" <comment>"; xml += tmpstr; xml += L"</comment>" EOL; } //P2PPort if (cond.mask & PROF_XMLELM_P2PPORT) { xml += L" <port>"; swprintf_s(tmp, 16, L"%d", P2PPort); xml += tmp; xml += L"</port>" EOL; } //ProxyPort if (cond.mask & PROF_XMLELM_PROXYPORT) { xml += L" <ProxyPort>"; swprintf_s(tmp, 16, L"%d", ProxyPort); xml += tmp; xml += L"</ProxyPort>" EOL; } //AdminPort if (cond.mask & PROF_XMLELM_ADMINPORT) { xml += L" <AdminPort>"; swprintf_s(tmp, 16, L"%d", AdminPort); xml += tmp; xml += L"</AdminPort>" EOL; } //PrivKey if (cond.mask & PROF_XMLELM_PRIVKEY) { PrivKey.to_string(tmpstr); xml += L" <PrivKey>"; xml += tmpstr; xml += L"</PrivKey>" EOL; } //PubKey if (cond.mask & PROF_XMLELM_PUBKEY) { PubKey.to_string(tmpstr); xml += L" <PubKey>"; xml += tmpstr; xml += L"</PubKey>" EOL; } //DBDir if (cond.mask & PROF_XMLELM_DBDIR) { makeCDATA(DBDirW, tmpstr); xml += L" <DBDir>"; xml += tmpstr; xml += L"</DBDir>" EOL; } //CacheRoot if (cond.mask & PROF_XMLELM_CACHEROOT) { makeCDATA(CacheRootW, tmpstr); xml += L" <CacheRoot>"; xml += tmpstr; xml += L"</CacheRoot>" EOL; } //AdminRoot if (cond.mask & PROF_XMLELM_ADMINROOT) { makeCDATA(AdminRootW, tmpstr); xml += L" <AdminRoot>"; xml += tmpstr; xml += L"</AdminRoot>" EOL; } //AdminBrowserType if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_TYPE) { xml += L" <AdminBrowserType>"; xml += AdminBrowserType; xml += L"</AdminBrowserType>" EOL; } //AdminBrowserPath if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_PATH) { makeCDATA(AdminBrowserPath, tmpstr); xml += L" <AdminBrowserPath>"; xml += tmpstr; xml += L"</AdminBrowserPath>" EOL; } //UPnPAdapterName if (cond.mask & PROF_XMLELM_UPNP_ADAPTERNAME) { ascii2unicode(UPnPAdapterName, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPAdapterName>"; xml += tmpstr; xml += L"</UPnPAdapterName>" EOL; } //UPnPLocation if (cond.mask & PROF_XMLELM_UPNP_LOCATION) { ascii2unicode(UPnPLocation, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPLocation>"; xml += tmpstr; xml += L"</UPnPLocation>" EOL; } //UPnPServiceId if (cond.mask & PROF_XMLELM_UPNP_SERVICEID) { ascii2unicode(UPnPServiceId, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPServiceId>"; xml += tmpstr; xml += L"</UPnPServiceId>" EOL; } //limits if (cond.mask & PROF_XMLELM_LIMIT) { swprintf_s(tmp, 16, L"%u", P2PSessionLimit); xml += L" <p2psessionlimit>"; xml += tmp; xml += L"</p2psessionlimit>" EOL; /* swprintf_s(tmp, 16, L"%u", NodeLimit); xml += L" <nodelimit>"; xml += tmp; xml += L"</nodelimit>" EOL; */ swprintf_s(tmp, 16, L"%u", KeyLimit); xml += L" <keylimit>"; xml += tmp; xml += L"</keylimit>" EOL; swprintf_s(tmp, 16, L"%u", QueryLimit); xml += L" <querylimit>"; xml += tmp; xml += L"</querylimit>" EOL; swprintf_s(tmp, 16, L"%u", LogLimit); xml += L" <loglimit>"; xml += tmp; xml += L"</loglimit>" EOL; swprintf_s(tmp, 16, L"%u", NetLogLimit); xml += L" <netloglimit>"; xml += tmp; xml += L"</netloglimit>" EOL; swprintf_s(tmp, 16, L"%u", HokanLogLimit); xml += L" <hokanloglimit>"; xml += tmp; xml += L"</hokanloglimit>" EOL; swprintf_s(tmp, 16, L"%u", IPFLogLimit); xml += L" <ipfloglimit>"; xml += tmp; xml += L"</ipfloglimit>" EOL; swprintf_s(tmp, 32, L"%I64u", QuarterSize); xml += L" <quartersize>"; xml += tmp; xml += L"</quartersize>" EOL; swprintf_s(tmp, 16, L"%u", QuarterFullOperation); xml += L" <quarterfulloperation>"; xml += tmp; xml += L"</quarterfulloperation>" EOL; swprintf_s(tmp, 16, L"%u", ResumeDelayMs); xml += L" <ResumeDelayMs>"; xml += tmp; xml += L"</ResumeDelayMs>" EOL; } if (cond.mask & PROF_XMLELM_BOOL) { xml += L" <port0>"; xml += (Port0 ? L"1" : L"0"); xml += L"</port0>" EOL; xml += L" <p2pautostart>"; xml += (P2PAutoStart ? L"1" : L"0"); xml += L"</p2pautostart>" EOL; xml += L" <loadsubdirindex>"; xml += (LoadSubdirIndex ? L"1" : L"0"); xml += L"</loadsubdirindex>" EOL; xml += L" <maruuser>"; xml += (MaruUser ? L"1" : L"0"); xml += L"</maruuser>" EOL; xml += L" <publicprofile>"; xml += (PublicReport ? L"1" : L"0"); xml += L"</publicprofile>" EOL; xml += L" <publicrecentdat>"; xml += (PublicRecentDat ? L"1" : L"0"); xml += L"</publicrecentdat>" EOL; xml += L" <baloon_p2p>"; xml += (Baloon_P2P ? L"1" : L"0"); xml += L"</baloon_p2p>" EOL; xml += L" <baloon_query>"; xml += (Baloon_Query ? L"1" : L"0"); xml += L"</baloon_query>" EOL; xml += L" <baloon_hokan>"; xml += (Baloon_Hokan ? L"1" : L"0"); xml += L"</baloon_hokan>" EOL; xml += L" <baloon_im>"; xml += (Baloon_IM ? L"1" : L"0"); xml += L"</baloon_im>" EOL; xml += L" <AutoResume>"; xml += (AutoResume ? L"1" : L"0"); xml += L"</AutoResume>" EOL; xml += L" <UseUPnP>"; xml += (UseUPnP ? L"1" : L"0"); xml += L"</UseUPnP>" EOL; } Unlock(); xml += L"</"; xml += cond.rootelement; xml += L">" EOL; return (FromUnicode(cond.charset.c_str(), xml, out)); }
void O2ReportMaker:: GetReport(string &out, bool pub) { double ptime; double ptimeavg; int handle_c; int thread_c; PerformanceCounter->GetValue(ptime, ptimeavg, handle_c, thread_c); long tzoffset; _get_timezone(&tzoffset); // start time time_t starttime = PerformanceCounter->GetStartTime(); wchar_t starttime_str[32]; if (starttime != 0) { time_t t = starttime - tzoffset; struct tm tm; gmtime_s(&tm, &t); wcsftime(starttime_str, 32, L"%Y/%m/%d %H:%M:%S", &tm); } else wcscpy_s(starttime_str, 32, L"-"); // uptime uint64 uptime = PerformanceCounter->GetUptime(); wchar_t uptime_str[32]; if (uptime != 0) { swprintf_s(uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d", uptime/86400, (uptime%86400)/3600, (uptime%3600)/60, uptime%60); } else wcscpy_s(uptime_str, 32, L"-"); // uptime (累計) uint64 total_uptime = PerformanceCounter->GetTotalUptime() + uptime; wchar_t total_uptime_str[32]; swprintf_s(total_uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d", total_uptime/86400, (total_uptime%86400)/3600, (total_uptime%3600)/60, total_uptime%60); wchar_t ptime_str[32]; swprintf_s(ptime_str, 32, L"%.1f%% (%.1f%%)", ptime, ptimeavg); // 送受信バイト数 (現在のセッション) uint64 total_u = Server_P2P->GetSendByte() + Client->GetSendByte(); uint64 total_d = Server_P2P->GetRecvByte() + Client->GetRecvByte(); wchar_t traffic_u[32]; swprintf_s(traffic_u, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)total_u/1024/uptime), (uptime == 0 ? 0 : (double)total_u/uptime*8)); wchar_t traffic_d[32]; swprintf_s(traffic_d, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)total_d/1024/uptime), (uptime == 0 ? 0 : (double)total_d/uptime*8)); wchar_t traffic_ud[32]; swprintf_s(traffic_ud, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)(total_u+total_d)/1024/uptime), (uptime == 0 ? 0 : (double)(total_u+total_d)/uptime*8)); // 送受信バイト数 (累計) uint64 accum_total_u = PerformanceCounter->GetTotalSend() + total_u; uint64 accum_total_d = PerformanceCounter->GetTotalRecv() + total_d; wchar_t a_traffic_u[32]; swprintf_s(a_traffic_u, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)accum_total_u/1024/total_uptime), (total_uptime == 0 ? 0 : (double)accum_total_u/total_uptime*8)); wchar_t a_traffic_d[32]; swprintf_s(a_traffic_d, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)accum_total_d/1024/total_uptime), (total_uptime == 0 ? 0 : (double)accum_total_d/total_uptime*8)); wchar_t a_traffic_ud[32]; swprintf_s(a_traffic_ud, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/1024/total_uptime), (total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/total_uptime*8)); //dat数、サイズ uint64 datnum = 0; uint64 datsize = 0; uint64 pubnum = 0; DatDB->select_report(PUBLISH_ORIGINAL_TT, datnum, datsize, pubnum); //publish率 wchar_t publishper[32]; if (datnum == 0) wcscpy_s(publishper, 32, L"0.0%"); else { swprintf(publishper, 32, L"%.1f%% (%I64u)", (double)pubnum/datnum*100.0, pubnum); } wstring tmpstr; wstring xml; xml += L"<?xml version=\"1.0\" encoding=\""; xml += _T(DEFAULT_XML_CHARSET); xml += L"\"?>"EOL; if (pub) xml += L"<?xml-stylesheet type=\"text/xsl\" href=\"/profile.xsl\"?>"; xml += L"<report>"EOL; // // 名前、コメント、閲覧履歴 // if (pub) { makeCDATA(Profile->GetNodeNameW(), tmpstr); xml += L"<name>"; xml += tmpstr; xml += L"</name>"EOL; xml += L"<category>"EOL; xml += L"<table>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"ID"); hashT hash; Profile->GetID(hash); wstring hashstr; hash.to_string(hashstr); xml_AddElement(xml, L"td", L"class=\"L\"", hashstr.c_str()); xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"コメント"); makeCDATA(Profile->GetComment(), tmpstr); xml += L" <pre>"; xml += tmpstr; xml += L"</pre>"EOL; xml += L"</tr>"EOL; // if (Profile->IsPublicRecentDat()) { xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"閲覧履歴"); xml += L"<pre>"; O2KeyList recent; Server_Proxy->GetRecentDatList(recent); tmpstr.erase(); for (O2KeyListIt it = recent.begin(); it != recent.end(); it++) { wchar_t timestr[TIMESTR_BUFF_SIZE]; struct tm tm; localtime_s(&tm, &it->date); wcsftime(timestr, TIMESTR_BUFF_SIZE, L"%Y/%m/%d %H:%M:%S", &tm); tmpstr += timestr; tmpstr += L" [ "; tmpstr += it->url; tmpstr += L" ] "; tmpstr += it->title; tmpstr += L"\r\n"; } makeCDATA(tmpstr, tmpstr); xml += tmpstr; xml += L"</pre>"EOL; xml += L"</tr>"EOL; } xml += L"</table>"EOL; xml += L"</category>"EOL; } // // 概要 // if (!pub || Profile->IsPublicReport()) { xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"概要"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"状態"); xml_AddElement(xml, L"td", L"type=\"h\"", L"CPU(平均)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ハンドル"); xml_AddElement(xml, L"td", L"type=\"h\"", L"スレッド"); xml_AddElement(xml, L"td", L"type=\"h\"", L"総dat数"); xml_AddElement(xml, L"td", L"type=\"h\"", L"総datサイズ"); xml_AddElement(xml, L"td", L"type=\"h\"", L"publish率"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; if (PerformanceCounter->IsActive()) xml_AddElement(xml, L"td", L"class=\"active\"", L"稼動中"); else xml_AddElement(xml, L"td", L"class=\"deactive\"", L"停止中"); xml_AddElement(xml, L"td", L"class=\"C\"", ptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", handle_c); xml_AddElement(xml, L"td", L"class=\"N\"", thread_c); xml_AddElement(xml, L"td", L"class=\"N\"", datnum); xml_AddElement(xml, L"td", L"class=\"N\"", datsize); xml_AddElement(xml, L"td", L"class=\"R\"", publishper); xml += L"</tr>"EOL; xml += L"</table>"EOL; // xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"起動日時"); xml_AddElement(xml, L"td", L"type=\"h\"", L"グローバルIP"); xml_AddElement(xml, L"td", (Server_P2P->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"P2P"); xml_AddElement(xml, L"td", (Server_Proxy->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Proxy"); xml_AddElement(xml, L"td", (Server_Admin->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Admin"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Ver"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; wstring ipstr; ulong2ipstr(Profile->GetIP(), ipstr); xml_AddElement(xml, L"td", L"class=\"C\"", starttime_str); xml_AddElement(xml, L"td", L"class=\"C\"", ipstr.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetP2PPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetProxyPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetAdminPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetUserAgentW()); xml += L"</tr>"EOL; xml += L"</table>"EOL; // xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"稼働時間"); xml_AddElement(xml, L"td", L"type=\"h\"", L"上り"); xml_AddElement(xml, L"td", L"type=\"h\"", L"下り"); xml_AddElement(xml, L"td", L"type=\"h\"", L"合計"); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"上りKB/s(bps)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"下りKB/s(bps)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"合計KB/s(bps)"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"今回"); xml_AddElement(xml, L"td", L"class=\"C\"", uptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", total_u); xml_AddElement(xml, L"td", L"class=\"N\"", total_d); xml_AddElement(xml, L"td", L"class=\"N\"", total_u+total_d); xml_AddElement(xml, L"td", L"", L""); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_u); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_d); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_ud); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"累計"); xml_AddElement(xml, L"td", L"class=\"C\"", total_uptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_d); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u+accum_total_d); xml_AddElement(xml, L"td", L"", L""); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_u); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_d); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_ud); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // DB // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"DB"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"Node"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Friend"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Key"); xml_AddElement(xml, L"td", L"type=\"h\"", L"SakuKey"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Query"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Saku"); xml_AddElement(xml, L"td", L"type=\"h\"", L"IM"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Broadcast"); xml_AddElement(xml, L"td", L"type=\"h\"", L"BCQueue"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Logger"); xml_AddElement(xml, L"td", L"type=\"h\"", L"IPFilter"); xml_AddElement(xml, L"td", L"type=\"h\"", L"DatRequest"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"保持数"); xml_AddElement(xml, L"td", L"class=\"N\"", NodeDB->count()); xml_AddElement(xml, L"td", L"class=\"N\"", FriendDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", KeyDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", SakuKeyDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", QueryDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", SakuDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", IMDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", BroadcastDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", Job_Broadcast->GetQueueCount()); xml_AddElement(xml, L"td", L"class=\"N\"", Logger->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", IPFilter_P2P->Count()+IPFilter_Proxy->Count()+IPFilter_Admin->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", Job_QueryDat->GetRequestQueueCount()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // Server // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Server"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"dat"); xml_AddElement(xml, L"td", L"type=\"h\"", L"collection"); xml_AddElement(xml, L"td", L"type=\"h\"", L"im"); xml_AddElement(xml, L"td", L"type=\"h\"", L"broadcast"); xml_AddElement(xml, L"td", L"type=\"h\"", L"profile"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ping"); xml_AddElement(xml, L"td", L"type=\"h\"", L"store"); xml_AddElement(xml, L"td", L"type=\"h\"", L"findnode"); xml_AddElement(xml, L"td", L"type=\"h\"", L"findvalue"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ERROR"); xml_AddElement(xml, L"td", L"type=\"h\"", L"?"); xml_AddElement(xml, L"td", L"type=\"h\"", L"計"); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"Proxy"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Admin"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetTotalSessionCount()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetTotalSessionCount()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetSendByte()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"down"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetRecvByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up + down"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat") + Server_P2P->GetRecvByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection") + Server_P2P->GetRecvByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im") + Server_P2P->GetRecvByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast") + Server_P2P->GetRecvByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile") + Server_P2P->GetRecvByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping") + Server_P2P->GetRecvByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store") + Server_P2P->GetRecvByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode") + Server_P2P->GetRecvByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue") + Server_P2P->GetRecvByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR") + Server_P2P->GetRecvByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("UNKNOWN") + Server_P2P->GetRecvByteByPath("UNKNOWN")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL) + Server_P2P->GetRecvByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte() + Server_Proxy->GetRecvByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte() + Server_Admin->GetRecvByte()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionPeak()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // Agent // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Agent"); xml += L"<table>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); size_t i; for (i = 0; i < Jobs.size(); i++) { if (Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"type=\"h\" class=\"active\"", Jobs[i]->GetName()); else xml_AddElement(xml, L"td", L"type=\"h\" class=\"deactive\"", Jobs[i]->GetName()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"実行"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else if (Jobs[i]->IsWorking()) xml_AddElement(xml, L"td", L"class=\"active\"", L"実行中"); else xml_AddElement(xml, L"td", L"class=\"wait\"", L"待機"); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"間隔(s)"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetInterval()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"起動まで"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive() || Jobs[i]->IsWorking()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetRemain()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetTotalSessionCount()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"down"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetRecvByte()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up+down"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()+Jobs[i]->GetRecvByte()); } xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク"); xml_AddElement(xml, L"td", L"class=\"N\"", Client->GetSessionPeak()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; if (O2DEBUG && TRACE_CONNECTIONS && !pub) { // // Connections // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Connections"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"IP"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Port"); xml_AddElement(xml, L"td", L"type=\"h\"", L"接続時間(s)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"recv"); xml_AddElement(xml, L"td", L"type=\"h\"", L"send"); xml_AddElement(xml, L"td", L"type=\"h\"", L"rbuff"); xml += L"</tr>"EOL; O2SocketSessionPList lst; time_t now = time(NULL); Server_P2P->GetSessionList(lst); for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) { O2SocketSession *ss = *it; wstring e_ip; ip2e(ss->ip, e_ip); xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"class=\"C\"", L"Server"); xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", ss->port); xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t); xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset); xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset); wstring rbuff; ascii2unicode(ss->rbuff, rbuff); xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true); xml += L"</tr>"EOL; delete *it; } lst.clear(); Client->GetSessionList(lst); for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) { O2SocketSession *ss = *it; wstring e_ip; ip2e(ss->ip, e_ip); xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"class=\"C\"", L"Agent"); xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", ss->port); xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t); xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset); xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset); wstring rbuff; ascii2unicode(ss->rbuff, rbuff); xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true); xml += L"</tr>"EOL; delete *it; } xml += L"</table>"EOL; xml += L"</category>"EOL; } } xml += L"</report>"EOL; FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out); }
static bool _open_fds(const char* filename, int flags, int mode, _FD_STRUCT* fds) { WCHAR filenameW[1024]; ascii2unicode(filename, filenameW, 1024); return _wopen_fds(filenameW, flags, mode, fds); }
// ----------------------------------------------------------------------- // GetNodeInfoFromHeader // ----------------------------------------------------------------------- bool GetNodeInfoFromHeader(const HTTPHeader &header , const ulong ip , const ushort port , O2Node &node) { strmap::const_iterator it; //ID it = header.fields.find(X_O2_NODE_ID); if (it == header.fields.end()) return false; node.id.assign(it->second.c_str(), it->second.size()); //IP node.ip = ip; //Port if (header.GetType() == HTTPHEADERTYPE_REQUEST) { it = header.fields.find(X_O2_PORT); if (it == header.fields.end()) return false; node.port = (ushort)strtoul(it->second.c_str(), NULL, 10); } else node.port = port; //RSA Public Key it = header.fields.find(X_O2_RSAPUBLICKEY); if (it == header.fields.end()) return false; node.pubkey.assign(it->second.c_str(), it->second.size()); //NodeName it = header.fields.find(X_O2_NODENAME); if (it != header.fields.end()) ToUnicode(_T(DEFAULT_XML_CHARSET), it->second, node.name); //Flags it = header.fields.find(X_O2_NODE_FLAGS); if (it != header.fields.end()) ascii2unicode(it->second, node.flags); //User-Agent byte status; switch (header.GetType()) { case HTTPHEADERTYPE_REQUEST: it = header.fields.find("User-Agent"); status = O2_NODESTATUS_LINKEDFROM; break; case HTTPHEADERTYPE_RESPONSE: it = header.fields.find("Server"); status = O2_NODESTATUS_LINKEDTO; break; default: return false; } if (it == header.fields.end()) return false; ascii2unicode(it->second, node.ua); // ノードのユーザーエージェントから情報を取得 // O2/0.2 (o2on/0.02.0027; Win32) // O2/0.2 (opy2on/0.00.0001; Linux x86_64) //など「O2/プロトコルバージョン (アプリ名/アプリバージョン; 環境等)」形式であること size_t ProtoNamePos = node.ua.find(L"O2/", 0); if (ProtoNamePos != 0) { // プロトコル名が見つからない return false; } size_t AppNamePeriodPos = node.ua.find(L" ", ProtoNamePos); if ( AppNamePeriodPos == wstring::npos ) { // プロトコル・アプリ名の区切りが見つからない return false; } node.proto_ver = node.ua.substr( 3, AppNamePeriodPos - 3 ); size_t AppNameStartPos = node.ua.find(L"(", AppNamePeriodPos); if (( AppNameStartPos == wstring::npos ) || ((AppNameStartPos + 1) == node.ua.size() )) { // アプリ名の開始位置が見つからない return false; } AppNameStartPos++; size_t AppNameEndPos = node.ua.find(L"/", AppNameStartPos); if ( AppNameEndPos == wstring::npos ) { // アプリ名の終了位置が見つからない return false; } node.app_name = node.ua.substr( AppNameStartPos, AppNameEndPos - AppNameStartPos ); if ((wcscmp(node.app_name.c_str(), _T(APP_NAME)) == 0) && ((AppNameEndPos + 1) < node.ua.size() )) { // 同じアプリならバージョン番号を取得 AppNameEndPos++; size_t VerEndPos = node.ua.find(L";", AppNameEndPos); if ( VerEndPos == wstring::npos ) { // バージョン番号の終了位置が見つからない return false; } node.app_ver = node.ua.substr(AppNameEndPos, VerEndPos - AppNameEndPos); } else { wchar_t tmpW[128]; swprintf_s(tmpW, 128, L"異なるアプリ:%s\n", node.app_name.c_str()); TRACEW(tmpW); } return true; }
// Do a transaction with server // returns received bytes, -1 if transaction failed static int DoTransactionToServer(char *txbuf, unsigned int txbuflen, char *rxbuf, unsigned int maxrxbuflen) { SOCKET s = INVALID_SOCKET; unsigned int sent = 0; int tmpres; int rxfsm = 0; unsigned int rxlen = 0; char recvbuf[BUFSIZ]; unsigned char cdata; s = EstablishConnection(_server_name, _server_port); if ( s==INVALID_SOCKET ) return -1; //Send the query to the server while(sent < txbuflen) { tmpres = send(s, txbuf+sent, txbuflen-sent, 0); if( tmpres == SOCKET_ERROR ) { rxlen = -1; goto cleanup; } sent += tmpres; } //Receive the page while( (tmpres = recv(s, recvbuf, BUFSIZ, 0)) > 0) { for (int i=0; i<tmpres; i++) { cdata = recvbuf[i]; switch (rxfsm) { default: case 0: if (cdata=='\r') rxfsm++; break; case 1: if (cdata=='\n') { rxfsm++; break; } rxfsm=0; break; case 2: if (cdata=='\r') { rxfsm++; break; } rxfsm=0; break; case 3: if (cdata=='\n') { rxfsm++; rxlen=0; break; } rxfsm=0; break; case 4: //Content chr rxbuf[rxlen] = cdata; if (rxlen<maxrxbuflen) rxlen++; break; }//sw } //for } //wh if(tmpres == SOCKET_ERROR) { rxlen = -1; goto cleanup; } rxbuf[rxlen]=0; #ifdef LT_DEBUG TCHAR urxbuf[500]; ascii2unicode(rxbuf,urxbuf,400); StartupStore(TEXT("Livetracker recv len=%d: %s%s"), rxlen, urxbuf, NEWLINE); #endif cleanup: closesocket(s); return rxlen; }
/* * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079) */ static void SetMasterKeys(char *secret, int secret_len, u_char NTResponse[24], int IsServer) { SHA1_CTX sha1Context; u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; u_char MasterKey[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */ u_char Digest[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */ u_char SHApad1[40] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; u_char SHApad2[40] = { 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2 }; /* "This is the MPPE Master Key" */ u_char Magic1[27] = { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79 }; /* "On the client side, this is the send key; " "on the server side, it is the receive key." */ u_char Magic2[84] = { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2e }; /* "On the client side, this is the receive key; " "on the server side, it is the send key." */ u_char Magic3[84] = { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2e }; u_char *s; /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); SHA1_Init(&sha1Context); SHA1_Update(&sha1Context, PasswordHashHash, sizeof(PasswordHashHash)); SHA1_Update(&sha1Context, NTResponse, 24); SHA1_Update(&sha1Context, Magic1, sizeof(Magic1)); SHA1_Final(MasterKey, &sha1Context); /* * generate send key */ if (IsServer) s = Magic3; else s = Magic2; SHA1_Init(&sha1Context); SHA1_Update(&sha1Context, MasterKey, 16); SHA1_Update(&sha1Context, SHApad1, sizeof(SHApad1)); SHA1_Update(&sha1Context, s, 84); SHA1_Update(&sha1Context, SHApad2, sizeof(SHApad2)); SHA1_Final(Digest, &sha1Context); BCOPY(Digest, mppe_send_key, sizeof(mppe_send_key)); /* * generate recv key */ if (IsServer) s = Magic2; else s = Magic3; SHA1_Init(&sha1Context); SHA1_Update(&sha1Context, MasterKey, 16); SHA1_Update(&sha1Context, SHApad1, sizeof(SHApad1)); SHA1_Update(&sha1Context, s, 84); SHA1_Update(&sha1Context, SHApad2, sizeof(SHApad2)); SHA1_Final(Digest, &sha1Context); BCOPY(Digest, mppe_recv_key, sizeof(mppe_recv_key)); }
/* * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079) */ static void SetMasterKeys(ppp_pcb *pcb, const char *secret, int secret_len, u_char NTResponse[24], int IsServer) { u_char unicodePassword[MAX_NT_PASSWORD * 2]; u_char PasswordHash[MD4_SIGNATURE_SIZE]; u_char PasswordHashHash[MD4_SIGNATURE_SIZE]; lwip_sha1_context sha1Context; u_char MasterKey[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */ u_char Digest[SHA1_SIGNATURE_SIZE]; /* >= MPPE_MAX_KEY_LEN */ const u_char *s; /* "This is the MPPE Master Key" */ static const u_char Magic1[27] = { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79 }; /* "On the client side, this is the send key; " "on the server side, it is the receive key." */ static const u_char Magic2[84] = { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2e }; /* "On the client side, this is the receive key; " "on the server side, it is the send key." */ static const u_char Magic3[84] = { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2e }; /* Hash (x2) the Unicode version of the secret (== password). */ ascii2unicode(secret, secret_len, unicodePassword); NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash); NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash); lwip_sha1_init(&sha1Context); lwip_sha1_starts(&sha1Context); lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE); lwip_sha1_update(&sha1Context, NTResponse, 24); lwip_sha1_update(&sha1Context, Magic1, sizeof(Magic1)); lwip_sha1_finish(&sha1Context, MasterKey); lwip_sha1_free(&sha1Context); /* * generate send key */ if (IsServer) s = Magic3; else s = Magic2; lwip_sha1_init(&sha1Context); lwip_sha1_starts(&sha1Context); lwip_sha1_update(&sha1Context, MasterKey, 16); lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE); lwip_sha1_update(&sha1Context, s, 84); lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE); lwip_sha1_finish(&sha1Context, Digest); lwip_sha1_free(&sha1Context); mppe_set_key(pcb, &pcb->mppe_comp, Digest); /* * generate recv key */ if (IsServer) s = Magic2; else s = Magic3; lwip_sha1_init(&sha1Context); lwip_sha1_starts(&sha1Context); lwip_sha1_update(&sha1Context, MasterKey, 16); lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE); lwip_sha1_update(&sha1Context, s, 84); lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE); lwip_sha1_finish(&sha1Context, Digest); lwip_sha1_free(&sha1Context); mppe_set_key(pcb, &pcb->mppe_decomp, Digest); pcb->mppe_keys_set = 1; }
static efi_status_t dir_read(struct file_handle *fh, u64 *buffer_size, void *buffer) { struct efi_file_info *info = buffer; struct fs_dirent *dent; unsigned int required_size; if (!fh->dirs) { assert(fh->offset == 0); fh->dirs = fs_opendir(fh->path); if (!fh->dirs) return EFI_DEVICE_ERROR; } /* * So this is a bit awkward. Since fs layer is stateful and we * can't rewind an entry, in the EFI_BUFFER_TOO_SMALL case below * we might have to return without consuming the dent.. so we * have to stash it for next call. */ if (fh->dent) { dent = fh->dent; fh->dent = NULL; } else { dent = fs_readdir(fh->dirs); } if (!dent) { /* no more files in directory: */ /* workaround shim.efi bug/quirk.. as find_boot_csv() * loops through directory contents, it initially calls * read w/ zero length buffer to find out how much mem * to allocate for the EFI_FILE_INFO, then allocates, * and then calls a 2nd time. If we return size of * zero the first time, it happily passes that to * AllocateZeroPool(), and when that returns NULL it * thinks it is EFI_OUT_OF_RESOURCES. So on first * call return a non-zero size: */ if (*buffer_size == 0) *buffer_size = sizeof(*info); else *buffer_size = 0; return EFI_SUCCESS; } /* check buffer size: */ required_size = sizeof(*info) + 2 * (strlen(dent->name) + 1); if (*buffer_size < required_size) { *buffer_size = required_size; fh->dent = dent; return EFI_BUFFER_TOO_SMALL; } *buffer_size = required_size; memset(info, 0, required_size); info->size = required_size; info->file_size = dent->size; info->physical_size = dent->size; if (dent->type == FS_DT_DIR) info->attribute |= EFI_FILE_DIRECTORY; ascii2unicode((u16 *)info->file_name, dent->name); fh->offset++; return EFI_SUCCESS; }
static efi_status_t EFIAPI efi_file_getinfo(struct efi_file_handle *file, const efi_guid_t *info_type, efi_uintn_t *buffer_size, void *buffer) { struct file_handle *fh = to_fh(file); efi_status_t ret = EFI_SUCCESS; EFI_ENTRY("%p, %p, %p, %p", file, info_type, buffer_size, buffer); if (!guidcmp(info_type, &efi_file_info_guid)) { struct efi_file_info *info = buffer; char *filename = basename(fh); unsigned int required_size; loff_t file_size; /* check buffer size: */ required_size = sizeof(*info) + 2 * (strlen(filename) + 1); if (*buffer_size < required_size) { *buffer_size = required_size; ret = EFI_BUFFER_TOO_SMALL; goto error; } if (set_blk_dev(fh)) { ret = EFI_DEVICE_ERROR; goto error; } if (fs_size(fh->path, &file_size)) { ret = EFI_DEVICE_ERROR; goto error; } memset(info, 0, required_size); info->size = required_size; info->file_size = file_size; info->physical_size = file_size; if (fh->isdir) info->attribute |= EFI_FILE_DIRECTORY; ascii2unicode((u16 *)info->file_name, filename); } else if (!guidcmp(info_type, &efi_file_system_info_guid)) { struct efi_file_system_info *info = buffer; disk_partition_t part; efi_uintn_t required_size; int r; if (fh->fs->part >= 1) r = part_get_info(fh->fs->desc, fh->fs->part, &part); else r = part_get_info_whole_disk(fh->fs->desc, &part); if (r < 0) { ret = EFI_DEVICE_ERROR; goto error; } required_size = sizeof(info) + 2 * (strlen((const char *)part.name) + 1); if (*buffer_size < required_size) { *buffer_size = required_size; ret = EFI_BUFFER_TOO_SMALL; goto error; } memset(info, 0, required_size); info->size = required_size; info->read_only = true; info->volume_size = part.size * part.blksz; info->free_space = 0; info->block_size = part.blksz; /* * TODO: The volume label is not available in U-Boot. * Use the partition name as substitute. */ ascii2unicode((u16 *)info->volume_label, (const char *)part.name); } else { ret = EFI_UNSUPPORTED; } error: return EFI_EXIT(ret); }