home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume12 / mdg / part05 / dmain.c < prev    next >
C/C++ Source or Header  |  1991-03-04  |  5KB  |  283 lines

  1. /*
  2.     MDG Multiuser Dungeon Game -- mdg_daemon
  3.     
  4.     MDG is Copyright 1990 John C. Gonnerman
  5.     This program is subject to the general MDG 
  6.     copyright statement (see enclosed file, Copyright).
  7. */
  8.  
  9. static char *sccsx = "@(#) MDG_DAEMON Copyright 1990 John C. Gonnerman";
  10. static char *sccsvers = "@(#) dmain.c\t(1.5)\tcreated 1/4/91";
  11.  
  12. #include <stdio.h>
  13. #include <fcntl.h>
  14. #include <signal.h>
  15. #include <sys/types.h>
  16. #include <sys/stat.h>
  17. #include <sys/ipc.h>
  18. #include <sys/msg.h>
  19. #include <sys/sem.h>
  20. #include "setup.h"
  21. #include "files.h"
  22. #include "struct.h"
  23. #include "messages.h"
  24.  
  25. char *progname;
  26. int dqid, pid;
  27. time_t mark_time;
  28. long max_mps, msg_count;
  29.  
  30. /* flag for debugging */
  31. int in_msgrcv;
  32.  
  33. FILE *saveopen();
  34.  
  35. extern long dmsgkey, gsemkey, mapkey, playerkey;
  36.  
  37. extern struct player_seg *pseg;
  38. extern struct map_seg *mseg;
  39.  
  40. extern int errno;
  41. extern char *sys_errlist[];
  42.  
  43.  
  44. main(argc, argv)
  45. int argc;
  46. char **argv;
  47. {
  48.     int i, rc, xx, dfd, tmp;
  49.     FILE *gfp;
  50.     void shutdown();
  51.     struct dmessage msg_buf;
  52.     struct msqid_ds qbuf;
  53.  
  54.     progname = argv[0];
  55.  
  56.     /* arrange for file creation to be limited. */
  57.  
  58.     umask(0007);
  59.  
  60.     if(argc != 1) {
  61.         fprintf(stderr, ARGCOUNT, progname, argc);
  62.         exit(1);
  63.     }
  64.  
  65.     fputs(DTITLE, stderr);
  66.     fputs(DCOPYRIGHT, stderr);
  67.     fputs(LOADMSG, stderr);
  68.  
  69.     if(chdir(GAME_HOME) == -1) {
  70.         fprintf(stderr, CANTERR, progname, "chdir()",
  71.             sys_errlist[errno]);
  72.         exit(1);
  73.     }
  74.  
  75.     if((tmp = creat(LOCKFILE, 0)) == -1) {
  76.         fprintf(stderr, "%s: daemon lock found, aborting...\n",
  77.             progname);
  78.         exit(99);
  79.     }
  80.  
  81.     close(tmp);
  82.  
  83.     if((dfd = open(ERRLOGFILE, O_WRONLY|O_CREAT|O_TRUNC, 0660)) == -1) {
  84.         fprintf(stderr, CANTERR, progname, "open error log",
  85.             sys_errlist[errno]);
  86.         exit(1);
  87.     }
  88.  
  89.     close(2);
  90.     dup(dfd);
  91.     close(dfd);
  92.  
  93.     setbuf(stderr, NULL);
  94.  
  95.     close(0);
  96.     close(1);
  97.  
  98.     fputs(LOADMSG, stderr);
  99.  
  100.     if((rc = fork()) == -1) {
  101.         fprintf(stderr, CANTERR, progname, "fork()", 
  102.             sys_errlist[errno]);
  103.         exit(1);
  104.     }
  105.  
  106.     if(rc != 0)
  107.         exit(0);
  108.  
  109.     setpgrp();
  110.  
  111.     /* load keys from config file */
  112.  
  113.     loadconfig();
  114.  
  115.     /* load the player segment */
  116.  
  117.     if((gfp = saveopen(ITEMS, "r")) == NULL) {
  118.         fprintf(stderr, CANTERR, progname, "open item file",
  119.             sys_errlist[errno]);
  120.         exit(1);
  121.     }
  122.  
  123.     load_pseg(gfp);
  124.     fclose(gfp);
  125.  
  126.     /* load the monster table */
  127.  
  128.     if((gfp = saveopen(MONSTERS, "r")) == NULL) {
  129.         fprintf(stderr, CANTERR, progname, "open monster file",
  130.             sys_errlist[errno]);
  131.         exit(1);
  132.     }
  133.  
  134.     load_monsters(gfp);
  135.     fclose(gfp);
  136.  
  137.     /* load the notes table */
  138.  
  139.     if((gfp = saveopen(NOTES, "r")) == NULL) {
  140.         fprintf(stderr, CANTERR, progname, "open note file",
  141.             sys_errlist[errno]);
  142.         exit(1);
  143.     }
  144.  
  145.     load_notes(gfp);
  146.     fclose(gfp);
  147.  
  148.     /* load the map segment */
  149.  
  150.     if((gfp = saveopen(MAP, "r")) == NULL) {
  151.         fprintf(stderr, CANTERR, progname, "open map file",
  152.             sys_errlist[errno]);
  153.         exit(1);
  154.     }
  155.  
  156.     load_mseg(gfp);
  157.     fclose(gfp);
  158.  
  159.     /* initialize ranged table */
  160.  
  161.     init_ranged();
  162.  
  163.     /* attach the segments. */
  164.  
  165.     seg_attach();
  166.  
  167.     /* create message queues (if needed) and open them */
  168.  
  169.     if((dqid = msgget(dmsgkey, IPC_CREAT | 0777)) == -1) {
  170.         fprintf(stderr, CANTERR, progname, "open daemon queue",
  171.             sys_errlist[errno]);
  172.         exit(1);
  173.     }
  174.  
  175.     msgctl(dqid, IPC_STAT, &qbuf);
  176.     qbuf.msg_qbytes = DQSIZ;
  177.     msgctl(dqid, IPC_SET, &qbuf);
  178.  
  179.     if((pseg->sid = semget(gsemkey, MAX_PLAYERS, IPC_CREAT|0777)) == -1) {
  180.         fprintf(stderr, CANTERR, progname, "open game semset",
  181.             sys_errlist[errno]);
  182.         exit(1);
  183.     }
  184.  
  185.     /* ready to run, so set signal traps */
  186.  
  187.     signal(SIGTERM, shutdown);
  188.     signal(SIGHUP, shutdown);
  189.  
  190.     /* lower our priority ... */
  191.  
  192.     nice(NICEVAL);
  193.  
  194.     /* ... start the monster packet driver ... */
  195.  
  196.     if((pid = fork()) == 0) {
  197.         if(execl(CLOCKTASK, CLOCKTASK, (char *)0) == -1) {
  198.             fprintf(stderr, CANTERR, progname, "execl()",
  199.                 sys_errlist[errno]);
  200.             exit(1);
  201.         }
  202.     } else if(pid == -1) {
  203.         fprintf(stderr, CANTERR, progname, "fork()",
  204.             sys_errlist[errno]);
  205.         exit(1);
  206.     }
  207.  
  208.     /* ... seed the random number generator ... */
  209.  
  210.     random();
  211.  
  212.     /* ... and place the stuff. */
  213.  
  214.     place_items();
  215.     place_monsters();
  216.  
  217.     /* we got it, let's do it! */
  218.  
  219.     mark_time = time(NULL);
  220.     max_mps = 0;
  221.     msg_count = 0;
  222.  
  223.     while(1) {
  224.         in_msgrcv = 1;
  225.  
  226.         if((xx = msgrcv(dqid, &msg_buf, DMSGSIZ, 0L, 0)) == DMSGSIZ) {
  227.                 msg_count++;
  228.                 msg_handler(msg_buf);
  229.         } 
  230.  
  231.         in_msgrcv = 0;
  232.  
  233.         if(mark_time != time(NULL)) {
  234.             if(msg_count > max_mps)
  235.                 max_mps = msg_count;
  236.             msg_count = 0;
  237.             mark_time = time(NULL);
  238.         }
  239.     }
  240. }
  241.  
  242.  
  243. int rename(oldname, newname)
  244. char *oldname, *newname;
  245. {
  246.     unlink(newname);
  247.  
  248.     if(link(oldname, newname) != -1)
  249.         return unlink(oldname);
  250.     else
  251.         return -1;
  252. }
  253.  
  254.  
  255. FILE *saveopen(file, mode)
  256. char *file, *mode;
  257. {
  258.     FILE *fp;
  259.     char savefile[128], altfile[128];
  260.  
  261.     strcpy(savefile, file);
  262.     strcat(savefile, SAVEEXT);
  263.  
  264.     strcpy(altfile, file);
  265.  
  266.     if(mode[0] == 'r') {
  267.         strcat(altfile, STARTEXT);
  268.  
  269.         if((fp = fopen(savefile, "r")) == NULL)
  270.             return fopen(altfile, "r");
  271.         else 
  272.             return fp;
  273.     } else if(mode[0] == 'w') {
  274.         strcat(altfile, OLDEXT);
  275.         rename(savefile, altfile);
  276.  
  277.         return fopen(savefile, "w");
  278.     }
  279. }
  280.  
  281.  
  282. /* end of file */
  283.