Index: include/config.h
===================================================================
RCS file: /home/cmunk/ircsystems/cvsroot/unreal/include/config.h,v
retrieving revision 1.1.1.1.6.1.2.97.2.14
diff -u -r1.1.1.1.6.1.2.97.2.14 config.h
--- include/config.h	17 Jun 2007 12:43:52 -0000	1.1.1.1.6.1.2.97.2.14
+++ include/config.h	14 Jul 2007 21:46:15 -0000
@@ -203,7 +203,11 @@
  * these are only the recommened names and paths. Change as needed.
  * You must define these to something, even if you don't really want them.
  */
+#ifndef _WIN32
 #define	CPATH		"unrealircd.conf"	/* server configuration file */
+#else
+extern char CPATH[262];
+#endif
 #define	MPATH		"ircd.motd"	/* server MOTD file */
 #define SMPATH          "ircd.smotd"    /* short MOTD file */
 #define RPATH   	"ircd.rules"	/* server rules file */
Index: src/win32/gui.c
===================================================================
RCS file: /home/cmunk/ircsystems/cvsroot/unreal/src/win32/Attic/gui.c,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 gui.c
--- src/win32/gui.c	4 Nov 2006 21:40:57 -0000	1.1.2.5
+++ src/win32/gui.c	14 Jul 2007 21:46:29 -0000
@@ -105,6 +105,7 @@
 HMENU hContext;
 OSVERSIONINFO VerInfo;
 char OSName[256];
+char CPATH[262];
 #ifdef USE_LIBCURL
 extern char *find_loaded_remote_include(char *url);
 #endif 
@@ -216,13 +217,14 @@
 	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 	GetVersionEx(&VerInfo);
 	GetOSName(VerInfo, OSName);
