r23779: Change from v2 or later to v3 or later.
[samba.git] / source3 / rpc_client / cli_reg.c
index 6ed04960303207894737d904ce0db91aeb6e5897..3c18e389005822677d93001daecfc007b9d7ae6e 100644 (file)
@@ -2,15 +2,11 @@
    Unix SMB/CIFS implementation.
    RPC Pipe client
  
-   Copyright (C) Andrew Tridgell              1992-1998,
-   Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
-   Copyright (C) Paul Ashton                  1997-1998.
-   Copyright (C) Jeremy Allison                    1999.
-   Copyright (C) Simo Sorce                        2001
+   Copyright (C) Gerald (Jerry) Carter        2005-2006
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
 */
 
 #include "includes.h"
+#include "rpc_client.h"
 
-/* Shutdown a server */
+/*******************************************************************
+ connect to a registry hive root (open a registry policy)
+*******************************************************************/
 
-NTSTATUS cli_reg_shutdown(struct cli_state * cli, TALLOC_CTX *mem_ctx,
-                          const char *msg, uint32 timeout, BOOL do_reboot,
-                         BOOL force)
+NTSTATUS rpccli_winreg_Connect(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
+                         uint32 reg_type, uint32 access_mask,
+                         POLICY_HND *reg_hnd)
 {
-       prs_struct qbuf;
-       prs_struct rbuf; 
-       REG_Q_SHUTDOWN q_s;
-       REG_R_SHUTDOWN r_s;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+       ZERO_STRUCTP(reg_hnd);
 
-       if (msg == NULL) return NT_STATUS_INVALID_PARAMETER;
+       switch (reg_type)
+       {
+       case HKEY_CLASSES_ROOT:
+               return rpccli_winreg_OpenHKCR( cli, mem_ctx, NULL, 
+                       access_mask, reg_hnd );
 
-       ZERO_STRUCT (q_s);
-       ZERO_STRUCT (r_s);
+       case HKEY_LOCAL_MACHINE:
+               return rpccli_winreg_OpenHKLM( cli, mem_ctx, NULL, 
+                       access_mask, reg_hnd );
 
-       prs_init(&qbuf , MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
+       case HKEY_USERS:
+               return rpccli_winreg_OpenHKU( cli, mem_ctx, NULL, 
+                       access_mask, reg_hnd );
 
-       /* Marshall data and send request */
+       case HKEY_PERFORMANCE_DATA:
+               return rpccli_winreg_OpenHKPD( cli, mem_ctx, NULL, 
+                       access_mask, reg_hnd );
 
-       init_reg_q_shutdown(&q_s, msg, timeout, do_reboot, force);
+       default:
+               /* fall through to end of function */
+               break;
+       }
 
-       if (!reg_io_q_shutdown("", &q_s, &qbuf, 0) ||
-           !rpc_api_pipe_req(cli, PI_WINREG, REG_SHUTDOWN, &qbuf, &rbuf))
-               goto done;
-       
-       /* Unmarshall response */
-       
-       if(reg_io_r_shutdown("", &r_s, &rbuf, 0))
-               result = r_s.status;
-
-done:
-       prs_mem_free(&rbuf);
-       prs_mem_free(&qbuf);
-
-       return result;
+       return NT_STATUS_INVALID_PARAMETER;
 }
 
+/*******************************************************************
+ Fill in a REGVAL_BUFFER for the data given a REGISTRY_VALUE
+ *******************************************************************/
 
-/* Abort a server shutdown */
-
-NTSTATUS cli_reg_abort_shutdown(struct cli_state * cli, TALLOC_CTX *mem_ctx)
+uint32 reg_init_regval_buffer( REGVAL_BUFFER *buf2, REGISTRY_VALUE *val )
 {
-       prs_struct rbuf;
-       prs_struct qbuf; 
-       REG_Q_ABORT_SHUTDOWN q_s;
-       REG_R_ABORT_SHUTDOWN r_s;
-       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
-
-       ZERO_STRUCT (q_s);
-       ZERO_STRUCT (r_s);
-
-       prs_init(&qbuf , MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
-       
-       /* Marshall data and send request */
-
-       init_reg_q_abort_shutdown(&q_s);
-
-       if (!reg_io_q_abort_shutdown("", &q_s, &qbuf, 0) ||
-           !rpc_api_pipe_req(cli, PI_WINREG, REG_ABORT_SHUTDOWN, &qbuf, &rbuf))
-               goto done;
-       
-               /* Unmarshall response */
+       uint32          real_size = 0;
        
-       if (reg_io_r_abort_shutdown("", &r_s, &rbuf, 0))
-               result = r_s.status;
-
-done:
-       prs_mem_free(&rbuf);
-       prs_mem_free(&qbuf );
+       if ( !buf2 || !val )
+               return 0;
+               
+       real_size = regval_size(val);
+       init_regval_buffer( buf2, (unsigned char*)regval_data_p(val), real_size );
 
-       return result;
+       return real_size;
 }