From 3b4e727c99c7dfc54745a10bbb182b3adea7f55d Mon Sep 17 00:00:00 2001 From: scw Date: Sat, 26 Feb 2005 12:45:20 +0000 Subject: Reenable Chinese chess watching. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2556 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/chc.c | 34 ++++++++++++++++++---------------- mbbsd/talk.c | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/mbbsd/chc.c b/mbbsd/chc.c index 8ce25f3f..eebabc0f 100644 --- a/mbbsd/chc.c +++ b/mbbsd/chc.c @@ -118,10 +118,12 @@ chc_sendmove(int s) static void chc_broadcast(chc_act_list **head, board_t board){ chc_act_list *p = *head; + void (*orig_handler)(int); if (!p) return; + orig_handler = Signal(SIGPIPE, SIG_IGN); if (!chc_sendmove(p->sock)) { /* do nothing */ } @@ -134,6 +136,7 @@ chc_broadcast(chc_act_list **head, board_t board){ } else p = p->next; } + Signal(SIGPIPE, orig_handler); } static int @@ -1026,12 +1029,17 @@ chc_init(int s, chcusr_t *user1, chcusr_t *user2, board_t board, play_func_t pla // choose one signal execpt SIGUSR1 kill(uin->pid, SIGALRM); #endif - read(s, board, sizeof(board_t)); - read(s, &chc_my, sizeof(chc_my)); - read(s, &chc_turn, sizeof(chc_turn)); - read(s, &my->turn, sizeof(my->turn)); - read(s, &chc_firststep, sizeof(chc_firststep)); - read(s, &mode, sizeof(mode)); + if(read(s, board, sizeof(board_t)) != sizeof(board_t) || + read(s, &chc_my, sizeof(chc_my)) != sizeof(chc_my) || + read(s, &chc_turn, sizeof(chc_turn)) != sizeof(chc_turn) || + read(s, &my->turn, sizeof(my->turn)) != sizeof(my->turn) || + read(s, &chc_firststep, sizeof(chc_firststep)) + != sizeof(chc_firststep) || + read(s, &mode, sizeof(mode)) != sizeof(mode)){ + add_io(0, 0); + close(s); + return -1; + } if (mode & CHC_PERSONAL) chc_mode |= CHC_WATCH_PERSONAL; } @@ -1052,10 +1060,9 @@ chc_init(int s, chcusr_t *user1, chcusr_t *user2, board_t board, play_func_t pla // if (my->turn && !(chc_mode & CHC_WATCH)) // chc_broadcast_recv(act_list, board); - user1->lose++; - count_chess_elo_rating(user1, user2, 0.0); - if (chc_mode & CHC_VERSUS) { + user1->lose++; + count_chess_elo_rating(user1, user2, 0.0); passwd_query(usernum, &xuser); chcusr_put(&xuser, user1); passwd_update(usernum, &xuser); @@ -1064,7 +1071,8 @@ chc_init(int s, chcusr_t *user1, chcusr_t *user2, board_t board, play_func_t pla if (!my->turn) { if (!(chc_mode & CHC_WATCH)) chc_broadcast_send(act_list, board); - user2->lose++; + if (chc_mode & CHC_VERSUS) + user2->lose++; } chc_redraw(user1, user2, board); @@ -1086,12 +1094,6 @@ chc(int s, int mode) char mode0 = currutmp->mode; char file[80]; - /* CHC_WATCH is unstable!! */ - if (mode & CHC_WATCH) { - vmsg("觀棋功\能不穩定,暫時停止使用。"); - return; - } - chc_mode = mode; if (!(chc_mode & CHC_WATCH)) diff --git a/mbbsd/talk.c b/mbbsd/talk.c index 7d8927cc..d92a7136 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -1380,8 +1380,18 @@ my_talk(userinfo_t * uin, int fri_stat, char defact) if (sock < 0) vmsg("無法建立連線"); else { +#if defined(Solaris) && __OS_MAJOR_VERSION__ == 5 && __OS_MINOR_VERSION__ < 7 + msgsock = accept(sock, (struct sockaddr *) 0, 0); +#else + msgsock = accept(sock, (struct sockaddr *) 0, (socklen_t *) 0); +#endif + close(sock); + if (msgsock == -1) { + perror("accept"); + return; + } strlcpy(currutmp->mateid, uin->userid, sizeof(currutmp->mateid)); - chc(sock, CHC_WATCH); + chc(msgsock, CHC_WATCH); } } else @@ -2859,6 +2869,7 @@ talkreply(void) char buf[4]; char genbuf[200]; int a, sig = currutmp->sig; + int currstat0 = currstat; uip = &SHM->uinfo[currutmp->destuip]; snprintf(page_requestor, sizeof(page_requestor), @@ -2899,6 +2910,7 @@ talkreply(void) a = reply_connection_request(uip); if (a < 0) { clear(); + currstat = currstat0; return; } @@ -2936,6 +2948,7 @@ talkreply(void) else close(a); clear(); + currstat = currstat0; } /* 網友動態簡表 */ -- cgit v1.2.3