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