diff options
Diffstat (limited to 'source4/lib/registry/registry.i')
-rw-r--r-- | source4/lib/registry/registry.i | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/source4/lib/registry/registry.i b/source4/lib/registry/registry.i new file mode 100644 index 0000000000..c55197c3d0 --- /dev/null +++ b/source4/lib/registry/registry.i @@ -0,0 +1,214 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +%define DOCSTRING +"Access to various registry formats and the Samba registry." +%enddef + +%module(docstring=DOCSTRING) registry + +%{ +/* Include headers */ +#include <stdint.h> +#include <stdbool.h> + +#include "includes.h" +#include "registry.h" +#include "param/param.h" +#include "events/events.h" + +typedef struct registry_context reg; +typedef struct hive_key hive_key; +%} +%include "../../libcli/util/errors.i" + +/* FIXME: This should be in another file */ +%typemap(default,noblock=1) struct auth_session_info * { + $1 = NULL; +} + +%import "stdint.i" +%import "../../lib/talloc/talloc.i" +%import "../../auth/credentials/credentials.i" +%import "../../param/param.i" +%import "../events/events.i" + +/* Utility functions */ + +const char *reg_get_predef_name(uint32_t hkey); +const char *str_regtype(int type); + +/* Registry contexts */ +%typemap(in,noblock=1,numinputs=0) struct registry_context ** (struct registry_context *tmp) { + $1 = &tmp; +} + +%typemap(argout,noblock=1) struct registry_context ** { + $result = SWIG_NewPointerObj(*$1, SWIGTYPE_p_registry_context, 0); +} + +%rename(Registry) reg_open_local; +WERROR reg_open_local(TALLOC_CTX *parent_ctx, struct registry_context **ctx); + +%typemap(in,noblock=1) const char ** { + /* Check if is a list */ + if (PyList_Check($input)) { + int size = PyList_Size($input); + int i = 0; + $1 = (char **) malloc((size+1)*sizeof(const char *)); + for (i = 0; i < size; i++) { + PyObject *o = PyList_GetItem($input,i); + if (PyString_Check(o)) + $1[i] = PyString_AsString(PyList_GetItem($input,i)); + else { + PyErr_SetString(PyExc_TypeError,"list must contain strings"); + free($1); + return NULL; + } + } + $1[i] = 0; + } else { + PyErr_SetString(PyExc_TypeError,"not a list"); + return NULL; + } +} + +%typemap(freearg,noblock=1) const char ** { + free((char **) $1); +} + +%talloctype(reg); + +typedef struct registry_context { + %extend { + + %feature("docstring") get_predefined_key_by_name "S.get_predefined_key_by_name(name) -> key\n" + "Find a predefined key by name"; + WERROR get_predefined_key_by_name(const char *name, + struct registry_key **key); + + %feature("docstring") key_del_abs "S.key_del_abs(name) -> None\n" + "Delete a key by absolute path."; + WERROR key_del_abs(const char *path); + %feature("docstring") get_predefined_key "S.get_predefined_key(hkey_id) -> key\n" + "Find a predefined key by id"; + WERROR get_predefined_key(uint32_t hkey_id, struct registry_key **key); + %feature("docstring") diff_apply "S.diff_apply(filename) -> None\n" + "Apply the diff from the specified file"; + + WERROR diff_apply(const char *filename); + WERROR generate_diff(struct registry_context *ctx2, const struct reg_diff_callbacks *callbacks, + void *callback_data); + + WERROR mount_hive(struct hive_key *key, uint32_t hkey_id, + const char **elements=NULL); + + struct registry_key *import_hive_key(struct hive_key *hive, uint32_t predef_key, const char **elements); + %feature("docstring") mount_hive "S.mount_hive(key, predef_name) -> None\n" + "Mount the specified key at the specified path."; + WERROR mount_hive(struct hive_key *key, const char *predef_name) + { + int i; + for (i = 0; reg_predefined_keys[i].name; i++) { + if (!strcasecmp(reg_predefined_keys[i].name, predef_name)) + return reg_mount_hive($self, key, + reg_predefined_keys[i].handle, NULL); + } + return WERR_INVALID_NAME; + } + + } +} reg; + +/* Hives */ +%typemap(in,noblock=1,numinputs=0) struct hive_key ** (struct hive_key *tmp) { + $1 = &tmp; +} + +%typemap(argout,noblock=1) struct hive_key ** { + Py_XDECREF($result); + $result = SWIG_NewPointerObj(*$1, SWIGTYPE_p_hive_key, 0); +} + +%feature("docstring") reg_open_hive "S.__init__(location, session_info=None, credentials=None, loadparm_context=None)"; +%rename(hive_key) reg_open_hive; +WERROR reg_open_hive(TALLOC_CTX *parent_ctx, const char *location, + struct auth_session_info *session_info, + struct cli_credentials *credentials, + struct event_context *ev_ctx, + struct loadparm_context *lp_ctx, + struct hive_key **root); + +%feature("docstring") reg_open_ldb_file "open_ldb(location, session_info=None, credentials=None, loadparm_context=None) -> key"; +%rename(open_ldb) reg_open_ldb_file; +WERROR reg_open_ldb_file(TALLOC_CTX *parent_ctx, const char *location, + struct auth_session_info *session_info, + struct cli_credentials *credentials, + struct event_context *ev_ctx, + struct loadparm_context *lp_ctx, + struct hive_key **k); + +%feature("docstring") reg_create_directory "create_dir(location) -> key"; +%rename(create_dir) reg_create_directory; +WERROR reg_create_directory(TALLOC_CTX *parent_ctx, + const char *location, struct hive_key **key); + +%feature("docstring") reg_open_directory "open_dir(location) -> key"; +%rename(open_dir) reg_open_directory; +WERROR reg_open_directory(TALLOC_CTX *parent_ctx, + const char *location, struct hive_key **key); + +%talloctype(hive_key); + +typedef struct hive_key { + %extend { + %feature("docstring") del "S.del(name) -> None\n" + "Delete a subkey"; + WERROR del(const char *name); + %feature("docstring") flush "S.flush() -> None\n" + "Flush this key to disk"; + WERROR flush(void); + %feature("docstring") del_value "S.del_value(name) -> None\n" + "Delete a value"; + WERROR del_value(const char *name); + %feature("docstring") set_value "S.set_value(name, type, data) -> None\n" + "Set a value"; + WERROR set_value(const char *name, uint32_t type, const DATA_BLOB data); + } +} hive_key; + +%rename(open_samba) reg_open_samba; + +%feature("docstring") reg_open_samba "open_samba() -> reg"; +WERROR reg_open_samba(TALLOC_CTX *mem_ctx, + struct registry_context **ctx, + struct event_context *ev_ctx, + struct loadparm_context *lp_ctx, + struct auth_session_info *session_info, + struct cli_credentials *credentials); + +/* Constants */ +%constant uint32_t HKEY_CLASSES_ROOT = HKEY_CLASSES_ROOT; +%constant uint32_t HKEY_CURRENT_USER = HKEY_CURRENT_USER; +%constant uint32_t HKEY_LOCAL_MACHINE = HKEY_LOCAL_MACHINE; +%constant uint32_t HKEY_USERS = HKEY_USERS; +%constant uint32_t HKEY_PERFORMANCE_DATA = HKEY_PERFORMANCE_DATA; +%constant uint32_t HKEY_CURRENT_CONFIG = HKEY_CURRENT_CONFIG; +%constant uint32_t HKEY_DYN_DATA = HKEY_DYN_DATA; +%constant uint32_t HKEY_PERFORMANCE_TEXT = HKEY_PERFORMANCE_TEXT; +%constant uint32_t HKEY_PERFORMANCE_NLSTEXT = HKEY_PERFORMANCE_NLSTEXT; |