5415 |
{ |
{ |
5416 |
} |
} |
5417 |
|
|
5418 |
int |
FUNCTION * |
5419 |
rewrite_check_function(char *name, Datatype rettype, char *typestr) |
rewrite_check_function(char *name, Datatype rettype, char *typestr) |
5420 |
{ |
{ |
5421 |
int i; |
int i; |
5424 |
FUNCTION *fun = (FUNCTION*) sym_lookup(rewrite_tab, name); |
FUNCTION *fun = (FUNCTION*) sym_lookup(rewrite_tab, name); |
5425 |
if (!fun) { |
if (!fun) { |
5426 |
radlog(L_ERR, _("function %s not defined"), name); |
radlog(L_ERR, _("function %s not defined"), name); |
5427 |
return -1; |
return NULL; |
5428 |
} |
} |
5429 |
if (fun->rettype) { |
if (fun->rettype != rettype) { |
5430 |
radlog(L_ERR, _("function %s returns wrong data type"), name); |
radlog(L_ERR, _("function %s returns wrong data type"), name); |
5431 |
return -1; |
return NULL; |
5432 |
} |
} |
5433 |
|
|
5434 |
for (i = 0, p = fun->parm; i < fun->nparm; i++, p++) { |
for (i = 0, p = fun->parm; i < fun->nparm; i++, p = p->next) { |
5435 |
switch (typestr[i]) { |
switch (typestr[i]) { |
5436 |
case 0: |
case 0: |
5437 |
radlog(L_ERR, |
radlog(L_ERR, |
5438 |
_("function %s takes too few arguments"), |
_("function %s takes too many arguments"), |
5439 |
name); |
name); |
5440 |
return -1; |
return NULL; |
5441 |
|
|
5442 |
case 'i': |
case 'i': |
5443 |
if (p->datatype != Integer) { |
if (p->datatype != Integer) { |
5444 |
radlog(L_ERR, |
radlog(L_ERR, |
5445 |
_("function %s: argument %d must be integer"), |
_("function %s: argument %d must be integer"), |
5446 |
name, i+1); |
name, i+1); |
5447 |
return -1; |
return NULL; |
5448 |
} |
} |
5449 |
break; |
break; |
5450 |
|
|
5453 |
radlog(L_ERR, |
radlog(L_ERR, |
5454 |
_("function %s: argument %d must be string"), |
_("function %s: argument %d must be string"), |
5455 |
name, i+1); |
name, i+1); |
5456 |
return -1; |
return NULL; |
5457 |
} |
} |
5458 |
break; |
break; |
5459 |
|
|
5464 |
|
|
5465 |
if (typestr[i]) { |
if (typestr[i]) { |
5466 |
radlog(L_ERR, |
radlog(L_ERR, |
5467 |
_("function %s takes too many arguments"), |
_("function %s takes too few arguments"), |
5468 |
name); |
name); |
5469 |
return -1; |
return NULL; |
5470 |
} |
} |
5471 |
|
|
5472 |
return 0; |
return fun; |
5473 |
} |
} |
5474 |
|
|
5475 |
int |
int |
5476 |
run_init(pctr_t pc, RADIUS_REQ *request) |
run_init(pctr_t pc, RADIUS_REQ *request) |
5477 |
{ |
{ |
5527 |
} |
} |
5528 |
|
|
5529 |
int |
int |
5530 |
rewrite_invoke(char *name, RADIUS_REQ *request, char *typestr, ...) |
rewrite_invoke(Datatype rettype, void *ret, |
5531 |
|
char *name, RADIUS_REQ *request, char *typestr, ...) |
5532 |
{ |
{ |
5533 |
FILE *fp; |
FILE *fp; |
5534 |
va_list ap; |
va_list ap; |
5535 |
FUNCTION *fun; |
FUNCTION *fun; |
5536 |
int nargs; |
int nargs; |
5537 |
char *s; |
char *s; |
|
RWSTYPE ret; |
|
5538 |
|
|
5539 |
fun = (FUNCTION*) sym_lookup(rewrite_tab, name); |
fun = rewrite_check_function(name, rettype, typestr); |
5540 |
if (!fun) { |
if (!fun) |
5541 |
radlog(L_ERR, _("function %s not defined"), name); |
return -1; |
5542 |
return -1; |
|
|
} |
|
|
|
|
5543 |
rw_mach_init(); |
rw_mach_init(); |
5544 |
if (setjmp(mach.jmp)) { |
if (setjmp(mach.jmp)) { |
5545 |
rw_mach_destroy(); |
rw_mach_destroy(); |
5574 |
} |
} |
5575 |
va_end(ap); |
va_end(ap); |
5576 |
|
|
|
if (fun->nparm != nargs) { |
|
|
radlog(L_ERR, |
|
|
_("%s(): wrong number of arguments (should be %d, passed %d)"), |
|
|
name, fun->nparm, nargs); |
|
|
rw_mach_destroy(); |
|
|
return -1; |
|
|
} |
|
|
|
|
5577 |
/* Imitate a function call */ |
/* Imitate a function call */ |
5578 |
pushn(0); /* Return address */ |
pushn(0); /* Return address */ |
5579 |
run(fun->entry); /* call function */ |
run(fun->entry); /* call function */ |
5583 |
avl_fprint(fp, pair_print_prefix, 1, AVPLIST(&mach)); |
avl_fprint(fp, pair_print_prefix, 1, AVPLIST(&mach)); |
5584 |
fclose(fp); |
fclose(fp); |
5585 |
} |
} |
5586 |
ret = mach.rA; |
|
5587 |
|
switch (rettype) { |
5588 |
|
case String: |
5589 |
|
/* FIXME: constant return. It may not be safe if |
5590 |
|
rw_mach_destroy() actually does something */ |
5591 |
|
*(char**)ret = (char *)mach.rA; |
5592 |
|
break; |
5593 |
|
|
5594 |
|
case Integer: |
5595 |
|
*(UINT4*)ret = mach.rA; |
5596 |
|
} |
5597 |
rw_mach_destroy(); |
rw_mach_destroy(); |
5598 |
return ret; |
return 0; |
5599 |
} |
} |
5600 |
|
|
5601 |
char * |
char * |