Home | History | Annotate | Line # | Download | only in phantasia
setup.c revision 1.12
      1  1.12     wiz /*	$NetBSD: setup.c,v 1.12 2003/05/08 13:03:49 wiz 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.1     jtc 
    113   1.1     jtc     /* put holy grail info into energy void file */
    114   1.1     jtc     Enrgyvoid.ev_active = TRUE;
    115   1.1     jtc     Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
    116  1.11  simonb     Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
    117   1.2      pk     path = strrchr(_PATH_VOID, '/') + 1;
    118   1.2      pk     if ((fp = fopen(path, "w")) == NULL)
    119   1.1     jtc 	Error("Cannot update %s.\n", path);
    120   1.1     jtc     else
    121   1.1     jtc 	{
    122  1.10     jsm 	fwrite(&Enrgyvoid, SZ_VOIDSTRUCT, 1, fp);
    123  1.10     jsm 	fflush(fp);
    124  1.10     jsm 	if (ferror(fp))
    125   1.1     jtc 	    Error("Writing %s.\n", path);
    126   1.1     jtc 	fclose(fp);
    127   1.1     jtc 	}
    128   1.1     jtc 
    129  1.11  simonb     /* create binary monster data base */
    130   1.2      pk     path = strrchr(_PATH_MONST, '/') + 1;
    131   1.2      pk     if ((Monstfp = fopen(path, "w")) == NULL)
    132   1.1     jtc 	Error("Cannot update %s.\n", path);
    133   1.1     jtc     else
    134   1.1     jtc 	{
    135   1.1     jtc 	if ((fp = fopen(monsterfile, "r")) == NULL)
    136   1.1     jtc 	    {
    137   1.1     jtc 	    fclose(Monstfp);
    138   1.1     jtc 	    Error("cannot open %s to create monster database.\n", "monsters.asc");
    139   1.1     jtc 	    }
    140   1.1     jtc 	else
    141   1.1     jtc 	    {
    142   1.1     jtc 	    Curmonster.m_o_strength =
    143   1.1     jtc 	    Curmonster.m_o_speed =
    144   1.1     jtc 	    Curmonster.m_maxspeed =
    145   1.1     jtc 	    Curmonster.m_o_energy =
    146   1.1     jtc 	    Curmonster.m_melee =
    147   1.1     jtc 	    Curmonster.m_skirmish = 0.0;
    148   1.1     jtc 
    149   1.1     jtc 	    while (fgets(Databuf, SZ_DATABUF, fp) != NULL)
    150   1.1     jtc 		/* read in text file, convert to binary */
    151   1.1     jtc 		{
    152   1.1     jtc 		sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
    153   1.1     jtc 		    &Curmonster.m_strength, &Curmonster.m_brains,
    154   1.1     jtc 		    &Curmonster.m_speed, &Curmonster.m_energy,
    155   1.1     jtc 		    &Curmonster.m_experience, &Curmonster.m_treasuretype,
    156   1.1     jtc 		    &Curmonster.m_type, &Curmonster.m_flock);
    157   1.1     jtc 		Databuf[24] = '\0';
    158   1.1     jtc 		strcpy(Curmonster.m_name, Databuf);
    159   1.1     jtc 		fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
    160   1.1     jtc 		}
    161  1.10     jsm 	    fclose(fp);
    162  1.10     jsm 	    fflush(Monstfp);
    163  1.10     jsm 	    if (ferror(Monstfp))
    164   1.1     jtc 		Error("Writing %s.\n", path);
    165   1.1     jtc 	    fclose(Monstfp);
    166   1.1     jtc 	    }
    167   1.1     jtc 	}
    168   1.1     jtc 
    169   1.1     jtc #ifdef MAKE_INSTALLS_THIS_AND_DOESNT_WANT_TO_HEAR_ABOUT_IT
    170   1.1     jtc     /* write to motd file */
    171   1.1     jtc     printf("One line 'motd' ? ");
    172   1.1     jtc     if (fgets(Databuf, SZ_DATABUF, stdin) == NULL)
    173  1.11  simonb 	Databuf[0] = '\0';
    174   1.2      pk     path = strrchr(_PATH_MOTD, '/') + 1;
    175   1.2      pk     if ((fp = fopen(path, "w")) == NULL)
    176   1.1     jtc 	Error("Cannot update %s.\n", path);
    177   1.1     jtc     else
    178   1.1     jtc 	{
    179   1.1     jtc 	fwrite(Databuf, sizeof(char), strlen(Databuf), fp);
    180   1.1     jtc 	fclose(fp);
    181   1.1     jtc 	}
    182   1.1     jtc 
    183   1.1     jtc     /* report compile-time options */
    184   1.1     jtc     printf("Compiled options:\n\n");
    185   1.1     jtc     printf("Phantasia destination directory:  %s\n", _PATH_PHANTDIR);
    186   1.1     jtc     printf("Wizard: root UID: 0\n");
    187   1.1     jtc 
    188   1.1     jtc #ifdef BSD41
    189   1.1     jtc     printf("Compiled for BSD 4.1\n");
    190   1.1     jtc #endif
    191   1.1     jtc 
    192   1.1     jtc #ifdef BSD42
    193   1.1     jtc     printf("Compiled for BSD 4.2\n");
    194   1.1     jtc #endif
    195   1.1     jtc 
    196   1.1     jtc #ifdef SYS3
    197   1.1     jtc     printf("Compiled for System III\n");
    198   1.1     jtc #endif
    199   1.1     jtc 
    200   1.1     jtc #ifdef SYS5
    201   1.1     jtc     printf("Compiled for System V\n");
    202   1.1     jtc #endif
    203   1.1     jtc #endif
    204   1.1     jtc 
    205   1.1     jtc     exit(0);
    206   1.1     jtc     /*NOTREACHED*/
    207   1.1     jtc }
    208   1.1     jtc /**/
    210   1.1     jtc /************************************************************************
    211   1.1     jtc /
    212   1.1     jtc / FUNCTION NAME: Error()
    213   1.1     jtc /
    214   1.1     jtc / FUNCTION: print an error message, and exit
    215   1.1     jtc /
    216   1.1     jtc / AUTHOR: E. A. Estes, 12/4/85
    217   1.1     jtc /
    218   1.1     jtc / ARGUMENTS:
    219   1.1     jtc /	char *str - format string for printf()
    220   1.1     jtc /	char *file - file which caused error
    221   1.1     jtc /
    222   1.1     jtc / RETURN VALUE: none
    223   1.1     jtc /
    224   1.1     jtc / MODULES CALLED: exit(), perror(), fprintf()
    225   1.1     jtc /
    226   1.1     jtc / GLOBAL INPUTS: _iob[]
    227   1.1     jtc /
    228   1.1     jtc / GLOBAL OUTPUTS: none
    229   1.1     jtc /
    230   1.1     jtc / DESCRIPTION:
    231  1.10     jsm /	Print an error message, then exit.
    232   1.1     jtc /
    233  1.10     jsm / ************************************************************************/
    234   1.1     jtc 
    235   1.9     jsm void
    236   1.1     jtc Error(str, file)
    237   1.1     jtc 	const char	*str, *file;
    238   1.1     jtc {
    239   1.1     jtc     fprintf(stderr, "Error: ");
    240   1.1     jtc     fprintf(stderr, str, file);
    241   1.1     jtc     perror(file);
    242   1.1     jtc     exit(1);
    243   1.1     jtc     /*NOTREACHED*/
    244   1.1     jtc }
    245   1.1     jtc /**/
    247   1.1     jtc /************************************************************************
    248   1.1     jtc /
    249   1.1     jtc / FUNCTION NAME: drandom()
    250   1.1     jtc /
    251   1.1     jtc / FUNCTION: return a random number
    252   1.1     jtc /
    253   1.1     jtc / AUTHOR: E. A. Estes, 2/7/86
    254   1.1     jtc /
    255   1.1     jtc / ARGUMENTS: none
    256   1.1     jtc /
    257   1.1     jtc / RETURN VALUE: none
    258   1.1     jtc /
    259   1.1     jtc / MODULES CALLED: random()
    260   1.1     jtc /
    261   1.1     jtc / GLOBAL INPUTS: none
    262   1.1     jtc /
    263   1.1     jtc / GLOBAL OUTPUTS: none
    264  1.10     jsm /
    265   1.1     jtc / DESCRIPTION:
    266   1.1     jtc /
    267   1.1     jtc / ************************************************************************/
    268   1.1     jtc 
    269   1.1     jtc double
    270   1.1     jtc drandom()
    271   1.1     jtc {
    272   1.1     jtc     if (sizeof(int) != 2)
    273   1.1     jtc 	return((double) (random() & 0x7fff) / 32768.0);
    274                   else
    275               	return((double) random() / 32768.0);
    276               }
    277