/* Define a few local routines inside and outside of the MUCK stuff. */
#include "config.h"
#include "interface.h"
#include "externs.h"
#include "params.h"
extern time_t time_started;
void do_fortune(__DO_PROTO)
{
char *cmd = "/usr/data/pa1/af/games/fortune /usr/data/pa1/af/games/lib/dat";
char buf[BUFFER_LEN];
FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL) {
notify(player, player, "Your fortune is ........");
while (fgets(buf, BUFFER_LEN, ptr) != NULL) {
buf[strlen(buf) -1] = '\0';
notify_nolisten(player, buf);
}
pclose(ptr);
}
}
void do_load(__DO_PROTO)
{
char *cmd = "w", cmd2[BUFFER_LEN], buf[BUFFER_LEN];
FILE *ptr, *ptr2;
if(!Wizard(player)) {
notify(player, player, "Wizard command only. Take off eh!");
return;
}
sprintf (cmd2, "%s%d", "ps -v", getpid());
if ((ptr2 = popen(cmd2, "r")) != NULL) {
notify(player, player, "MUCK process stats................. ");
while (fgets(buf, BUFFER_LEN, ptr2) != NULL) {
buf[strlen(buf) -1] = '\0';
notify_nolisten(player, buf);
}
pclose(ptr2);
}
notify(player, player, " ");
if ((ptr = popen(cmd, "r")) != NULL) {
notify(player, player, "Overall host load.....");
while (fgets(buf, BUFFER_LEN, ptr) != NULL) {
buf[strlen(buf) -1] = '\0';
notify_nolisten(player, buf);
}
pclose(ptr);
}
}
void do_prop_load(__DO_PROTO)
{
int i;
if(!God(player)) {
notify(player, player, "Wizard command only. Take off eh!");
return;
}
#ifndef USE_DBP_STR
for (i = 0; i < db_top; i++) {
if (Typeof(i) != TYPE_GARBAGE) {
DBFETCHPROP(i);
if(GET_DESC(i))
add_property(i, "desc", GET_DESC(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_SUCC(i))
add_property(i, "succ", GET_SUCC(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_FAIL(i))
add_property(i, "fail", GET_FAIL(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_DROP(i))
add_property(i, "drop", GET_DROP(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_OSUCC(i))
add_property(i, "osucc", GET_OSUCC(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_OFAIL(i))
add_property(i, "ofail", GET_OFAIL(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
if(GET_ODROP(i))
add_property(i, "odrop", GET_ODROP(i), PERMS_COREAD | PERMS_COWRITE |
PERMS_OTSRCH | PERMS_OTREAD, ACCESS_CO);
}
}
#endif
}
void dump_stats_on_close()
{
int rooms = 0, exits = 0, things = 0, players = 0, programs = 0,
total = 0, garbage = 0, frames = 0, pid = 0, psize = 0;
dbref i;
char *sitename;
time_t downtime;
#ifdef HAVE_GETRUSAGE
struct rusage usage;
#endif
for (i = 0; i < db_top; i++)
{
switch(Typeof(i))
{
case TYPE_ROOM: total++; rooms++; break;
case TYPE_EXIT: total++; exits++; break;
case TYPE_THING: total++; things++;
break;
case TYPE_PLAYER: total++; players++;
break;
case TYPE_PROGRAM: total++; programs++; break;
case TYPE_GARBAGE: total++; garbage++; break;
}
}
fprintf(stderr,"Start time: %s", asctime(localtime(&time_started)));
time(&downtime);
fprintf(stderr,"Down time : %s", asctime(localtime(&downtime)));
fprintf(stderr, "\n%s stats at shutdown:\n", (sitename =
get_property_data((dbref) 0, RWHO_NAME, ACCESS_WI)) ?
sitename : "Universe");
fprintf(stderr, " Rooms : (%6.2f%%) %5d Exits : (%6.2f%%) %5d\n",
DO_PERCENT(rooms),DO_PERCENT(exits));
fprintf(stderr, " Things : (%6.2f%%) %5d Programs : (%6.2f%%) %5d\n",
DO_PERCENT(things),DO_PERCENT(programs));
fprintf(stderr, " Players : (%6.2f%%) %5d Processes: ( ) %5d\n",
DO_PERCENT(players), frames);
fprintf(stderr, " Garbage : (%6.2f%%) %5d Total : (100.00%%) %5d\n\n",
DO_PERCENT(garbage),total);
pid=getpid();
#ifdef HAVE_GETPAGESIZE
psize=getpagesize();
#endif
fprintf(stderr, "Peak number of players...........%d\n", maxplayer);
fprintf(stderr, "Process ID.......................%d\n", pid);
#ifdef HAVE_GETRUSAGE
if(getrusage(RUSAGE_SELF, &usage) != -1)
{
fprintf(stderr, "User time used (CPU secs)........%ld.%ld\n",
usage.ru_utime.tv_sec, usage.ru_utime.tv_usec / 10000);
fprintf(stderr, "System time used(CPU secs).......%ld.%ld\n",
usage.ru_stime.tv_sec, usage.ru_stime.tv_usec / 10000);
#ifdef HAVE_GETPAGESIZE
fprintf(stderr, "Resident memory (bytes)..........%ld\n",
usage.ru_maxrss * psize);
#endif
fprintf(stderr, "Page faults (No I/O).............%ld\n",
usage.ru_minflt);
fprintf(stderr, "Page faults (I/O)................%ld\n",
usage.ru_majflt);
fprintf(stderr, "Swapped..........................%ld\n",
usage.ru_nswap);
fprintf(stderr, "Input services...................%ld\n",
usage.ru_inblock);
fprintf(stderr, "Output services..................%ld\n",
usage.ru_oublock);
fprintf(stderr, "Messages/Bytes sent..............%ld/%d\n",
usage.ru_msgsnd, 0);
fprintf(stderr, "Messages/Bytes received..........%ld/%d\n",
usage.ru_msgrcv, 0);
fprintf(stderr, "Signals received.................%ld\n",
usage.ru_nsignals);
fprintf(stderr, "Voluntarily context switches.....%ld\n",
usage.ru_nvcsw);
fprintf(stderr, "Involuntarily context switches...%ld\n",
usage.ru_nivcsw);
}
#endif
}
void profile_users()
{
descriptor_data *d;
int i=0;
for(d = descriptor_list; d; d = d->next) {
if (d->connected)
log_users("%s\n", d->hostname);
i++;
}
log_status("USERS %d\n", i);
}
#ifdef XEVENTS
#define MALLOC(result, type, number) \
if (!((result) = (type *) malloc ((number) * sizeof (type)))) \
panic("Out of memory"); \
void free_queue(descriptor_data *d)
{
xque *tmp;
if(!d->q) return;
d->qcnt --;
if (d->q->comm) free(d->q->comm);
tmp = d->q->next;
free(d->q);
d->q = tmp;
}
void add_queue(descriptor_data *d, char *command)
{
xque *tmp, *tmp2; /* This code is HORRIBLY inefficient! */
if(d->qcnt > MAX_XEVENTS) /* Flush if we overfill */
while(d->q) free_queue(d);
if(d->connected) { /* Don't let em spam us */
while(*command && !isspace(*command)) command ++;
command++;
if(!*command) return;
MALLOC(tmp, xque, 1);
tmp->comm = dup_string(command);
tmp->next = NULL;
d->qcnt ++;
if (d->q) {
for (tmp2 = d->q; tmp2->next != NULL; tmp2 = tmp2->next)
; /* do nothing */
tmp2->next = tmp;
} else
d->q = tmp;
}
}
void do_xqueue (__DO_PROTO)
{
descriptor_data *d;
for(d = descriptor_list; d; d = d->next) {
if (d->connected && d->q && d->q->comm && d->player == player) {
notify(player, player, d->q->comm);
free_queue(d);
}
}
}
void check_xevents(frame *fr)
{
descriptor_data *d;
for(d = descriptor_list; d; d = d->next) {
if(d->player == fr->player && d->q && d->q->comm) {
if (fr->argument.top >= STACK_SIZE) {
notify(fr->player, fr->player, "Program stack overflow.");
fr->status = STATUS_DEAD;
free_queue(d);
return;
}
fr->argument.st[fr->argument.top].type = PROG_STRING;
fr->argument.st[fr->argument.top++].data.string =
dup_string(d->q->comm);
fr->status = STATUS_RUN;
free_queue(d);
return;
}
}
}
#endif