📄 main.c.bak
字号:
#define _MAIN_C_#include "main.h"#include "util.h"#include "mail.h"#include "db.h"#include "saacproto_util.h"#include "saacproto_serv.h"// CoolFish: Family 2001/5/9#include "acfamily.h"#include "version.h"#ifdef _SEND_EFFECT // WON ADD 送下雪、下雨等特效 #include "recv.h"#endif#include "char.h"#ifdef _SASQL#include "sasql.h"#endif#include <stdio.h> #include <time.h> #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 "lock.h"#define BACKLOGNUM 5int worksockfd;struct 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;};struct membuf *mb;int mbsize;int mbuse ;int cpuuse;int mainsockfd; /* accept 及 域娄醒卞中木月 */struct sockaddr_in localaddr; /* bind 允月失玉伊旦 */ struct connection *con; /* 戊生弁扑亦件 */static int mb_finder=0; /* mb及坞五毛腹绸允月凶户及 腹绸玄永皿及匏 筏盛迕 */// WON FIX//char tmpbuf[65536];char tmpbuf[1024*32];//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 );void 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荚今木凶 */int port; /* 必□丞扔□田□互涛粮仄化仁月禾□玄 */int Total_Charlist;int Expired_mail;int Del_Family_or_Member;int Write_Family;// Nuke startchar *chartime(){ static char buf[80]; time_t t; t=time(0); strcpy(buf,ctime(&t)); buf[strlen(buf)-1]=0; return(buf);}static int initRankTable( void );/* sigaction白弁 */void sighandle( int a ){ if (a==SIGUSR1) log("sigusr1信号!\n"); log("得到一个信号! 异常中断......\n" ); writeFamily(familydir); writeFMPoint(fmpointdir); writeFMSMemo(fmsmemodir); exit(1);}// 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 _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 "); }}static int netWrite( int ti , char *buf , int len){ return tcpstruct_write( ti , buf, len );}gmsv gs[MAXCONNECTION];#ifdef _VIPint login_game_server( int ti , char *svname , char *svpas , int checkvip, char *result , int resultlen , char *retdata , int retdatalen )#elseint login_game_server( int ti , char *svname , char *svpas , char *result , int resultlen , char *retdata , int retdatalen )#endif{#ifndef _VIP char buff[50]; sprintf(buff,"vipe-%s-%d",svpass,123); if( strcmp( svpas , buff ) == 0 ){#else if( strcmp( svpas , svpass ) == 0 ){#endif log( "服务器密码正确 %s\n" , svname ); } else { log( "服务器密码错误 %s\n" , svname ); snprintf( result , resultlen , "失败" ); snprintf( retdata , retdatalen , "密码错误" ); return 0; }#ifdef _VIP if(checkvip==0 || checkvip!=4303225 * 2) { snprintf( result , resultlen , "失败" ); snprintf( retdata , retdatalen , "QQ验证错误" ); return 0; }#endif { int i; for(i=0;i<MAXCONNECTION;i++){ if( gs[i].use && strcmp( gs[i].name , svname ) == 0 ){ snprintf( result, resultlen, "failed" ); snprintf( retdata , retdatalen, "duplicate login" ); return 0; } } } snprintf( gs[ti].name , sizeof(gs[ti].name), "%s" , svname ); gs[ti].fd = ti; snprintf( result , resultlen ,SUCCESSFUL ); snprintf( retdata , retdatalen , "Nothing special" ); DeleteMemLockServer(svname); // Arminius 7.31 unlock server return 0;}int logout_game_server( int ti ){ gs[ti].use = 0; gs[ti].fd = -1; gs[ti].name[0] = 0; tcpstruct_close( ti ); return 0;}int is_game_server_login( int ti ){ return gs[ti].use;}static int readConfig( char *path ){ char buf[2048]; FILE *fp; fp = fopen( path , "r" ); if( fp == NULL ){ return -2; } while( fgets( buf , sizeof( buf ) , fp )){ char command[128]; char param[128]; chop(buf); easyGetTokenFromString( buf , 1 , command , sizeof( command )); easyGetTokenFromString( buf , 2 , param , sizeof( param )); if( strcmp( command , "port" ) == 0 ){ port = atoi( param ); log( "\n监听端口:%d\n",port ); } else if( strcmp( command , "logdir" ) == 0 ){ snprintf( logdir , sizeof( logdir) , param ); log( "日志目录:%s\n",logdir ); } else if( strcmp( command , "chardir" ) == 0 ){ snprintf( chardir , sizeof( chardir) , param ); log( "档案目录:%s\n",chardir );#ifdef _SLEEP_CHAR snprintf( sleepchardir , sizeof( sleepchardir), "%s_sleep", chardir); log( "睡眠目录:%s\n",sleepchardir );#endif } else if( strcmp( command , "pass" ) == 0 ){ snprintf( svpass , sizeof( svpass ) , param); log( "验证密码:%s\n",param ); } else if( strcmp( command , "dbdir" ) == 0 ){ snprintf( dbdir , sizeof( dbdir) , param ); log( "数据目录:%s\n",dbdir ); } else if( strcmp( command, "rotate_interval" ) == 0 ){ log_rotate_interval = atoi( param ); log( "日志循环间隔:%d\n",log_rotate_interval ); } else if( strcmp( command, "maildir" ) == 0 ){ snprintf( maildir, sizeof( maildir ), param ); log( "邮件目录:%s\n",maildir );#ifdef _FAMILY // CoolFish: Family 2001/5/9 } else if( strcmp( command, "familydir" ) == 0 ){ snprintf( familydir, sizeof( familydir ), param ); log( "家族目录:%s\n",familydir ); } else if( strcmp( command, "fmpointdir" ) == 0 ){ snprintf( fmpointdir, sizeof( fmpointdir ), param ); log( "庄园表列:%s\n",fmpointdir ); } else if( strcmp( command, "fmsmemodir" ) == 0 ){ snprintf( fmsmemodir, sizeof( fmsmemodir ), param ); log( "家族备份:%s\n",fmsmemodir );#endif } else if( strcmp( command , "Total_Charlist" ) == 0 ){ Total_Charlist = atoi( param ); log( "更新人物点数间隔:%d秒\n",Total_Charlist ); } else if( strcmp( command , "Expired_mail" ) == 0 ){ Expired_mail = atoi( param ); log( "更新过期邮件间隔:%d秒\n",Expired_mail ); } else if( strcmp( command , "Del_Family_or_Member" ) == 0 ){ Del_Family_or_Member = atoi( param ); log( "删除家族成员间隔:%d秒\n",Del_Family_or_Member ); } else if( strcmp( command , "Write_Family" ) == 0 ){ Write_Family = atoi( param ); log( "更新家族信息间隔:%d秒\n",Write_Family ); } else if( strcmp( command , "SameIpMun" ) == 0 ){ sameipmun = atoi( param ); if(sameipmun>0){ log( "同IP允许同时登陆:%d次\n",sameipmun ); }else{ log( "同IP允许同时登陆:无限制\n" ); } } } fclose(fp); return 0;}static void parseOpts( int argc, char **argv ){ int c , option_index; while(1){ static struct option long_options[] = { {"nice" , 1 , 0 , 'n'}, {"help" , 0 , 0 , 'h' }, {"userinfo",0 , 0 , 'i'}, {"lockuser",0 , 0 , 'l'} }; c = getopt_long( argc , argv , "n:hil" , long_options , &option_index ); if( c == -1 )break; switch( c ){ case 'h': fprintf( stderr , "使用方法: saac [-h] [-w port] [-w port] ... \n" "-h : 显示saac的帮助\n" "-w port : 添加一个工作站进程端口\n" "( vipe system supply)\n"); exit(0); break; case 'i':#ifdef _SASQL sasql_init(); sasql_craete_userinfo(); sasql_close();#endif exit(0); break; case 'l':#ifdef _SASQL sasql_init(); sasql_craete_lock(); sasql_close();#endif exit(0); break; case 'n': nice(atoi( optarg )); break; default: log( "不能读懂选项 %c\n" , c ); exit(0); } }}double time_diff(struct timeval subtrahend, struct timeval subtractor);int main( int argc , char **argv ){ parseOpts( argc, argv ); // Nuke +1 1012: Loop counter int counter1 = 0; int counter2 = 0; int counter3 = 0; int counter4 = 0; signal(SIGUSR1, sigusr1); log_rotate_interval = 3600 * 24 * 7;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -