void score(long amount, int lvl, int flags, int monst) /*ARGSUSED*/ { struct sc_ent *scp=NULL, *sc2=NULL; int i; char *killer; char buf[1024]; static const char *reason[] = { "killed", "quit", "a winner", "a total winner" }; char *packend; if (flags != WINNER && flags != TOTAL && flags != SCOREIT) { if (flags == CHICKEN) packend = "when you quit"; else packend = "at your untimely demise"; noecho(); nl(); refresh(); showpack(packend); } /* Open file and read list */ if (fd_score == NULL) { printf("No score file opened\n"); return; } for (scp = top_ten; scp < &top_ten[10]; scp++) { scp->sc_lvl = 0L; scp->sc_score = 0L; for (i = 0; i < 76; i++) scp->sc_name[i] = ucrnd(255); scp->sc_gold = 0L; scp->sc_flags = rnd(10); scp->sc_level = rnd(10); scp->sc_monster = srnd(10); scp->sc_artifacts = 0; } if (flags != SCOREIT) { mvaddstr(LINES - 1, 0, retstr); refresh(); fflush(stdout); wait_for('\n'); } fseek(fd_score, 0L, SEEK_SET); fread(top_ten, sizeof(top_ten), 1, fd_score); /* Insert player in list if need be */ if (!waswizard) { for (scp = top_ten; scp < &top_ten[10]; scp++) { if (lvl > scp->sc_lvl) break; if (lvl == scp->sc_lvl && amount > scp->sc_score) break; } if (scp < &top_ten[10]) { if (flags == WINNER) sc2 = &top_ten[9]; /* LAST WINNER ALWAYS MAKES IT */ while (sc2 > scp) { *sc2 = sc2[-1]; sc2--; } scp->sc_lvl = lvl; scp->sc_gold = purse; scp->sc_score = amount; strcpy(scp->sc_name, whoami); strcat(scp->sc_name,", "); strcat(scp->sc_name, which_class(player.t_ctype)); scp->sc_flags = flags; if (flags == WINNER) scp->sc_level = max_level; else scp->sc_level = level; scp->sc_monster = monst; scp->sc_artifacts = has_artifact; sc2 = scp; } } if (flags != SCOREIT) { clear(); refresh(); endwin(); } /* Print the list */ printf("\nTop Ten Adventurers:\n%4s %15s %10s %s\n", "Rank", "Score", "Gold", "Name"); for (scp = top_ten; scp < &top_ten[10]; scp++) { if (scp->sc_score) { char lev[20]; sprintf(lev, "%ld+%ld", scp->sc_lvl, scp->sc_score); printf("%4d %15s %10ld %s:", scp - top_ten + 1, lev, scp->sc_gold, scp->sc_name); if (scp->sc_artifacts) { char thangs[80]; int n; int first = TRUE; thangs[0] = '\0'; for (n = 0; n <= maxartifact; n++) { if (scp->sc_artifacts & (1 << n)) { if (strlen(thangs)) strcat(thangs, ", "); if (first) { strcat(thangs, "retrieved "); first = FALSE; } if (45 - strlen(thangs) < strlen(arts[n].ar_name)) { printf("%s\n%32s", thangs," "); thangs[0] = '\0'; } strcat(thangs, arts[n].ar_name); } } if (strlen(thangs)) printf("%s,", thangs); printf("\n%32s"," "); } printf("%s on level %d",reason[scp->sc_flags],scp->sc_level); if (scp->sc_flags == 0) { printf(" by \n%32s"," "); killer = killname(scp->sc_monster, buf); printf(" %s", killer); } putchar('\n'); } } if (sc2 != NULL) { fseek(fd_score, 0L, SEEK_SET); /* Update the list file */ fwrite(top_ten, sizeof(top_ten), 1, fd_score); } fclose(fd_score); }
int RecvPack(T_Connect *connect,T_NetHead *nethead) { char headbuf[HEADPACKLENGTH+1],addr[16]; int i,n; u_int crc; char *zbuf; memset(nethead->para,0,sizeof(nethead->para)); nethead->data=NULL; peeraddr(connect->Socket,addr); i=RecvNet(connect->Socket,headbuf,HEADPACKLENGTH,connect->timeout); if(i<HEADPACKLENGTH){ if(i==TIMEOUTERR) { ShowLog(1,"%s:head TIMEOUT %d second's",__FUNCTION__, connect->timeout); return i; } ShowLog(1,"RecvPack Head LENERR i=%d,err=%d,%s",i,errno,strerror(errno)); return LENGERR; } if(connect->CryptFlg & DO_CRYPT) enigma2_decrypt(&connect->t,headbuf,HEADPACKLENGTH); i=NetHeadDispack(nethead,headbuf,connect->family[29]); if(i!=0) { ShowLog(1,"aft NetHeadDispack len=%d,PKGERR %s",i, addr); showpack(1,headbuf,HEADPACKLENGTH); return(FORMATERR); } if(!nethead->T_LEN) return 0; if(connect->CryptFlg&UNDO_ZIP) { i=nethead->T_LEN+1; } else { i=nethead->PKG_LEN+1; if(nethead->T_LEN <nethead->PKG_LEN) i+=nethead->T_LEN+1; } n=connect->RecvLen-i; if(!connect->RecvBuffer || n<0 || n>32768){ if(connect->RecvBuffer) { free(connect->RecvBuffer); connect->RecvBuffer=0; } connect->RecvLen=0; connect->RecvBuffer=malloc(i); if(!connect->RecvBuffer) return MEMERR; connect->RecvLen=i; } if(!(connect->CryptFlg&UNDO_ZIP) && nethead->T_LEN != nethead->PKG_LEN) { zbuf=connect->RecvBuffer+nethead->PKG_LEN+1; } else zbuf=connect->RecvBuffer; i=RecvNet(connect->Socket,zbuf,nethead->T_LEN,5); if(i != (nethead->T_LEN)) { if(TIMEOUTERR == i) { ShowLog(1,"%s:recv body TIMEOUT",__FUNCTION__); return i; } ShowLog(1,"%s,Recv Body T_LEN=%d i=%d,errno=%d",__FUNCTION__, nethead->T_LEN,i,errno); free(connect->RecvBuffer); connect->RecvBuffer=0; connect->RecvLen=0; return i<0?SYSERR:LENGERR; } crc=ssh_crc32((const unsigned char *)zbuf, nethead->T_LEN); if((connect->CryptFlg & CHECK_CRC) && (crc != nethead->PKG_CRC)) { ShowLog(1,"RecvPack:PKG_CRC=%08X,crc=%08X,PKG_LEN=%d,T_LEN=%d,head=%s", nethead->PKG_CRC,crc,nethead->PKG_LEN,nethead->T_LEN,headbuf); return CRCERR; } pack_decode(zbuf, nethead->T_LEN,connect); if(zbuf != connect->RecvBuffer) { size_t sz=qlz_size_decompressed(zbuf); if(nethead->T_LEN<9 || nethead->PKG_LEN != sz) { ShowLog(1,"unzip error T_LEN=%d,sz=%ld,PKG_LEN=%d,ADDR=%s",nethead->T_LEN, sz,nethead->PKG_LEN,addr); return FORMATERR; } i=qlz_decompress(zbuf,connect->RecvBuffer); if(i!=nethead->PKG_LEN) { ShowLog(1,"RecvPack:PKG_LEN=%d,T_LEN=%d,unzip_size=%d", nethead->PKG_LEN,nethead->T_LEN,i); return LENGERR; } } //else if(connect->CryptFlg & UNDO_ZIP) // ShowLog(5,"%s:UNDO_ZIP %s,T_LEN=%d,PKG_LEN=%d,data=%s",__FUNCTION__, // *connect->Host?connect->Host:"Client",nethead->T_LEN,nethead->PKG_LEN,connect->RecvBuffer); if(!(connect->CryptFlg & UNDO_ZIP)) connect->RecvBuffer[nethead->PKG_LEN]=0; nethead->data=connect->RecvBuffer; return 0; }
int RecvPack(T_Connect *connect,T_NetHead *nethead) { char headbuf[HEADPACKLENGTH+1],addr[16]; int i,n; u_int crc; char *zbuf; n_zero(PARANUM,nethead->para); nethead->data=0; memset(headbuf,0,sizeof(headbuf)); i=RecvNet(connect->Socket,headbuf,HEADPACKLENGTH,connect->timeout); //free SendBuffer if(i<HEADPACKLENGTH){ if(i==TIMEOUTERR) { ShowLog(1,"%s:head TIMEOUT %d second's",__FUNCTION__, connect->timeout); return i; } ShowLog(1,"RecvPack Head LENERR i=%d,err=%d,%s",i,errno,strerror(errno)); return LENGERR; } headbuf[HEADPACKLENGTH]=0; i=NetHeadDispack(nethead,headbuf,connect->family[29]); if(i!=0) { peeraddr(connect->Socket,addr); ShowLog(1,"aft NetHeadDispack len=%d,PKGERR %s:%.48s",i, addr,headbuf); showpack(1,headbuf,HEADPACKLENGTH); return(FORMATERR); } if(!nethead->T_LEN) return 0; i=((connect->CryptFlg&UNDO_ZIP)?nethead->T_LEN:nethead->PKG_LEN)+1; n=connect->RecvLen-i; if(n<0 || n>SDBC_BLKSZ){ if( connect->RecvBuffer) free(connect->RecvBuffer); connect->RecvBuffer=0; connect->RecvLen=0; connect->RecvBuffer=malloc(i); if(!connect->RecvBuffer) return MEMERR; connect->RecvLen=i; } if(!(connect->CryptFlg&UNDO_ZIP) && nethead->T_LEN != nethead->PKG_LEN) { zbuf=malloc(nethead->T_LEN); if(!zbuf) { RecvNet(connect->Socket,connect->RecvBuffer,nethead->T_LEN,3); return MEMERR; } } else zbuf=connect->RecvBuffer; i=RecvNet(connect->Socket,zbuf,nethead->T_LEN,3); if(i < (nethead->T_LEN)) { if(TIMEOUTERR == i) { ShowLog(1,"%s:recv body TIMEOUT",__FUNCTION__); return i; } if(zbuf!=connect->RecvBuffer) free(zbuf); ShowLog(1,"%s,Recv Body T_LEN=%d i=%d,errno=%d",__FUNCTION__, nethead->T_LEN,i,errno); free(connect->RecvBuffer); connect->RecvBuffer=0; connect->RecvLen=0; return i<0?SYSERR:LENGERR; } crc=ssh_crc32((const unsigned char *)zbuf, nethead->T_LEN); if((connect->CryptFlg & CHECK_CRC) && (crc != nethead->PKG_CRC)) { ShowLog(1,"RecvPack:PKG_CRC=%08X,crc=%08X,PKG_LEN=%d,T_LEN=%d,head=%s", nethead->PKG_CRC,crc,nethead->PKG_LEN,nethead->T_LEN,headbuf); return CRCERR; } pack_decode(zbuf, nethead->T_LEN,connect); if(zbuf != connect->RecvBuffer) { if(nethead->T_LEN<9 || nethead->PKG_LEN != qlz_size_decompressed(zbuf)) { ShowLog(1,"unzip error T_LEN=%d,ADDR=%s",nethead->T_LEN, addr); return FORMATERR; } i=qlz_decompress(zbuf,connect->RecvBuffer); free(zbuf); if(i!=nethead->PKG_LEN) { ShowLog(1,"RecvPack:PKG_LEN=%d,T_LEN=%d,unzip_size=%d", nethead->PKG_LEN,nethead->T_LEN,i); return LENGERR; } } connect->RecvBuffer[nethead->PKG_LEN]=0; nethead->data=connect->RecvBuffer; return 0; }