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