+	strlcpy(CPATH, "unrealircd.conf", sizeof(CPATH));
 	if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) 
 	{
 		SC_HANDLE hService, hSCManager = OpenSCManager(NULL, NULL, GENERIC_EXECUTE);
+		StartServiceCtrlDispatcher(DispatchTable); 
 		if ((hService = OpenService(hSCManager, "UnrealIRCd", GENERIC_EXECUTE))) 
 		{
 			int save_err = 0;
-			StartServiceCtrlDispatcher(DispatchTable); 
 			if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
 			{ 
 				SERVICE_STATUS status;
Index: src/win32/service.c
===================================================================
RCS file: /home/cmunk/ircsystems/cvsroot/unreal/src/win32/Attic/service.c,v
retrieving revision 1.1.2.2.2.2
diff -u -r1.1.2.2.2.2 service.c
--- src/win32/service.c	13 Jul 2004 22:27:28 -0000	1.1.2.2.2.2
+++ src/win32/service.c	14 Jul 2007 21:46:31 -0000
@@ -100,7 +100,7 @@
 {
 	WSADATA WSAData;
 	DWORD error = 0;
-	char path[MAX_PATH], *folder;
+	char path[MAX_PATH], *folder, *c;
 
 	IsService = TRUE;
 
@@ -117,9 +117,13 @@
 	folder = strrchr(path, '\\');
 	*folder = 0;
 	chdir(path);
+	
+	_snprintf(CPATH, sizeof(CPATH)-1, "%s.conf", lpszArgv[0]);
+	for (c = CPATH; !BadPtr(c); c++)
+		*c = tolower(*c);
 
 	/* Register the service controller */
-	IRCDStatusHandle = RegisterServiceCtrlHandler("UnrealIRCd", IRCDCtrlHandler); 
+	IRCDStatusHandle = RegisterServiceCtrlHandler(lpszArgv[0], IRCDCtrlHandler); 
  
 	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 	GetVersionEx(&VerInfo);
Index: src/win32/unreal.c
===================================================================
RCS file: /home/cmunk/ircsystems/cvsroot/unreal/src/win32/Attic/unreal.c,v
retrieving revision 1.1.2.3.2.2
diff -u -r1.1.2.3.2.2 unreal.c
--- src/win32/unreal.c	29 Apr 2006 19:41:18 -0000	1.1.2.3.2.2
+++ src/win32/unreal.c	14 Jul 2007 21:46:34 -0000
@@ -27,7 +27,8 @@
 
 #define IRCD_SERVICE_CONTROL_REHASH 128
 void show_usage() {
-	fprintf(stderr, "unreal start|stop|rehash|restart|install|uninstall|config <option> <value>");
+	fprintf(stderr, "unreal start|stop|rehash|restart|install|uninstall|config [-n name] <option> <value>");
+	fprintf(stderr, "\n-n parameter specifies the name of the service. It is useful if you want to install more than one service on the same machine\n");
 	fprintf(stderr, "\nValid config options:\nstartup auto|manual\n");
 	if (VerInfo.dwMajorVersion == 5) 
 		fprintf(stderr, "crashrestart delay\n");
@@ -41,13 +42,30 @@
 
 
 int main(int argc, char *argv[]) {
-	char *bslash;
+	char *bslash, sname[257], *opt = NULL, *value = NULL;
 	VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 	GetVersionEx(&VerInfo);
 	if (argc < 2) {
 		show_usage();
 		return -1;
 	}
+	strcpy(sname, "UnrealIRCd");
+	if (argc > 2)
+	{
+		if (!strcmp(argv[2], "-n"))
+		{
+			if (argc < 4)
+			{
+				show_usage();
+				return -1;
+			}
+			_snprintf(sname, sizeof(sname)-1, "UnrealIRCd-%s", argv[3]);
+			if (argc > 4)
+				opt = argv[4];
+			if (argc > 5)
+				value = argv[5];
+		}
+	}
 	hAdvapi = LoadLibrary("advapi32.dll");
 	uChangeServiceConfig2 = (UCHANGESERVICECONFIG2)GetProcAddress(hAdvapi, "ChangeServiceConfig2A");
 	if (!stricmp(argv[1], "install")) {
@@ -65,7 +83,7 @@
 		
 		strcpy(binpath,path);
 		strcat(binpath, "\\wircd.exe");
-		hService = CreateService(hSCManager, "UnrealIRCd", "UnrealIRCd",
+		hService = CreateService(hSCManager, sname, sname,
 				 SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
 				 SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, binpath,
 				 NULL, NULL, NULL, NULL, NULL); 
@@ -85,7 +103,7 @@
 	}
 	else if (!stricmp(argv[1], "uninstall")) {
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd", DELETE); 
+		SC_HANDLE hService = OpenService(hSCManager, sname, DELETE); 
 		if (DeleteService(hService)) 
 			printf("UnrealIRCd NT Service successfully uninstalled");
 		else
@@ -96,7 +114,7 @@
 	}
 	else if (!stricmp(argv[1], "start")) {
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd", SERVICE_START); 
+		SC_HANDLE hService = OpenService(hSCManager, sname, SERVICE_START); 
 		if (StartService(hService, 0, NULL)) 
 			printf("UnrealIRCd NT Service successfully started");
 		else
@@ -108,7 +126,7 @@
 	else if (!stricmp(argv[1], "stop")) {
 		SERVICE_STATUS status;
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd", SERVICE_STOP); 
+		SC_HANDLE hService = OpenService(hSCManager, sname, SERVICE_STOP); 
 		ControlService(hService, SERVICE_CONTROL_STOP, &status);
 		printf("UnrealIRCd NT Service successfully stopped");
 		CloseServiceHandle(hService);
@@ -118,7 +136,7 @@
 	else if (!stricmp(argv[1], "restart")) {
 		SERVICE_STATUS status;
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd", SERVICE_STOP|SERVICE_START); 
+		SC_HANDLE hService = OpenService(hSCManager, sname, SERVICE_STOP|SERVICE_START); 
 		ControlService(hService, SERVICE_CONTROL_STOP, &status);
 		if (StartService(hService, 0, NULL)) 
 			printf("UnrealIRCd NT Service successfully restarted");
@@ -129,37 +147,37 @@
 	else if (!stricmp(argv[1], "rehash")) {
 		SERVICE_STATUS status;
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd", SERVICE_USER_DEFINED_CONTROL); 
+		SC_HANDLE hService = OpenService(hSCManager, sname, SERVICE_USER_DEFINED_CONTROL); 
 		ControlService(hService, IRCD_SERVICE_CONTROL_REHASH, &status);
 		printf("UnrealIRCd NT Service successfully rehashed");
 	}
 	else if (!stricmp(argv[1], "config")) {
 		SERVICE_STATUS status;
 		SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
-		SC_HANDLE hService = OpenService(hSCManager, "UnrealIRCd",
+		SC_HANDLE hService = OpenService(hSCManager, sname,
 						 SERVICE_CHANGE_CONFIG|SERVICE_START); 
-		if (argc < 3) {
+		if (!opt) {
 			show_usage();
 			return -1;
 		}
-		if (!stricmp(argv[2], "startup")) {
+		if (!stricmp(opt, "startup")) {
 			if (ChangeServiceConfig(hService, SERVICE_NO_CHANGE,
-					    !stricmp(argv[3], "auto") ? SERVICE_AUTO_START
+					    value && !stricmp(value, "auto") ? SERVICE_AUTO_START
 						: SERVICE_DEMAND_START, SERVICE_NO_CHANGE,
 					    NULL, NULL, NULL, NULL, NULL, NULL, NULL)) 
 				printf("UnrealIRCd NT Service configuration changed");
 			else
 				printf("UnrealIRCd NT Service configuration change failed - %s", show_error(GetLastError()));	
 		}
-		else if (!stricmp(argv[2], "crashrestart") && VerInfo.dwMajorVersion == 5) {
+		else if (!stricmp(opt, "crashrestart") && VerInfo.dwMajorVersion == 5) {
 			SERVICE_FAILURE_ACTIONS hFailActions;
 			SC_ACTION hAction;
 			memset(&hFailActions, 0, sizeof(hFailActions));
-			if (argc >= 4) {
+			if (value) {
 				hFailActions.dwResetPeriod = 30;
 				hFailActions.cActions = 1;
 				hAction.Type = SC_ACTION_RESTART;
-				hAction.Delay = atoi(argv[3])*60000;
+				hAction.Delay = atoi(value)*60000;
 				hFailActions.lpsaActions = &hAction;
 				if (uChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, 	
 						     &hFailActions))
