Home | History | Annotate | Line # | Download | only in phantasia
setup.c revision 1.14
      1  1.14     jmc /*	$NetBSD: setup.c,v 1.14 2004/12/09 05:15:59 jmc Exp $	*/
      2   1.3     cgd 
      3   1.1     jtc /*
      4   1.1     jtc  * setup.c - set up all files for Phantasia
      5   1.1     jtc  */
      6   1.2      pk #include <sys/param.h>
      7   1.1     jtc #include <sys/stat.h>
      8  1.10     jsm #include <fcntl.h>
      9   1.4     cgd #include "include.h"
     10  1.10     jsm 
     11  1.12     wiz int main(int, char *[]);
     12  1.12     wiz void Error(const char *, const char *) __attribute__((__noreturn__));
     13  1.12     wiz double drandom(void);
     14  1.10     jsm 
     15   1.1     jtc /**/
     17   1.1     jtc /************************************************************************
     18   1.1     jtc /
     19   1.1     jtc / FUNCTION NAME: main()
     20   1.1     jtc /
     21   1.1     jtc / FUNCTION: setup files for Phantasia 3.3.2
     22   1.1     jtc /
     23   1.1     jtc / AUTHOR: E. A. Estes, 12/4/85
     24   1.1     jtc /
     25   1.1     jtc / ARGUMENTS: none
     26   1.1     jtc /
     27   1.1     jtc / RETURN VALUE: none
     28   1.1     jtc /
     29   1.1     jtc / MODULES CALLED: time(), exit(), stat(), Error(), creat(), close(), fopen(),
     30   1.1     jtc /	fgets(), floor(), srandom(), umask(), drandom(), strcpy(), getuid(),
     31   1.1     jtc /	unlink(), fwrite(), fclose(), sscanf(), printf(), strlen(), fprintf()
     32   1.1     jtc /
     33   1.1     jtc / GLOBAL INPUTS: Curmonster, _iob[], Databuf[], *Monstfp, Enrgyvoid
     34   1.1     jtc /
     35   1.1     jtc / GLOBAL OUTPUTS: Curmonster, Databuf[], *Monstfp, Enrgyvoid
     36   1.1     jtc /
     37   1.1     jtc / DESCRIPTION:
     38   1.1     jtc /
     39   1.1     jtc /	This program tries to verify the parameters specified in
     40   1.1     jtc /	the Makefile.
     41   1.1     jtc /
     42   1.1     jtc /	Create all necessary files.  Note that nothing needs to be
     43   1.1     jtc /	put in these files.
     44   1.1     jtc /	Also, the monster binary data base is created here.
     45  1.10     jsm /
     46   1.1     jtc / ************************************************************************/
     47   1.9     jsm 
     48   1.1     jtc static const char *const files[] = {		/* all files to create */
     49   1.1     jtc 	_PATH_MONST,
     50   1.1     jtc 	_PATH_PEOPLE,
     51   1.1     jtc 	_PATH_MESS,
     52   1.1     jtc 	_PATH_LASTDEAD,
     53   1.1     jtc 	_PATH_MOTD,
     54   1.1     jtc 	_PATH_GOLD,
     55   1.1     jtc 	_PATH_VOID,
     56   1.1     jtc 	_PATH_SCORE,
     57   1.1     jtc 	NULL,
     58   1.1     jtc };
     59   1.9     jsm 
     60   1.1     jtc const char *monsterfile = "monsters.asc";
     61   1.1     jtc 
     62   1.1     jtc int
     63   1.1     jtc main(argc, argv)
     64   1.1     jtc 	int argc;
     65   1.1     jtc 	char *argv[];
     66  1.11  simonb {
     67  1.11  simonb 	const char *const *filename; /* for pointing to file names */
     68  1.11  simonb 	int		fd;		/* file descriptor */
     69   1.1     jtc 	FILE		*fp;			/* for opening files */
     70   1.1     jtc 	struct stat	fbuf;		/* for getting files statistics */
     71  1.11  simonb 	int ch;
     72   1.1     jtc 	char *path;
     73   1.6   lukem 
     74   1.1     jtc 	while ((ch = getopt(argc, argv, "m:")) != -1)
     75   1.1     jtc 		switch(ch) {
     76   1.1     jtc 		case 'm':
     77   1.1     jtc 			monsterfile = optarg;
     78   1.1     jtc 			break;
     79   1.1     jtc 		case '?':
     80   1.1     jtc 		default:
     81   1.1     jtc 			break;
     82   1.1     jtc 		}
     83   1.1     jtc 	argc -= optind;
     84   1.1     jtc 	argv += optind;
     85   1.4     cgd 
     86   1.1     jtc     srandom((unsigned) time(NULL));	/* prime random numbers */
     87   1.1     jtc 
     88   1.1     jtc     umask(0117);		/* only owner can read/write created files */
     89   1.1     jtc 
     90   1.1     jtc     /* try to create data files */
     91   1.1     jtc     filename = &files[0];
     92   1.1     jtc     while (*filename != NULL)
     93   1.1     jtc 	/* create each file */
     94  1.11  simonb 	{
     95   1.2      pk 	path = strrchr(*filename, '/') + 1;
     96   1.1     jtc 	if (stat(path, &fbuf) == 0)
     97   1.1     jtc 	    /* file exists; remove it */
     98   1.2      pk 	    {
     99   1.2      pk 	    if (unlink(path) < 0)
    100   1.1     jtc 		Error("Cannot unlink %s.\n", path);
    101   1.1     jtc 		/*NOTREACHED*/
    102   1.1     jtc 	    }
    103   1.2      pk 
    104   1.2      pk 	if ((fd = creat(path, 0660)) < 0)
    105   1.1     jtc 	    Error("Cannot create %s.\n", path);
    106   1.1     jtc 	    /*NOTREACHED*/
    107   1.1     jtc 
    108   1.1     jtc 	close(fd);			/* close newly created file */
    109   1.1     jtc 
    110   1.1     jtc 	++filename;			/* process next file */
    111   1.1     jtc 	}
    112  1.14     jmc 
    113   1.2      pk     /* Initialize an empty file placeholder for the grail location. */
    114  1.14     jmc     if ((fp = fopen(path, "w")) == NULL)
    115  1.14     jmc 	Error("Cannot create %s.\n", path);
    116   1.1     jtc     fclose(fp);
    117   1.1     jtc 
    118  1.11  simonb     /* create binary monster data base */
    119   1.2      pk     path = strrchr(_PATH_MONST, '/') + 1;
    120   1.2      pk     if ((Monstfp = fopen(path, "w")) == NULL)
    121   1.1     jtc 	Error("Cannot update %s.\n", path);
    122   1.1     jtc     else
    123   1.1     jtc 	{
    124   1.1     jtc 	if ((fp = fopen(monsterfile, "r")) == NULL)
    125   1.1     jtc 	    {
    126   1.1     jtc 	    fclose(Monstfp);
    127   1.1     jtc 	    Error("cannot open %s to create monster database.\n", "monsters.asc");
    128   1.1     jtc 	    }
    129   1.1     jtc 	else
    130   1.1     jtc 	    {
    131   1.1     jtc 	    Curmonster.m_o_strength =
    132   1.1     jtc 	    Curmonster.m_o_speed =
    133   1.1     jtc 	    Curmonster.m_maxspeed =
    134   1.1     jtc 	    Curmonster.m_o_energy =
    135   1.1     jtc 	    Curmonster.m_melee =
    136   1.1     jtc 	    Curmonster.m_skirmish = 0.0;
    137   1.1     jtc 
    138   1.1     jtc 	    while (fgets(Databuf, SZ_DATABUF, fp) != NULL)
    139   1.1     jtc 		/* read in text file, convert to binary */
    140   1.1     jtc 		{
    141   1.1     jtc 		sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
    142   1.1     jtc 		    &Curmonster.m_strength, &Curmonster.m_brains,
    143   1.1     jtc 		    &Curmonster.m_speed, &Curmonster.m_energy,
    144   1.1     jtc 		    &Curmonster.m_experience, &Curmonster.m_treasuretype,
    145   1.1     jtc 		    &Curmonster.m_type, &Curmonster.m_flock);
    146   1.1     jtc 		Databuf[24] = '\0';
    147   1.1     jtc 		strcpy(Curmonster.m_name, Databuf);
    148   1.1     jtc 		fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
    149   1.1     jtc 		}
    150  1.10     jsm 	    fclose(fp);
    151  1.10     jsm 	    fflush(Monstfp);
    152  1.10     jsm 	    if (ferror(Monstfp))
    153   1.1     jtc 		Error("Writing %s.\n", path);
    154   1.1     jtc 	    fclose(Monstfp);
    155   1.1     jtc 	    }
    156   1.1     jtc 	}
    157   1.1     jtc 
    158   1.1     jtc #ifdef MAKE_INSTALLS_THIS_AND_DOESNT_WANT_TO_HEAR_ABOUT_IT
    159   1.1     jtc     /* write to motd file */
    160   1.1     jtc     printf("One line 'motd' ? ");
    161   1.1     jtc     if (fgets(Databuf, SZ_DATABUF, stdin) == NULL)
    162  1.11  simonb 	Databuf[0] = '\0';
    163   1.2      pk     path = strrchr(_PATH_MOTD, '/') + 1;
    164   1.2      pk     if ((fp = fopen(path, "w")) == NULL)
    165   1.1     jtc 	Error("Cannot update %s.\n", path);
    166   1.1     jtc     else
    167   1.1     jtc 	{
    168   1.1     jtc 	fwrite(Databuf, sizeof(char), strlen(Databuf), fp);
    169   1.1     jtc 	fclose(fp);
    170   1.1     jtc 	}
    171   1.1     jtc 
    172   1.1     jtc     /* report compile-time options */
    173   1.1     jtc     printf("Compiled options:\n\n");
    174   1.1     jtc     printf("Phantasia destination directory:  %s\n", _PATH_PHANTDIR);
    175   1.1     jtc     printf("Wizard: root UID: 0\n");
    176   1.1     jtc 
    177   1.1     jtc #ifdef BSD41
    178   1.1     jtc     printf("Compiled for BSD 4.1\n");
    179   1.1     jtc #endif
    180   1.1     jtc 
    181   1.1     jtc #ifdef BSD42
    182   1.1     jtc     printf("Compiled for BSD 4.2\n");
    183   1.1     jtc #endif
    184   1.1     jtc 
    185   1.1     jtc #ifdef SYS3
    186   1.1     jtc     printf("Compiled for System III\n");
    187   1.1     jtc #endif
    188   1.1     jtc 
    189   1.1     jtc #ifdef SYS5
    190   1.1     jtc     printf("Compiled for System V\n");
    191   1.1     jtc #endif
    192   1.1     jtc #endif
    193   1.1     jtc 
    194   1.1     jtc     exit(0);
    195   1.1     jtc     /*NOTREACHED*/
    196   1.1     jtc }
    197   1.1     jtc /**/
    199   1.1     jtc /************************************************************************
    200   1.1     jtc /
    201   1.1     jtc / FUNCTION NAME: Error()
    202   1.1     jtc /
    203   1.1     jtc / FUNCTION: print an error message, and exit
    204   1.1     jtc /
    205   1.1     jtc / AUTHOR: E. A. Estes, 12/4/85
    206   1.1     jtc /
    207   1.1     jtc / ARGUMENTS:
    208   1.1     jtc /	char *str - format string for printf()
    209   1.1     jtc /	char *file - file which caused error
    210   1.1     jtc /
    211   1.1     jtc / RETURN VALUE: none
    212   1.1     jtc /
    213   1.1     jtc / MODULES CALLED: exit(), perror(), fprintf()
    214   1.1     jtc /
    215   1.1     jtc / GLOBAL INPUTS: _iob[]
    216   1.1     jtc /
    217   1.1     jtc / GLOBAL OUTPUTS: none
    218   1.1     jtc /
    219   1.1     jtc / DESCRIPTION:
    220  1.10     jsm /	Print an error message, then exit.
    221   1.1     jtc /
    222  1.10     jsm / ************************************************************************/
    223   1.1     jtc 
    224   1.9     jsm void
    225   1.1     jtc Error(str, file)
    226   1.1     jtc 	const char	*str, *file;
    227   1.1     jtc {
    228   1.1     jtc     fprintf(stderr, "Error: ");
    229   1.1     jtc     fprintf(stderr, str, file);
    230   1.1     jtc     perror(file);
    231   1.1     jtc     exit(1);
    232   1.1     jtc     /*NOTREACHED*/
    233   1.1     jtc }
    234   1.1     jtc /**/
    236   1.1     jtc /************************************************************************
    237   1.1     jtc /
    238   1.1     jtc / FUNCTION NAME: drandom()
    239   1.1     jtc /
    240   1.1     jtc / FUNCTION: return a random number
    241   1.1     jtc /
    242   1.1     jtc / AUTHOR: E. A. Estes, 2/7/86
    243   1.1     jtc /
    244   1.1     jtc / ARGUMENTS: none
    245   1.1     jtc /
    246   1.1     jtc / RETURN VALUE: none
    247   1.1     jtc /
    248   1.1     jtc / MODULES CALLED: random()
    249   1.1     jtc /
    250   1.1     jtc / GLOBAL INPUTS: none
    251   1.1     jtc /
    252   1.1     jtc / GLOBAL OUTPUTS: none
    253  1.10     jsm /
    254   1.1     jtc / DESCRIPTION:
    255   1.1     jtc /
    256   1.1     jtc / ************************************************************************/
    257   1.1     jtc 
    258   1.1     jtc double
    259   1.1     jtc drandom()
    260   1.1     jtc {
    261   1.1     jtc     if (sizeof(int) != 2)
    262   1.1     jtc 	return((double) (random() & 0x7fff) / 32768.0);
    263                   else
    264               	return((double) random() / 32768.0);
    265               }
    266