Module: wine Branch: master Commit: c46cacc81683ae7d443d9a9383baa2bf8622f165 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c46cacc81683ae7d443d9a9383...
Author: Tim Schwartz tim@sanityinternet.com Date: Mon Jun 18 12:48:06 2007 -0500
net.exe: Add NET STOP.
---
programs/net/net.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/programs/net/net.c b/programs/net/net.c index 3a6c39a..4af72ae 100644 --- a/programs/net/net.c +++ b/programs/net/net.c @@ -21,6 +21,38 @@ #include <windows.h>
#define NET_START 0001 +#define NET_STOP 0002 + +static BOOL StopService(SC_HANDLE SCManager, SC_HANDLE serviceHandle) +{ + LPENUM_SERVICE_STATUS dependencies = NULL; + DWORD buffer_size = 0; + DWORD count = 0, counter; + BOOL result; + SC_HANDLE dependent_serviceHandle; + SERVICE_STATUS_PROCESS ssp; + + result = EnumDependentServices(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count); + + if(!result && (GetLastError() == ERROR_MORE_DATA)) + { + dependencies = HeapAlloc(GetProcessHeap(), 0, buffer_size); + if(EnumDependentServices(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count)) + { + for(counter = 0; counter < count; counter++) + { + printf("Stopping dependent service: %s\n", dependencies[counter].lpDisplayName); + dependent_serviceHandle = OpenService(SCManager, dependencies[counter].lpServiceName, SC_MANAGER_ALL_ACCESS); + if(dependent_serviceHandle) result = StopService(SCManager, dependent_serviceHandle); + if(!result) printf("Could not stop service %s\n", dependencies[counter].lpDisplayName); + } + } + } + + if(result) result = ControlService(serviceHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp); + HeapFree(GetProcessHeap(), 0, dependencies); + return result; +}
static BOOL net_service(int operation, char *service_name) { @@ -57,6 +89,14 @@ static BOOL net_service(int operation, char *service_name) if(!result) printf("failed to start.\n"); else printf("was started successfully.\n"); break; + case NET_STOP: + printf("The %s service is stopping.\n", service_display_name); + result = StopService(SCManager, serviceHandle); + + printf("The %s service ", service_display_name); + if(!result) printf("failed to stop.\n"); + else printf("was stopped successfully.\n"); + break; }
CloseServiceHandle(serviceHandle); @@ -70,7 +110,7 @@ int main(int argc, char *argv[]) if (argc < 2) { printf("The syntax of this command is:\n\n"); - printf("NET [ HELP | START ]\n"); + printf("NET [ HELP | START | STOP ]\n"); return 1; }
@@ -79,7 +119,7 @@ int main(int argc, char *argv[]) printf("The syntax of this command is:\n\n"); printf("NET HELP command\n -or-\nNET command /HELP\n\n"); printf(" Commands available are:\n"); - printf(" NET HELP NET START\n"); + printf(" NET HELP NET START NET STOP\n"); }
if(!strcasecmp(argv[1], "start")) @@ -97,5 +137,20 @@ int main(int argc, char *argv[]) return 0; }
+ if(!strcasecmp(argv[1], "stop")) + { + if(argc < 3) + { + printf("Specify service name to stop.\n"); + return 1; + } + + if(!net_service(NET_STOP, argv[2])) + { + return 1; + } + return 0; + } + return 0; }