[or-cvs] Apply patch from Matt Edman for NT services, mildly tweaked...

Nick Mathewson nickm at seul.org
Sat Feb 5 21:30:43 UTC 2005


Update of /home/or/cvsroot/tor/src/or
In directory moria.mit.edu:/tmp/cvs-serv31090/src/or

Modified Files:
      Tag: tor-0_0_9-patches
	main.c config.c 
Log Message:
Apply patch from Matt Edman for NT services, mildly tweaked to Finally Do What Nick Wants.

Index: main.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/main.c,v
retrieving revision 1.407.2.10
retrieving revision 1.407.2.11
diff -u -d -r1.407.2.10 -r1.407.2.11
--- main.c	4 Feb 2005 07:16:13 -0000	1.407.2.10
+++ main.c	5 Feb 2005 21:30:41 -0000	1.407.2.11
@@ -73,6 +73,7 @@
 #include <tchar.h>
 #define GENSRV_SERVICENAME  TEXT("tor-"VERSION)
 #define GENSRV_DISPLAYNAME  TEXT("Tor "VERSION" Win32 Service")
+#define GENSRV_DESCRIPTION  TEXT("Provides an anonymous Internet communication system")
 SERVICE_STATUS service_status;
 SERVICE_STATUS_HANDLE hStatus;
 static char **backup_argv;
@@ -99,7 +100,7 @@
   tor_assert(conn);
   tor_assert(conn->s >= 0);
 
-  if (nfds >= get_options()->_MaxConn-1) {
+  if (nfds >= get_options()->MaxConn-1) {
     log_fn(LOG_WARN,"Failing because we have %d connections already. Please raise your ulimit -n.", nfds);
     return -1;
   }
@@ -1276,6 +1277,7 @@
 
   SC_HANDLE hSCManager = NULL;
   SC_HANDLE hService = NULL;
+  SERVICE_DESCRIPTION sdBuff;
   TCHAR szPath[_MAX_PATH];
   TCHAR szDrive[_MAX_DRIVE];
   TCHAR szDir[_MAX_DIR];
@@ -1291,7 +1293,7 @@
 
   /* Account for the extra quotes */
   //len = _MAX_PATH + strlen(cmd1) + _MAX_DRIVE + _MAX_DIR + strlen(cmd2);
-  len = _MAX_PATH + strlen(cmd1) + _MAX_DRIVE + _MAX_DIR + strlen(cmd2) + 4;
+  len = _MAX_PATH + strlen(cmd1) + _MAX_DRIVE + _MAX_DIR + strlen(cmd2) + 64;
   command = tor_malloc(len);
 
   /* 1/26/2005 mje - There was an extra '\' between end of the path and 'torrc'
@@ -1303,7 +1305,7 @@
   //strlcpy(command, szPath, len);
   strlcat(command, szPath, len);
   strlcat(command, "\"", len);
-  strlcat(command, " -f ", len);
+  strlcat(command, " --nt-service -f ", len);
   strlcat(command, "\"", len);
   strlcat(command, szDrive, len);
   strlcat(command, szDir, len);
@@ -1331,11 +1333,26 @@
     return 0;
   }
 
-  /* Start the service initially, so you don't have to muck with it in the SCM */
-  if(!StartService(hService, 0, NULL))
-    printf("Service installed, but not started.\n");
-  else
-    printf("Service installed and started successfully!\n");
+  /* Set the service's description */
+  sdBuff.lpDescription = GENSRV_DESCRIPTION;
+  ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sdBuff);
+
+  /* Start the service, so you don't have to muck with it in the SCM */
+  if(StartService(hService, 0, NULL)) {
+    /* Loop until the service has finished attempting to start */
+	while(QueryServiceStatus(hService, &service_status) &&
+		  service_status.dwCurrentState == SERVICE_START_PENDING)
+		  Sleep(500);
+
+	/* Check if it started successfully or not */
+    if(service_status.dwCurrentState == SERVICE_RUNNING)
+   	  printf("Service installed and started successfully.\n");
+    else
+	  printf("Service installed, but failed to start.\n");
+  }
+  else {
+    printf("Service installed, but failed to start.\n");
+  }
 
   CloseServiceHandle(hService);
   CloseServiceHandle(hSCManager);
@@ -1359,6 +1376,7 @@
   if ((hService = OpenService(hSCManager, GENSRV_SERVICENAME, SERVICE_ALL_ACCESS)) == NULL) {
     printf("Failed: OpenService()\n");
     CloseServiceHandle(hSCManager);
+    return 0;
   }
 
   result = ControlService(hService, SERVICE_CONTROL_STOP, &service_status);
@@ -1371,13 +1389,13 @@
         break;
     }
     if (DeleteService(hService))
-      printf("Remove service successfully\n");
+      printf("Removed service successfully\n");
     else
       printf("Failed: DeleteService()\n");
   } else {
     result = DeleteService(hService);
     if (result)
-      printf("Remove service successfully\n");
+      printf("Removed service successfully\n");
     else
       printf("Failed: DeleteService()\n");
   }
@@ -1397,8 +1415,10 @@
     return nt_service_install();
   if ((argc >= 2) && !strcmp(argv[1], "-remove"))
     return nt_service_remove();
-  nt_service_main();
-  return 0;
+  if ((argc >= 2) && !strcmp(argv[1], "--nt-service")) {
+    nt_service_main();
+    return 0;
+  }
 #else
   if (tor_init(argc, argv)<0)
     return -1;

Index: config.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/config.c,v
retrieving revision 1.286.2.9
retrieving revision 1.286.2.10
diff -u -d -r1.286.2.9 -r1.286.2.10
--- config.c	4 Feb 2005 07:15:40 -0000	1.286.2.9
+++ config.c	5 Feb 2005 21:30:41 -0000	1.286.2.10
@@ -420,6 +420,9 @@
     } else if (!strcmp(argv[i],"--list-fingerprint")) {
       i += 1; /* command-line option. ignore it. */
       continue;
+    } else if (!strcmp(argv[i],"--nt-service")) {
+      i += 1;
+      continue;
     }
 
     new = tor_malloc(sizeof(struct config_line_t));



More information about the tor-commits mailing list