summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mbbsd/chc.c34
-rw-r--r--mbbsd/talk.c15
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;
}
/* 網友動態簡表 */