Browse Source

* Added SERVER_TYPE to core for future plugins support
* Added support for the UPNP plugin to release port mappings and re-close firewall ports on shutdown
* Updated showmsg

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1409 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest 20 năm trước cách đây
mục cha
commit
8114bec659
5 tập tin đã thay đổi với 104 bổ sung59 xóa
  1. 23 19
      src/common/core.c
  2. 9 1
      src/common/core.h
  3. 29 35
      src/common/showmsg.c
  4. 12 1
      src/common/showmsg.h
  5. 31 3
      src/common/socket.c

+ 23 - 19
src/common/core.c

@@ -14,20 +14,21 @@
 	#endif
 #endif
 
-#include "../common/mmo.h"
-#include "malloc.h"
 #include "core.h"
-#include "socket.h"
-#include "timer.h"
-#include "version.h"
-#include "showmsg.h"
+#include "../common/mmo.h"
+#include "../common/malloc.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/version.h"
+#include "../common/showmsg.h"
 
 #ifdef MEMWATCH
 #include "memwatch.h"
 #endif
 
-char server_type[24];
+char *argp;
 int runflag = 1;
+char SERVER_TYPE = SERVER_NONE;
 unsigned long ticks = 0; // by MC Cameri
 char pid_file[256];
 static void (*term_func)(void)=NULL;
@@ -132,7 +133,7 @@ void sig_dump(int sn)
 
 	// search for a usable filename
 	do {
-		sprintf (file, "log/%s%04d.stackdump", server_type, ++no);
+		sprintf (file, "log/%s%04d.stackdump", argp, ++no);
 	} while((fp = fopen(file,"r")) && (fclose(fp), no < 9999));
 	// dump the trace into the file
 
@@ -171,12 +172,13 @@ int get_svn_revision(char *svnentry) { // Warning: minor syntax checking
 	if ((fp = fopen(svnentry, "r")) == NULL) {
 		return 0;
 	} else {
-		while (fgets(line,1023,fp)) if (strstr(line,"revision=")) break;
+		while (fgets(line,1023,fp))
+			if (strstr(line,"revision=")) break;
 		fclose(fp);
-		if (sscanf(line," %*[^\"]\"%d%*[^\n]",&rev)==1) 
-		return rev;
+		if (sscanf(line," %*[^\"]\"%d%*[^\n]",&rev) == 1)
+			return rev;
 		else
-		return 0;
+			return 0;
 	}
 //	return 0;
 }
@@ -273,7 +275,7 @@ void log_uptime(void)
 		seconds -= (seconds/minute>0)?(seconds/minute)*minute:0;
 
 		fprintf(fp, "%s: %s uptime - %ld days, %ld hours, %ld minutes, %ld seconds.\n",
-			curtime2, server_type, days, hours, minutes, seconds);
+			curtime2, argp, days, hours, minutes, seconds);
 		fclose(fp);
 	}
 
