void checkGSUCheck( char *id ) { int i; char gname[256]; if(!id[0]) return; memset( gname, 0, sizeof( gname) ); if( LockNode_getGname( (getHash(id) & 0xff), id, gname) <= 0 ){ log("ÎÞ·¨´ÓÓÎÏ·ÖÐÕÒµ½Õ˺Å:%x/%s !!\n", getHash( id), id); return; } log("\n"); for(i=0; i < MAXCONNECTION; i++ ){ if( gs[i].name[0] && strcmp( gs[i].name , gname )==0){ log("·¢ËͽâËø¼ì²é[%s] µ½ %d.%x/%s ·þÎñÆ÷:%d !!\n", id, i, getHash( id), gname, gs[i].fd); saacproto_ACUCheck_send( gs[i].fd , id ); return; } } // log("Can't find gname:%s sending err !!\n", gname); int ret = -1; if( !isLocked( id) ) { log( "ɾ³ýÄÚ´æÐÅÏ¢: Óû§:%x/%s ûÓÐËø¶¨!!\n", getHash(id), id); } if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) { } else { log( "²»ÄܽâËø %x:%s !\n", getHash(id), id); } }
void checkGSUCheck( char *id ) { int i; char gname[256]; if(!id[0]) return; memset( gname, 0, sizeof( gname) ); if( LockNode_getGname( (getHash(id) & 0xff), id, gname) <= 0 ){ log("������Ϸ���ҵ��˺�:%x/%s !!\n", getHash( id), id); return; } log("\n"); for(i=0; i < MAXCONNECTION; i++ ){ if( gs[i].name[0] && strcmp( gs[i].name , gname )==0){ log("���ͽ������[%s] �� %d.%x/%s ������:%d !!\n", id, i, getHash( id), gname, gs[i].fd); saacproto_ACUCheck_send( gs[i].fd , id ); return; } } // log("Can't find gname:%s sending err !!\n", gname); int ret = -1; if( !isLocked( id) ) { log( "ɾ���ڴ���Ϣ: �û�:%x/%s û������!!\n", getHash(id), id); } if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) { } else { log( "���ܽ��� %x:%s !\n", getHash(id), id); } }
// Arminius 7.20 memory unlock void sigusr1(int a) { int i; FILE *f; char key[4096],buf[4096]; signal(SIGUSR1, sigusr1); f = fopen("./unlock.arg", "r"); if (f) { memset(key, 0, 4096); fread(key, 4096, 1, f); for (i=0; i<strlen(key); i++) if (key[i]=='\n') key[i]='\0'; switch (key[0]) { case 'P': // unlock player if (DeleteMemLock(getHash(&key[1]) & 0xff,&key[1],&i)) { log("ADM: memunlock: %s success.\n", key); } else { log("ADM: memunlock: %s failed.\n", key); } break; case 'S': // unlock server DeleteMemLockServer(&key[1]); log("ADM: memunlock: %s\n", key); break; case 'C': // check player lock GetMemLockState(getHash(&key[1]) & 0xff, &key[1], buf); sprintf(key, "echo \"%s\" > ./sigusr1.result", buf); system(key); break; #ifdef _SEND_EFFECT // WON ADD ËÍÏÂÑ©¡¢ÏÂÓêµÈÌØЧ case 'E': log("\nAC Ïò GS ·¢ËÍÏÂÑ©ÌØЧ!!\n"); SendEffect(&key[1]); break; #endif case 'L': // Robin ÁгöËùÓÐServerÁ¬Ïß log("\nList All Server Conncet!!!!!\n"); for( i =0; i <MAXCONNECTION; i++) if( gs[i].use) log("\n gs[%d] fd:%d name:%s ", i, gs[i].fd, gs[i].name ); break; } log(" sigusr1_over_1 "); fclose(f); log(" sigusr1_over_2 "); } }
int lockUser( char *gmsvname , char *id , char *passwd , int lock , char *result, int resultlen, char *retdata , int retdatalen , char *process , char *deadline) #endif { char fname[1024]; int ret = -1; if(!id[0]){ snprintf(result , resultlen , FAILED); snprintf(retdata , retdatalen , "bad id"); return -1; } makeDirFilename( fname,sizeof(fname),lockdir , getHash(id), id ); retdata[0] = 0; if( lock ){ if (isLocked(id)) { snprintf( result , resultlen, FAILED ); snprintf( retdata , retdatalen, "already locked" ); log( "InsertMemLock: user:%x/%s is already locked err !!\n", getHash(id), id); return -1; } else { #ifdef _LOCK_ADD_NAME if( InsertMemLock( getHash(id) & 0xff, id, name, passwd, gmsvname, atoi(process), deadline ) ) #else if( InsertMemLock( getHash(id) & 0xff, id, passwd, gmsvname, atoi(process), deadline ) ) #endif return 0; else return -1; } } else { if( !isLocked( id) ) { log( "DeleteMemLock: user:%x/%s is't lock!!\n", getHash(id), id); } log("DEL2:"); if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) { snprintf( result , resultlen, SUCCESSFUL ); snprintf( retdata , retdatalen, "removed" ); return ret; } else { snprintf( result , resultlen, FAILED ); snprintf( retdata , retdatalen, "cannot remove lock" ); log( "Can't Unlock %x:%s !\n", getHash(id), id); return ret; } } }
int lockUser( char *gmsvname , char *id , char *passwd , int lock , char *result, int resultlen, char *retdata , int retdatalen , char *process , char *deadline) #endif { char fname[1024]; int ret = -1; if(!id[0]){ snprintf(result , resultlen , FAILED); snprintf(retdata , retdatalen , "bad id"); return -1; } retdata[0] = 0; if( lock ){ if (isLocked(id)) { snprintf( result , resultlen, FAILED ); snprintf( retdata , retdatalen, "already locked" ); log( "дÈëÄÚ´æÐÅÏ¢: Óû§:%x/%s ÒѾͬÒâËø¶¨ !!\n", getHash(id), id); return -1; } else { #ifdef _LOCK_ADD_NAME if( InsertMemLock( getHash(id) & 0xff, id, name, passwd, gmsvname, atoi(process), deadline ) ) #else if( InsertMemLock( getHash(id) & 0xff, id, passwd, gmsvname, atoi(process), deadline ) ) #endif return 0; else return -1; } } else { if( !isLocked( id) ) { log( "ɾ³ýÄÚ´æÐÅÏ¢: Óû§:%x/%s ûÓÐËø¶¨!!\n", getHash(id), id); } if( DeleteMemLock( getHash(id) & 0xff, id, &ret) ) { snprintf( result , resultlen, SUCCESSFUL ); snprintf( retdata , retdatalen, "removed" ); return ret; } else { snprintf( result , resultlen, FAILED ); snprintf( retdata , retdatalen, "²»ÄÜÒƳýËø¶¨" ); log( "²»ÄܽâËø %x:%s !\n", getHash(id), id); return ret; } } }
void charLoadCallback( int ti , int auth , char *c0, char* c1 , char *c2 , char *c3, char *c4, int i0 , int i1 ) { // Spock deleted 2000/11/2 //static int process_id = 0; // CoolFish: Init charindex 2001/10/16 #ifdef _NewSave int charindex = -1; #else int charindex; #endif char loadbuf[CHARDATASIZE]; char infobuf[CHARDATASIZE]; int lock = i0; char *process = c3; char *id = c0; char *passwd = c1; char *charname = c2; int mesgid = i1; char *deadline = c4; // Spock deleted 2000/11/2 //process_id++; if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ), "%d" , auth ); #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , data, mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , data, mesgid ); #endif return; } if( isLocked( id ) ){ int process=atoi(c3); #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "locked" , mesgid ); #endif DeleteMemLock(getHash(id) & 0xff, id, &process); // Èç¹ûAPÎÞËøÔòAC½âËø log("\n (%s) ACͬһÐÇϵÖظ²µÇÈ룬ÌßÈË!! ", id ); saacproto_ACKick_recv( ti, id, 1, -1); //ÌßÈË checkGSUCheck(id); return; } charindex = getCharIndexByName( id , charname ); #ifdef _NewSave //log("\nµµ°¸×°ÔØÐòºÅ:%d Õ˺Å:%s Ãû×Ö:%s\n", charindex, id, charname); #endif if( charindex < 0 ){ /* ƽÅҷ»¥Ðå»þØÆئÖм°Æ¥¾Þ·Â¡õئ¼°·Ö */ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid , charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "char nonexistent" , mesgid ); #endif return; } // log( "loadCharOne: id:[%s] char:[%s]\n", id, charname ); if( loadCharOne( id , charindex , loadbuf ,sizeof( loadbuf ))<0){ #ifdef _NewSave saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , FAILED , "cannot load ( disk i/o error?)", mesgid ); #endif return; }else{ #ifdef _CHAR_POOLITEM checkCharPoolItem( id); #endif #ifdef _CHAR_POOLITEM checkCharPoolPet( id); #endif } {//ttom char *c_ptr; c_ptr=loadbuf; while(*c_ptr!='\0'){ if( IS_2BYTEWORD(*c_ptr) ){ if(*(c_ptr+1)==' '){ *(c_ptr+1)=0x41; } c_ptr++; if(*c_ptr=='\0') break; } c_ptr++; } }//ttom if( lock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( lockUser( getGSName(ti) , id , charname, passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #else // Spock 2000/11/2 if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ #endif saacproto_ACCharLoad_send( ti , FAILED, "lock FAIL!!" , mesgid , charindex ); return; } } memset( infobuf , 0 , sizeof( infobuf )); getCharInfoFromString( loadbuf , infobuf ); makeStringFromEscaped( infobuf ); #ifdef _NewSave saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid, charindex ); #else saacproto_ACCharLoad_send( ti , SUCCESSFUL , infobuf , mesgid); #endif #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 10, -1); //ÌßÆäËûÐÇϵ #endif } #ifdef _NewSave int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid , int charindex) #else int charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid ) #endif { #ifdef _NewSave #else int charindex; #endif char savebuf[CHARDATASIZE]; int ret = -1; memset(savebuf, 0, sizeof(savebuf)); //andy_log if( strstr( charinfo, "DATAEND=") == NULL ){ FILE *fp; if( (fp=fopen( "badpetstring.txt", "a+")) != NULL ){ fprintf( fp, "%s\n", charinfo); fclose( fp); } log( "err add batpetstring.txt:%s[%s] !\n", id, charname); } if( unlock ){ char result[100]; char retdata[100]; #ifdef _LOCK_ADD_NAME if( (ret = lockUser( getGSName(ti), id , "" , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #else if( (ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ #endif log( "½âËø:%s ʧ°Ü!!\n", id); } } // Nuke *1 add escape if( makeSaveCharString( savebuf , sizeof( savebuf ) , charname, opt , charinfo )<0){ log("\n AC´æµµ:Ì«³¤ "); saacproto_ACCharSave_send( ti , FAILED , "too long" , mesgid ); // Spock fixed 2000/11/1 return ret; } #ifdef _NewSave if (charindex == -1) charindex = getCharIndexByName( id , charname ); #else // Nuke *1- charindex = getCharIndexByName( id , charname ); #endif if( charindex < 0 ){ int blankind = findBlankCharIndex( id ); if( blankind < 0 ){ log("\n ACCharSave:char full "); saacproto_ACCharSave_send( ti , FAILED , "char full" ,mesgid); return ret; } else { charindex = blankind; } } log( "Õ˺Å:[%s] ÈËÎï:[%s]\n", id, charname ); if( saveCharOne( id , charindex , savebuf ) < 0 ){ log("\n ACCharSave:disk I/O error or a bug "); saacproto_ACCharSave_send( ti , FAILED , "disk I/O error or a bug", mesgid ); return ret; } saacproto_ACCharSave_send( ti , SUCCESSFUL , "" , mesgid); return ret; } void charListCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ) { char listbuf[CHARDATASIZE]; char *id = c0; int mesgid = i0; //log(" µµ°¸Áбí»ØËÝ:%s:%d \n", id, auth); if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ) , "%d" , auth ); saacproto_ACCharList_send( ti , FAILED , data , mesgid ); total_ng_charlist++; return; } // È¡ÏûÏÂÁÐ unlock ¶¯×÷ if( isLocked( id ) ){ saacproto_ACCharList_send( ti , FAILED , "locked" , mesgid ); checkGSUCheck( id ); total_ng_charlist++; return; } #ifdef _SLEEP_CHAR // Èç¹ûÎÞеµ, ½«¾ÉµµÒÆÖÁеµ { char fn_old[256], fn_new[256]; FILE *fp_old, *fp_new; int i; // ÒÆÈËÎïµµ for( i=0; i<MAXCHAR_PER_USER; i++) { makeCharFileName( id, fn_new, sizeof(fn_new), i); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharFileName( id, fn_old, sizeof(fn_old), i); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } } // ÒƲÖÎïÆ·¿âµµ makeCharPoolItemFileName( id, fn_new, sizeof(fn_new)); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharPoolItemFileName( id, fn_old, sizeof(fn_old)); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } // ÒƲֳèÎï¿âµµ makeCharPoolPetFileName( id, fn_new, sizeof(fn_new)); fp_new = fopen( fn_new, "r"); if( fp_new == NULL ) { makeSleepCharPoolPetFileName( id, fn_old, sizeof(fn_old)); fp_old = fopen( fn_old, "r"); if( fp_old != NULL ) { fclose( fp_old); rename( fn_old, fn_new); // °áÒÆ //filecopy( fn_old, fn_new); // ¸´ÖÆ log(" ÒƵµ_%s ", fn_new); } } else { fclose( fp_new); } } #endif loadCharNameAndOption( id , listbuf,sizeof(listbuf)); // Arminius saacproto_ACCharList_send( ti , SUCCESSFUL , listbuf , mesgid); total_ok_charlist++; }
void saacproto_ACLock_recv( int ti ,char* id,int lock,int mesgid ) { if( !is_game_server_login(ti) ){ saacproto_ACLock_send( ti , FAILED , "not login" , mesgid ); return; } // Arminius 7.25 test unlock log("ACLock recv:%d\n",lock); if (lock==2) { char buf[4096]; if (GetMemLockState(getHash(id) & 0xff, id, buf)) { sprintf(retdata, "USRLOCKED:%s", buf); } else { sprintf(retdata, "USRUNLOCKED:%s", buf); } log(retdata); } else if (lock==3) { int proc; if (DeleteMemLock(getHash(id) & 0xff, id, &proc)) { sprintf(retdata, "GMUNLOCKSUCCESS"); } else { sprintf(retdata, "GMUNLOCKFAIL"); } log(retdata); } else if (lock==4) { DeleteMemLockServer(id); sprintf(retdata, "GMUNLOCKALL"); } else { #ifdef _LOCK_ADD_NAME if ( lockUser( getGSName( ti ) , id , "" , "0" , lock , result,sizeof(result), retdata ,sizeof( retdata ) , "0" , "0") < 0 ) { #else if ( lockUser( getGSName( ti ) , id , "0" , lock , result,sizeof(result), retdata ,sizeof( retdata ) , "0" , "0") < 0 ) { #endif log( "锁定用户: %s 失败\n" , id ); } else { log( "锁定用户: %s 成功\n" , id ); } } // Spock end saacproto_ACLock_send( ti , result , retdata , mesgid ); } void saacproto_ACUCheck_recv( int ti , char *id , int status ) { if( !is_game_server_login(ti) ){ log( "服务器发现账号:%s status:%d\n", id, status ); return; } if( status == 0 ){ log( "用户 %s 在 %s 并未锁定!\n", id , getGSName( ti ) ); saacproto_ACKick_recv( ti, id, 6, -1); } else { log( "用户 %s 在 %s 已锁定!\n", id , getGSName( ti ) ); #ifdef _WAEI_KICK saacproto_ACKick_recv( ti, id, 1, -1); #endif } } void saacproto_DBUpdateEntryString_recv( int fd, char* table, char* key, char* value, int msgid, int msgid2 ) { int r; r = dbUpdateEntryString( table, key, value ); if( r != 0 ){ log( "failed: DBUpdateEntryString err !!\n"); } /* 2003/06/26 if( r == 0 ){ // saacproto_DBUpdateEntryString_send( fd, SUCCESSFUL,table,key, msgid,msgid2 ); } else { // saacproto_DBUpdateEntryString_send( fd, FAILED,table,key, msgid,msgid2 ); } */ }