Add shutdown abort try over initshutdown pipe first, then fall back to
authorJim McDonough <jmcd@samba.org>
Fri, 24 Oct 2003 14:03:15 +0000 (14:03 +0000)
committerJim McDonough <jmcd@samba.org>
Fri, 24 Oct 2003 14:03:15 +0000 (14:03 +0000)
winreg pipe if it doesn't work.  Fixes bug #534.

I will go back and add the same logic for the shutdown itself, even though
that works so far against win2k (haven't tested all win clients).
(This used to be commit e6d02117755d92d1b5ce029bf659d0fbe1a55585)

source3/utils/net_rpc.c

index 85818152d1d833b0dffed9385d62df4414c9da2a..298e8ff6690772bf9431bfce80da1c93e791d624 100644 (file)
@@ -1461,7 +1461,7 @@ int net_rpc_file(int argc, const char **argv)
 
 
 /** 
- * ABORT the shutdown of a remote RPC Server
+ * ABORT the shutdown of a remote RPC Server over, initshutdown pipe
  *
  * All parameters are provided by the run_rpc_command function, except for
  * argc, argv which are passed through. 
@@ -1476,11 +1476,47 @@ int net_rpc_file(int argc, const char **argv)
  * @return Normal NTSTATUS return.
  **/
 
-static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, struct cli_state *cli, TALLOC_CTX *mem_ctx, 
+static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, 
+                                            struct cli_state *cli, 
+                                            TALLOC_CTX *mem_ctx, 
                                             int argc, const char **argv) 
 {
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        
+       result = cli_shutdown_abort(cli, mem_ctx);
+       
+       if (NT_STATUS_IS_OK(result))
+               DEBUG(5,("cmd_shutdown_abort: query succeeded\n"));
+       else
+               DEBUG(5,("cmd_shutdown_abort: query failed\n"));
+       
+       return result;
+}
+
+
+/** 
+ * ABORT the shutdown of a remote RPC Server,  over winreg pipe
+ *
+ * All parameters are provided by the run_rpc_command function, except for
+ * argc, argv which are passed through. 
+ *
+ * @param domain_sid The domain sid aquired from the remote server
+ * @param cli A cli_state connected to the server.
+ * @param mem_ctx Talloc context, destoyed on compleation of the function.
+ * @param argc  Standard main() style argc
+ * @param argv  Standard main() style argv.  Initial components are already
+ *              stripped
+ *
+ * @return Normal NTSTATUS return.
+ **/
+
+static NTSTATUS rpc_reg_shutdown_abort_internals(const DOM_SID *domain_sid, 
+                                                struct cli_state *cli, 
+                                                TALLOC_CTX *mem_ctx, 
+                                                int argc, const char **argv) 
+{
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+       
        result = cli_reg_abort_shutdown(cli, mem_ctx);
        
        if (NT_STATUS_IS_OK(result))
@@ -1491,7 +1527,6 @@ static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, struct c
        return result;
 }
 
-
 /** 
  * ABORT the Shut down of a remote RPC server
  *
@@ -1504,7 +1539,17 @@ static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, struct c
 
 static int rpc_shutdown_abort(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PI_WINREG, 0, rpc_shutdown_abort_internals,
+       int rc = run_rpc_command(NULL, PI_SHUTDOWN, 0, 
+                                rpc_shutdown_abort_internals,
+                                argc, argv);
+
+       if (rc == 0)
+               return rc;
+
+       DEBUG(1, ("initshutdown pipe didn't work, trying winreg pipe\n"));
+
+       return run_rpc_command(NULL, PI_WINREG, 0, 
+                              rpc_reg_shutdown_abort_internals,
                               argc, argv);
 }