@@ -285,14 +287,15 @@ int main(int argc,char **argv)
 {
 	int next;
 
-	display_title();
-	// call this first so it'll be finalised last
-	do_init_memmgr(argv[0]); // 一番最初に実行する必要がある
+	if ((argp = strstr(argv[0], "./")) != NULL)
+		argp+=2;
+	else argp = argv[0];
 
-	sscanf(argv[0], "./%24[^\n]", server_type);	// map/char/login?
-	atexit(log_uptime);
-	pid_create(argv[0]);
+	display_title();
 	
+	do_init_memmgr(argp); // 一番最初に実行する必要がある
+	atexit(log_uptime);
+	pid_create(argp);
 	Net_Init();
 	do_socket();
 	
@@ -313,6 +316,7 @@ int main(int argc,char **argv)
 	ticks = gettick();
 
 	do_init(argc,argv);
+
 	while(runflag){
 		next=do_timer(gettick_nocache());
 		do_sendrecv(next);

+ 9 - 1
src/common/core.h

@@ -3,11 +3,19 @@
 #ifndef	_CORE_H_
 #define	_CORE_H_
 
+extern char *argp;
 extern int runflag;
 extern unsigned long ticks;
+extern char SERVER_TYPE;
 
-int do_init(int,char**);
+enum {
+	SERVER_NONE,
+	SERVER_LOGIN,
+	SERVER_CHAR,
+	SERVER_MAP,
+};
 
+int do_init(int,char**);
 void set_termfunc(void (*termfunc)(void));
 
 #endif	// _CORE_H_

+ 29 - 35
src/common/showmsg.c

@@ -5,15 +5,12 @@
 
 char tmp_output[1024] = {"\0"};
 
-#undef ShowMessage
-
 // by MC Cameri
 int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 {
 	// _ShowMessage MUST be used instead of printf as of 10/24/2004.
 	// Return: 0 = Successful, 1 = Failed.
 //	int ret = 0;
-//	char *output;
 	char prefix[40];
 	
 	if (!string || strlen(string) <= 0) {
@@ -21,6 +18,8 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 		return 1;
 	}
 	switch (flag) {
+		case MSG_NONE: // direct printf replacement
+			break;
 		case MSG_STATUS: //Bright Green (To inform about good things)
 			strcpy(prefix,CL_GREEN"[Status]"CL_RESET":");
 			break;
@@ -49,22 +48,10 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 			printf("In function _ShowMessage() -> Invalid flag passed.\n");
 			return 1;
 	}
-	if (!(flag == MSG_DEBUG && !SHOW_DEBUG_MSG)) {
-
-/*		output = (char*)aMalloc(sizeof(char)*(strlen(prefix)+strlen(string)+2)); // prefix+string+two chars(space and \0)
-		if (output == NULL) {
-			return 1;
-//			exit(1); // Kill server? Deadly
-		}
 
-		strcpy(output,prefix);
-		strcat(output," ");
-		strcat(output,string);
-		vprintf(output, ap);
-		fflush(stdout);
-		aFree(output);*/
-
-		printf ("%s ", prefix);
+	if (!(flag == MSG_DEBUG && !SHOW_DEBUG_MSG)) {
+		if (flag != MSG_NONE)
+			printf ("%s ", prefix);
 		vprintf (string, ap);
 		fflush (stdout);
 	}
@@ -96,51 +83,58 @@ int _ShowMessage(enum msg_type flag, const char *string, ...)
         return _vShowMessage(flag, string, ap);
 }
 
+// direct printf replacement
+int ShowMessage(const char *string, ...) {
+	va_list ap;
+
+	va_start(ap, string);
+		return _vShowMessage(MSG_NONE, string, ap);
+}
 int ShowStatus(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_STATUS, string, ap);
+		return _vShowMessage(MSG_STATUS, string, ap);
 }
 int ShowSQL(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_SQL, string, ap);
+		return _vShowMessage(MSG_SQL, string, ap);
 }
 int ShowInfo(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_INFORMATION, string, ap);
+		return _vShowMessage(MSG_INFORMATION, string, ap);
 }
 int ShowNotice(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_NOTICE, string, ap);
+		return _vShowMessage(MSG_NOTICE, string, ap);
 }
 int ShowWarning(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_WARNING, string, ap);
+		return _vShowMessage(MSG_WARNING, string, ap);
 }
 int ShowDebug(const char *string, ...) {
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_DEBUG, string, ap);
+		return _vShowMessage(MSG_DEBUG, string, ap);
 }
 int ShowError(const char *string, ...) { 
-  	va_list ap;
+	va_list ap;
 	
 	va_start(ap, string);
-        return _vShowMessage(MSG_ERROR, string, ap);
+		return _vShowMessage(MSG_ERROR, string, ap);
 }
 int ShowFatalError(const char *string, ...) {
-  	va_list ap;
-	
+	va_list ap;
+
 	va_start(ap, string);
-        return _vShowMessage(MSG_FATALERROR, string, ap);
+		return _vShowMessage(MSG_FATALERROR, string, ap);
 }

