[NET] CORE-6413
[reactos.git] / reactos / base / applications / network / net / cmdStop.c
index 87fb83e..179bc31 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command
 
 #include "net.h"
 
-INT cmdStop(INT argc, CHAR **argv )
+INT cmdStop(INT argc, WCHAR **argv)
 {
-   char *string;
-   long size = 100*sizeof(char);
-
-   if (argc>4)
-   {
-         help();
-         return 0;
-   }
-
-   if (argc==2)
-   {
-      string = (char *) malloc(size);
-      if (string != NULL)
-      {
-         sprintf(string,"rpcclient -c \"service enum\"");
-         system(string);
-         free(string);
-      }
-      return 0;
-   }
-
-   if (argc==3)
-   {
-         stop_service(argv[1]);
-      return 0;
-   }
-
-   return 0;
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    SERVICE_STATUS ServiceStatus;
+    DWORD dwError = ERROR_SUCCESS;
+    INT nError = 0;
+
+    if (argc != 3)
+    {
+        /* FIXME: Print usage message! */
+        printf("Usage: NET STOP <Service name>\n");
+        return 1;
+    }
+
+    hManager = OpenSCManagerW(NULL,
+                              SERVICES_ACTIVE_DATABASE,
+                              SC_MANAGER_ENUMERATE_SERVICE);
+    if (hManager == NULL)
+    {
+printf("1\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    hService = OpenServiceW(hManager,
+                            argv[2],
+                            SERVICE_STOP);
+    if (hService == NULL)
+    {
+printf("2\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    if (!ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus))
+    {
+printf("3\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+done:
+    if (hService != NULL)
+        CloseServiceHandle(hService);
+
+    if (hManager != NULL)
+        CloseServiceHandle(hManager);
+
+    if (dwError != ERROR_SUCCESS)
+    {
+        /* FIXME: Print proper error message */
+        printf("Error: %lu\n", dwError);
+    }
+
+    return nError;
 }
 
 
-INT stop_service(CHAR *service)
-{
-
-  CHAR *srvlst;
-  LONG pos=0;
-  LONG old_pos=0;
-  LONG row_size=0;
-  LONG size=0;
-
-  CHAR *row; /* we assume display name can max be 20 row and each row is 80 char */
-
-
-  /* Get the size for  srvlst */
-  myCreateProcessStartGetSzie("rpcclient -c \"service enum\"", &size);
-  if (size==0)
-  {
-    return 0;
-  }
-
-  srvlst = (CHAR *) malloc(size);
-  if (srvlst == NULL)
-  {
-         return 0;
-  }
-  /* Get the server list */
-  myCreateProcessStart("rpcclient -c \"service enum\"", srvlst, size);
-
-
-  /* scan after display name */
-  while (pos<size)
-  {
-               old_pos = pos;
-
-               if (1 == row_scanner_service(srvlst, &pos, size, service, NULL))
-               {
-                 row_size = (pos - old_pos)+32; /* 32 buffer for command */
-                 pos = old_pos;
-                 row = (CHAR *) malloc(row_size*sizeof(CHAR));
-                 if (row == NULL)
-             {
-                   free(srvlst);
-                   return 0;
-                 }
-                 memset(row,0,row_size*sizeof(CHAR));
-                 if (1 == row_scanner_service(srvlst, &pos, size, service, &row[27]))
-                 {
-                    /*
-                           display name found
-                       now we can start the service
-                         */
-
-                         memcpy(row,"rpcclient -c \"service stop %s\"\"",27*sizeof(CHAR));
-                         row_size = strlen(row);
-                         row[row_size] = '\"';
-              system(row);
-                 }
-                 free(row);
-               }
-  }
-
-  free(srvlst);
-  return 0;
-}