📄 main.c
字号:
#define _MAIN_C_#ifdef _SASQL1#include "sasql.h"#endif#include "main.h"#include "util.h"#include "mail.h"#include "db.h"#include "saacproto_util.h"#include "saacproto_serv.h"#ifdef _UNIVERSE_CHATROOM#include "chatroom.h"#endif// CoolFish: Family 2001/5/9#include "acfamily.h"#include "version.h"#ifdef _DEATH_CONTEND#include "deathcontend.h"#endif#include <signal.h>#include <sys/types.h>#include <time.h>#include <sys/time.h>#include <errno.h>#include <sys/wait.h>#include <getopt.h>#include <stdio.h>#include <malloc.h>#include <strings.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <errno.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <time.h>#include <fcntl.h>#include <netinet/tcp.h>#include "saacproto_work.h"#ifdef _OACSTRUCT_TCP#include "saacproto_oac.h"#endif#ifdef _PAUCTION_MAN#include "auction.h"#endif#include "lock.h"#define BACKLOGNUM 5#ifdef _FIX_WORKS#include "saacproto_work.h"int worksockfd;#endif#ifdef _LOCK_SERVER#include "saacproto_lserver.h"#endif#ifdef _SEND_EFFECT // WON ADD 送下雪、下雨等特效 #include "recv.h"#endif#include "defend.h"#include "char.h"#ifdef _SASQL#include "sasql.h"#endif#ifndef _FIX_WORKSstruct membuf{ int use; char buf[512];// char buf[1024*128]; int len; int next;};struct connection{ int use; int fd; int mbtop_ri; int mbtop_wi; struct sockaddr_in remoteaddr; int closed_by_remote;};#else#endifstruct membuf *mb;int mbsize;int mbuse ;int mainsockfd; /* accept 及 域娄醒卞中木月 */struct sockaddr_in localaddr; /* bind 允月失玉伊旦 */ struct connection *con; /* 戊生弁扑亦件 */static int mb_finder=0; /* mb及坞五毛腹绸允月凶户及 腹绸玄永皿及匏 筏盛迕 */// WON FIXchar tmpbuf[65536];//char tmpbuf[65536*3]; /* read迕 */struct timeval select_timeout;time_t sys_time =0; // Robin addextern gmsv gs[MAXCONNECTION];int tcpstruct_init( char *addr, int port, int timeout_ms, int mem_use, int deb);int tcpstruct_accept1( void );int tcpstruct_accept( int *tis , int ticount );int tcpstruct_close( int ti );int tcpstruct_read( int ti , char *buf , int len );int tcpstruct_readline( int ti , char *buf , int len ,int k ,int r);int tcpstruct_readline_chop( int ti , char *buf, int len );int tcpstruct_write( int ti , char *buf , int len );int tcpstruct_countmbuse( void );int tcpstruct_connect( char *addr , int port );#ifndef _FIX_WORKSvoid set_nodelay( int sock );#define OK 0 /* 岳 */#define TCPSTRUCT_ENOMEM -1 /* malloc 撩 */#define TCPSTRUCT_ESOCK -2 /* socket 撩 */#define TCPSTRUCT_EBIND -3 /* bind 撩 */#define TCPSTRUCT_ELISTEN -4 /* listen 撩 */#define TCPSTRUCT_EBUG -6 /* 田弘匹丐月 */#define TCPSTRUCT_EINVCIND -7 /* con尺及index互云井仄中方 */#define TCPSTRUCT_EREADFIN -8 /* read 允月犯□正互卅仁化 closed by remote */#define TCPSTRUCT_EHOST -9 /* gethostbyname 撩 */#define TCPSTRUCT_ECONNECT -10 /* connect 撩 */#define TCPSTRUCT_ECFULL -11 /* con 互中匀天中 */#define TCPSTRUCT_ETOOLONG -12 /* 垫互卅互允亢 */#define TCPSTRUCT_EMBFULL -13 /* mb 互中匀天中 */#define TCPSTRUCT_ECLOSEAGAIN -14 /* close 互2荚今木凶 */#endifint port; /* 必□丞扔□田□互涛粮仄化仁月禾□玄 */int Total_Charlist;int Expired_mail;int Del_Family_or_Member;int Write_Family;#ifdef _NEW_PLAYERGOLDint New_PlayerGold;#endif// Nuke startchar *chartime(){ static char buf[80]; time_t t; t=time(0); strcpy(buf,ctime(&t)); buf[strlen(buf)-1]=0; return(buf);}/* sigaction白弁 */void sighandle( int a ){ if (a==SIGUSR1) log("sigusr1信号!\n"); if (a==SIGUSR2) { sigusr2( a); log("sigusr2信号!\n"); return; } #ifdef _SQL_BACKGROUND if(!sasql_initonline()) log("\n数据库保存失败!\n"); #endif log("得到一个信号! 异常中断......\n" ); exit(1);}void sigusr2(int a);// Arminius 7.20 memory unlockvoid 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 _CK_ONLINE_PLAYER_COUNT // WON ADD 计算线上人数 case 'W': PlayerCount(); break;#endif#ifdef _SEND_EFFECT // WON ADD 送下雪、下雨等特效 case 'E': log("\nAC 向 GS 发送下雪特效!!\n"); SendEffect(&key[1]); break;#endif#ifdef _BAD_PLAYER // WON ADD 送坏玩家去关 case 'B': log("\nAC 发送坏玩家监狱!!\n"); BadPlayer(); break;#endif#ifdef _RECAL_BACKUP_PLAYER // WON 回溯功能 case 'U': log("\n发送备份人物资料"); // 得到备份人物资料 send_backup_player_data(); break;#endif #ifdef _GM_BROADCAST // WON ADD 客服公告系统 case 'G': log("\n won test 1 ==> _GM_BROADCAST" ); broadcast(key); break;#endif#ifdef _KILLDEADWORKER // 将所有Worker初始化 case 'K': log("\nKILL ALL WORKER!!!!!\n"); initWorkerPort(); 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 "); }}static int netWrite( int ti , char *buf , int len){ return tcpstruct_write( ti , buf, len );}#ifndef _FIX_WORKStypedef enum{ WKSTAT_IDLE = 0, /* 窒手仄化卅中橇谪 */ WKSTAT_WAITING = 2 /* 伐□市井日及忒蚕毛引匀化月橇谪 */} WKSTAT;struct worker{ int use; int port; int ti; int request_ti; WKSTAT status; time_t last_query; void (*callback)( int ti , int result , char *cparam0 , char *cparam1, char *cparam2 , char *cparam3, char *cparam4, int iparam1 , int iparam2 );#define CPARAMNUM 5 char cparam[CPARAMNUM][CHARDATASIZE];#define IPARAMNUM 3 int iparam[IPARAMNUM];};struct worker wk[MAXWK];#endif#ifndef _FIX_WORKSstatic void addWorkerPort( int port ){ int i; for(i=0;i<MAXWK;i++){ if( wk[i].use == 0 ){ wk[i].use = 1; wk[i].port = port; wk[i].ti = -1; return; } } exit(1);}#endifint worker_finder = 0;static void initWorkerPort( void ){ int i; bzero( &wk , sizeof( wk )); for(i=0;i<MAXWK;i++){#ifdef _FIX_WORKS wk[i].use = 0; wk[i].status = WKSTAT_IDLE; if( wk[i].fd < 0 ) close( wk[i].fd); wk[i].fd = -1; wk[i].last_query = -1;#else wk[i].status = WKSTAT_IDLE;#endif } worker_finder = 0;}static void connectToWorker( void ){#ifndef _FIX_WORKS int i; for(i=0;i<MAXWK;i++){ if( wk[i].use ){ int ti = tcpstruct_connect( "127.0.0.1" , wk[i].port ); if( ti >= 0 ){ wk[i].ti = ti; } else { exit(1); } } }#endif}static int countWorker( void );// Nukeint addWorkerTask( char *id , char *pas , char *flag, void (*callbk)( int ti , int result , char *cp0 , char *cp1 , char *cp2 , char *cp3 , char *cp4, int i0 , int i1) , int ti , char *cparam0 , char *cparam1 , char *cparam2 , char *cparam3 , char *cparam4 , int iparam0 , int iparam1){ int i; // Spock +1 2000/11/2 char *process = cparam3; for(i=0;i<MAXWK;i++){ int n; worker_finder ++; if( worker_finder >= MAXWK ) worker_finder = 0; n = worker_finder; if( wk[n].use && wk[n].status == WKSTAT_IDLE ){ char s[256]; log("使用工作站:%d \n", n); // Nuke { int i; for (i=0;id[i];i++) if (id[i]==' ') return -1; } // Spock 2000/11/2 snprintf( s , sizeof( s ) , "%s %s %s %s\n", id , pas , flag , process); // Spock end#ifdef _FIX_WORKS if( cWork_write( wk[n].ti, s, strlen(s)) <= 0 ) {#else if( tcpstruct_write( wk[n].ti , s , strlen(s)) != strlen(s) ){#endif return -1; } else { } snprintf( wk[n].cparam[0] , CHARDATASIZE , "%s", cparam0 ); snprintf( wk[n].cparam[1] , CHARDATASIZE , "%s", cparam1 ); snprintf( wk[n].cparam[2] , CHARDATASIZE , "%s", cparam2 ); snprintf( wk[n].cparam[3] , CHARDATASIZE , "%s", cparam3 ); snprintf( wk[n].cparam[4] , CHARDATASIZE , "%s", cparam4 ); wk[n].iparam[0] = iparam0; wk[n].iparam[1] = iparam1; wk[n].status = WKSTAT_WAITING; wk[n].callback = callbk; wk[n].request_ti = ti ; wk[n].last_query = time(NULL); return 0; } } log( "工作站繁忙或工作站停止工作. 活动中的工作站有:%d\n", countWorker() ); return -1;}static int countWorker( void ){ int i,c=0; for(i=0;i<MAXWK;i++){ if( wk[i].use )c++; } return c;}#ifndef _FIX_WORKSstatic void checkWorkerClosed( int ti ){ int i; for(i=0;i<MAXWK;i++){ if( wk[i].ti == ti ){ wk[i].use = 0; wk[i].ti = -1; } }}#endifstatic void doWorker( int ti , char *m ){ int i; int res=-1; char deadline[128];#ifdef _TIMEOUTKICK //log("工作站:%s ", m); // Nuke 20040519: Protect from error from worker if (m) { char *p1,*p2; p1=strtok(m," "); p2=strtok(0," "); if (p1) res = atoi( p1 ); else res=-1; if (p2) strcpy( deadline, p2 ); // 取得 deadline else { strcpy( deadline, "0" ); //log("\n 工作站回传消息:%d:%s ", ti, p1); } } else { res=-1; strcpy( deadline, "0" ); }#else res = atoi( m );#endif#ifdef _NO_DOUBLECHECK res =0;#endif for( i=0; i<MAXWK; i++){ if( wk[i].use && wk[i].ti == ti ){ if( wk[i].status == WKSTAT_WAITING ){ if( wk[i].callback ){#ifdef _TIMEOUTKICK strcpy( wk[i].cparam[4] ,deadline);#endif // Robin log //log(" wk[%d] c0:%s c1:%s c2:%s c3:%s c4:%s i0:%d i1:%d ", // wk[i].request_ti, wk[i].cparam[0], wk[i].cparam[1], // wk[i].cparam[2], wk[i].cparam[3], wk[i].cparam[4], // wk[i].iparam[0], wk[i].iparam[1]); wk[i].callback( wk[i].request_ti , res, wk[i].cparam[0] , wk[i].cparam[1] , wk[i].cparam[2] , wk[i].cparam[3] , wk[i].cparam[4] , wk[i].iparam[0] , wk[i].iparam[1] ); } else { log( "工作站: 漏洞! callback 不能初始化\n"); } wk[i].status = WKSTAT_IDLE; } } }}static int isWorker( int ti ){#ifndef _FIX_WORKS int i; for(i=0;i<MAXWK;i++){ if( wk[i].use && wk[i].ti == ti )return 1; }#endif return 0;}gmsv gs[MAXCONNECTION];int login_game_server( int ti , char *svname , char *svpas , char *result , int resultlen , char *retdata , int retdatalen ){ if( strcmp( svpas , svpass ) == 0 ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -