Home | History | Annotate | Line # | Download | only in phantasia
setup.c revision 1.11.2.1
      1  1.11.2.1     riz /*	$NetBSD: setup.c,v 1.11.2.1 2005/10/26 20:47:27 riz 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.10     jsm int main __P((int, char *[]));
     12      1.10     jsm void Error __P((const char *, const char *)) __attribute__((__noreturn__));
     13      1.10     jsm double drandom __P((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.11.2.1     riz 
    113       1.2      pk     /* Initialize an empty file placeholder for the grail location. */
    114  1.11.2.1     riz     if ((fp = fopen(path, "w")) == NULL)
    115  1.11.2.1     riz 	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