xref: /csrg-svn/games/sail/sync.c (revision 15901)
115207Sedward #ifndef lint
2*15901Sedward static	char *sccsid = "@(#)sync.c	2.4 84/01/27";
315207Sedward #endif
415207Sedward 
515207Sedward #include "externs.h"
615207Sedward 
715207Sedward static char sync_buf[BUFSIZE];
8*15901Sedward static char *sync_bp = sync_buf;
915207Sedward static char sync_lock[25];
1015207Sedward static char sync_file[25];
1115207Sedward static long sync_seek;
1215207Sedward static FILE *sync_fp;
1315207Sedward #define SF "/tmp/#sailsink.%d"
1415207Sedward #define LF "/tmp/#saillock.%d"
1515207Sedward 
1615207Sedward /*VARARGS3*/
1715207Sedward makesignal(from, fmt, ship, a, b, c)
1815207Sedward struct ship *from;
1915207Sedward char *fmt;
2015207Sedward register struct ship *ship;
2115207Sedward {
2215207Sedward 	char message[80];
2315207Sedward 
2415207Sedward 	if (ship == 0)
2515207Sedward 		(void) sprintf(message, fmt, a, b, c);
2615207Sedward 	else
2715207Sedward 		(void) sprintf(message, fmt,
2815207Sedward 			ship->shipname, colours(ship),
2915207Sedward 			sterncolour(ship), a, b, c);
3015207Sedward 	Write(W_SIGNAL, from, 1, (int)message, 0, 0, 0);
3115207Sedward }
3215207Sedward 
3315312Sedward #include <sys/types.h>
3415312Sedward #include <sys/stat.h>
3515207Sedward sync_exists(game)
3615207Sedward {
3715207Sedward 	char buf[sizeof sync_file];
3815312Sedward 	struct stat s;
3915312Sedward 	time_t t;
4015207Sedward 
4115207Sedward 	(void) sprintf(buf, SF, game);
4215723Sedward 	(void) time(&t);
4315312Sedward 	if (stat(buf, &s) < 0)
4415312Sedward 		return 0;
4515312Sedward 	if (s.st_mtime < t - 60*60*2) {		/* 2 hours */
4615723Sedward 		(void) unlink(buf);
4715312Sedward 		return 0;
4815312Sedward 	} else
4915312Sedward 		return 1;
5015207Sedward }
5115207Sedward 
5215207Sedward sync_open()
5315207Sedward {
5415207Sedward 	(void) sprintf(sync_lock, LF, game);
5515207Sedward 	(void) sprintf(sync_file, SF, game);
5615207Sedward 	if (access(sync_file, 0) < 0) {
5715207Sedward 		int omask;
5815207Sedward #ifdef SETUID
5915207Sedward 		omask = umask(077);
6015207Sedward #else
6115207Sedward 		omask = umask(011);
6215207Sedward #endif
6315207Sedward 		sync_fp = fopen(sync_file, "w+");
6415207Sedward 		(void) umask(omask);
6515207Sedward 	} else
6615207Sedward 		sync_fp = fopen(sync_file, "r+");
6715207Sedward 	if (sync_fp == 0)
6815207Sedward 		return -1;
6915207Sedward 	sync_seek == 0;
7015249Sedward 	return 0;
7115207Sedward }
7215207Sedward 
7315207Sedward sync_close(remove)
7415207Sedward char remove;
7515207Sedward {
7615352Sedward 	if (sync_fp != 0)
7715352Sedward 		(void) fclose(sync_fp);
7815207Sedward 	if (remove)
7915207Sedward 		(void) unlink(sync_file);
8015207Sedward }
8115207Sedward 
8215207Sedward Write(type, ship, isstr, a, b, c, d)
8315207Sedward int type;
8415207Sedward struct ship *ship;
8515207Sedward char isstr;
8615207Sedward int a, b, c, d;
8715207Sedward {
8815207Sedward 	if (isstr)
89*15901Sedward 		(void) sprintf(sync_bp, "%d %d %d %s\n",
9015723Sedward 			type, ship->file->index, isstr, a);
9115207Sedward 	else
92*15901Sedward 		(void) sprintf(sync_bp, "%d %d %d %d %d %d %d\n",
9315723Sedward 			type, ship->file->index, isstr, a, b, c, d);
94*15901Sedward 	while (*sync_bp++)
9515207Sedward 		;
96*15901Sedward 	sync_bp--;
97*15901Sedward 	if (sync_bp >= &sync_buf[sizeof sync_buf])
9815207Sedward 		abort();
9915207Sedward 	sync_update(type, ship, a, b, c, d);
10015207Sedward }
10115207Sedward 
10215207Sedward Sync()
10315207Sedward {
10415207Sedward 	int (*sig1)(), (*sig2)();
10515207Sedward 	int type, shipnum, isstr, a, b, c, d;
10615207Sedward 	char buf[60];
10715207Sedward 	register char *p = buf;
10815207Sedward 	int n;
10915207Sedward 
11015207Sedward 	sig1 = signal(SIGHUP, SIG_IGN);
11115207Sedward 	sig2 = signal(SIGINT, SIG_IGN);
11215207Sedward 	for (n = 0; link(sync_file, sync_lock) < 0 && n < 30; n++)
11315207Sedward 		sleep(2);
11415207Sedward 	(void) fseek(sync_fp, sync_seek, 0);
11515207Sedward 	while (fscanf(sync_fp, "%d%d%d", &type, &shipnum, &isstr) != EOF) {
11615207Sedward 		if (isstr) {
11715207Sedward 			for (p = buf;;) {
11815207Sedward 				switch (*p++ = getc(sync_fp)) {
11915207Sedward 				case '\n':
12015207Sedward 					p--;
12115207Sedward 				case EOF:
12215207Sedward 					break;
12315207Sedward 				default:
12415207Sedward 					continue;
12515207Sedward 				}
12615207Sedward 				break;
12715207Sedward 			}
12815207Sedward 			*p = 0;
12915207Sedward 			for (p = buf; *p == ' '; p++)
13015207Sedward 				;
13115207Sedward 			a = (int)p;
13215207Sedward 			b = c = d = 0;
13315207Sedward 		} else
13415207Sedward 			(void) fscanf(sync_fp, "%d%d%d%d", &a, &b, &c, &d);
13515207Sedward 		sync_update(type, SHIP(shipnum), a, b, c, d);
13615207Sedward 	}
137*15901Sedward 	if (sync_bp != sync_buf) {
13815207Sedward 		(void) fseek(sync_fp, 0L, 2);
13915207Sedward 		(void) fputs(sync_buf, sync_fp);
14015207Sedward 		(void) fflush(sync_fp);
141*15901Sedward 		sync_bp = sync_buf;
14215207Sedward 	}
14315207Sedward 	sync_seek = ftell(sync_fp);
14415207Sedward 	(void) unlink(sync_lock);
14515207Sedward 	(void) signal(SIGHUP, sig1);
14615207Sedward 	(void) signal(SIGINT, sig2);
14715207Sedward }
14815207Sedward 
14915207Sedward sync_update(type, ship, a, b, c, d)
15015207Sedward int type;
15115207Sedward register struct ship *ship;
15215207Sedward int a, b, c, d;
15315207Sedward {
15415207Sedward 	switch (type) {
15515207Sedward 	case W_DBP: {
15615207Sedward 		register struct BP *p = &ship->file->DBP[a];
15715207Sedward 		p->turnsent = b;
15815207Sedward 		p->toship = SHIP(c);
15915207Sedward 		p->mensent = d;
16015207Sedward 		break;
16115207Sedward 		}
16215207Sedward 	case W_OBP: {
16315207Sedward 		register struct BP *p = &ship->file->OBP[a];
16415207Sedward 		p->turnsent = b;
16515207Sedward 		p->toship = SHIP(c);
16615207Sedward 		p->mensent = d;
16715207Sedward 		break;
16815207Sedward 		}
16915207Sedward 	case W_FOUL: {
17015723Sedward 		register struct snag *p = &ship->file->foul[a];
17115723Sedward 		if (SHIP(a)->file->dir == 0)
17215723Sedward 			break;
17315723Sedward 		if (p->sn_count++ == 0)
17415723Sedward 			p->sn_turn = turn;
17515723Sedward 		ship->file->nfoul++;
17615207Sedward 		break;
17715207Sedward 		}
17815207Sedward 	case W_GRAP: {
17915723Sedward 		register struct snag *p = &ship->file->grap[a];
18015723Sedward 		if (SHIP(a)->file->dir == 0)
18115723Sedward 			break;
18215723Sedward 		if (p->sn_count++ == 0)
18315723Sedward 			p->sn_turn = turn;
18415723Sedward 		ship->file->ngrap++;
18515207Sedward 		break;
18615207Sedward 		}
18715723Sedward 	case W_UNFOUL: {
18815723Sedward 		register struct snag *p = &ship->file->foul[a];
18915723Sedward 		if (p->sn_count > 0)
19015723Sedward 			if (b) {
19115723Sedward 				ship->file->nfoul -= p->sn_count;
19215723Sedward 				p->sn_count = 0;
19315723Sedward 			} else {
19415723Sedward 				ship->file->nfoul--;
19515723Sedward 				p->sn_count--;
19615723Sedward 			}
19715723Sedward 		break;
19815723Sedward 		}
19915723Sedward 	case W_UNGRAP: {
20015723Sedward 		register struct snag *p = &ship->file->grap[a];
20115723Sedward 		if (p->sn_count > 0)
20215723Sedward 			if (b) {
20315723Sedward 				ship->file->ngrap -= p->sn_count;
20415723Sedward 				p->sn_count = 0;
20515723Sedward 			} else {
20615723Sedward 				ship->file->ngrap--;
20715723Sedward 				p->sn_count--;
20815723Sedward 			}
20915723Sedward 		break;
21015723Sedward 		}
21115207Sedward 	case W_SIGNAL:
21215723Sedward 		if (isplayer)
21315307Sedward 			Signal("\7%s (%c%c): %s", ship, a);
21415207Sedward 		break;
21515207Sedward 	case W_CREW: {
21615207Sedward 		register struct shipspecs *s = ship->specs;
21715207Sedward 		s->crew1 = a;
21815207Sedward 		s->crew2 = b;
21915207Sedward 		s->crew3 = c;
22015207Sedward 		break;
22115207Sedward 		}
22215207Sedward 	case W_CAPTAIN:
22315207Sedward 		(void) strncpy(ship->file->captain, (char *)a,
22415207Sedward 			sizeof ship->file->captain - 1);
22515207Sedward 		ship->file->captain[sizeof ship->file->captain - 1] = 0;
22615207Sedward 		break;
22715207Sedward 	case W_CAPTURED:
22815315Sedward 		if (a < 0)
22915315Sedward 			ship->file->captured = 0;
23015315Sedward 		else
23115315Sedward 			ship->file->captured = SHIP(a);
23215207Sedward 		break;
23315207Sedward 	case W_CLASS:
23415207Sedward 		ship->specs->class = a;
23515207Sedward 		break;
23615207Sedward 	case W_DRIFT:
23715207Sedward 		ship->file->drift = a;
23815207Sedward 		break;
23915207Sedward 	case W_EXPLODE:
24015207Sedward 		if ((ship->file->explode = a) == 2)
24115207Sedward 			ship->file->dir = 0;
24215207Sedward 		break;
24315207Sedward 	case W_FS:
24415207Sedward 		ship->file->FS = a;
24515207Sedward 		break;
24615207Sedward 	case W_GUNL: {
24715207Sedward 		register struct shipspecs *s = ship->specs;
24815207Sedward 		s->gunL = a;
24915207Sedward 		s->carL = b;
25015207Sedward 		break;
25115207Sedward 		}
25215207Sedward 	case W_GUNR: {
25315207Sedward 		register struct shipspecs *s = ship->specs;
25415207Sedward 		s->gunR = a;
25515207Sedward 		s->carR = b;
25615207Sedward 		break;
25715207Sedward 		}
25815207Sedward 	case W_HULL:
25915207Sedward 		ship->specs->hull = a;
26015207Sedward 		break;
26115723Sedward 	case W_MOVE:
26215723Sedward 		(void) strncpy(ship->file->movebuf, (char *)a,
26315723Sedward 			sizeof ship->file->movebuf - 1);
26415723Sedward 		ship->file->movebuf[sizeof ship->file->movebuf - 1] = 0;
26515207Sedward 		break;
26615207Sedward 	case W_PCREW:
26715207Sedward 		ship->file->pcrew = a;
26815207Sedward 		break;
26915207Sedward 	case W_POINTS:
27015207Sedward 		ship->file->points = a;
27115207Sedward 		break;
27215207Sedward 	case W_QUAL:
27315207Sedward 		ship->specs->qual = a;
27415207Sedward 		break;
27515207Sedward 	case W_RIGG: {
27615207Sedward 		register struct shipspecs *s = ship->specs;
27715207Sedward 		s->rig1 = a;
27815207Sedward 		s->rig2 = b;
27915207Sedward 		s->rig3 = c;
28015207Sedward 		s->rig4 = d;
28115207Sedward 		break;
28215207Sedward 		}
28315207Sedward 	case W_RIG1:
28415207Sedward 		ship->specs->rig1 = a;
28515207Sedward 		break;
28615207Sedward 	case W_RIG2:
28715207Sedward 		ship->specs->rig2 = a;
28815207Sedward 		break;
28915207Sedward 	case W_RIG3:
29015207Sedward 		ship->specs->rig3 = a;
29115207Sedward 		break;
29215207Sedward 	case W_RIG4:
29315207Sedward 		ship->specs->rig4 = a;
29415207Sedward 		break;
29515723Sedward 	case W_COL:
29615207Sedward 		ship->file->col = a;
29715207Sedward 		break;
29815723Sedward 	case W_DIR:
29915207Sedward 		ship->file->dir = a;
30015207Sedward 		break;
30115723Sedward 	case W_ROW:
30215207Sedward 		ship->file->row = a;
30315207Sedward 		break;
30415207Sedward 	case W_SINK:
30515207Sedward 		if ((ship->file->sink = a) == 2)
30615207Sedward 			ship->file->dir = 0;
30715207Sedward 		break;
30815207Sedward 	case W_STRUCK:
30915207Sedward 		ship->file->struck = a;
31015207Sedward 		break;
31115207Sedward 	case W_TA:
31215207Sedward 		ship->specs->ta = a;
31315207Sedward 		break;
31415207Sedward 	case W_ALIVE:
31515207Sedward 		alive = 1;
31615207Sedward 		break;
31715207Sedward 	case W_TURN:
31815207Sedward 		turn = a;
31915207Sedward 		break;
32015207Sedward 	case W_WIND:
32115207Sedward 		winddir = a;
32215207Sedward 		windspeed = b;
32315207Sedward 		break;
32415207Sedward 	case W_BEGIN:
32515207Sedward 		(void) strcpy(ship->file->captain, "begin");
32615207Sedward 		people++;
32715207Sedward 		break;
32815207Sedward 	case W_END:
32915207Sedward 		(void) strcpy(ship->file->captain, "");
33015207Sedward 		people--;
33115207Sedward 		break;
33215207Sedward 	default:
33315207Sedward 		fprintf(stderr, "sync_update: unknown type %d\n", type);
33415207Sedward 		break;
33515207Sedward 	}
33615207Sedward }
337