/* wait_cmd.c */
#include <sys/types.h>
#include <sys/time.h>
#include "db.h"
#include "externs.h"
#include "interface.h"
struct oq {
time_t when;
dbref who;
char *comm;
struct oq *next;
};
struct oq *cs =NULL;
void do_wait_command(dbref who, const char *what, int nos)
{
time_t mytime;
struct oq *cur;
struct oq *cur2;
mytime = time(NULL);
mytime += nos;
if(!cs || cs->when >= mytime) {
cur = malloc(sizeof(*cur));
cur->next = cs;
cs = cur;
} else {
for(cur = cs; cur->next && (cur->next->when < mytime); cur = cur->next);
cur2 = malloc(sizeof(*cur2));
cur2->next = cur->next;
cur->next = cur2;
cur = cur2;
}
cur->who = who;
cur->comm = alloc_string(what);
cur->when = mytime;
}
static void freer(struct oq *what)
{
if(what->comm) free(what->comm);
free(what);
}
static int check_a_waits()
{
struct oq *cur;
if(!cs) {
return 0;
}
if(cs->when > time(NULL)) {
return 0; /* nothing to do right now */
}
cur = cs;
cs = cs->next;
if(cur->comm)
trigobj(cur->who, cur->comm, cur->who);
freer(cur);
return 1;
}
void do_halt(dbref player, const char *what)
{
dbref victim;
if((victim = match_controlled(player, what)) != NOTHING) {
if(Typeof(victim) != TYPE_PLAYER &&
Typeof(victim) != TYPE_THING) {
notify(player, "Illegal object type.");
return;
}
else {
halt_long(victim);
notify(player, "Halted.");
}
}
return;
}
void halt_long(dbref obj)
{
struct oq *x;
struct oq *y;
x = y = cs;
while(x) {
if(x->who == obj) {
if(y != x) {
y->next = x->next;
freer(x);
x = y->next;
}
else {
cs = cs -> next;
freer(x);
x = y = cs;
}
}
else {
y = x;
x = x -> next;
}
}
return;
}
void wc_every_sec()
{
while(check_a_waits());
}
void do_wait(dbref who, const char *when,const char *comm)
{
if(when)
while(*when == ' ') when++;
if(!when || !*when || !number(when) || !comm || !*comm) {
notify(who,"Usage: @wait <seconds>=<command>");
return;
}
do_wait_command(who, comm, atoi(when));
notify(who, "Queued.");
}
void do_ps(dbref player, const char *who)
{
dbref who_d = 0;
struct oq *d;
int count = 0;
if(!(*who))
if(!Arch(player))
who = NAME(player);
if(*who)
who_d = lookup_player(who);
if(who_d && (who_d == NOTHING || !controls(player, who_d))) {
notify(player,"Permission denied!");
return;
}
sprintf(buf, "%7s %-22s %-25s %-20s",
"Wait", "Command", "Source", "Owner");
notify(player, buf);
for(d = cs; d; d = d->next) {
if((!who_d && controls(player, d->who)) || (OWNER(d->who) == who_d)) {
char tmp3[25];
char *tmp1;
char *tmp2;
int x1, x2;
tmp1 = alloc_string(unparse_object(player, d->who));
tmp2 = alloc_string(unparse_object(player, OWNER(d->who)));
strncpy(tmp3, d->comm, 22);
x1 = strlen(tmp1) - 25;
x2 = strlen(tmp2) - 20;
if(x1 < 0)
x1 = 0;
if(x2 < 0)
x2 = 0;
sprintf(buf,"%7d %-22s %-25s %-20s", (int) (d-> when - time(NULL)),
tmp3, tmp1 + x1, tmp2 + x2);
notify(player, buf);
free((void *) tmp1);
free((void *) tmp2);
}
count++;
}
sprintf(buf, "%d total processes.", count);
notify(player, buf);
}