/** * Console Command Parser * Transmited from command cli.cpp * note common name for all serv do not rename (extern in cli) * @author [Wizputer] * @param buf: buffer to parse, (from console) * @return 1=success */ int cnslif_parse(const char* buf){ char type[64]; char command[64]; int n=0; if( ( n = sscanf(buf, "%127[^:]:%255[^\n\r]", type, command) ) < 2 ){ if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg } if( n != 2 ){ //end string ShowNotice("Type: '%s'\n",type); command[0] = '\0'; } else ShowNotice("Type of command: '%s' || Command: '%s'\n",type,command); if( n == 2 ){ if(strcmpi("server", type) == 0 ){ if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){ runflag = 0; } else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 ) ShowInfo(CL_CYAN "Console: " CL_BOLD "I'm Alive." CL_RESET"\n"); else if( strcmpi("reloadconf", command) == 0 ) { ShowInfo("Reloading config file \"%s\"\n", login_config.loginconf_name); login_config_read(login_config.loginconf_name, false); } } if( strcmpi("create",type) == 0 ) { char username[NAME_LENGTH], password[NAME_LENGTH], md5password[32+1], sex; //23+1 plaintext 32+1 md5 bool md5 = 0; if( sscanf(command, "%23s %23s %c", username, password, &sex) < 3 || strnlen(username, sizeof(username)) < 4 || strnlen(password, sizeof(password)) < 1 ){ ShowWarning("Console: Invalid parameters for '%s'. Usage: %s <username> <password> <sex:F/M>\n", type, type); return 0; } if( login_config.use_md5_passwds ){ MD5_String(password,md5password); md5 = 1; } if( login_mmo_auth_new(username,(md5?md5password:password), TOUPPER(sex), "0.0.0.0") != -1 ){ ShowError("Console: Account creation failed.\n"); return 0; } ShowStatus("Console: Account '%s' created successfully.\n", username); } } else if( strcmpi("ers_report", type) == 0 ){ ers_report(); } else if( strcmpi("help", type) == 0 ){ ShowInfo("Available commands:\n"); ShowInfo("\t server:shutdown => Stops the server.\n"); ShowInfo("\t server:alive => Checks if the server is running.\n"); ShowInfo("\t server:reloadconf => Reload config file: \"%s\"\n", login_config.loginconf_name); ShowInfo("\t ers_report => Displays database usage.\n"); ShowInfo("\t create:<username> <password> <sex:M|F> => Creates a new account.\n"); } return 1; }
int login_config_read(const char* cfgName) { int i; char line[1024], w1[1024], w2[1024]; FILE *fp; ShowStatus("Start reading interserver configuration: %s\n", cfgName); fp=fopen(cfgName,"r"); if(fp==NULL){ ShowError("File not found: %s\n", cfgName); return 1; } while(fgets(line, sizeof(line), fp)) { if(line[0] == '/' && line[1] == '/') continue; i=sscanf(line,"%[^:]:%s", w1, w2); if(i!=2) continue; //add for DB connection if(strcmpi(w1,"db_server_ip")==0){ strcpy(db_server_ip, w2); ShowStatus("set db_server_ip : %s\n",w2); } else if(strcmpi(w1,"db_server_port")==0){ db_server_port=atoi(w2); ShowStatus("set db_server_port : %s\n",w2); } else if(strcmpi(w1,"db_server_id")==0){ strcpy(db_server_id, w2); ShowStatus("set db_server_id : %s\n",w2); } else if(strcmpi(w1,"db_server_pw")==0){ strcpy(db_server_pw, w2); ShowStatus("set db_server_pw : %s\n",w2); } else if(strcmpi(w1,"db_server_logindb")==0){ strcpy(db_server_logindb, w2); ShowStatus("set db_server_logindb : %s\n",w2); } //support the import command, just like any other config else if(strcmpi(w1,"import")==0){ login_config_read(w2); } } fclose(fp); ShowStatus("End reading interserver configuration...\n"); return 0; }
int do_init(int argc, char** argv) { int input; login_config_read( (argc > 1) ? argv[1] : INTER_CONF_NAME ); read_gm_account(); ShowInfo("\nWarning : Make sure you backup your databases before continuing!\n"); ShowInfo("\nDo you wish to convert your Login Database to SQL? (y/n) : "); input = getchar(); if(input == 'y' || input == 'Y') convert_login(); return 0; }
int do_init(int argc,char **argv) { char input; login_config_read( (argc>1)?argv[1]:INTER_CONF_NAME ); read_gm_account(); printf("\nWarning : Make sure you backup your databases before continuing!\n"); printf("\nDo you wish to convert your Login Database to SQL? (y/n) : "); input=getchar(); if(input == 'y' || input == 'Y') mmo_auth_init(); printf ("Everything's been converted!\n"); exit (0); }
int32 do_init(int32 argc, char** argv) { int32 i; LOGIN_CONF_FILENAME = "conf/login_darkstar.conf"; VERSION_INFO_FILENAME = "version.info"; const char *lan_cfgName = LAN_CONFIG_NAME; //srand(gettick()); for (i = 1; i < argc; i++) { if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0) login_helpscreen(1); else if (strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "--v") == 0 || strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "/v") == 0) login_versionscreen(1); else if (strcmp(argv[i], "--login_config") == 0 || strcmp(argv[i], "--login-config") == 0) LOGIN_CONF_FILENAME = argv[i + 1]; else if (strcmp(argv[i], "--lan_config") == 0 || strcmp(argv[i], "--lan-config") == 0) lan_cfgName = argv[i + 1]; else if (strcmp(argv[i], "--run_once") == 0) // close the map-server as soon as its done.. for testing [Celest] runflag = 0; } //lan_config_default(&lan_config); //lan_config_read(lan_cfgName,&lan_config); login_config_default(); login_config_read(LOGIN_CONF_FILENAME); version_info_default(); version_info_read(VERSION_INFO_FILENAME); login_fd = makeListenBind_tcp(login_config.uiLoginAuthIp, login_config.usLoginAuthPort, connect_client_login); ShowStatus("The login-server-auth is " CL_GREEN"ready" CL_RESET" (Server is listening on the port %u).\n\n", login_config.usLoginAuthPort); login_lobbydata_fd = makeListenBind_tcp(login_config.uiLobbyDataIp, login_config.usLobbyDataPort, connect_client_lobbydata); ShowStatus("The login-server-lobbydata is " CL_GREEN"ready" CL_RESET" (Server is listening on the port %u).\n\n", login_config.usLobbyDataPort); login_lobbyview_fd = makeListenBind_tcp(login_config.uiLobbyViewIp, login_config.usLobbyViewPort, connect_client_lobbyview); ShowStatus("The login-server-lobbyview is " CL_GREEN"ready" CL_RESET" (Server is listening on the port %u).\n\n", login_config.usLobbyViewPort); SqlHandle = Sql_Malloc(); if (Sql_Connect(SqlHandle, login_config.mysql_login, login_config.mysql_password, login_config.mysql_host, login_config.mysql_port, login_config.mysql_database) == SQL_ERROR) { exit(EXIT_FAILURE); } Sql_Keepalive(SqlHandle); const char *fmtQuery = "OPTIMIZE TABLE `accounts`,`accounts_banned`, `accounts_sessions`, `chars`,`char_equip`, \ `char_inventory`, `char_jobs`,`char_look`,`char_stats`, `char_vars`, `char_bazaar_msg`, \ `char_skills`, `char_titles`, `char_effects`, `char_exp`;"; if (Sql_Query(SqlHandle, fmtQuery) == SQL_ERROR) { ShowError("do_init: Impossible to optimise tables\n"); } messageThread = std::thread(message_server_init); ShowStatus("The login-server is " CL_GREEN"ready" CL_RESET" to work...\n"); return 0; }
int32 login_config_read(const char *cfgName) { char line[1024], w1[1024], w2[1024]; FILE *fp; fp = fopen(cfgName, "r"); if (fp == nullptr) { ShowError("login configuration file not found at: %s\n", cfgName); return 1; } while (fgets(line, sizeof(line), fp)) { char* ptr; if (line[0] == '#') continue; if (sscanf(line, "%[^:]: %[^\t\r\n]", w1, w2) < 2) continue; //Strip trailing spaces ptr = w2 + strlen(w2); while (--ptr >= w2 && *ptr == ' '); ptr++; *ptr = '\0'; if (strcmpi(w1, "timestamp_format") == 0) { strncpy(timestamp_format, w2, 19); } else if (strcmpi(w1, "stdout_with_ansisequence") == 0) { stdout_with_ansisequence = config_switch(w2); } else if (strcmpi(w1, "console_silent") == 0) { ShowInfo("Console Silent Setting: %d\n", atoi(w2)); msg_silent = atoi(w2); } else if (strcmp(w1, "mysql_host") == 0) { login_config.mysql_host = aStrdup(w2); } else if (strcmp(w1, "mysql_login") == 0) { login_config.mysql_login = aStrdup(w2); } else if (strcmp(w1, "mysql_password") == 0) { login_config.mysql_password = aStrdup(w2); } else if (strcmp(w1, "mysql_port") == 0) { login_config.mysql_port = atoi(w2); } else if (strcmp(w1, "mysql_database") == 0) { login_config.mysql_database = aStrdup(w2); } else if (strcmp(w1, "search_server_port") == 0) { login_config.search_server_port = atoi(w2); } else if (strcmp(w1, "expansions") == 0) { login_config.expansions = atoi(w2); } else if (strcmp(w1, "servername") == 0) { login_config.servername = aStrdup(w2); } else if (strcmpi(w1, "import") == 0) { login_config_read(w2); } else if (strcmp(w1, "msg_server_port") == 0) { login_config.msg_server_port = atoi(w2); } else if (strcmp(w1, "msg_server_ip") == 0) { login_config.msg_server_ip = aStrdup(w2); } else { ShowWarning("Unknown setting '%s' in file %s\n", w1, cfgName); } } fclose(fp); return 0; }
int32 main (int32 argc, int8 **argv) { #ifdef WIN32 WSADATA wsaData; #endif int iResult; SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET; struct addrinfo *result = NULL; struct addrinfo hints; search_config_default(); search_config_read(SEARCH_CONF_FILENAME); login_config_read(LOGIN_CONF_FILENAME); #ifdef WIN32 // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { ShowError("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory(&hints, sizeof(hints)); #else memset(&hints, 0, sizeof(hints)); #endif hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the server address and port iResult = getaddrinfo(NULL, login_config.search_server_port, &hints, &result); if (iResult != 0) { ShowError("getaddrinfo failed with error: %d\n", iResult); #ifdef WIN32 WSACleanup(); #endif return 1; } // Create a SOCKET for connecting to server ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { #ifdef WIN32 ShowError("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); #else ShowError("socket failed with error: %ld\n", errno); freeaddrinfo(result); #endif return 1; } // Setup the TCP listening socket iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { #ifdef WIN32 ShowError("bind failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); #else ShowError("bind failed with error: %d\n", errno); freeaddrinfo(result); close(ListenSocket); #endif return 1; } freeaddrinfo(result); iResult = listen(ListenSocket, SOMAXCONN); if (iResult == SOCKET_ERROR) { #ifdef WIN32 ShowError("listen failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); #else ShowError("listen failed with error: %d\n", errno); close(ListenSocket); #endif return 1; } ShowMessage(CL_WHITE"========================================================\n\n" CL_RESET); ShowMessage(CL_WHITE"DSSearch-server\n\n"); ShowMessage(CL_WHITE"========================================================\n\n" CL_RESET); while (true) { // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { #ifdef WIN32 ShowError("accept failed with error: %d\n", WSAGetLastError()); #else ShowError("accept failed with error: %d\n", errno); #endif continue; } std::thread(TCPComm, ClientSocket).detach(); } // TODO: сейчас мы никогда сюда не попадем // shutdown the connection since we're done #ifdef WIN32 iResult = shutdown(ClientSocket, SD_SEND); #else iResult = shutdown(ClientSocket, SHUT_WR); #endif if (iResult == SOCKET_ERROR) { #ifdef WIN32 ShowError("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); #else ShowError("shutdown failed with error: %d\n", errno); close(ClientSocket); #endif return 1; } // cleanup #ifdef WIN32 closesocket(ClientSocket); WSACleanup(); #else close(ClientSocket); #endif return 0; }