/* pcmds.c */
/* $Id: pcmds.c,v 1.5 1993/08/16 01:56:36 nils Exp $ */
#include <stdio.h>
#include <time.h>
#include <sys/file.h>
#include "credits.h"
#include "db.h"
#include "config.h"
#include "externs.h"
#ifdef USE_SPACE
#include "space.h"
#endif
char *base_date = BASE_DATE;
char *upgrade_date = UPGRADE_DATE;
int day_release=DAY_RELEASE;
extern long muse_up_time;
char *get_version()
{
static char buf[1000];
static int abs_day = 0;
if(abs_day == 0) {
abs_day = (atoi(&upgrade_date[6]) - 91) * 372;
abs_day += (atoi(upgrade_date) - 1) * 31;
abs_day += atoi(&upgrade_date[3]);
abs_day -= (atoi(&base_date[6]) - 91) * 372;
abs_day -= (atoi(base_date) - 1) * 31;
abs_day -= atoi(&base_date[3]);
}
sprintf(buf,"%s.%d.%d%s",BASE_VERSION,abs_day,day_release-1
#ifdef MODIFIED
,"M"
#else
#ifdef BETA
," beta"
#else
,""
#endif
#endif
);
return buf;
}
void do_version(player)
dbref player;
{
notify(player, tprintf("%s Version Information:", MUSE_NAME));
notify(player, tprintf(" Last Code Upgrade: %s", UPGRADE_DATE));
notify(player, tprintf(" Version reference: %s",
get_version()));
notify(player, tprintf(" DB Format Version: v%d", DB_VERSION));
#ifdef USE_SPACE /* MM */
notify(player, tprintf(" Space Version: %s", SPACE_VERSION));
#endif
}
void do_uptime(player)
dbref player;
{
int index = 28;
long now, a, b=0, c=0, d=0, t;
static char pattern[] = "%d days, %d hrs, %d min and %d sec";
char format[50];
/* get current time and total run time */
now = time(NULL);
a = now - muse_up_time;
/* calc seconds */
t = a / 60L;
if ( t > 0L ) {
b = a % 60L;
a = t;
if ( a > 0L )
index = 17;
/* calc minutes */
t = a / 60L;
if ( t > 0 ) {
c = b;
b = a % 60L;
a = t;
if ( a > 0 )
index = 9;
/* calc hours and days */
t = a / 24L;
if ( t > 0 ) {
d = c;
c = b;
b = a % 24L;
a = t;
if ( a > 0 )
index = 0;
}
}
}
/* rig up format for operation time output */
sprintf(format, "%%s %s", &pattern[index]);
notify(player, tprintf("%s runtime stats:", MUSE_NAME));
notify(player, tprintf(" Muse boot time..: %s",
mktm(muse_up_time, "D", player)));
notify(player, tprintf(" Current time....: %s",
mktm(now, "D", player)));
notify(player, tprintf(format, " In operation for:",
(int) a, (int) b, (int) c, (int) d));
#ifdef USE_SPACE /* MM */
if(halt_space)
notify(player, " Space status....: Running");
else
notify(player, " Space status....: Halted");
#endif
}
/* uptime stuff */
static int cpos=0;
static int qcmdcnt[60*5];
static int pcmdcnt[60*5];
void inc_qcmdc()
{
qcmdcnt[cpos]++;
pcmdcnt[cpos]--; /* we're gunna get this again in process_command */
}
static void check_time()
{
static struct timeval t,last;
gettimeofday(&t,NULL);
while (t.tv_sec != last.tv_sec) {
if (last.tv_sec - t.tv_sec > 60*5 || t.tv_sec-last.tv_sec > 60*5)
last.tv_sec = t.tv_sec;
else
last.tv_sec++;
cpos++;
if (cpos>=60*5) cpos = 0;
qcmdcnt[cpos] = pcmdcnt[cpos];
}
}
void inc_pcmdc()
{
check_time();
pcmdcnt[cpos]++;
}
void do_cmdav(player)
dbref player;
{
int len;
notify(player,"Seconds Player cmds/s Queue cmds/s Tot cmds/s");
for(len=5; len!=0;len=((len==5)?30:((len==30)?(60*5):0))) {
int i;
int cnt;
double pcmds=0, qcmds=0;
char buf[1024];
i = cpos-1;
cnt = len;
while (cnt) {
if (i<=0) i = 60*5-1;
pcmds += pcmdcnt[i];
qcmds += qcmdcnt[i];
i--; cnt--;
}
sprintf(buf,"%-8d %-14f %-14f %f", len, pcmds/len, qcmds/len, (pcmds+qcmds)/len);
notify(player,buf);
}
}
#ifdef EXEC
void do_exec(player,arg1,arg2)
dbref player;
char *arg1;
char *arg2;
{
dbref thing;
int fd;
int mypipe[2];
int forkno;
char buf[1024];
char *bufptr; /* for seperating arg2 by ;'s */
char *curptr;
FILE *f;
char fbuf[1024]; /* for reading in the @exec perms file */
thing = match_thing(player, arg1);
if (thing == NOTHING) return;
if (!power(player,POW_EXEC)) {
puts("permission denied");
return;
}
strcpy (bufptr=buf, arg2);
while (curptr=parse_up(&bufptr, ';')) {
FILE *f;
f = fopen(EXEC_CONFIG,"r");
while (fgets(fbuf, 1000, f)) {
if (*fbuf != 'g' || fbuf[1] != ' ')
continue;
fbuf[strlen(fbuf)-1] = '\0';
if (wild_match(fbuf+2,curptr))
goto okmatch;
}
fclose(f);
notify(player,"Permission denied: illegal command");
return;
okmatch:
fclose(f);
}
pipe(mypipe);
forkno = vfork();
if (forkno == -1) {
notify(player,"Fork failed.");
return;
}
if (forkno > 0) { /* parent */
rwho_setupfd(thing,mypipe[0]);
close(mypipe[1]);
return;
}
/* child */
{ char *envptr[2];
char envbuf[1010];
*envbuf = '\0';
envptr[0] = envptr[1] = NULL;
f = fopen (EXEC_CONFIG, "r");
while (fgets(fbuf, 1000, f)) {
if (*fbuf != 'p' || fbuf[1] != ' ')
continue;
fbuf[strlen(fbuf)-1] = '\0';
sprintf (envbuf, "PATH=%s", fbuf+2);
}
fclose(f);
fd = open("/dev/null",O_RDONLY,0);
dup2(fd,0); /* we don't have a stdin. */
dup2(mypipe[1],1); /* stdout and */
dup2(mypipe[1],2); /* stderr go back through to the executer. */
if (*envbuf)
envptr[0] = envbuf;
execle(EXEC_SHELL,EXEC_SHELLAV0,"-c",arg2, NULL, envptr);
write(1,"Couldn't get sh!!\n",sizeof("Couldn't get sh!!\n"));
_exit(1);
}
}
#endif