/* 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