+ 12 - 1
src/common/showmsg.h

@@ -32,8 +32,19 @@
 
 extern char tmp_output[1024];
 
-enum msg_type {MSG_STATUS, MSG_SQL, MSG_INFORMATION,MSG_NOTICE,MSG_WARNING,MSG_DEBUG,MSG_ERROR,MSG_FATALERROR};
+enum msg_type {
+	MSG_NONE,
+	MSG_STATUS,
+	MSG_SQL,
+	MSG_INFORMATION,
+	MSG_NOTICE,
+	MSG_WARNING,
+	MSG_DEBUG,
+	MSG_ERROR,
+	MSG_FATALERROR
+};
 
+extern int ShowMessage(const char *, ...);
 extern int ShowStatus(const char *, ...);
 extern int ShowSQL(const char *, ...);
 extern int ShowInfo(const char *, ...);

+ 31 - 3
src/common/socket.c

@@ -54,7 +54,10 @@ int (*upnp_init)();
 int (*upnp_final)();
 int (*firewall_addport)(char *desc, int port);
 int (*upnp_addport)(char *desc, char *ip, int port);
-extern char server_type[24];
+extern char *argp;
+
+int release_mappings = 1;
+int close_ports = 1;
 #else
 #error This doesnt work with non-Windows yet
 #endif
@@ -327,10 +330,10 @@ int make_listen_bind(long ip,int port)
 		char buf[16];
 		sprintf(buf, "%d.%d.%d.%d", natip[0], natip[1], natip[2], natip[3]);
 		//printf("natip=%d.%d.%d.%d\n", natip[0], natip[1], natip[2], natip[3]);
-		if (firewall_addport(server_type, port))
+		if (firewall_addport(argp, port))
 			printf ("Firewall port %d successfully opened\n", port);
 		if (natip[0] == 192 && natip[1] == 168) {
-			if (upnp_addport(server_type, natip, port))
+			if (upnp_addport(argp, natip, port))
 				printf ("Upnp mappings successfull\n");
 			else printf ("Upnp mapping failed\n");
 		}
@@ -845,6 +848,20 @@ int socket_config_read(const char *cfgName) {
 			else if(strcmpi(w2,"no")==0)
 				access_debug = 0;
 			else access_debug = atoi(w2);
+	#ifdef UPNP
+		} else if(!strcmpi(w1,"release_mappings")){
+			if(strcmpi(w2,"yes")==0)
+				release_mappings = 1;
+			else if(strcmpi(w2,"no")==0)
+				release_mappings = 0;
+			else release_mappings = atoi(w2);
+		} else if(!strcmpi(w1,"close_ports")){
+			if(strcmpi(w2,"yes")==0)
+				close_ports = 1;
+			else if(strcmpi(w2,"no")==0)
+				close_ports = 0;
+			else close_ports = atoi(w2);
+	#endif
 		} else if (strcmpi(w1, "import") == 0)
 			socket_config_read(w2);
 	}
@@ -957,6 +974,9 @@ int  Net_Init(void)
 // not implemented yet ^^;
 void do_init_upnp(void)
 {
+	int *_release_mappings;
+	int *_close_ports;
+
 	upnp_dll = DLL_OPEN ("upnp.dll");
 	if (!upnp_dll) {
 		printf ("Cannot open upnp.dll: %s\n", dlerror());
@@ -972,6 +992,14 @@ void do_init_upnp(void)
 		upnp_dll = NULL;
 		return;
 	}
+
+	DLL_SYM (_release_mappings, upnp_dll, "release_mappings");
+	DLL_SYM (_close_ports, upnp_dll, "close_ports");
+	if (release_mappings && _release_mappings)
+		*_release_mappings = release_mappings;
+	if (close_ports && _close_ports)
+		*_close_ports = close_ports;
+
 	if (upnp_init() == 0) {
 		printf ("Error initialising upnp.dll, unloading...\n");
 		DLL_CLOSE (upnp_dll);