updated the 3.0 branch from the head branch - ready for alpha18
[kai/samba.git] / source3 / rpc_server / srv_reg.c
index 569f3fb8b139a920ba093561adaf048be950fa7d..a09632586036239e863b67111072de3976fa0f27 100644 (file)
@@ -1,11 +1,12 @@
-/* 
+/*
  *  Unix SMB/CIFS implementation.
  *  RPC Pipe client / server routines
  *  Copyright (C) Andrew Tridgell              1992-1997,
  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
  *  Copyright (C) Paul Ashton                       1997.
- *  Copyright (C) Marc Jacobsen                                                2000.
- *  Copyright (C) Jeremy Allison                                       2001.
+ *  Copyright (C) Marc Jacobsen                            2000.
+ *  Copyright (C) Jeremy Allison                   2001.
+ *  Copyright (C) Gerald Carter                    2002.
  *
  *  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
@@ -26,6 +27,9 @@
 
 #include "includes.h"
 
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_RPC_SRV
+
 /*******************************************************************
  api_reg_close
  ********************************************************************/
@@ -53,10 +57,10 @@ static BOOL api_reg_close(pipes_struct *p)
 }
 
 /*******************************************************************
- api_reg_open
+ api_reg_open_khlm
  ********************************************************************/
 
-static BOOL api_reg_open(pipes_struct *p)
+static BOOL api_reg_open_hklm(pipes_struct *p)
 {
        REG_Q_OPEN_HKLM q_u;
        REG_R_OPEN_HKLM r_u;
@@ -70,7 +74,7 @@ static BOOL api_reg_open(pipes_struct *p)
        if(!reg_io_q_open_hklm("", &q_u, data, 0))
                return False;
 
-       r_u.status = _reg_open(p, &q_u, &r_u);
+       r_u.status = _reg_open_hklm(p, &q_u, &r_u);
 
        if(!reg_io_r_open_hklm("", &r_u, rdata, 0))
                return False;
@@ -78,6 +82,33 @@ static BOOL api_reg_open(pipes_struct *p)
        return True;
 }
 
+/*******************************************************************
+ api_reg_open_khlm
+ ********************************************************************/
+
+static BOOL api_reg_open_hku(pipes_struct *p)
+{
+       REG_Q_OPEN_HKU q_u;
+       REG_R_OPEN_HKU r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       /* grab the reg open */
+       if(!reg_io_q_open_hku("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _reg_open_hku(p, &q_u, &r_u);
+
+       if(!reg_io_r_open_hku("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+
 /*******************************************************************
  api_reg_open_entry
  ********************************************************************/
@@ -184,18 +215,99 @@ static BOOL api_reg_abort_shutdown(pipes_struct *p)
 }
 
 
+/*******************************************************************
+ api_reg_query_key
+ ********************************************************************/
+
+static BOOL api_reg_query_key(pipes_struct *p)
+{
+       REG_Q_QUERY_KEY q_u;
+       REG_R_QUERY_KEY r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       if(!reg_io_q_query_key("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _reg_query_key(p, &q_u, &r_u);
+
+       if(!reg_io_r_query_key("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ api_reg_unknown_1a
+ ********************************************************************/
+
+static BOOL api_reg_unknown_1a(pipes_struct *p)
+{
+       REG_Q_UNKNOWN_1A q_u;
+       REG_R_UNKNOWN_1A r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       if(!reg_io_q_unknown_1a("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _reg_unknown_1a(p, &q_u, &r_u);
+
+       if(!reg_io_r_unknown_1a("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+ api_reg_enum_key
+ ********************************************************************/
+
+static BOOL api_reg_enum_key(pipes_struct *p)
+{
+       REG_Q_ENUM_KEY q_u;
+       REG_R_ENUM_KEY r_u;
+       prs_struct *data = &p->in_data.data;
+       prs_struct *rdata = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_u);
+       ZERO_STRUCT(r_u);
+
+       if(!reg_io_q_enum_key("", &q_u, data, 0))
+               return False;
+
+       r_u.status = _reg_enum_key(p, &q_u, &r_u);
+
+       if(!reg_io_r_enum_key("", &r_u, rdata, 0))
+               return False;
+
+       return True;
+}
+
+
+
 /*******************************************************************
  array of \PIPE\reg operations
  ********************************************************************/
 static struct api_struct api_reg_cmds[] =
 {
-       { "REG_CLOSE"        , REG_CLOSE        , api_reg_close        },
-       { "REG_OPEN_ENTRY"   , REG_OPEN_ENTRY   , api_reg_open_entry   },
-       { "REG_OPEN"         , REG_OPEN_HKLM    , api_reg_open         },
-       { "REG_INFO"         , REG_INFO         , api_reg_info         },
-       { "REG_SHUTDOWN"     , REG_SHUTDOWN     , api_reg_shutdown     },
-       { "REG_ABORT_SHUTDOWN", REG_ABORT_SHUTDOWN, api_reg_abort_shutdown },
-       { NULL,                0                , NULL                 }
+       { "REG_CLOSE"              , REG_CLOSE              , api_reg_close            },
+       { "REG_OPEN_ENTRY"         , REG_OPEN_ENTRY         , api_reg_open_entry       },
+       { "REG_OPEN_HKLM"          , REG_OPEN_HKLM          , api_reg_open_hklm        },
+       { "REG_OPEN_HKU"           , REG_OPEN_HKU           , api_reg_open_hku         },
+       { "REG_ENUM_KEY"           , REG_ENUM_KEY           , api_reg_enum_key         },
+       { "REG_QUERY_KEY"          , REG_QUERY_KEY          , api_reg_query_key        },
+       { "REG_INFO"               , REG_INFO               , api_reg_info             },
+       { "REG_SHUTDOWN"           , REG_SHUTDOWN           , api_reg_shutdown         },
+       { "REG_ABORT_SHUTDOWN"     , REG_ABORT_SHUTDOWN     , api_reg_abort_shutdown   },
+       { "REG_UNKNOWN_1A"         , REG_UNKNOWN_1A         , api_reg_unknown_1a       },
+       { NULL                     , 0                      , NULL                     }
 };
 
 /*******************************************************************