/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#include "db.h"
#include "config.h"
#include "bytecode.h"
#include "globals.h"
#include "interface.h"
#include "externs.h"
static datum sys_examine (void)
{
struct object *o;
char buf[MAX_STRLEN + MAX_STRLEN + 16];
datum key;
datum value;
char *p;
/* you examine me */
if ((o = object (me)) == 0)
return 0;
FOREACH (o->vars, key, value) {
strcpy (buf, string (key));
strcat (buf, ": ");
p = buf + strlen (buf);
switch (*buf) {
case STRING_MARKER:
if (value != NOTHING) {
strcpy (p, string (value));
}
break;
case BOOL_MARKER:
strcpy (p, value ? "TRUE" : "FALSE");
break;
case TIME_MARKER:
strcpy (p, time_string (value));
break;
case NUM_MARKER:
default:
sprintf (p, "%ld", value);
break;
}
notify (you, buf);
}
END_FOREACH;
/* just dump the names of the sets */
FOREACH (o->sets, key, value) {
notify (you, string (key));
}
END_FOREACH;
if (!isempty (o->actions)) {
FOREACH (o->actions, key, value) {
sprintf (buf, "%c%s", ACTION_MARKER, string (key));
notify (you, buf);
}
END_FOREACH;
}
return 1;
}
static datum do_request (int *flag)
{
if (flag_set (you, F_ADMIN)) {
*flag = 1;
return 1;
} else {
return 0;
}
}
static datum sys_gc (void)
{
return do_request (&please_gc);
}
static datum sys_checkpoint (void)
{
return do_request (&please_checkpoint);
}
static datum sys_shutdown (void)
{
return do_request (&shutdown_flag);
}
/* encrypt password on me */
static datum sys_encrypt_password (void)
{
datum password;
if ((password = lookup (me, PASSWORD_NAME)) == NOTHING) {
return 0;
}
/* else */
return set_variable (me, PASSWORD_NAME,
intern (encrypt_password (string (password))));
}
/* checks all the code on me and reports errors to you */
static datum sys_verify (void)
{
datum key;
datum value;
char buf[MAX_STRLEN];
const char *s;
datum *code;
struct object *o;
if ((o = object (me)) == 0)
return 0;
if (!isempty (o->actions)) {
FOREACH (o->actions, key, value) {
if ((s = string (value)) == 0) {
sprintf (buf, "&%s: no code!", string (key));
notify (you, buf);
} else if ((code = compile (s)) == 0) {
sprintf (buf, "&%s: %s", string (key), compile_error);
notify (you, buf);
} else {
/* everything ok, free the compiled block */
/* (it's not safe to call set_compiled_string down here) */
free ((void *) code);
}
} END_FOREACH;
}
return 1;
}
static datum sys_remove_delays (void)
{
remove_delays (me);
return 1;
}
#define SYSFUNC_COUNT (7)
static datum (*sysfuncs[SYSFUNC_COUNT]) (void) = {
sys_examine,
sys_gc,
sys_checkpoint,
sys_shutdown, sys_encrypt_password, sys_verify, sys_remove_delays,};
datum do_syscall (datum number)
{
if (number <= 0 || number > SYSFUNC_COUNT) {
return 0;
} else {
return (*sysfuncs[number - 1]) ();
}
}