summaryrefslogtreecommitdiff
path: root/source4/scripting/ejs/smbcalls_irpc.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-06-10 12:43:11 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:55 -0500
commit6ef2a41aa1e6cfeb88ee621c63327593b51315ae (patch)
tree7a4eb766210afd6292b4c352a7a695ed24b25ebd /source4/scripting/ejs/smbcalls_irpc.c
parentd543e4a26510da5293b5c884f026f3e40ec869d7 (diff)
downloadsamba-6ef2a41aa1e6cfeb88ee621c63327593b51315ae.tar.gz
samba-6ef2a41aa1e6cfeb88ee621c63327593b51315ae.tar.bz2
samba-6ef2a41aa1e6cfeb88ee621c63327593b51315ae.zip
r7461: this is the start of some code for mapping IDL onto ejs. This is hand
written code, and it doesn't work or even compile yet. I am committing it to make it easier to discuss the approach with jelmer and tpot. The intention is that this code will eventually end up being mostly auto-generated (with the utility functions split out, just like librpc/ndr/*.c) (This used to be commit 30e876e9c2ba73a3bc26e7708110e00a8552a75e)
Diffstat (limited to 'source4/scripting/ejs/smbcalls_irpc.c')
-rw-r--r--source4/scripting/ejs/smbcalls_irpc.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/source4/scripting/ejs/smbcalls_irpc.c b/source4/scripting/ejs/smbcalls_irpc.c
new file mode 100644
index 0000000000..9b0efc69e4
--- /dev/null
+++ b/source4/scripting/ejs/smbcalls_irpc.c
@@ -0,0 +1,197 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ provide hooks into IRPC calls from ejs scripts.
+
+ Copyright (C) Andrew Tridgell 2005
+
+ 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
+ (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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+/*
+ I hope that this code will eventually be autogenerated.
+
+
+ In this code, the convention is:
+
+ ejs_pull_*() from MprVar -> C structure
+ ejs_push_*() from C structure -> MprVar
+
+ note that for ejs calls, pull only ever needs to do
+ NDR_IN, and push only ever needs to do NDR_OUT. This is
+ because ejs code is (at least for the moment) only used for
+ the client, not the server
+
+ also note that we don't need the NDR_SCALARS/NDR_BUFFERS stuff, as
+ we aren't dealing with wire marshalling where scalars and buffers
+ are separated
+*/
+
+#include "includes.h"
+#include "lib/ejs/ejs.h"
+#include "librpc/gen_ndr/ndr_irpc.h"
+
+struct ndr_ejs {
+ /* nothing here yet */
+ int dummy;
+};
+
+struct enum_table {
+ uint32_t evalue;
+ const char *name;
+};
+
+#define EJS_ASSERT(condition) do { \
+ if (!(condition)) { \
+ DEBUG(0,("ejs assert failed at %s: %s\n", __location__, #condition)); \
+ return NT_STATUS_INVALID_PARAMETER; \
+ } \
+} while (0)
+
+
+/* first some common helper functions */
+
+static NTSTATUS ejs_pull_enum(struct ndr_ejs *ndr,
+ uint32_t *evalue,
+ struct MprVar *v,
+ const struct enum_table *etable)
+{
+ const char *s;
+ int i;
+ EJS_ASSERT(v->type == MPR_TYPE_STRING);
+ s = v->string;
+ for (i=0;etable[i].name;i++) {
+ if (strcmp(s, etable[i].name) == 0) {
+ *evalue = etable[i].evalue;
+ return NT_STATUS_OK;
+ }
+ }
+ return NT_STATUS_INVALID_PARAMETER;
+}
+
+static NTSTATUS ejs_push_enum(struct ndr_ejs *ndr,
+ uint32_t evalue,
+ struct MprVar *v,
+ const struct enum_table *etable)
+{
+ int i;
+ for (i=0;etable[i].name;i++) {
+ if (evalue == etable[i].evalue) {
+ *v = mprCreateStringVar(etable[i].name, 0);
+ return NT_STATUS_OK;
+ }
+ }
+ return NT_STATUS_INVALID_PARAMETER;
+}
+
+static NTSTATUS ejs_push_hyper(struct ndr_ejs *ndr,
+ uint64_t evalue,
+ struct MprVar *v,
+ const char *name)
+{
+}
+
+
+NTSTATUS ejs_element(struct ndr_ejs *ndr,
+ struct MprVar *v,
+ const char *name,
+ struct MprVar **e)
+{
+ *e = mprGetProperty(v, name, NULL);
+ if (*e == NULL) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+ return NT_STATUS_OK;
+}
+
+
+/* when we auto-generate, the enum tables should also be used by
+ the ndr_print_*() functions for non-ejs handling of enums
+*/
+static const struct enum_table enum_table_nbdt_info_level[] = {
+ {NBTD_INFO_STATISTICS, "NBTD_INFO_STATISTICS"},
+ {-1, NULL}
+};
+
+
+
+/* pull-side functions for nbtd_information call */
+
+static NTSTATUS ejs_pull_nbtd_info_level(struct ndr_ejs *ndr,
+ enum nbtd_info_level *r,
+ struct MprVar *v)
+{
+ uint32_t e;
+ NDR_CHECK(ejs_pull_enum(ndr, &e, v, enum_table_nbdt_info_level));
+ *r = e;
+ return NT_STATUS_OK;
+}
+
+static NTSTATUS ejs_pull_nbtd_information(struct ndr_ejs *ndr,
+ struct nbtd_information *r,
+ struct MprVar *v)
+{
+ struct MprVar *e;
+ NDR_CHECK(ejs_element(ndr, v, "level", &e));
+ NDR_CHECK(ejs_pull_nbtd_info_level(ndr, &r->in.level, e));
+ return NT_STATUS_OK;
+}
+
+
+/* push side functions for nbtd_information */
+
+static NTSTATUS ejs_push_nbtd_info_level(struct ndr_ejs *ndr, enum nbtd_info_level r,
+ struct MprVar *v)
+{
+ NDR_CHECK(ejs_push_enum(ndr, r, v, enum_table_nbdt_info_level));
+ return NT_STATUS_OK;
+}
+
+static NTSTATUS ejs_push_nbtd_statistics(struct ndr_ejs *ndr, struct nbtd_statistics *r,
+ struct MprVar *v)
+{
+ NDR_CHECK(ejs_push_hyper(ndr, r->total_received, v, "total_received"));
+ NDR_CHECK(ejs_push_hyper(ndr, r->total_sent, v, "total_sent"));
+ NDR_CHECK(ejs_push_hyper(ndr, r->query_count, v, "query_count"));
+ NDR_CHECK(ejs_push_hyper(ndr, r->register_count, v, "register_count"));
+ NDR_CHECK(ejs_push_hyper(ndr, r->release_count, v, "release_count"));
+ NDR_CHECK(ejs_push_hyper(ndr, r->refresh_count, v, "refresh_count"));
+ return NT_STATUS_OK;
+}
+
+static NTSTATUS ejs_push_nbtd_info(struct ndr_ejs *ndr, union nbtd_info *r,
+ struct MprVar *v)
+{
+ int level;
+ level = ejs_push_get_switch_value(ndr, r);
+ switch (level) {
+ case NBTD_INFO_STATISTICS:
+ NDR_CHECK(ejs_push_object(ndr, r->stats,
+ (ejs_push_fn_t)ejs_push_nbtd_statistics,
+ v, "stats"));
+ break;
+ default:
+ return ejs_push_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", level);
+ }
+ return NT_STATUS_OK;
+}
+
+static NTSTATUS ndr_push_nbtd_information(struct ndr_push *ndr,
+ struct nbtd_information *r, struct MprVar *v)
+{
+ NDR_CHECK(ejs_push_set_switch_value(ndr, &r->out.info, r->in.level));
+ NDR_CHECK(ejs_push_object(ndr, &r->out.info,
+ (ejs_push_fn_t)ejs_push_nbtd_info, v, "info"));
+ return NT_STATUS_OK;
+}