1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

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 commit is contained in:
Andrew Tridgell 2005-06-10 12:43:11 +00:00 committed by Gerald (Jerry) Carter
parent 417e967afb
commit 30e876e9c2

View File

@ -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;
}