/* case 1: server configuration(ip , port) updated case 2: server offline(No heartbeat) */ int client_reconnect(void) { static int counter =0; if (g_sockfd_client > 0){ g_sockfd_client_status = SOCKFD_CLIENT_NULL; close(g_sockfd_client); g_sockfd_client = -1; } led_ctrl(LED_D3_ALARM_SERVER_STATUS, LED_OFF); while (FAILURE == client_connect_server()){ if (g_sockfd_client > 0){ g_sockfd_client_status = SOCKFD_CLIENT_NULL; close(g_sockfd_client); g_sockfd_client = -1; } sys_log(FUNC, LOG_WARN, "Reconnect duration %dS: counter: %d",CLIENT_RECONNECT_DURATION, ++counter); sleep(CLIENT_RECONNECT_DURATION); } return SUCCESS; }
void CClientManager::GuildDisband(CPeer* peer, TPacketGuild* p) { sys_log(0, "GuildDisband %u", p->dwGuild); char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild%s WHERE id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_grade%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "REPLACE INTO quest%s (dwPID, szName, szState, lValue) SELECT pid, 'guild_manage', 'withdraw_time', %u FROM guild_member%s WHERE guild_id = %u", GetTablePostfix(), (DWORD) GetCurrentTime(), GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_member%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_comment%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); ForwardPacket(HEADER_DG_GUILD_DISBAND, p, sizeof(TPacketGuild)); }
CMD_CODE its_dns(char *www , unsigned int dns, char *ip) { unsigned char buf[MAX_SIZE_DNS]; /* socket发送的数据 */ char *DN=www; /* 将要解析的域名(www.xxx.xxx) */ char name[MAX_SIZE_DNS]; /* 转换为符合DNS报文格式的域名 */ char recvMsg[MAX_SIZE_DNS]; /* 接收的数据 */ int len; /* socket发送数据的长度 */ int len_recvMsg; int ret =-1; sys_log(FUNC, LOG_DBG, " www=%s, dns=0x%08x, ip=%s", www, dns, ip); len = changeDN(DN,name); setHead(buf); setQuery(name,buf,len); len += 16; //sys_log(FUNC, LOG_DBG, " %s", "---->1"); len_recvMsg = sendDNSPacket(buf,len,recvMsg, dns); //sys_log(FUNC, LOG_DBG, " %s", "---->2"); ret = resolve(recvMsg,len,len_recvMsg, ip); //sys_log(FUNC, LOG_DBG, "---->3 ret=%d",ret); return ret; }
void socket_sndbuf(socket_t s, unsigned int opt) { socklen_t optlen; optlen = sizeof(opt); if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, (const char*) &opt, optlen) < 0) { sys_err("setsockopt: sndbuf: %s", strerror(errno)); return; } opt = 0; optlen = sizeof(opt); if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*) &opt, &optlen) < 0) { sys_err("getsockopt: sndbuf: %s", strerror(errno)); return; } sys_log(1, "SYSTEM: %d: send buffer changed to %d", s, opt); }
/* * Panic system call. * * If kernel is built with debug option, sys_panic() displays * a panic message and stops the enture system. Otherwise, it * terminates the task which called sys_panic(). */ int sys_panic(const char *str) { #ifdef DEBUG task_t self = cur_task(); irq_lock(); printf("\nUser mode panic: task:%s thread:%x\n", self->name != NULL ? self->name : "no name", cur_thread); sys_log(str); printf("\n"); sched_lock(); irq_unlock(); for (;;); #else task_terminate(cur_task()); #endif /* NOTREACHED */ return 0; }
void CMonarch::ElectMonarch() { int size = GetVecMonarchCandidacy().size(); int * s = new int[size]; itertype(m_map_MonarchElection) it = m_map_MonarchElection.begin(); int idx = 0; for (; it != m_map_MonarchElection.end(); ++it) { if ((idx = GetCandidacyIndex(it->second->pid)) < 0) continue; ++s[idx]; if (g_test_server) sys_log (0, "[MONARCH_VOTE] pid(%d) come to vote candidacy pid(%d)", it->second->pid, m_vec_MonarchCandidacy[idx].pid); } delete [] s; }
int socket_write_tcp(socket_t desc, const char *txt, int length) { int bytes_written = send(desc, txt, length, 0); // 성공 if (bytes_written > 0) return (bytes_written); if (bytes_written == 0) return -1; #ifdef EAGAIN /* POSIX */ if (errno == EAGAIN) return 0; #endif #ifdef EWOULDBLOCK /* BSD */ if (errno == EWOULDBLOCK) return 0; #endif #ifdef EDEADLK /* Macintosh */ if (errno == EDEADLK) return 0; #endif #ifdef __WIN32__ int wsa_error = WSAGetLastError(); if (wsa_error == WSAEWOULDBLOCK) { return 0; } sys_log(0, "socket_write_tcp: WSAGetLastError returned %d", wsa_error); #endif /* Looks like the error was fatal. Too bad. */ return -1; }
SHELL void sign_up() { clrvar(user.mptr); clrvar(user.var); user.number=user.member+1; ult(user.number)->mpost =0; ult(user.number)->post =0; ult(user.number)->mlogin=0; ult(user.number)->login =0; setvar("mpost","0",user.var); setvar("post","0",user.var); setvar("mlogin","0",user.var); setvar("login","0",user.var); for(;;) { setvar("pass","",user.var); msgout(IC_act "今からサインアップを行います。"); user_chk(1); user_rep(user.member+1); user_disp(); msgout(IC_act "以上でよろしいでしょうか?"); if (ynq()) break; msgout(IC_act "中止しますか?"); if (ynq()) { user_guest(""); return; } } user_add(); user_write(); sys_log("| User登録"); where_seta(); }
bool CMonarch::SetMonarch(const char * name) { MonarchInfo * p = &m_MonarchInfo; char szQuery[256]; snprintf(szQuery, sizeof(szQuery), "SELECT empire, pid, name FROM player a where a.name = '%s'", name); SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER); if (pMsg->Get()->uiNumRows == 0) { delete pMsg; return false; } MYSQL_ROW row; int Empire = 0; for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n) { int idx = 0; str_to_number(Empire, row[idx++]); str_to_number(p->pid[Empire], row[idx++]); strlcpy(p->name[Empire], row[idx++], sizeof(p->name[Empire])); p->money[Empire] = atoll(row[idx++]); if (g_test_server) sys_log(0, "[Set_MONARCH] Empire %d pid %d money %lld windate %s", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]); } delete pMsg; //db¿¡ ÀÔ·Â snprintf(szQuery, sizeof(szQuery), "REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %lld)", Empire, p->pid[Empire], p->money[Empire]); CDBManager::instance().AsyncQuery(szQuery, SQL_PLAYER); return true; }
bool CHARACTER::RemoveAffect(CAffect * pkAff) { if (!pkAff) return false; // AFFECT_BUF_FIX m_list_pkAffect.remove(pkAff); // END_OF_AFFECT_BUF_FIX ComputeAffect(pkAff, false); // 백기 버그 수정. // 백기 버그는 버프 스킬 시전->둔갑->백기 사용(AFFECT_REVIVE_INVISIBLE) 후 바로 공격 할 경우에 발생한다. // 원인은 둔갑을 시전하는 시점에, 버프 스킬 효과를 무시하고 둔갑 효과만 적용되게 되어있는데, // 백기 사용 후 바로 공격하면 RemoveAffect가 불리게 되고, ComputePoints하면서 둔갑 효과 + 버프 스킬 효과가 된다. // ComputePoints에서 둔갑 상태면 버프 스킬 효과 안 먹히도록 하면 되긴 하는데, // ComputePoints는 광범위하게 사용되고 있어서 큰 변화를 주는 것이 꺼려진다.(어떤 side effect가 발생할지 알기 힘들다.) // 따라서 AFFECT_REVIVE_INVISIBLE가 RemoveAffect로 삭제되는 경우만 수정한다. // 시간이 다 되어 백기 효과가 풀리는 경우는 버그가 발생하지 않으므로 그와 똑같이 함. // (ProcessAffect를 보면 시간이 다 되어서 Affect가 삭제되는 경우, ComputePoints를 부르지 않는다.) if (AFFECT_REVIVE_INVISIBLE != pkAff->dwType) { ComputePoints(); } CheckMaximumPoints(); if (test_server) sys_log(0, "AFFECT_REMOVE: %s (flag %u apply: %u)", GetName(), pkAff->dwFlag, pkAff->bApplyOn); if (IsPC()) { SendAffectRemovePacket(GetDesc(), GetPlayerID(), pkAff->dwType, pkAff->bApplyOn); } CAffect::Release(pkAff); return true; }
void CWarMap::AddFlag(BYTE bIdx, DWORD x, DWORD y) { if (m_bEnded) return; assert(bIdx < 2); TeamData & r = m_TeamData[bIdx]; if (r.pkChrFlag) return; if (x == 0) { x = m_kMapInfo.posStart[bIdx].x; y = m_kMapInfo.posStart[bIdx].y; } r.pkChrFlag = CHARACTER_MANAGER::instance().SpawnMob(bIdx == 0 ? warmap::WAR_FLAG_VNUM0 : warmap::WAR_FLAG_VNUM1, m_kMapInfo.lMapIndex, x, y, 0); sys_log(0, "WarMap::AddFlag %u %p id %u", bIdx, get_pointer(r.pkChrFlag), r.dwID); r.pkChrFlag->SetPoint(POINT_STAT, r.dwID); r.pkChrFlag->SetWarMap(this); }
EC_BOOL chfsnprb_pool_init(CHFSNPRB_POOL *pool, const uint32_t node_max_num, const uint32_t node_sizeof) { uint32_t node_pos; if(CHFSNPRB_POOL_MAX_SIZE < node_max_num) { sys_log(LOGSTDERR, "error:chfsnprb_pool_init: node_max_num %u overflow!\n", node_max_num); return (EC_FALSE); } CHFSNPRB_POOL_NODE_MAX_NUM(pool) = node_max_num; CHFSNPRB_POOL_NODE_USED_NUM(pool) = 0; CHFSNPRB_POOL_NODE_SIZEOF(pool) = node_sizeof; for(node_pos = 0; node_pos < node_max_num; node_pos ++) { chfsnprb_node_init(pool, node_pos); chfsnprb_node_set_next(pool, node_pos, node_pos + 1); } chfsnprb_node_set_next(pool, node_max_num - 1, CHFSNPRB_ERR_POS); CHFSNPRB_POOL_FREE_HEAD(pool) = 0;/*the free nodes head*/ return (EC_TRUE); }
void ItemAwardManager::Taken(DWORD dwAwardID, DWORD dwItemID) { SetAwardMap::const_iterator it = m_map_award.find(dwAwardID); if (it == m_map_award.end()) { sys_log(0, "ITEM_AWARD: Taken ID not exist %lu", dwAwardID); return; } TItemAward * k = it->second; k->bTaken = true; // // Update taken_time in database to prevent not to give him again. // char szQuery[QUERY_MAX_LEN]; snprintf(szQuery, sizeof(szQuery), "UPDATE item_award SET taken_time=NOW(),item_id=%u WHERE id=%u AND taken_time IS NULL", dwItemID, dwAwardID); CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_AWARD_TAKEN, 0, NULL); }
static void daemon_cache_user_authorized_cb (Daemon *daemon, User *dummy, GDBusMethodInvocation *context, gpointer data) { const gchar *user_name = data; User *user; sys_log (context, "cache user '%s'", user_name); user = daemon_local_find_user_by_name (daemon, user_name); if (user == NULL) { throw_error (context, ERROR_USER_DOES_NOT_EXIST, "No user with the name %s found", user_name); return; } user_update_system_account_property (user, FALSE); cache_user (daemon, user); accounts_accounts_complete_cache_user (NULL, context, user_get_object_path (user)); }
void cnetcard_print(LOG *log, const CNETCARD *cnetcard) { sys_log(log, "device name : %s\n", (char *)cstring_get_str(CNETCARD_NAME(cnetcard))); sys_log(log, "device ip addr: %s (%lx)\n", (char *)cstring_get_str(CNETCARD_IPV4STR(cnetcard)), CNETCARD_IPV4VAL(cnetcard)); sys_log(log, "device mac addr: %s\n", (char *)cstring_get_str(CNETCARD_MACSTR(cnetcard))); if(CNETCARD_UP_STATE == CNETCARD_STATE(cnetcard)) { sys_log(log, "device state : UP\n"); } else if (CNETCARD_DOWN_STATE == CNETCARD_STATE(cnetcard)) { sys_log(log, "device state : DOWN\n"); } else { sys_log(log, "device state : UNKNOWN\n"); } }
void PC::EndRunning() { // unlocked locked npc { LPCHARACTER npc = CQuestManager::instance().GetCurrentNPCCharacterPtr(); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); // npc АЦѕъґш °жїм if (npc && !npc->IsPC()) { // ±Ч їЈЗЗѕѕ°Ў іЄїЎ°Ф ¶фАО °жїм if (ch->GetPlayerID() == npc->GetQuestNPCID()) { npc->SetQuestNPCID(0); sys_log(0, "QUEST NPC lock isn't unlocked : pid %u", ch->GetPlayerID()); CQuestManager::instance().WriteRunningStateToSyserr(); } } } // commit data if (HasReward()) { Save(); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch != NULL) { Reward(ch); ch->Save(); } } m_bIsGivenReward = false; if (m_iSendToClient) { sys_log(1, "QUEST end running %d", m_iSendToClient); SendQuestInfoPakcet(); } if (m_RunningQuestState == NULL) { sys_log(0, "Entered PC::EndRunning() with invalid running quest state"); return; } QuestState * pOldState = m_RunningQuestState; int iNowState = m_RunningQuestState->st; m_RunningQuestState = 0; if (m_iLastState != iNowState) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); DWORD dwQuestIndex = CQuestManager::instance().GetQuestIndexByName(m_stCurQuest); if (ch) { SetFlag(m_stCurQuest + ".__status", m_iLastState); CQuestManager::instance().LeaveState(ch->GetPlayerID(), dwQuestIndex, m_iLastState); pOldState->st = iNowState; SetFlag(m_stCurQuest + ".__status", iNowState); CQuestManager::instance().EnterState(ch->GetPlayerID(), dwQuestIndex, iNowState); if (GetFlag(m_stCurQuest + ".__status") == iNowState) CQuestManager::instance().Letter(ch->GetPlayerID(), dwQuestIndex, iNowState); } } DoQuestStateChange(); }
bool CHARACTER::AddAffect(DWORD dwType, BYTE bApplyOn, long lApplyValue, DWORD dwFlag, long lDuration, long lSPCost, bool bOverride, bool IsCube ) { // CHAT_BLOCK if (dwType == AFFECT_BLOCK_CHAT && lDuration > 1) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("운영자 제제로 채팅이 금지 되었습니다.")); } // END_OF_CHAT_BLOCK if (lDuration == 0) { sys_err("Character::AddAffect lDuration == 0 type %d", lDuration, dwType); lDuration = 1; } CAffect * pkAff = NULL; if (IsCube) pkAff = FindAffect(dwType,bApplyOn); else pkAff = FindAffect(dwType); if (dwFlag == AFF_STUN) { if (m_posDest.x != GetX() || m_posDest.y != GetY()) { m_posDest.x = m_posStart.x = GetX(); m_posDest.y = m_posStart.y = GetY(); battle_end(this); SyncPacket(); } } // 이미 있는 효과를 덮어 쓰는 처리 if (pkAff && bOverride) { ComputeAffect(pkAff, false); // 일단 효과를 삭제하고 if (GetDesc()) SendAffectRemovePacket(GetDesc(), GetPlayerID(), pkAff->dwType, pkAff->bApplyOn); } else { // // 새 에펙를 추가 // // NOTE: 따라서 같은 type 으로도 여러 에펙트를 붙을 수 있다. // pkAff = CAffect::Acquire(); m_list_pkAffect.push_back(pkAff); } sys_log(1, "AddAffect %s type %d apply %d %d flag %u duration %d", GetName(), dwType, bApplyOn, lApplyValue, dwFlag, lDuration); sys_log(0, "AddAffect %s type %d apply %d %d flag %u duration %d", GetName(), dwType, bApplyOn, lApplyValue, dwFlag, lDuration); pkAff->dwType = dwType; pkAff->bApplyOn = bApplyOn; pkAff->lApplyValue = lApplyValue; pkAff->dwFlag = dwFlag; pkAff->lDuration = lDuration; pkAff->lSPCost = lSPCost; WORD wMovSpd = GetPoint(POINT_MOV_SPEED); WORD wAttSpd = GetPoint(POINT_ATT_SPEED); ComputeAffect(pkAff, true); if (pkAff->dwFlag || wMovSpd != GetPoint(POINT_MOV_SPEED) || wAttSpd != GetPoint(POINT_ATT_SPEED)) UpdatePacket(); StartAffectEvent(); if (IsPC()) { SendAffectAddPacket(GetDesc(), pkAff); if (IS_NO_SAVE_AFFECT(pkAff->dwType)) return true; TPacketGDAddAffect p; p.dwPID = GetPlayerID(); p.elem.dwType = pkAff->dwType; p.elem.bApplyOn = pkAff->bApplyOn; p.elem.lApplyValue = pkAff->lApplyValue; p.elem.dwFlag = pkAff->dwFlag; p.elem.lDuration = pkAff->lDuration; p.elem.lSPCost = pkAff->lSPCost; db_clientdesc->DBPacket(HEADER_GD_ADD_AFFECT, 0, &p, sizeof(p)); } return true; }
int main_udp(int argc, char **argv) { UINT32 this_tcid; UINT32 this_comm; UINT32 this_rank; task_brd_default_init(argc, argv); if(EC_FALSE == task_brd_default_check_validity()) { sys_log(LOGSTDOUT, "error:main_trans: validity checking failed\n"); task_brd_default_abort(); return (-1); } this_tcid = task_brd_default_get_tcid(); this_comm = task_brd_default_get_comm(); this_rank = task_brd_default_get_rank(); if (EC_TRUE == task_brd_check_is_dbg_tcid(this_tcid) && CMPI_DBG_RANK == this_rank) { do_cmd_default(); } else if (EC_TRUE == task_brd_check_is_monitor_tcid(this_tcid) && CMPI_MON_RANK == this_rank) { void * mod_mgr_def; mod_mgr_def = mod_mgr_new(CMPI_ERROR_MODI, LOAD_BALANCING_LOOP); mod_mgr_default_init(mod_mgr_def, CMPI_ANY_TCID, CMPI_ANY_RANK); //mod_mgr_excl(this_tcid, CMPI_ANY_COMM, this_rank, CMPI_ANY_MODI, mod_mgr_def); sys_log(LOGSTDOUT, "======================================================================\n"); sys_log(LOGSTDOUT, " mod_mgr_default_init finished \n"); sys_log(LOGSTDOUT, "======================================================================\n"); mod_mgr_print(LOGSTDOUT, mod_mgr_def); mod_mgr_free(mod_mgr_def); do_slave_wait_default(); } /*fwd rank entrance*/ else if (c_ipv4_to_word("10.10.10.1") == this_tcid && CMPI_FWD_RANK == this_rank) { int sockfd; const char *mcast_ipaddr_str = "239.2.11.71";/*239.0.0.0бл239.255.255.255*/ UINT32 mcast_ipaddr; UINT32 mcast_port = 8888; mcast_ipaddr = c_ipv4_to_word(mcast_ipaddr_str); if(EC_FALSE == csocket_start_udp_mcast_recver(mcast_ipaddr, mcast_port, &sockfd)) { sys_log(LOGCONSOLE, "error:start udp server %s:%ld failed\n", mcast_ipaddr_str, mcast_port); } else { UINT8 data[256]; UINT32 dlen; sys_log(LOGCONSOLE, "start udp server %s:%ld\n", mcast_ipaddr_str, mcast_port); for(;EC_TRUE == csocket_udp_mcast_recvfrom(sockfd, mcast_ipaddr, mcast_port, data, sizeof(data)/sizeof(data[0]), &dlen);) { sys_log(LOGCONSOLE, "[DEBUG] recv udp data: %.*s\n", dlen, (char *)data); } csocket_stop_udp_mcast_recver(sockfd, mcast_ipaddr); } do_slave_wait_default(); } else if (c_ipv4_to_word("10.10.10.7") == this_tcid && CMPI_FWD_RANK == this_rank) { int sockfd; const char *mcast_ipaddr_str = "239.2.11.71"; UINT32 mcast_ipaddr; UINT32 mcast_port = 8888; UINT32 loop; mcast_ipaddr = c_ipv4_to_word(mcast_ipaddr_str); csocket_start_udp_mcast_sender(mcast_ipaddr, mcast_port, &sockfd); for(loop = 0; loop < 5; loop ++) { UINT8 data[256]; UINT32 dlen; snprintf((char *)data, sizeof(data)/sizeof(data[0]), "[loop %ld] hello world!", loop); dlen = strlen((char *)data); //dlen = sizeof(data)/sizeof(data[0]); if(EC_FALSE == csocket_udp_mcast_sendto(sockfd, mcast_ipaddr, mcast_port, data, dlen)) { sys_log(LOGSTDOUT, "error:send udp data to %s:%ld failed\n", mcast_ipaddr_str, mcast_port); break; } sys_log(LOGCONSOLE, "send udp data: %.*s\n", dlen, (char *)data); c_sleep(5); } csocket_stop_udp_mcast_sender(sockfd, c_ipv4_to_word(mcast_ipaddr_str)); do_slave_wait_default(); } else if (CMPI_FWD_RANK == this_rank) { sys_log(LOGSTDOUT,"======================================================================\n"); sys_log(LOGSTDOUT," taskc_mgr in (tcid %s, rank %ld) \n", c_word_to_ipv4(this_tcid), this_rank); super_show_work_client(task_brd_default_get_super(), LOGSTDOUT);/*debug only*/ sys_log(LOGSTDOUT,"======================================================================\n"); do_slave_wait_default(); } /*work process*/ else { do_slave_wait_default(); } return (0); }
int main_trans(int argc, char **argv) { UINT32 this_tcid; UINT32 this_comm; UINT32 this_rank; task_brd_default_init(argc, argv); if(EC_FALSE == task_brd_default_check_validity()) { sys_log(LOGSTDOUT, "error:main_trans: validity checking failed\n"); task_brd_default_abort(); return (-1); } this_tcid = task_brd_default_get_tcid(); this_comm = task_brd_default_get_comm(); this_rank = task_brd_default_get_rank(); if (EC_TRUE == task_brd_check_is_dbg_tcid(this_tcid) && CMPI_DBG_RANK == this_rank) { do_cmd_default(); } else if (EC_TRUE == task_brd_check_is_monitor_tcid(this_tcid) && CMPI_MON_RANK == this_rank) { void * mod_mgr_def; mod_mgr_def = mod_mgr_new(CMPI_ERROR_MODI, LOAD_BALANCING_LOOP); mod_mgr_default_init(mod_mgr_def, CMPI_ANY_TCID, CMPI_ANY_RANK); //mod_mgr_excl(this_tcid, CMPI_ANY_COMM, this_rank, CMPI_ANY_MODI, mod_mgr_def); sys_log(LOGSTDOUT, "======================================================================\n"); sys_log(LOGSTDOUT, " mod_mgr_default_init finished \n"); sys_log(LOGSTDOUT, "======================================================================\n"); mod_mgr_print(LOGSTDOUT, mod_mgr_def); mod_mgr_free(mod_mgr_def); do_slave_wait_default(); } /*fwd rank entrance*/ else if (c_ipv4_to_word("10.10.10.2") == this_tcid && CMPI_FWD_RANK == this_rank) { CSTRING *src_fname; CSTRING *des_fname; UINT32 des_tcid; src_fname = cstring_new((UINT8 *)"/home/ezhocha/bgn/bin/CentOS_4.4_DVD.iso", 0); des_fname = cstring_new((UINT8 *)"/home/ezhocha/bgn/bin/CentOS_4.4_DVD_des.iso", 0); des_tcid = c_ipv4_to_word("10.10.10.1"); super_transfer(0, src_fname, des_tcid, des_fname); do_slave_wait_default(); } else if (CMPI_FWD_RANK == this_rank) { sys_log(LOGSTDOUT,"======================================================================\n"); sys_log(LOGSTDOUT," taskc_mgr in (tcid %s, rank %ld) \n", c_word_to_ipv4(this_tcid), this_rank); super_show_work_client(task_brd_default_get_super(), LOGSTDOUT);/*debug only*/ sys_log(LOGSTDOUT,"======================================================================\n"); do_slave_wait_default(); } /*work process*/ else { do_slave_wait_default(); } return (0); }
void CParty::SendMessage(LPCHARACTER ch, BYTE bMsg, DWORD dwArg1, DWORD dwArg2) { if (ch->GetParty() != this) { sys_err("%s is not member of this party %p", ch->GetName(), this); return; } switch (bMsg) { case PM_ATTACK: break; case PM_RETURN: { TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { DWORD x = dwArg1 + number(-500, 500); DWORD y = dwArg2 + number(-500, 500); pkChr->SetVictim(NULL); pkChr->SetRotationToXY(x, y); if (pkChr->Goto(x, y)) { LPCHARACTER victim = pkChr->GetVictim(); sys_log(0, "%s %p RETURN victim %p", pkChr->GetName(), get_pointer(pkChr), get_pointer(victim)); pkChr->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0); } } } } break; case PM_ATTACKED_BY: // 공격 받았음, 리더에게 도움을 요청 { // 리더가 없을 때 LPCHARACTER pkChrVictim = ch->GetVictim(); if (!pkChrVictim) return; TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { if (pkChr->CanBeginFight()) pkChr->BeginFight(pkChrVictim); } } } break; case PM_AGGRO_INCREASE: { LPCHARACTER victim = CHARACTER_MANAGER::instance().Find(dwArg2); if (!victim) return; TMemberMap::iterator it = m_memberMap.begin(); while (it != m_memberMap.end()) { TMember & rMember = it->second; ++it; LPCHARACTER pkChr; if ((pkChr = rMember.pCharacter) && ch != pkChr) { pkChr->UpdateAggrPoint(victim, DAMAGE_TYPE_SPECIAL, dwArg1); } } } break; } }
void CParty::P2PJoin(DWORD dwPID) { TMemberMap::iterator it = m_memberMap.find(dwPID); if (it == m_memberMap.end()) { TMember Member; Member.pCharacter = NULL; Member.bNear = false; if (m_memberMap.empty()) { Member.bRole = PARTY_ROLE_LEADER; m_dwLeaderPID = dwPID; } else Member.bRole = PARTY_ROLE_NORMAL; if (m_bPCParty) { LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID); if (ch) { sys_log(0, "PARTY: Join %s pid %u leader %u", ch->GetName(), dwPID, m_dwLeaderPID); Member.strName = ch->GetName(); if (Member.bRole == PARTY_ROLE_LEADER) m_iLeadership = ch->GetLeadershipSkillLevel(); } else { CCI * pcci = P2P_MANAGER::instance().FindByPID(dwPID); if (!pcci); else if (pcci->bChannel == g_bChannel) Member.strName = pcci->szName; else sys_err("member is not in same channel PID: %u channel %d, this channel %d", dwPID, pcci->bChannel, g_bChannel); } } sys_log(2, "PARTY[%d] MemberCountChange %d -> %d", GetLeaderPID(), GetMemberCount(), GetMemberCount()+1); m_memberMap.insert(TMemberMap::value_type(dwPID, Member)); if (m_memberMap.size() == 1) m_itNextOwner = m_memberMap.begin(); if (m_bPCParty) { CPartyManager::instance().SetPartyMember(dwPID, this); SendPartyJoinOneToAll(dwPID); LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID); if (ch) SendParameter(ch); } } if (m_pkDungeon) { m_pkDungeon->QuitParty(this); } }
void CParty::Update() { sys_log(1, "PARTY::Update"); LPCHARACTER l = GetLeaderCharacter(); if (!l) return; TMemberMap::iterator it; int iNearMember = 0; bool bResendAll = false; for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; it->second.bNear = false; if (!ch) continue; if (l->GetDungeon()) it->second.bNear = l->GetDungeon() == ch->GetDungeon(); else it->second.bNear = (DISTANCE_APPROX(l->GetX()-ch->GetX(), l->GetY()-ch->GetY()) < PARTY_DEFAULT_RANGE); if (it->second.bNear) { ++iNearMember; //sys_log(0,"NEAR %s", ch->GetName()); } } if (iNearMember <= 1 && !l->GetDungeon()) { for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) it->second.bNear = false; iNearMember = 0; } if (iNearMember != m_iCountNearPartyMember) { m_iCountNearPartyMember = iNearMember; bResendAll = true; } m_iLeadership = l->GetLeadershipSkillLevel(); int iNewExpBonus = ComputePartyBonusExpPercent(); m_iAttBonus = ComputePartyBonusAttackGrade(); m_iDefBonus = ComputePartyBonusDefenseGrade(); if (m_iExpBonus != iNewExpBonus) { bResendAll = true; m_iExpBonus = iNewExpBonus; } bool bLongTimeExpBonusChanged = false; // 파티 결성 후 충분한 시간이 지나면 경험치 보너스를 받는다. if (!m_iLongTimeExpBonus && (get_dword_time() - m_dwPartyStartTime > PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS * 60 * 1000 / (g_iUseLocale?1:2))) { bLongTimeExpBonusChanged = true; m_iLongTimeExpBonus = 5; bResendAll = true; } for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; if (!ch) continue; if (bLongTimeExpBonusChanged && ch->GetDesc()) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("파티의 협동력이 높아져 지금부터 추가 경험치 보너스를 받습니다.")); bool bNear = it->second.bNear; ComputeRolePoint(ch, it->second.bRole, bNear); if (bNear) { if (!bResendAll) SendPartyInfoOneToAll(ch); } } // PARTY_ROLE_LIMIT_LEVEL_BUG_FIX m_anMaxRole[PARTY_ROLE_ATTACKER] = m_iLeadership >= 10 ? 1 : 0; m_anMaxRole[PARTY_ROLE_HASTE] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_TANKER] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_BUFFER] = m_iLeadership >= 25 ? 1 : 0; m_anMaxRole[PARTY_ROLE_SKILL_MASTER] = m_iLeadership >= 35 ? 1 : 0; m_anMaxRole[PARTY_ROLE_DEFENDER] = m_iLeadership >= 40 ? 1 : 0; m_anMaxRole[PARTY_ROLE_ATTACKER] += m_iLeadership >= 40 ? 1 : 0; // END_OF_PARTY_ROLE_LIMIT_LEVEL_BUG_FIX // Party Heal Update if (!m_bPartyHealReady) { if (!m_bCanUsePartyHeal && m_iLeadership >= 18) m_dwPartyHealTime = get_dword_time(); m_bCanUsePartyHeal = m_iLeadership >= 18; // 통솔력 18 이상은 힐을 사용할 수 있음. // 통솔력 40이상은 파티 힐 쿨타임이 적다. DWORD PartyHealCoolTime = (m_iLeadership >= 40) ? PARTY_HEAL_COOLTIME_SHORT * 60 * 1000 : PARTY_HEAL_COOLTIME_LONG * 60 * 1000; if (m_bCanUsePartyHeal) { if (get_dword_time() > m_dwPartyHealTime + PartyHealCoolTime) { m_bPartyHealReady = true; // send heal ready if (0) // XXX DELETEME 클라이언트 완료될때까지 if (GetLeaderCharacter()) GetLeaderCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "PartyHealReady"); } } } if (bResendAll) { for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) if (it->second.pCharacter) SendPartyInfoOneToAll(it->second.pCharacter); } }
UINT32 vmatrix_r_new_matrix_skeleton(const UINT32 vmatrixr_md_id, const UINT32 row_num, const UINT32 col_num, MATRIX *matrix) { VMATRIXR_MD *vmatrixr_md; UINT32 blocks_row_num; UINT32 blocks_col_num; UINT32 block_row_idx; UINT32 block_col_idx; UINT32 sub_row_num; UINT32 sub_col_num; //VMATRIX_BLOCK *vmatrix_block; CVECTOR *blocks; TASK_MGR *task_mgr; MOD_NODE *send_mod_node; UINT32 ret; #if ( SWITCH_ON == MATRIX_DEBUG_SWITCH ) if ( VMATRIXR_MD_ID_CHECK_INVALID(vmatrixr_md_id) ) { sys_log(LOGSTDOUT, "error:vmatrix_r_new_matrix_skeleton: matrixr module #0x%lx not started.\n", vmatrixr_md_id); dbg_exit(MD_VMATRIXR, vmatrixr_md_id); } #endif/*MATRIX_DEBUG_SWITCH*/ if( NULL_PTR == matrix ) { sys_log(LOGSTDERR,"error:vmatrix_r_new_matrix_skeleton: matrix is null pointer\n"); return ((UINT32)(-1)); } vmatrixr_md = VMATRIXR_MD_GET(vmatrixr_md_id); send_mod_node = &(vmatrixr_md->local_mod_node); /*set rotated_flag to default 0*/ MATRIX_SET_ROTATED_FLAG(matrix, 0); /*set row num and col num to matrix. not sure if it is suitable or not here*/ MATRIX_SET_ROW_NUM(matrix, row_num); MATRIX_SET_COL_NUM(matrix, col_num); blocks_row_num = MATRIX_GET_ROW_BLOCKS_NUM(matrix); blocks_col_num = MATRIX_GET_COL_BLOCKS_NUM(matrix); /*create matrix header*/ blocks = cvector_new(blocks_row_num * blocks_col_num, MM_VMM_NODE, LOC_VMATRIXR_0006); MATRIX_SET_BLOCKS(matrix, blocks); task_mgr = task_new(vmatrixr_md->mod_mgr, TASK_PRIO_NORMAL, TASK_NEED_RSP_FLAG, TASK_NEED_ALL_RSP); VMATRIX_ROW_COL_BLOCKS_LOOP_NEXT(matrix, block_row_idx, block_col_idx) { VMM_NODE *matrix_block_vmm; //vmm_alloc(vmatrixr_md->vmm_md_id, MD_VMATRIXR, MOD_NODE_MODI(recv_mod_node), MM_VMM_NODE, &vmm_node); alloc_static_mem(MD_VMATRIXR, vmatrixr_md_id, MM_VMM_NODE, &matrix_block_vmm, LOC_VMATRIXR_0007); cvector_push((CVECTOR *)blocks, (void *)matrix_block_vmm); task_inc(task_mgr, &ret, FI_vmatrix_r_alloc_block, ERR_MODULE_ID, matrix_block_vmm);/*alloc matrix block from virtual memory*/ }
bool CInputProcessor::Process(LPDESC lpDesc, const void * c_pvOrig, int iBytes, int & r_iBytesProceed) { const char * c_pData = (const char *) c_pvOrig; BYTE bLastHeader = 0; int iLastPacketLen = 0; int iPacketLen; if (!m_pPacketInfo) { sys_err("No packet info has been binded to"); return true; } for (m_iBufferLeft = iBytes; m_iBufferLeft > 0;) { BYTE bHeader = (BYTE) *(c_pData); const char * c_pszName; if (bHeader == 0) // 암호화 처리가 있으므로 0번 헤더는 스킵한다. iPacketLen = 1; else if (!m_pPacketInfo->Get(bHeader, &iPacketLen, &c_pszName)) { sys_err("UNKNOWN HEADER: %d, LAST HEADER: %d(%d), REMAIN BYTES: %d, fd: %d", bHeader, bLastHeader, iLastPacketLen, m_iBufferLeft, lpDesc->GetSocket()); //printdata((BYTE *) c_pvOrig, m_iBufferLeft); lpDesc->SetPhase(PHASE_CLOSE); return true; } if (m_iBufferLeft < iPacketLen) return true; if (bHeader) { if (test_server && bHeader != HEADER_CG_MOVE) sys_log(0, "Packet Analyze [Header %d][bufferLeft %d] ", bHeader, m_iBufferLeft); m_pPacketInfo->Start(); int iExtraPacketSize = Analyze(lpDesc, bHeader, c_pData); if (iExtraPacketSize < 0) return true; iPacketLen += iExtraPacketSize; lpDesc->Log("%s %d", c_pszName, iPacketLen); m_pPacketInfo->End(); } // TRAFFIC_PROFILER if (g_bTrafficProfileOn) TrafficProfiler::instance().Report(TrafficProfiler::IODIR_INPUT, bHeader, iPacketLen); // END_OF_TRAFFIC_PROFILER if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u %u", m_pPacketInfo->IsSequence(bHeader), *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); if (m_pPacketInfo->IsSequence(bHeader)) { BYTE bSeq = lpDesc->GetSequence(); BYTE bSeqReceived = *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)); if (bSeq != bSeqReceived) { sys_err("SEQUENCE %x mismatch 0x%x != 0x%x header %u", get_pointer(lpDesc), bSeq, bSeqReceived, bHeader); LPCHARACTER ch = lpDesc->GetCharacter(); char buf[1024]; int offset, len; offset = snprintf(buf, sizeof(buf), "SEQUENCE_LOG [%s]-------------\n", ch ? ch->GetName() : "UNKNOWN"); if (offset < 0 || offset >= (int) sizeof(buf)) offset = sizeof(buf) - 1; for (size_t i = 0; i < lpDesc->m_seq_vector.size(); ++i) { len = snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", lpDesc->m_seq_vector[i].hdr, lpDesc->m_seq_vector[i].seq); if (len < 0 || len >= (int) sizeof(buf) - offset) offset += (sizeof(buf) - offset) - 1; else offset += len; } snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", bHeader, bSeq); sys_err("%s", buf); lpDesc->SetPhase(PHASE_CLOSE); return true; } else { lpDesc->push_seq(bHeader, bSeq); lpDesc->SetNextSequence(); //sys_err("SEQUENCE %x match %u next %u header %u", lpDesc, bSeq, lpDesc->GetSequence(), bHeader); } } c_pData += iPacketLen; m_iBufferLeft -= iPacketLen; r_iBytesProceed += iPacketLen; iLastPacketLen = iPacketLen; bLastHeader = bHeader; if (GetType() != lpDesc->GetInputProcessor()->GetType()) return false; } return true; }
int main_csession(int argc, char **argv) { UINT32 this_tcid; UINT32 this_comm; UINT32 this_rank; task_brd_default_init(argc, argv); if(EC_FALSE == task_brd_default_check_validity()) { sys_log(LOGSTDOUT, "error:main_csession: validity checking failed\n"); task_brd_default_abort(); return (-1); } this_tcid = task_brd_default_get_tcid(); this_comm = task_brd_default_get_comm(); this_rank = task_brd_default_get_rank(); if (EC_TRUE == task_brd_check_is_dbg_tcid(this_tcid) && CMPI_DBG_RANK == this_rank) { do_cmd_default(); } else if (EC_TRUE == task_brd_check_is_monitor_tcid(this_tcid) && CMPI_MON_RANK == this_rank) { void * mod_mgr_def; mod_mgr_def = mod_mgr_new(CMPI_ERROR_MODI, LOAD_BALANCING_LOOP); mod_mgr_default_init(mod_mgr_def, CMPI_ANY_TCID, CMPI_ANY_RANK); //mod_mgr_excl(this_tcid, CMPI_ANY_COMM, this_rank, CMPI_ANY_MODI, mod_mgr_def); sys_log(LOGSTDOUT, "======================================================================\n"); sys_log(LOGSTDOUT, " mod_mgr_default_init finished \n"); sys_log(LOGSTDOUT, "======================================================================\n"); mod_mgr_print(LOGSTDOUT, mod_mgr_def); mod_mgr_free(mod_mgr_def); do_slave_wait_default(); } /*fwd rank entrance*/ else if (CMPI_FWD_RANK == this_rank) { UINT32 csession_md_id; sys_log(LOGSTDOUT,"======================================================================\n"); sys_log(LOGSTDOUT," taskc_mgr in (tcid %s, rank %ld) \n", c_word_to_ipv4(this_tcid), this_rank); super_show_work_client(task_brd_default_get_super(), LOGSTDOUT);/*debug only*/ sys_log(LOGSTDOUT,"======================================================================\n"); csession_md_id = csession_start(); sys_log(LOGSTDOUT, "[DEBUG] main_csession: csession_md_id = %ld\n", csession_md_id); do_slave_wait_default(); } /*work process*/ else { do_slave_wait_default(); } return (0); }
EC_BOOL lic_mac_collect(LIC_MAC *lic_mac_tbl, const UINT32 lic_mac_tbl_max_size, UINT32 *lic_mac_num) { int fd; UINT32 net_interface; struct ifreq buf[ LIC_INTERFACE_MAX_NUM ]; struct ifconf ifc; UINT32 lic_mac_idx; LIC_MAC *lic_mac; lic_mac_idx = 0; if ((fd = csocket_open(AF_INET, SOCK_DGRAM, 0)) >= 0) { ifc.ifc_len = sizeof(buf); ifc.ifc_buf = (caddr_t) buf; if (ioctl(fd, SIOCGIFCONF, (char *) &ifc)) { close(fd); return (EC_FALSE); } net_interface = sizeof(buf) / sizeof(buf[0]); if(net_interface > lic_mac_tbl_max_size) { net_interface = lic_mac_tbl_max_size; } while (net_interface -- > 0) { /*Jugde whether the net card status is promisc */ if (ioctl(fd, SIOCGIFFLAGS, (char *) &buf[net_interface])) { continue; } if (!(buf[net_interface].ifr_flags & IFF_UP)) { continue; } /*Get HW ADDRESS of the net card */ if (ioctl(fd, SIOCGIFHWADDR, (char *) &buf[net_interface])) { continue; } lic_mac = (lic_mac_tbl + lic_mac_idx); #if 0 sys_log(stdout, "HW address is:"); sys_print(stdout, "%02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[0], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[1], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[2], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[3], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[4], (unsigned char) buf[net_interface].ifr_hwaddr.sa_data[5]); #endif LIC_MAC_ADDR(lic_mac, 0) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[0]; LIC_MAC_ADDR(lic_mac, 1) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[1]; LIC_MAC_ADDR(lic_mac, 2) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[2]; LIC_MAC_ADDR(lic_mac, 3) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[3]; LIC_MAC_ADDR(lic_mac, 4) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[4]; LIC_MAC_ADDR(lic_mac, 5) = (UINT8)buf[net_interface].ifr_hwaddr.sa_data[5]; lic_mac_idx ++; } } close(fd); (*lic_mac_num) = lic_mac_idx; return (EC_TRUE); }
void lic_prikey_print(LOG *log, const BIGINT *prikey) { sys_log(log, "private key : "); print_bigint_dec(log, prikey); return; }
void PC::Save() { if (m_FlagSaveMap.empty()) return; static std::vector<TQuestTable> s_table; s_table.resize(m_FlagSaveMap.size()); int i = 0; TFlagMap::iterator it = m_FlagSaveMap.begin(); while (it != m_FlagSaveMap.end()) { const std::string & stComp = it->first; long lValue = it->second; ++it; int iPos = stComp.find("."); if (iPos < 0) { sys_err("quest::PC::Save : cannot find . in FlagMap"); continue; } string stName; stName.assign(stComp, 0, iPos); string stState; stState.assign(stComp, iPos + 1, stComp.length()); if (stName.length() == 0 || stState.length() == 0) { sys_err("quest::PC::Save : invalid quest data: %s", stComp.c_str()); continue; } sys_log(1, "QUEST Save Flag %s, %s %d (%d)", stName.c_str(), stState.c_str(), lValue, i); if (stName.length() >= QUEST_NAME_MAX_LEN) { sys_err("quest::PC::Save : quest name overflow"); continue; } if (stState.length() >= QUEST_STATE_MAX_LEN) { sys_err("quest::PC::Save : quest state overflow"); continue; } TQuestTable & r = s_table[i++]; r.dwPID = m_dwID; enhance_strlcpymt(r.szName, stName.c_str(), sizeof(r.szName)); enhance_strlcpymt(r.szState, stState.c_str(), sizeof(r.szState)); r.lValue = lValue; } if (i > 0) { sys_log(1, "QuestPC::Save %d", i); db_clientdesc->DBPacketHeader(HEADER_GD_QUEST_SAVE, 0, sizeof(TQuestTable) * i); db_clientdesc->Packet(&s_table[0], sizeof(TQuestTable) * i); } m_FlagSaveMap.clear(); }
EC_BOOL ccurl_get(const UINT32 ccurl_md_id, const CSTRING *url_str, const CSTRING *proxy_ip_port, CSTRING *curl_reply_body) { CURL *curl; CURLcode res; long status; #if ( SWITCH_ON == CCURL_DEBUG_SWITCH ) if ( CCURL_MD_ID_CHECK_INVALID(ccurl_md_id) ) { sys_log(LOGSTDOUT, "error:ccurl_get: ccurl module #0x%lx not started.\n", ccurl_md_id); ccurl_print_module_status(ccurl_md_id, LOGSTDOUT); dbg_exit(MD_CCURL, ccurl_md_id); } #endif/*CCURL_DEBUG_SWITCH*/ curl = curl_easy_init(); if(NULL_PTR == curl) { dbg_log(SEC_0030_CCURL, 0)(LOGSTDOUT, "error:ccurl_get: curl_easy_init failed\n"); return (EC_FALSE); } curl_easy_setopt(curl, CURLOPT_URL, (char *)cstring_get_str(url_str)); /* example.com is redirected, so we tell libcurl to follow redirection */ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_PROXY, (char *)cstring_get_str(proxy_ip_port)); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, __ccurl_write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_reply_body); curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 1L); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 120L); /*total download time in seconds*/ curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30L); /*total connect time in seconds*/ /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(CURLE_OK != res) { dbg_log(SEC_0030_CCURL, 0)(LOGSTDOUT, "error:ccurl_get:curl_easy_perform() failed: %s where url '%s'\n", curl_easy_strerror(res), (char *)cstring_get_str(url_str)); curl_easy_cleanup(curl); return (EC_FALSE); } res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &status); if(CURLE_OK != res) { dbg_log(SEC_0030_CCURL, 0)(LOGSTDOUT, "error:ccurl_get:curl_easy_getinfo() failed: %s where url '%s'\n", curl_easy_strerror(res), (char *)cstring_get_str(url_str)); curl_easy_cleanup(curl); return (EC_FALSE); } if(CCURL_HTTP_OK != status) { dbg_log(SEC_0030_CCURL, 0)(LOGSTDOUT, "error:ccurl_get:reply status %d not OK! where url '%s'\n", status, (char *)cstring_get_str(url_str)); curl_easy_cleanup(curl); return (EC_FALSE); } /* always cleanup */ curl_easy_cleanup(curl); dbg_log(SEC_0030_CCURL, 9)(LOGSTDOUT, "[DEBUG] ccurl_get: GET '%s' from '%s' done\n", (char *)cstring_get_str(url_str), (char *)cstring_get_str(proxy_ip_port)); return (EC_TRUE); }
int CInputHandshake::Analyze(LPDESC d, BYTE bHeader, const char * c_pData) { if (bHeader == 10) // 엔터는 무시 return 0; if (bHeader == HEADER_CG_TEXT) { ++c_pData; const char * c_pSep; if (!(c_pSep = strchr(c_pData, '\n'))) // \n을 찾는다. return -1; if (*(c_pSep - 1) == '\r') --c_pSep; std::string stResult; std::string stBuf; stBuf.assign(c_pData, 0, c_pSep - c_pData); sys_log(0, "SOCKET_CMD: FROM(%s) CMD(%s)", d->GetHostName(), stBuf.c_str()); if (!stBuf.compare("IS_SERVER_UP")) { if (g_bNoMoreClient) stResult = "NO"; else stResult = "YES"; } else if (!stBuf.compare("IS_PASSPOD_UP")) { if (g_bNoPasspod) stResult = "NO"; else stResult = "YES"; } //else if (!stBuf.compare("SHOWMETHEMONEY")) else if (stBuf == g_stAdminPagePassword) { if (!IsEmptyAdminPage()) { if (!IsAdminPage(inet_ntoa(d->GetAddr().sin_addr))) { char szTmp[64]; snprintf(szTmp, sizeof(szTmp), "WEBADMIN : Wrong Connector : %s", inet_ntoa(d->GetAddr().sin_addr)); stResult += szTmp; } else { d->SetAdminMode(); stResult = "UNKNOWN"; } } else { d->SetAdminMode(); stResult = "UNKNOWN"; } } else if (!stBuf.compare("USER_COUNT")) { char szTmp[64]; if (!IsEmptyAdminPage()) { if (!IsAdminPage(inet_ntoa(d->GetAddr().sin_addr))) { snprintf(szTmp, sizeof(szTmp), "WEBADMIN : Wrong Connector : %s", inet_ntoa(d->GetAddr().sin_addr)); } else { int iTotal; int * paiEmpireUserCount; int iLocal; DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal); snprintf(szTmp, sizeof(szTmp), "%d %d %d %d %d", iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal); } } else { int iTotal; int * paiEmpireUserCount; int iLocal; DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal); snprintf(szTmp, sizeof(szTmp), "%d %d %d %d %d", iTotal, paiEmpireUserCount[1], paiEmpireUserCount[2], paiEmpireUserCount[3], iLocal); } stResult += szTmp; } else if (!stBuf.compare("CHECK_P2P_CONNECTIONS")) { std::ostringstream oss(std::ostringstream::out); oss << "P2P CONNECTION NUMBER : " << P2P_MANAGER::instance().GetDescCount() << "\n"; std::string hostNames; P2P_MANAGER::Instance().GetP2PHostNames(hostNames); oss << hostNames; stResult = oss.str(); TPacketGGCheckAwakeness packet; packet.bHeader = HEADER_GG_CHECK_AWAKENESS; P2P_MANAGER::instance().Send(&packet, sizeof(packet)); } else if (!stBuf.compare("PACKET_INFO")) { m_pMainPacketInfo->Log("packet_info.txt"); stResult = "OK"; } else if (!stBuf.compare("PROFILE")) { CProfiler::instance().Log("profile.txt"); stResult = "OK"; } //gift notify delete command else if (!stBuf.compare(0,15,"DELETE_AWARDID ")) { char szTmp[64]; std::string msg = stBuf.substr(15,26); // item_award의 id범위? TPacketDeleteAwardID p; p.dwID = (DWORD)(atoi(msg.c_str())); snprintf(szTmp,sizeof(szTmp),"Sent to DB cache to delete ItemAward, id: %d",p.dwID); //sys_log(0,"%d",p.dwID); // strlcpy(p.login, msg.c_str(), sizeof(p.login)); db_clientdesc->DBPacket(HEADER_GD_DELETE_AWARDID, 0, &p, sizeof(p)); stResult += szTmp; } else { stResult = "UNKNOWN"; if (d->IsAdminMode()) { // 어드민 명령들 if (!stBuf.compare(0, 7, "NOTICE ")) { std::string msg = stBuf.substr(7, 50); LogManager::instance().CharLog(0, 0, 0, 1, "NOTICE", msg.c_str(), d->GetHostName()); BroadcastNotice(msg.c_str()); } else if (!stBuf.compare("CLOSE_PASSPOD")) { g_bNoPasspod = true; stResult += "CLOSE_PASSPOD"; } else if (!stBuf.compare("OPEN_PASSPOD")) { g_bNoPasspod = false; stResult += "OPEN_PASSPOD"; } else if (!stBuf.compare("SHUTDOWN")) { LogManager::instance().CharLog(0, 0, 0, 2, "SHUTDOWN", "", d->GetHostName()); TPacketGGShutdown p; p.bHeader = HEADER_GG_SHUTDOWN; P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShutdown)); sys_err("Accept shutdown command from %s.", d->GetHostName()); Shutdown(10); } else if (!stBuf.compare("SHUTDOWN_ONLY")) { LogManager::instance().CharLog(0, 0, 0, 2, "SHUTDOWN", "", d->GetHostName()); sys_err("Accept shutdown only command from %s.", d->GetHostName()); Shutdown(10); } else if (!stBuf.compare(0, 3, "DC ")) { std::string msg = stBuf.substr(3, LOGIN_MAX_LEN); dev_log(LOG_DEB0, "DC : '%s'", msg.c_str()); TPacketGGDisconnect pgg; pgg.bHeader = HEADER_GG_DISCONNECT; strlcpy(pgg.szLogin, msg.c_str(), sizeof(pgg.szLogin)); P2P_MANAGER::instance().Send(&pgg, sizeof(TPacketGGDisconnect)); // delete login key { TPacketDC p; strlcpy(p.login, msg.c_str(), sizeof(p.login)); db_clientdesc->DBPacket(HEADER_GD_DC, 0, &p, sizeof(p)); } } else if (!stBuf.compare(0, 10, "RELOAD_CRC")) { LoadValidCRCList(); BYTE bHeader = HEADER_GG_RELOAD_CRC_LIST; P2P_MANAGER::instance().Send(&bHeader, sizeof(BYTE)); stResult = "OK"; } else if (!stBuf.compare(0, 20, "CHECK_CLIENT_VERSION")) { CheckClientVersion(); BYTE bHeader = HEADER_GG_CHECK_CLIENT_VERSION; P2P_MANAGER::instance().Send(&bHeader, sizeof(BYTE)); stResult = "OK"; } else if (!stBuf.compare(0, 6, "RELOAD")) { if (stBuf.size() == 6) { LoadStateUserCount(); db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0); DBManager::instance().LoadDBString(); } else { char c = stBuf[7]; switch (LOWER(c)) { case 'u': LoadStateUserCount(); break; case 'p': db_clientdesc->DBPacket(HEADER_GD_RELOAD_PROTO, 0, NULL, 0); break; case 's': DBManager::instance().LoadDBString(); break; case 'q': quest::CQuestManager::instance().Reload(); break; case 'f': fishing::Initialize(); break; case 'a': db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0); sys_log(0, "Reloading admin infomation."); break; } } } else if (!stBuf.compare(0, 6, "EVENT ")) { std::istringstream is(stBuf); std::string strEvent, strFlagName; long lValue; is >> strEvent >> strFlagName >> lValue; if (!is.fail()) { sys_log(0, "EXTERNAL EVENT FLAG name %s value %d", strFlagName.c_str(), lValue); quest::CQuestManager::instance().RequestSetEventFlag(strFlagName, lValue); stResult = "EVENT FLAG CHANGE "; stResult += strFlagName; } else { stResult = "EVENT FLAG FAIL"; } } // BLOCK_CHAT else if (!stBuf.compare(0, 11, "BLOCK_CHAT ")) { std::istringstream is(stBuf); std::string strBlockChat, strCharName; long lDuration; is >> strBlockChat >> strCharName >> lDuration; if (!is.fail()) { sys_log(0, "EXTERNAL BLOCK_CHAT name %s duration %d", strCharName.c_str(), lDuration); do_block_chat(NULL, const_cast<char*>(stBuf.c_str() + 11), 0, 0); stResult = "BLOCK_CHAT "; stResult += strCharName; } else { stResult = "BLOCK_CHAT FAIL"; } }