Cleanup logging behavior

Fix #8

- the multiple 'version' handling in LS is removed, now just GetVersion() as before.
- Console commands '1' and '2' removed (would change world status to all clients).  Version command added (was missing).
- Window Title updated to note version
- Some loose log messages (printfs) were made into proper "LOGIN" messages via log_config.xml
- Previously marked "World" messages that are also used as "Login" now properly categorized as such
- Removed DumpPacket on unknown opcodes (stop unnecessary data to console)
- Welcome banners on world/login updated
This commit is contained in:
Image 2020-06-26 22:09:16 -04:00
parent a5131f3e31
commit a9f087b40c
9 changed files with 129 additions and 69 deletions

View file

@ -0,0 +1,3 @@
alter table log_messages add column name text default null;
alter table log_messages add column version text default null;
alter table log_messages modify column log_type text not null default '';

View file

@ -48,7 +48,7 @@ Client::Client(EQStream* ieqnc) {
lsadmin = 0; lsadmin = 0;
worldadmin = 0; worldadmin = 0;
lsstatus = 0; lsstatus = 0;
origversion = version = 0; version = 0;
kicked = false; kicked = false;
verified = false; verified = false;
memset(bannedreason, 0, sizeof(bannedreason)); memset(bannedreason, 0, sizeof(bannedreason));
@ -168,12 +168,6 @@ bool Client::Process() {
LogWrite(LOGIN__DEBUG, 0, "Login", "Client Version Provided: %i", version); LogWrite(LOGIN__DEBUG, 0, "Login", "Client Version Provided: %i", version);
// Image 2020 Notes
// we keep the original version for special packets like char creation to pass to world server
origversion = version;
// forced version to 60085 for now since those structures seem to work best for steam AoM 12133L Aug 17 2015 11:19:13 build
version = 60085;
if (EQOpcodeManager.count(GetOpcodeVersion(version)) == 0) { if (EQOpcodeManager.count(GetOpcodeVersion(version)) == 0) {
LogWrite(LOGIN__ERROR, 0, "Login", "Incompatible client version provided: %i", version); LogWrite(LOGIN__ERROR, 0, "Login", "Incompatible client version provided: %i", version);
SendLoginDenied(); SendLoginDenied();
@ -181,7 +175,7 @@ bool Client::Process() {
} }
if(EQOpcodeManager.count(GetOpcodeVersion(version)) > 0 && getConnection()){ if(EQOpcodeManager.count(GetOpcodeVersion(version)) > 0 && getConnection()){
getConnection()->SetClientVersion(GetOrigVersion()); getConnection()->SetClientVersion(GetVersion());
EQ2_16BitString username = packet->getType_EQ2_16BitString_ByName("username"); EQ2_16BitString username = packet->getType_EQ2_16BitString_ByName("username");
EQ2_16BitString password = packet->getType_EQ2_16BitString_ByName("password"); EQ2_16BitString password = packet->getType_EQ2_16BitString_ByName("password");
LoginAccount* acct = database.LoadAccount(username.data.c_str(),password.data.c_str(), net.IsAllowingAccountCreation()); LoginAccount* acct = database.LoadAccount(username.data.c_str(),password.data.c_str(), net.IsAllowingAccountCreation());
@ -231,7 +225,7 @@ bool Client::Process() {
case OP_AllWSDescRequestMsg:{ case OP_AllWSDescRequestMsg:{
SendWorldList(); SendWorldList();
needs_world_list = false; needs_world_list = false;
database.LoadCharacters(GetLoginAccount(), GetOrigVersion()); database.LoadCharacters(GetLoginAccount(), GetVersion());
SendCharList(); SendCharList();
break; break;
} }
@ -259,7 +253,7 @@ bool Client::Process() {
break; break;
} }
case OP_CreateCharacterRequestMsg:{ case OP_CreateCharacterRequestMsg:{
PacketStruct* packet = configReader.getStruct("CreateCharacter", GetOrigVersion()); PacketStruct* packet = configReader.getStruct("CreateCharacter", GetVersion());
playWaitTimer = new Timer ( 15000 ); playWaitTimer = new Timer ( 15000 );
playWaitTimer->Start ( ); playWaitTimer->Start ( );
@ -276,7 +270,7 @@ bool Client::Process() {
else else
{ {
ServerPacket* outpack = new ServerPacket(ServerOP_CharacterCreate, app->size+sizeof(int16)); ServerPacket* outpack = new ServerPacket(ServerOP_CharacterCreate, app->size+sizeof(int16));
int16 out_version = GetOrigVersion(); int16 out_version = GetVersion();
memcpy(outpack->pBuffer, &out_version, sizeof(int16)); memcpy(outpack->pBuffer, &out_version, sizeof(int16));
memcpy(outpack->pBuffer + sizeof(int16), app->pBuffer, app->size); memcpy(outpack->pBuffer + sizeof(int16), app->pBuffer, app->size);
uchar* tmp = outpack->pBuffer; uchar* tmp = outpack->pBuffer;
@ -366,14 +360,11 @@ bool Client::Process() {
break; break;
} }
default: { default: {
char* name = (char*)app->GetOpcodeName(); const char* name = app->GetOpcodeName();
if(name) if (name)
cout << name; LogWrite(OPCODE__DEBUG, 1, "Opcode", "%s Received %04X (%i)", name, app->GetRawOpcode(), app->GetRawOpcode());
else else
cout << "Unknown"; LogWrite(OPCODE__DEBUG, 1, "Opcode", "Received %04X (%i)", app->GetRawOpcode(), app->GetRawOpcode());
cout << " Packet: OPCode: 0x" << hex << setw(2) << setfill('0') << app->GetOpcode() << dec << ", size: " << setw(5) << setfill(' ') << app->Size() << " from " << GetAccountName() << endl;
if (app->Size() < 128)
DumpPacket(app);
} }
} }
delete app; delete app;
@ -421,7 +412,7 @@ void Client::CharacterApproved(int32 server_id,int32 char_id)
if(!world_server) if(!world_server)
return; return;
PacketStruct* packet = configReader.getStruct("LS_CreateCharacterReply", GetOrigVersion()); PacketStruct* packet = configReader.getStruct("LS_CreateCharacterReply", GetVersion());
if(packet){ if(packet){
packet->setDataByName("account_id", GetAccountID()); packet->setDataByName("account_id", GetAccountID());
packet->setDataByName("unknown", 0xFFFFFFFF); packet->setDataByName("unknown", 0xFFFFFFFF);
@ -433,7 +424,7 @@ void Client::CharacterApproved(int32 server_id,int32 char_id)
database.SaveCharacter(createRequest, GetLoginAccount(),char_id); database.SaveCharacter(createRequest, GetLoginAccount(),char_id);
// refresh characters for this account // refresh characters for this account
database.LoadCharacters(GetLoginAccount(), GetOrigVersion()); database.LoadCharacters(GetLoginAccount(), GetVersion());
SendCharList(); SendCharList();
} }
@ -500,8 +491,8 @@ void Client::SendCharList(){
safe_delete(packet);*/ safe_delete(packet);*/
LogWrite(LOGIN__INFO, 0, "Login", "[%s] sending character list.", GetAccountName()); LogWrite(LOGIN__INFO, 0, "Login", "[%s] sending character list.", GetAccountName());
LS_CharSelectList list; LS_CharSelectList list;
list.loadData(GetAccountID(), GetLoginAccount()->charlist, GetOrigVersion()); list.loadData(GetAccountID(), GetLoginAccount()->charlist, GetVersion());
EQ2Packet* outapp = list.serialize(GetOrigVersion()); EQ2Packet* outapp = list.serialize(GetVersion());
// DumpPacket(outapp); // DumpPacket(outapp);
QueuePacket(outapp); QueuePacket(outapp);
@ -524,7 +515,7 @@ void Client::SendLoginDenied(){
} }
void Client::SendLoginAccepted() { void Client::SendLoginAccepted() {
PacketStruct* packet = configReader.getStruct("LS_LoginReplyMsg", GetOrigVersion()); PacketStruct* packet = configReader.getStruct("LS_LoginReplyMsg", GetVersion());
int i = 0; int i = 0;
if (packet) if (packet)
{ {
@ -559,7 +550,7 @@ void Client::SendLoginAccepted() {
void Client::SendWorldList(){ void Client::SendWorldList(){
EQ2Packet* pack = world_list.MakeServerListPacket(lsadmin, version); EQ2Packet* pack = world_list.MakeServerListPacket(lsadmin, version);
EQ2Packet* dupe = pack->Copy(); EQ2Packet* dupe = pack->Copy();
DumpPacket(dupe->pBuffer,dupe->size); //DumpPacket(dupe->pBuffer,dupe->size);
QueuePacket(dupe); QueuePacket(dupe);
return; return;
} }
@ -704,7 +695,7 @@ void ClientList::Process() {
struct in_addr in; struct in_addr in;
in.s_addr = client->getConnection()->GetRemoteIP(); in.s_addr = client->getConnection()->GetRemoteIP();
net.numclients--; net.numclients--;
cout << Timer::GetCurrentTime2() << " Removing client from ip: " << inet_ntoa(in) << " port: " << ntohs(client->getConnection()->GetRemotePort()) << " Name: " << client->GetAccountName() << endl; LogWrite(LOGIN__INFO, 0, "Login", "Removing client from ip: %s on port %i, Account Name: %s", inet_ntoa(in), ntohs(client->getConnection()->GetRemotePort()), client->GetAccountName());
client->getConnection()->SetState(CLOSED); client->getConnection()->SetState(CLOSED);
net.UpdateWindowTitle(); net.UpdateWindowTitle();
client_list.erase(client); client_list.erase(client);

View file

@ -44,7 +44,6 @@ public:
account_id = in_account->getLoginAccountID(); account_id = in_account->getLoginAccountID();
} }
int16 GetVersion(){ return version; } int16 GetVersion(){ return version; }
int16 GetOrigVersion(){ return origversion; }
char* GetKey() { return key; } char* GetKey() { return key; }
void SetKey(char* in_key) { strcpy(key,in_key); } void SetKey(char* in_key) { strcpy(key,in_key); }
int32 GetIP() { return ip; } int32 GetIP() { return ip; }
@ -95,7 +94,6 @@ private:
bool start; bool start;
bool needs_world_list; bool needs_world_list;
int16 version; int16 version;
int16 origversion;
char bannedreason[30]; char bannedreason[30];
eLoginMode LoginMode; eLoginMode LoginMode;
PacketStruct* createRequest; PacketStruct* createRequest;

View file

@ -73,6 +73,9 @@ int main(int argc, char** argv){
LogStart(); LogStart();
LogParseConfigs();
net.WelcomeHeader();
srand(time(NULL)); srand(time(NULL));
if(!net.ReadLoginConfig()) if(!net.ReadLoginConfig())
@ -161,20 +164,23 @@ void NetConnection::HitKey(int keyhit)
world_list.ListWorldsToConsole(); world_list.ListWorldsToConsole();
break; break;
} }
case '1': case 'v':
world_list.SendWorldChanged(1, true); case 'V':
break; {
case '2': printf("========Version Info=========\n");
world_list.SendWorldChanged(1, false); printf("%s %s\n", EQ2EMU_MODULE, CURRENT_VERSION);
printf("Last Compiled on %s %s\n", COMPILE_DATE, COMPILE_TIME);
printf("=============================\n\n");
break; break;
}
case 'H': case 'H':
case 'h': { case 'h': {
printf("============================\n"); printf("===========Help=============\n");
printf("Available Commands:\n"); printf("Available Commands:\n");
printf("l = Listing of World Servers\n"); printf("l = Listing of World Servers\n");
printf("v = Login Version\n"); printf("v = Login Version\n");
// printf("0 = Kick all connected world servers\n"); // printf("0 = Kick all connected world servers\n");
printf("============================\n"); printf("============================\n\n");
break; break;
} }
default: default:
@ -283,11 +289,60 @@ void NetConnection::UpdateWindowTitle(char* iNewTitle) {
#ifdef WIN32 #ifdef WIN32
char tmp[500]; char tmp[500];
if (iNewTitle) { if (iNewTitle) {
snprintf(tmp, sizeof(tmp), "%s", iNewTitle); snprintf(tmp, sizeof(tmp), "Login: %s", iNewTitle);
} }
else { else {
snprintf(tmp, sizeof(tmp), "%i Server(s), %i Client(s) Connected", net.numservers, net.numclients); snprintf(tmp, sizeof(tmp), "%s, Version: %s: %i Server(s), %i Client(s) Connected", EQ2EMU_MODULE, CURRENT_VERSION, net.numservers, net.numclients);
} }
SetConsoleTitle(tmp); SetConsoleTitle(tmp);
#endif #endif
} }
void NetConnection::WelcomeHeader()
{
#ifdef _WIN32
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD);
#endif
printf("Module: %s, Version: %s", EQ2EMU_MODULE, CURRENT_VERSION);
#ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_YELLOW_BOLD);
#endif
printf("\n\nCopyright (C) 2007-2020 EQ2Emulator. https://www.eq2emu.com \n\n");
printf("EQ2Emulator is free software: you can redistribute it and/or modify\n");
printf("it under the terms of the GNU General Public License as published by\n");
printf("the Free Software Foundation, either version 3 of the License, or\n");
printf("(at your option) any later version.\n\n");
printf("EQ2Emulator is distributed in the hope that it will be useful,\n");
printf("but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
printf("GNU General Public License for more details.\n\n");
#ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_GREEN_BOLD);
#endif
printf(" /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$$ \n");
printf("| $$_____/ /$$__ $$ /$$__ $$| $$_____/ \n");
printf("| $$ | $$ \\ $$|__/ \\ $$| $$ /$$$$$$/$$$$ /$$ /$$\n");
printf("| $$$$$ | $$ | $$ /$$$$$$/| $$$$$ | $$_ $$_ $$| $$ | $$\n");
printf("| $$__/ | $$ | $$ /$$____/ | $$__/ | $$ \\ $$ \\ $$| $$ | $$\n");
printf("| $$ | $$/$$ $$| $$ | $$ | $$ | $$ | $$| $$ | $$\n");
printf("| $$$$$$$$| $$$$$$/| $$$$$$$$| $$$$$$$$| $$ | $$ | $$| $$$$$$/\n");
printf("|________/ \\____ $$$|________/|________/|__/ |__/ |__/ \\______/ \n");
printf(" \\__/ \n\n");
#ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_MAGENTA_BOLD);
#endif
printf(" Website : https://eq2emu.com \n");
printf(" Wiki : http://eq2emu.com:3001/ \n");
printf(" Git : http://git.eq2emu.com \n");
printf(" Discord : https://discord.gg/j92Ay9H \n\n");
#ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD);
#endif
printf("For more detailed logging, modify 'Level' param the log_config.xml file.\n\n");
#ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_WHITE);
#endif
fflush(stdout);
}

View file

@ -60,6 +60,7 @@ public:
bool IsAllowingAccountCreation() { return allowAccountCreation; } bool IsAllowingAccountCreation() { return allowAccountCreation; }
void WelcomeHeader();
protected: protected:
friend class LWorld; friend class LWorld;
bool Uplink_WrongVersion; bool Uplink_WrongVersion;

View file

@ -129,7 +129,7 @@ int main(int argc, char** argv) {
LogStart(); LogStart();
LogParseConfigs(); LogParseConfigs();
WelcomeHeader(); net.WelcomeHeader();
LogWrite(INIT__INFO, 0, "Init", "Starting EQ2Emulator WorldServer..."); LogWrite(INIT__INFO, 0, "Init", "Starting EQ2Emulator WorldServer...");
//int32 server_startup = time(NULL); //int32 server_startup = time(NULL);
@ -963,17 +963,17 @@ void ZoneAuth::RemoveAuth(ZoneAuthRequest *zar) {
} }
} }
void WelcomeHeader() void NetConnection::WelcomeHeader()
{ {
#ifdef _WIN32 #ifdef _WIN32
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD); SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD);
#endif #endif
printf("Module: %s, Version: %s", EQ2EMU_MODULE, CURRENT_VERSION); printf("Module: %s, Version: %s", EQ2EMU_MODULE, CURRENT_VERSION);
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_YELLOW_BOLD); SetConsoleTextAttribute(console, FOREGROUND_YELLOW_BOLD);
#endif #endif
printf("\n\nCopyright (C) 2007-2011 EQ2Emulator. http://eq2emulator.net/ \n\n"); printf("\n\nCopyright (C) 2007-2020 EQ2Emulator. https://www.eq2emu.com \n\n");
printf("EQ2Emulator is free software: you can redistribute it and/or modify\n"); printf("EQ2Emulator is free software: you can redistribute it and/or modify\n");
printf("it under the terms of the GNU General Public License as published by\n"); printf("it under the terms of the GNU General Public License as published by\n");
printf("the Free Software Foundation, either version 3 of the License, or\n"); printf("the Free Software Foundation, either version 3 of the License, or\n");
@ -982,9 +982,9 @@ void WelcomeHeader()
printf("but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf("but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
printf("GNU General Public License for more details.\n\n"); printf("GNU General Public License for more details.\n\n");
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_GREEN_BOLD); SetConsoleTextAttribute(console, FOREGROUND_GREEN_BOLD);
#endif #endif
printf(" /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$$ \n"); printf(" /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$$ \n");
printf("| $$_____/ /$$__ $$ /$$__ $$| $$_____/ \n"); printf("| $$_____/ /$$__ $$ /$$__ $$| $$_____/ \n");
printf("| $$ | $$ \\ $$|__/ \\ $$| $$ /$$$$$$/$$$$ /$$ /$$\n"); printf("| $$ | $$ \\ $$|__/ \\ $$| $$ /$$$$$$/$$$$ /$$ /$$\n");
@ -994,20 +994,20 @@ void WelcomeHeader()
printf("| $$$$$$$$| $$$$$$/| $$$$$$$$| $$$$$$$$| $$ | $$ | $$| $$$$$$/\n"); printf("| $$$$$$$$| $$$$$$/| $$$$$$$$| $$$$$$$$| $$ | $$ | $$| $$$$$$/\n");
printf("|________/ \\____ $$$|________/|________/|__/ |__/ |__/ \\______/ \n"); printf("|________/ \\____ $$$|________/|________/|__/ |__/ |__/ \\______/ \n");
printf(" \\__/ \n\n"); printf(" \\__/ \n\n");
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_MAGENTA_BOLD); SetConsoleTextAttribute(console, FOREGROUND_MAGENTA_BOLD);
#endif #endif
printf(" Website : http://eq2emulator.net \n"); printf(" Website : https://eq2emu.com \n");
printf(" Forums : http://eq2emulator.net/phpBB3/ \n"); printf(" Wiki : http://eq2emu.com:3001/ \n");
printf(" Contributors: http://eq2emulator.net/wiki/index.php/Developer:Contributors \n"); printf(" Git : http://git.eq2emu.com \n");
printf(" SVN : http://svn.eq2emulator.net/svn/eq2server \n\n"); printf(" Discord : https://discord.gg/j92Ay9H \n\n");
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD); SetConsoleTextAttribute(console, FOREGROUND_WHITE_BOLD);
#endif #endif
printf("For more detailed logging, modify 'Level' param the log_config.xml file.\n\n"); printf("For more detailed logging, modify 'Level' param the log_config.xml file.\n\n");
#ifdef _WIN32 #ifdef _WIN32
SetConsoleTextAttribute(console, FOREGROUND_WHITE); SetConsoleTextAttribute(console, FOREGROUND_WHITE);
#endif #endif
fflush(stdout); fflush(stdout);
} }

View file

@ -40,7 +40,6 @@
ThreadReturnType EQ2ConsoleListener(void *tmp); ThreadReturnType EQ2ConsoleListener(void *tmp);
void CatchSignal(int sig_num); void CatchSignal(int sig_num);
void UpdateWindowTitle(char* iNewTitle); void UpdateWindowTitle(char* iNewTitle);
void WelcomeHeader();
#define PORT 9000 #define PORT 9000
#define LOGIN_PORT 9100 #define LOGIN_PORT 9100
@ -70,6 +69,8 @@ public:
~NetConnection() { } ~NetConnection() { }
bool ReadLoginINI(); bool ReadLoginINI();
void WelcomeHeader();
bool LoginServerInfo; bool LoginServerInfo;
bool UpdateStats; bool UpdateStats;
char* GetLoginInfo(int16* oPort); char* GetLoginInfo(int16* oPort);

View file

@ -132,8 +132,13 @@ struct sockaddr_in address;
fcntl(sock, F_SETFL, O_NONBLOCK); fcntl(sock, F_SETFL, O_NONBLOCK);
#endif #endif
//moved these because on windows the output was delayed and causing the console window to look bad //moved these because on windows the output was delayed and causing the console window to look bad
LogWrite(WORLD__DEBUG, 0, "World", "Starting factory Reader"); #ifdef LOGIN
LogWrite(WORLD__DEBUG, 0, "World", "Starting factory Writer"); LogWrite(LOGIN__DEBUG, 0, "Login", "Starting factory Reader");
LogWrite(LOGIN__DEBUG, 0, "Login", "Starting factory Writer");
#elif WORLD
LogWrite(WORLD__DEBUG, 0, "World", "Starting factory Reader");
LogWrite(WORLD__DEBUG, 0, "World", "Starting factory Writer");
#endif
#ifdef WIN32 #ifdef WIN32
_beginthread(EQStreamFactoryReaderLoop,0, this); _beginthread(EQStreamFactoryReaderLoop,0, this);
_beginthread(EQStreamFactoryWriterLoop,0, this); _beginthread(EQStreamFactoryWriterLoop,0, this);
@ -297,7 +302,12 @@ void EQStreamFactory::CheckTimeout(bool remove_all)
//give it a little time for everybody to finish with it //give it a little time for everybody to finish with it
} else { } else {
//everybody is done, we can delete it now //everybody is done, we can delete it now
#ifdef LOGIN
LogWrite(LOGIN__DEBUG, 0, "Login", "Removing connection...");
#else
LogWrite(WORLD__DEBUG, 0, "World", "Removing connection..."); LogWrite(WORLD__DEBUG, 0, "World", "Removing connection...");
#endif
map<string,EQStream *>::iterator temp=stream_itr; map<string,EQStream *>::iterator temp=stream_itr;
stream_itr++; stream_itr++;
//let whoever has the stream outside delete it //let whoever has the stream outside delete it

View file

@ -18,6 +18,8 @@
along with EQ2Emulator. If not, see <http://www.gnu.org/licenses/>. along with EQ2Emulator. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "LogTypes.h"
#ifndef VERSION_H #ifndef VERSION_H
#define VERSION_H #define VERSION_H
@ -36,9 +38,9 @@
#endif #endif
#if defined(LOGIN) #if defined(LOGIN)
#define CURRENT_VERSION "0.8.1-gemini2" #define CURRENT_VERSION "0.8.1-cancer1"
#elif defined(WORLD) #elif defined(WORLD)
#define CURRENT_VERSION "0.8.1-gemini2" #define CURRENT_VERSION "0.8.1-cancer1"
#else #else
#define CURRENT_VERSION "0.7.3-dev" #define CURRENT_VERSION "0.7.3-dev"
#endif #endif
@ -51,5 +53,4 @@
#define LAST_MODIFIED __TIMESTAMP__ #define LAST_MODIFIED __TIMESTAMP__
#endif #endif
#endif #endif