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