📄 char.c
字号:
#define _CHAR_C_// Spock +1 2000/12/6#include <time.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include "main.h"#include "char.h"#include "saacproto_serv.h"#include "util.h"// CoolFish: Family 2001/6/12#include "acfamily.h"#include "version.h"// Arminius 7.17 memory lock#include "lock.h"#include "recv.h"static void getCharNameFromString(char *str ,char *out );static void getCharOptionFromString( char *str , char *out );static void makeCharFileName( char *idstring ,char *output, int outlen,int num);// Nuke *1*1static int makeSaveCharString( char *out , int outlen , char *nm , char *opt , char *info );static int findBlankCharIndex( char *id );static int unlinkCharFile( char *id , int num );#ifdef _SLEEP_CHAR // 取得非活跃人物档名static void makeSleepCharFileName( char *id,char *output, int outlen, int num);#endif#define SPACE '|'#define SPACESTRING "|"#define IS_2BYTEWORD( _a_ ) ( (char)(0x80) <= (_a_) && (_a_) <= (char)(0xFF) )#define USERLOG( id , format, args...) \{\ char body[1000];\ char fn[1000];\ if(id[0]){\ snprintf( body ,sizeof(body), "%s.log.%d" , id ,get_rotate_count() );\ makeDirFilename( fn , sizeof(fn),logdir, getHash(id), body);\ LOGBASE( fn , "%u " , (unsigned int ) time(NULL) );\ LOGBASE( fn , format , ## args );\ }\}/* 仇及白央奶伙匹烂聒今木化中月楮醒反兮氏少 据毛勾井丹[ char *c0 : ID char *c1 : Passwd 手丹 据允氏匹月井日银歹卅中 char *c2 : Charname char *c3 : opt Spock fixed, opt change to process char *c3 : process char *c4 : 勾井歹氏 int i0 : lock int i1 : mesgid */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; } {//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]; // Spock 2000/11/2 if( lockUser( getGSName(ti) , id , passwd , 1 , result , sizeof( result ) , retdata , sizeof( retdata ) , process , deadline) <0 ){ 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 _NewSaveint charSave( int ti , char *id , char *charname , char *opt , char *charinfo, int unlock , int mesgid , int charindex)#elseint 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]; if( (ret = lockUser( getGSName(ti), id , "0" , 0 , result , sizeof( result ) , retdata , sizeof( retdata ) , "0" , "0")) < 0 ){ 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); } } }#endif loadCharNameAndOption( id , listbuf,sizeof(listbuf)); // Arminius saacproto_ACCharList_send( ti , SUCCESSFUL , listbuf , mesgid); total_ok_charlist++;}void charDeleteCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ){ int charindex; char *id = c0; char *charname = c2; int mesgid = i0; struct tm *now; time_t timenow; char logfile[128]; if( auth != 0 ){ char data[100]; snprintf( data, sizeof( data ) , "%d" , auth ); saacproto_ACCharDelete_send( ti , FAILED , data, mesgid ); return; } charindex = getCharIndexByName( id , charname ); if( charindex < 0 ){ saacproto_ACCharDelete_send( ti , FAILED , "nochar", mesgid ); return; } if( unlinkCharFile( id , charindex ) < 0 ){ saacproto_ACCharDelete_send( ti , FAILED , "fileI/O" , mesgid); return; }#ifdef _FAMILY // CoolFish: Family 2001/6/12 { int index = 0, fmindex = 0, fmcharindex = 0; char fmname[32]; index = ACgetFMInfoFromChar(fmname, &fmindex, charname, id, &fmcharindex); if (index != -1) { if (fmcharindex == 0) {#ifdef _FMVER21 if (ChangeFMLeader(index, fmname, fmindex) >= 0) { if (ACDelFM(index, fmname, fmindex) >= 0) log("删除家族成员:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%d\n", index, fmname, fmindex, charname, id, fmcharindex); } log("ChangeFMLeader_3 index:%d fmname:%s fmindex:%d\n", index, fmname, fmindex);#else if (ACDelFM(index, fmname, fmindex) >= 0) log("删除家族成员:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%d\n", index, fmname, fmindex, charname, id, fmcharindex);#endif } else {#ifdef _FMVER21 if (ACMemberLeaveFM(index, fmname, fmindex, charname, 0, 0, fmcharindex) >= 0) log("ACMemberLeaveFM index:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%d\n", index, fmname, fmindex, charname, id, fmcharindex);#else if (ACMemberLeaveFM(index, fmname, fmindex, charname, 0, fmcharindex) >= 0) log("ACMemberLeaveFM index:%d 家族名:%s 家族索引:%d 人物:%s, 账号:%s, 家族人物索引:%d\n", index, fmname, fmindex, charname, id, fmcharindex);#endif } } }#endif // Spock 2000/12/6 time( &timenow ); now = localtime( &timenow ); sprintf( logfile , "log/chardel/%04d%02d%02d.log" , now->tm_year + 1900 , now->tm_mon + 1 , now->tm_mday ); LOGBASE( logfile , "%04d/%02d/%02d %02d:%02d:%02d id:[%s] char:[%s] index:[%d]\n" , now->tm_year + 1900 , now->tm_mon + 1 , now->tm_mday , now->tm_hour , now->tm_min , now->tm_sec , id , charname , charindex ); // Spock end USERLOG( id , "账号删除: 成功\n" ); saacproto_ACCharDelete_send( ti , SUCCESSFUL , "ok" , mesgid);}void dummyCallback( int ti , int auth , char *c0 , char *c1 , char *c2 , char *c3 , char *c4 , int i0 , int i1 ){ return;}static void getCharNameFromString(char *str ,char *out ){ int c; out[0]='\0'; for(c=0;;c++){ if( IS_2BYTEWORD( str[c] ) ){ out[c] = str[c];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -