home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
games
/
volume12
/
mdg
/
part05
/
dmain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-04
|
5KB
|
283 lines
/*
MDG Multiuser Dungeon Game -- mdg_daemon
MDG is Copyright 1990 John C. Gonnerman
This program is subject to the general MDG
copyright statement (see enclosed file, Copyright).
*/
static char *sccsx = "@(#) MDG_DAEMON Copyright 1990 John C. Gonnerman";
static char *sccsvers = "@(#) dmain.c\t(1.5)\tcreated 1/4/91";
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include "setup.h"
#include "files.h"
#include "struct.h"
#include "messages.h"
char *progname;
int dqid, pid;
time_t mark_time;
long max_mps, msg_count;
/* flag for debugging */
int in_msgrcv;
FILE *saveopen();
extern long dmsgkey, gsemkey, mapkey, playerkey;
extern struct player_seg *pseg;
extern struct map_seg *mseg;
extern int errno;
extern char *sys_errlist[];
main(argc, argv)
int argc;
char **argv;
{
int i, rc, xx, dfd, tmp;
FILE *gfp;
void shutdown();
struct dmessage msg_buf;
struct msqid_ds qbuf;
progname = argv[0];
/* arrange for file creation to be limited. */
umask(0007);
if(argc != 1) {
fprintf(stderr, ARGCOUNT, progname, argc);
exit(1);
}
fputs(DTITLE, stderr);
fputs(DCOPYRIGHT, stderr);
fputs(LOADMSG, stderr);
if(chdir(GAME_HOME) == -1) {
fprintf(stderr, CANTERR, progname, "chdir()",
sys_errlist[errno]);
exit(1);
}
if((tmp = creat(LOCKFILE, 0)) == -1) {
fprintf(stderr, "%s: daemon lock found, aborting...\n",
progname);
exit(99);
}
close(tmp);
if((dfd = open(ERRLOGFILE, O_WRONLY|O_CREAT|O_TRUNC, 0660)) == -1) {
fprintf(stderr, CANTERR, progname, "open error log",
sys_errlist[errno]);
exit(1);
}
close(2);
dup(dfd);
close(dfd);
setbuf(stderr, NULL);
close(0);
close(1);
fputs(LOADMSG, stderr);
if((rc = fork()) == -1) {
fprintf(stderr, CANTERR, progname, "fork()",
sys_errlist[errno]);
exit(1);
}
if(rc != 0)
exit(0);
setpgrp();
/* load keys from config file */
loadconfig();
/* load the player segment */
if((gfp = saveopen(ITEMS, "r")) == NULL) {
fprintf(stderr, CANTERR, progname, "open item file",
sys_errlist[errno]);
exit(1);
}
load_pseg(gfp);
fclose(gfp);
/* load the monster table */
if((gfp = saveopen(MONSTERS, "r")) == NULL) {
fprintf(stderr, CANTERR, progname, "open monster file",
sys_errlist[errno]);
exit(1);
}
load_monsters(gfp);
fclose(gfp);
/* load the notes table */
if((gfp = saveopen(NOTES, "r")) == NULL) {
fprintf(stderr, CANTERR, progname, "open note file",
sys_errlist[errno]);
exit(1);
}
load_notes(gfp);
fclose(gfp);
/* load the map segment */
if((gfp = saveopen(MAP, "r")) == NULL) {
fprintf(stderr, CANTERR, progname, "open map file",
sys_errlist[errno]);
exit(1);
}
load_mseg(gfp);
fclose(gfp);
/* initialize ranged table */
init_ranged();
/* attach the segments. */
seg_attach();
/* create message queues (if needed) and open them */
if((dqid = msgget(dmsgkey, IPC_CREAT | 0777)) == -1) {
fprintf(stderr, CANTERR, progname, "open daemon queue",
sys_errlist[errno]);
exit(1);
}
msgctl(dqid, IPC_STAT, &qbuf);
qbuf.msg_qbytes = DQSIZ;
msgctl(dqid, IPC_SET, &qbuf);
if((pseg->sid = semget(gsemkey, MAX_PLAYERS, IPC_CREAT|0777)) == -1) {
fprintf(stderr, CANTERR, progname, "open game semset",
sys_errlist[errno]);
exit(1);
}
/* ready to run, so set signal traps */
signal(SIGTERM, shutdown);
signal(SIGHUP, shutdown);
/* lower our priority ... */
nice(NICEVAL);
/* ... start the monster packet driver ... */
if((pid = fork()) == 0) {
if(execl(CLOCKTASK, CLOCKTASK, (char *)0) == -1) {
fprintf(stderr, CANTERR, progname, "execl()",
sys_errlist[errno]);
exit(1);
}
} else if(pid == -1) {
fprintf(stderr, CANTERR, progname, "fork()",
sys_errlist[errno]);
exit(1);
}
/* ... seed the random number generator ... */
random();
/* ... and place the stuff. */
place_items();
place_monsters();
/* we got it, let's do it! */
mark_time = time(NULL);
max_mps = 0;
msg_count = 0;
while(1) {
in_msgrcv = 1;
if((xx = msgrcv(dqid, &msg_buf, DMSGSIZ, 0L, 0)) == DMSGSIZ) {
msg_count++;
msg_handler(msg_buf);
}
in_msgrcv = 0;
if(mark_time != time(NULL)) {
if(msg_count > max_mps)
max_mps = msg_count;
msg_count = 0;
mark_time = time(NULL);
}
}
}
int rename(oldname, newname)
char *oldname, *newname;
{
unlink(newname);
if(link(oldname, newname) != -1)
return unlink(oldname);
else
return -1;
}
FILE *saveopen(file, mode)
char *file, *mode;
{
FILE *fp;
char savefile[128], altfile[128];
strcpy(savefile, file);
strcat(savefile, SAVEEXT);
strcpy(altfile, file);
if(mode[0] == 'r') {
strcat(altfile, STARTEXT);
if((fp = fopen(savefile, "r")) == NULL)
return fopen(altfile, "r");
else
return fp;
} else if(mode[0] == 'w') {
strcat(altfile, OLDEXT);
rename(savefile, altfile);
return fopen(savefile, "w");
}
}
/* end of file */