]> git.pond.sub.org Git - empserver/blob - src/util/files.c
Import of Empire 4.2.12
[empserver] / src / util / files.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23  *  related information and legal notices. It is expected that any future
24  *  projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  files.c: Create all the misc files
29  * 
30  *  Known contributors to this file:
31  *     Thomas Ruschak
32  *     Ken Stevens, 1995
33  *     Steve McClure, 1998
34  */
35
36 #if defined(aix) || defined(linux) || defined(solaris)
37 #include <unistd.h>
38 #endif /* aix or linux */
39
40 #include <sys/types.h>
41 #include <fcntl.h>
42 #if !defined(_WIN32)
43 #include <sys/uio.h>
44 #include <sys/file.h>
45 #else
46 #include <direct.h>
47 #endif
48 #include <stdio.h>
49
50 #include "options.h"
51 #include "misc.h"
52 #include "var.h"
53 #include "sect.h"
54 #include "nat.h"
55 #include "ship.h"
56 #include "land.h"
57 #include "plane.h"
58 #include "nuke.h"
59 #include "power.h"
60 #include "trade.h"
61 #include "file.h"
62 #include "tel.h"
63 #include "prototypes.h"
64 #include "optlist.h"
65
66 s_char  program[] = "file";
67
68 static void comminit(int fd);
69 static int make(char *filename);
70 static void file_sct_init(coord x, coord y, s_char *ptr);
71
72 int
73 main(int argc, char *argv[])
74 {
75         extern  s_char *annfil;
76         extern  s_char *timestampfil;
77         extern  s_char *infodir;
78         extern  s_char *commfil;
79         extern  s_char *datadir;
80         s_char  buf[255];
81         s_char  tbuf[512];
82         s_char   *filename;
83         int     x,y;
84         struct  natstr nat;
85         struct  sctstr sct;
86         int     i;
87         s_char  *map;
88         extern char *optarg;
89         int opt;
90         char *config_file = NULL;
91
92 #if !defined(_WIN32)
93         while ((opt = getopt (argc, argv, "e:")) != EOF) {
94                 switch (opt) {
95                         case 'e':
96                                 config_file = optarg;
97                                 break;
98                 }
99         }
100 #endif
101
102         /* Try to use the existing data directory */
103         if (config_file == NULL) {
104           sprintf (tbuf, "%s/econfig", datadir);
105           config_file = tbuf;
106         }
107         emp_config (config_file);
108         empfile[EF_MAP].size = (WORLD_X * WORLD_Y) / 2;
109         empfile[EF_BMAP].size = (WORLD_X * WORLD_Y) / 2;
110
111 #if !defined(_WIN32)
112         if (access(datadir, F_OK) < 0 && mkdir(datadir, 0750) < 0) {
113 #else
114         if (_access(datadir, 06) < 0 && _mkdir(datadir) < 0) {
115 #endif
116                 perror(datadir);
117                 printf("Can't make game directory\n");
118                 exit(1);
119         }
120         printf("WARNING: this blasts the existing game in %s (if any)\n", datadir);
121         printf("continue? ");
122         fgets(buf, sizeof(buf) - 1, stdin);
123         if (*buf != 'y' && *buf != 'Y')
124                 exit(1);
125         for (i=0; i < EF_MAX; i++) {
126                 if (ef_open(i, O_RDWR|O_CREAT|O_TRUNC, 0) < 0) {
127                         perror("ef_open");
128                         exit(1);
129                 }
130         }
131         bzero((s_char *)&nat, sizeof(nat));
132         nat.ef_type = EF_NATION;
133         if (nat.nat_cnam[0] == 0)
134                 strcpy(nat.nat_cnam,"POGO");
135         if (nat.nat_pnam[0] == 0)
136                 strcpy(nat.nat_pnam,"peter");
137         nat.nat_stat = STAT_INUSE|STAT_NORM|STAT_GOD|STAT_ABS;
138         nat.nat_btu = 255;
139         nat.nat_money = 123456789;
140         nat.nat_cnum = 0;
141         nat.nat_flags |= NF_FLASH;
142         for(x=0;x<SCT_MAXDEF+8;x++)
143                 nat.nat_priorities[x] = -1;
144         putnat((&nat));
145         printf("All praise to %s!\n", nat.nat_cnam);
146         bzero((s_char *)&nat, sizeof(nat));
147         for(x=0;x<SCT_MAXDEF+8;x++)
148                 nat.nat_priorities[x] = -1;
149         for (i = 1; i < MAXNOC; i++) {
150                 nat.ef_type = EF_NATION;
151                 nat.nat_cnum = i;
152                 putnat((&nat));
153         }
154         ef_close(EF_NATION);
155         comminit(make(commfil));
156 #if !defined(_WIN32)
157         if (access(teldir, F_OK) < 0 && mkdir(teldir, 0750) < 0) {
158 #else
159         if (access(teldir, 06) < 0 && _mkdir(teldir) < 0) {
160 #endif
161                 perror(teldir);
162                 printf("Can't make telegram directory\n");
163                 exit(1);
164         }
165         for (x = MAXNOC - 1; x >= 0; x--) {
166                 filename = mailbox(buf, x);
167                 close(creat(filename, 0600));
168                 chmod(filename, 0600);
169         }
170         close(creat(timestampfil, 0600));
171         close(creat(annfil, 0600));
172         chmod(infodir, 0750);
173         chmod(datadir, 0770);
174         chmod(teldir, 0770);
175
176         /* create a zero-filled sector file */
177         bzero((s_char *)&sct,sizeof(sct));
178         for (y=0;y<WORLD_Y;y++) {
179                 for (x=0;x<WORLD_X/2;x++) {
180                         file_sct_init(x*2 + (y & 01), y, (s_char *)&sct);
181                         putsect(&sct);
182                 }
183         }
184         map = (s_char *)calloc(WORLD_X*WORLD_Y/2, sizeof(*map));
185         for (i=0; i < MAXNOC; i++) {
186                 ef_write(EF_MAP, i, map);
187         }
188         map = (s_char *)calloc(WORLD_X*WORLD_Y/2, sizeof(*map));
189         for (i=0; i < MAXNOC; i++) {
190                 ef_write(EF_BMAP, i, map);
191         }
192         for (i=0; i < EF_MAX; i++) {
193                 ef_close(i);
194         }
195
196         exit(0);
197 }
198
199 static int
200 make(char *filename)
201 {
202         register int fd;
203
204 #if !defined(_WIN32)
205         fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0600);
206 #else
207         fd = open(filename, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0600);
208 #endif
209         if (fd < 0)
210                 printf("Creation of %s failed.\n", filename);
211         return fd;
212 }
213
214
215 /*
216  * commodity trading file special initialization
217  */
218 float   file_comm[MAXNOC][I_MAX+1];
219 float   file_price[MAXNOC][I_MAX+1];
220 float   file_mult[MAXNOC][MAXNOC];
221
222 #if !defined(_WIN32)
223 static  struct iovec tradevec[3] = {
224         { (caddr_t)file_comm,   sizeof(file_comm) },
225         { (caddr_t)file_price,  sizeof(file_price)},
226         { (caddr_t)file_mult,   sizeof(file_mult)}
227 };
228 #endif
229
230 static void
231 comminit(int fd)
232 {
233         int     i;
234         int     j;
235
236         for (i=0; i<MAXNOC; i++)
237                 for (j=0; j<MAXNOC; j++)
238                         file_mult[i][j] = 1.0;
239 #if !defined(_WIN32)
240         writev(fd, tradevec, 3);
241 #else
242     write(fd, file_comm, sizeof(file_comm));
243     write(fd, file_price, sizeof(file_price));
244     write(fd, file_mult, sizeof(file_mult));
245 #endif
246         close(fd);
247 }
248
249 static void
250 file_sct_init(coord x, coord y, s_char *ptr)
251 {
252         struct  sctstr *sp = (struct sctstr *) ptr;
253
254         sp->ef_type = EF_SECTOR;
255         sp->sct_x = x;
256         sp->sct_y = y;
257         sp->sct_dist_x = x;
258         sp->sct_dist_y = y;
259 }
260
261 void
262 log_last_commands(void) {}