/* args: - managed_svc - pointer to svc table - is_in_ipvs - function stores status is a virtual defined in ipvs (status is saved here only if (is_in_ipvs != NULL) */ int ipvsfuncs_del_unmanaged_services(ipvs_service_t **managed_svc, gint *is_in_ipvs) { int i, idx, found; ipvs_service_t **m; struct ip_vs_service_entry *se; struct ip_vs_get_services *vs; ipvsfuncs_reinitialize(); //if someone clears IPVS ipvs_get_services returns vs table which contains crap inside vs = ipvs_get_services(); if (!vs) return -1; LOGDETAIL("vs = %x, vs->num_services = %d", vs, vs->num_services); for (i = 0; i < vs->num_services; i++) { se = &vs->entrytable[i]; LOGDETAIL("del_umanaged_services check: [%d], ip=%x, port=%d, protocol=%d, fwmark=%d", i, ntohl(se->addr.ip), ntohs(se->port), se->protocol, se->fwmark); m = managed_svc; found = 0; idx = 0; while (*m) { LOGDETAIL(" * compare to [%x:%d proto=%d fwmark=%d]", ntohl((*m)->addr.ip), ntohs((*m)->port), (*m)->protocol, (*m)->fwmark); if ((*m)->addr.ip == se->addr.ip && (*m)->port == se->port && (*m)->protocol == se->protocol && (*m)->fwmark == se->fwmark) { found = 1; if (is_in_ipvs) is_in_ipvs[idx] = 1; break; } m++; idx++; } if (!found) { LOGDEBUG("Delete unmanaged virtual: ip=%s, port=%d, protocol=%d, fwmark=%d", INETTXTADDR(se->addr.ip), ntohs(se->port), se->protocol, se->fwmark); ipvsfuncs_del_service_entry((struct ip_vs_service_entry *)se); } } free(vs); // ipvsfuncs_fprintf_ipvs(stderr); return 0; }
void lock_ipvssync() { LOGDETAIL("lock_ipvssync"); if (lockfd < 0) lockfd = open(G_lock_sync_file, 0, S_IRWXU | S_IRGRP | S_IROTH); if (lockfd < 0) { fprintf(stderr, "Can't open lockfile: %s [error=%s]\n", G_lock_sync_file, STRERROR); exit(1); } flock(lockfd, LOCK_EX); }
int CLoginHandler::LoginRole(const RoleID& stRoleID, TNetHead_V2* pNetHead, const Zone_LoginServer_Request& rstRequest) { ASSERT_AND_LOG_RTN_INT(pNetHead); int iSessionID = (int)ntohl(pNetHead->m_uiSocketFD); LOGDETAIL("Login Req: Uin = %u, Session = %d\n", stRoleID.uin(), iSessionID); // 该Session已经存在 CSessionManager* pSessionManager = CModuleHelper::GetSessionManager(); CGameSessionObj* pSessionObj = pSessionManager->FindSessionByID(iSessionID); if (pSessionObj) { LOGERROR("Session Already Exist: ID = %d\n", iSessionID); return -2; } // 该RoleID的Session已经存在,且处于未登录状态 pSessionObj = pSessionManager->FindSessionByRoleID(stRoleID); if (pSessionObj && pSessionObj->GetBindingRole() == NULL) { LOGERROR("Session Alreay Binding Role: ID = %d, Uin = %u\n", iSessionID, stRoleID.uin()); return -3; } // 创建一个新的会话 pSessionObj = pSessionManager->CreateSession(pNetHead, stRoleID); if(!pSessionObj) { LOGERROR("Cannot Create Session: Uin = %u, SessionID = %d\n", stRoleID.uin(), iSessionID); return -2; } // 保存客户端版本号 pSessionObj->SetClientVersion(rstRequest.uclientversion()); //保存登录原因 pSessionObj->SetLoginReason(rstRequest.uloginreason()); // 向World发送踢人请求,相同uin的都踢下去 int iRet = KickRoleFromWorldServer(stRoleID, iSessionID); if (iRet < 0) { CModuleHelper::GetSessionManager()->DeleteSession(iSessionID); } return iRet; }
/* ---------------------------------------------------------------------- */ gint diffs_clean_old_files(Config *conf) { GDir *dir; const gchar *de; gchar *diffname; gchar *ffname; gint matched = 0; struct timeval ctime; gettimeofday(&ctime, NULL); if (ctime.tv_sec - conf->last_diffs_cleanup.tv_sec < DIFFS_CLEANUP_SEC) { LOGDETAIL("Cleanup time not reached curr[%d], last[%d], diff[%d]", ctime.tv_sec, conf->last_diffs_cleanup.tv_sec, ctime.tv_sec - conf->last_diffs_cleanup.tv_sec); return 0; } dir = g_dir_open(G_diff_sync_dir, 0, NULL); if (!dir) { G_logfd = STDERR_FILENO; LOGERROR("Can't open directory: %s", G_diff_sync_dir); exit(1); } diffname = g_path_get_basename(conf->diff_filename); while ((de = g_dir_read_name(dir))) { if (strcmp(de, diffname) >= 0) continue; LOGINFO("diff file [%s] < current diff [%s], removing", de, diffname); ffname = g_build_filename(G_diff_sync_dir, de, NULL); if (unlink(ffname)) LOGERROR("Problem removing diff [%s]", ffname); else matched++; g_free(ffname); }; g_free(diffname); g_dir_close(dir); conf->last_diffs_cleanup = ctime; LOGINFO("diffs cleanup, matched %d files", matched); return matched; }
/* ---------------------------------------------------------------------- */ gint sd_cmd_listen_socket_create(gchar *addr, u_int16_t lport) { struct sockaddr_in sa; SDClient *server = NULL; gchar *localhost = "127.0.0.1"; int reuseaddr = 1; LOGDETAIL("%s()", __PRETTY_FUNCTION__); listen_sock = sd_socket_nb(SOCK_STREAM); if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (const void *) &reuseaddr, sizeof(int)) == -1) { LOGERROR("Unable to reuse listen_sock [%s]", STRERROR); } if (!strlen(addr)) addr = localhost; sa.sin_family = PF_INET; sa.sin_port = htons(lport); sa.sin_addr.s_addr = inet_addr(addr); LOGINFO("Binding cmd interface to [%s:%d]", addr, lport); if (bind(listen_sock, (struct sockaddr *)&sa, sizeof(sa))) { LOGERROR("Unable to bind to socket: [%s:%d] [syserror = %s]", addr, lport, STRERROR); exit(1); } if (listen(listen_sock, MAX_CLIENTS)) { LOGERROR("Unable to listen()"); return -1; } server = (SDClient *) malloc(sizeof(SDClient)); server->fd = listen_sock; if (!cmd_epoll) cmd_epoll = sd_epoll_new(MAX_CLIENTS+1); sd_epoll_ctl(cmd_epoll, EPOLL_CTL_ADD, listen_sock, server, EPOLLIN); return listen_sock; }
/* Split line into hash table, returns GHashTable */ GHashTable *sd_parse_line(gchar *line) { GHashTable *ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_assert(ht); gchar **strv = g_strsplit_set(line, " \t", 0); gchar **v; v = strv; while ( *v ) { gchar **kvstrv = g_strsplit_set(*v, "=", 0); if (kvstrv[0] && kvstrv[1]) { LOGDETAIL("* key = %s, val = %s", kvstrv[0], kvstrv[1]); g_hash_table_insert(ht, g_strdup(kvstrv[0]), g_strdup(kvstrv[1])); } g_strfreev(kvstrv); v++; } g_strfreev(strv); return ht; }
/* ---------------------------------------------------------------------- */ gboolean ipvsfuncs_set_svc_from_ht(ipvs_service_t *svc, GHashTable *ht) { gchar *vproto, *vaddr, *vport, *vsched, *vpers, *vops, *v; u_int16_t svcproto = IPPROTO_TCP; guint vfwmark = 0; __be32 netmask = ~0; unsigned timeout = 0; unsigned flags = 0; /* svcproto */ vproto = g_hash_table_lookup(ht, "vproto"); LOGDETAIL("vproto = [%s]", vproto); if (!vproto) { LOGERROR("No vproto set"); return FALSE; } if (strcmp(vproto, "tcp") && strcmp(vproto, "udp") && strcmp(vproto, "fwmark")) { LOGERROR("Unknown protocol [%s]", vproto); return FALSE; } if (!strcmp(vproto, "udp")) svcproto = IPPROTO_UDP; else if (!strcmp(vproto, "fwmark")) { vfwmark = 300; v = g_hash_table_lookup(ht, "vfwmark"); if (v) vfwmark = atoi(v); } vaddr = g_hash_table_lookup(ht, "vaddr"); if (!vaddr) { LOGERROR("No vaddr set"); return FALSE; } vport = g_hash_table_lookup(ht, "vport"); if (!vport) { LOGERROR("No vport set"); return FALSE; } /* vsched */ vsched = g_hash_table_lookup(ht, "vsched"); if (!vsched) { LOGERROR("No vsched set"); return FALSE; } /* Get persistent timeout if defined */ vpers = g_hash_table_lookup(ht, "vpers"); if (vpers) { flags |= IP_VS_SVC_F_PERSISTENT; timeout = atoi(vpers); } /* Get "one packet scheduler" if defined */ vops = g_hash_table_lookup(ht, "vops"); if (vops) { flags |= IP_VS_SVC_F_ONEPACKET; } ipvsfuncs_set_svc(svcproto, vaddr, vport, vfwmark, vsched, flags, timeout, netmask, svc); return TRUE; }
static CfgVirtual *sd_cmd_find_virt(GPtrArray *VCfgArr, GHashTable *ht, gchar *errbuf) { CfgVirtual *virt = NULL; gchar *vaddr, *vport, *vproto, *vfwmark; gint i; gboolean found = FALSE; in_addr_t addr; u_int16_t port; SDIPVSProtocol proto; u_int32_t fwmark; gchar *defaddr = "0.0.0.0"; gchar *deffwmark = "0"; vaddr = g_hash_table_lookup(ht, "vaddr"); if (!vaddr) vaddr = defaddr; vport = g_hash_table_lookup(ht, "vport"); if (!vport) vport = deffwmark; vproto = g_hash_table_lookup(ht, "vproto"); if (!vproto) { if (errbuf) strcpy(errbuf, "cmd_find_virt: No vproto specified\n"); return NULL; } vfwmark = g_hash_table_lookup(ht, "vfwmark"); if (!vfwmark) { vfwmark = deffwmark; } addr = inet_addr(vaddr); port = htons(atoi(vport)); proto = sd_proto_no(vproto); fwmark = atoi(vfwmark); if (addr == -1) { LOGINFO("[^] logic: find_virt() invalid IP"); return NULL; } for (i = 0; i < VCfgArr->len; i++) { virt = (CfgVirtual *) g_ptr_array_index(VCfgArr, i); LOGDETAIL("addr = %x==%x, %d==%d, %d==%d, %d==%d", virt->addr, addr, virt->port, port, virt->ipvs_proto, proto, virt->ipvs_fwmark, fwmark); if (fwmark > 0 && virt->ipvs_fwmark > 0 && !(virt->ipvs_fwmark - fwmark)) { found = TRUE; break; } if (!virt->ipvs_fwmark && virt->addr == addr && virt->port == port && virt->ipvs_proto == proto) { found = TRUE; break; } } if (!found) { if (errbuf) strcpy(errbuf, "cmd_find_virt: Virt not found\n"); return NULL; } return virt; }
void unlock_ipvssync() { LOGDETAIL("unlock_ipvssync"); flock(lockfd, LOCK_UN); }