static void talk_request() { bell(); bell(); if(currutmp->msgcount) { char buf[200]; time_t now = time(0); sprintf(buf, "\033[33;41m★%s\033[34;47m [%s] %s \033[0m", utmpshm->uinfo[currutmp->destuip].userid, my_ctime(&now), (currutmp->sig == 2) ? "重要消息廣播!(請Ctrl-U,l查看熱訊記錄)" : "呼叫、呼叫,聽到請回答"); move(0, 0); clrtoeol(); outs(buf); refresh(); } else { unsigned char mode0 = currutmp->mode; char c0 = currutmp->chatid[0]; screenline_t *screen0 = calloc(t_lines, sizeof(screenline_t)); extern screenline_t *big_picture; currutmp->mode = 0; currutmp->chatid[0] = 1; memcpy(screen0, big_picture, t_lines * sizeof(screenline_t)); talkreply(); currutmp->mode = mode0; currutmp->chatid[0] = c0; memcpy(big_picture, screen0, t_lines * sizeof(screenline_t)); free(screen0); redoscr(); } }
static void process_bar(int n, int len) { char buf[256]; char buf2[256]; char *ptr; char *ptr2; char *ptr3; move(4, 0); prints("┌───────────────┐\n"); sprintf(buf2, " %3d%% ", n * 100 / len); ptr = buf; ptr2 = buf2; ptr3 = buf + n; while (ptr != ptr3) *ptr++ = *ptr2++; *ptr++ = '\x1b'; *ptr++ = '['; *ptr++ = '4'; *ptr++ = '4'; *ptr++ = 'm'; while (*ptr2 != '\0') *ptr++ = *ptr2++; *ptr++ = '\0'; prints("│\033[46m%s\033[m│\n", buf); prints("└───────────────┘\n"); redoscr(); }
void vs_restore(screenline *screen) { roll = old_roll[vs_stack_ptr]; i_newfd = my_newfd[vs_stack_ptr]; if(currutmp) { currstat = stat0[vs_stack_ptr]; currutmp->mode = mode0[vs_stack_ptr]; } memcpy(big_picture, screen, t_lines * sizeof(screenline)); move(y[vs_stack_ptr],x[vs_stack_ptr]); vs_stack_ptr--; free(screen); redoscr(); refresh(); }
int bbsnet(struct _select_def *conf, int n) { time_t now; struct hostent *pHost = NULL; struct sockaddr_in remote; unsigned char buf[BUFSIZ]; int rc; int rv; int maxfdp1; fd_set readset; struct timeval tv; int tos = 020; /* Low delay bit */ int i; sig_t oldsig; int ret; int key; char buf1[40], buf2[40], c, buf3[40]; //增加的变量 int l; //判断是不是port int j; if (strcmp(host2[n], "般若波羅密") == 0) { //如果是自定义站点,等待输入ip或域名 memset(buf1, 0, sizeof(buf1)); move(22,2); prints("\033[1;32m连往: \033[m"); refresh(); j = 0; l = 0; for (i = 0; i < 30;) { c = igetch(); if (c == ' ' || c == '\015' || c == '\0' || c == '\n') break; if (c == ':') { l = 1; sprintf(buf3, "%c", c); prints("\033[0;1m"); prints(buf3); prints("\033[1;33m"); refresh(); strncpy(ip_zdh, buf1, 40); strncpy(ip[n], ip_zdh, 40); memset(buf1, 0, sizeof(buf1)); j = 0; i++; } if ((c >= '0' && c <= '9') || (((c == '.') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !l)) { sprintf(buf3, "%c", c); sprintf(buf2, "%s%c", buf1, c); sprintf(buf1, "%s", buf2); prints(buf3); refresh(); j++; i++; } if ((c == 8) && (j >= 1)) { buf1[j - 1] = '\0'; sprintf(buf3, "\033[D\033[1;33m_\033[%sm\033[D", l ? "1;33" : "0"); prints(buf3); refresh(); i--; j--; } } if (l == 0) { strncpy(ip_zdh, buf1, 40); strcpy(ip[n], ip_zdh); } else { port[n] = atoi(buf1); } } now = time(NULL); clear(); prints("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\n", host2[n], ip[n]); prints("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\n", TIME_OUT); if (setjmp(jb) == 0) { oldsig = signal(SIGALRM, bbsnet_timeout); alarm(TIME_OUT); pHost = gethostbyname(ip[n]); alarm(0); signal(SIGALRM, oldsig); } if (pHost == NULL) { prints("\033[1;31m查找主机名失败!\033[m\n"); pressreturn(); return -1; } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { prints("\033[1;31m无法创建socket!\033[m\n"); pressreturn(); return -1; } bzero(&remote, sizeof(remote)); remote.sin_family = AF_INET; remote.sin_port = htons(port[n]); remote.sin_addr = *(struct in_addr *)pHost->h_addr_list[0]; prints("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\n"); process_bar(0, MAX_PROCESS_BAR_LEN); for (i = 0; i < MAX_PROCESS_BAR_LEN; i++) { if (i == 0) rv = NonBlockConnectEx(sockfd, (struct sockaddr *)&remote, sizeof(remote), 500, 1); else rv = NonBlockConnectEx(sockfd, (struct sockaddr *)&remote, sizeof(remote), 500, 0); if (rv == ERR_TCPLIB_TIMEOUT) { process_bar(i+1, MAX_PROCESS_BAR_LEN); continue; } else if (rv == 0) break; else { prints("\033[1;31m连接失败!\033[m\n"); pressreturn(); ret = -1; goto on_error; } } if (i == MAX_PROCESS_BAR_LEN) { prints("\033[1;31m连接超时!\033[m\n"); pressreturn(); ret = -1; goto on_error; } setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(int)); prints("\033[1;31m连接成功!\033[m\n"); bbsnet_report(host2[n], ip[n], now, 0); clear(); refresh(); bbsnet_send_winsize(sockfd); for (;;) { FD_ZERO(&readset); FD_SET(0, &readset); FD_SET(sockfd, &readset); maxfdp1 = sockfd + 1; tv.tv_sec = 1200; tv.tv_usec = 0; /*if ((rv = SignalSafeSelect(maxfdp1, &readset, NULL, NULL, &tv)) == -1)*/ if ((rv = select(maxfdp1, &readset, NULL, NULL, &tv)) == -1) { if (errno == EINTR) { while (msg_count) { msg_count--; r_msg(); } continue; } ret = -1; goto on_error; } if (rv == 0) { ret = -1; goto on_error; } if (FD_ISSET(sockfd, &readset)) { if ((rc = read(sockfd, buf, BUFSIZ)) < 0) { ret = -1; goto on_error; } else if (rc == 0) break; else if (strchr((void*)buf, 255)) /* 查找是否含有TELNET命令IAC */ telnetopt(sockfd, (void*)buf, rc); else { output((void*)buf, rc); oflush(); } } if (FD_ISSET(0, &readset)) { if ((rc = bbsnet_read(0, (void*)buf, BUFSIZ)) < 0) { ret = -1; goto on_error; } if (rc == 0) break; if ((key = list_select_remove_key(conf)) != KEY_INVALID) { if (key == KEY_ONSIZE) { bbsnet_send_winsize(sockfd); } } write(sockfd, buf, rc); } } bbsnet_report(host2[n], ip[n], now, 1); ret = 0; on_error: close(sockfd); clear(); redoscr(); return ret; }
int bbsnet(struct _select_def *conf, int n) { time_t now; struct hostent *pHost = NULL; struct sockaddr_in remote; unsigned char buf[BUFSIZ]; int rc; int rv; int maxfdp1; fd_set readset; struct timeval tv; int tos = 020; /* Low delay bit */ int i; sig_t oldsig; int ret; int key; now = time(NULL); clear(); prints("\033[1;32m正在测试往 %s (%s) 的连接,请稍候... \033[m\n", host1[n], ip[n]); prints("\033[1;32m如果在 %d 秒内无法连上,穿梭程序将放弃连接。\033[m\n", TIME_OUT); if (setjmp(jb) == 0) { oldsig = signal(SIGALRM, bbsnet_timeout); alarm(TIME_OUT); pHost = gethostbyname(ip[n]); alarm(0); signal(SIGALRM, oldsig); } if (pHost == NULL) { prints("\033[1;31m查找主机名失败!\033[m\n"); pressreturn(); return -1; } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { prints("\033[1;31m无法创建socket!\033[m\n"); pressreturn(); return -1; } bzero(&remote, sizeof(remote)); remote.sin_family = AF_INET; remote.sin_port = htons(port[n]); remote.sin_addr = *(struct in_addr *)pHost->h_addr_list[0]; prints("\033[1;32m穿梭进度条提示您当前已使用的时间。\033[m\n"); process_bar(0, MAX_PROCESS_BAR_LEN); for (i = 0; i < MAX_PROCESS_BAR_LEN; i++) { if (i == 0) rv = NonBlockConnectEx(sockfd, (struct sockaddr *)&remote, sizeof(remote), 500, 1); else rv = NonBlockConnectEx(sockfd, (struct sockaddr *)&remote, sizeof(remote), 500, 0); if (rv == ERR_TCPLIB_TIMEOUT) { process_bar(i+1, MAX_PROCESS_BAR_LEN); continue; } else if (rv == 0) break; else { prints("\033[1;31m连接失败!\033[m\n"); pressreturn(); ret = -1; goto on_error; } } if (i == MAX_PROCESS_BAR_LEN) { prints("\033[1;31m连接超时!\033[m\n"); pressreturn(); ret = -1; goto on_error; } setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(int)); prints("\033[1;31m连接成功!\033[m\n"); bbsnet_report(host1[n], ip[n], now, 0); clear(); refresh(); bbsnet_send_winsize(sockfd); for (;;) { FD_ZERO(&readset); FD_SET(0, &readset); FD_SET(sockfd, &readset); maxfdp1 = sockfd + 1; tv.tv_sec = 1200; tv.tv_usec = 0; /*if ((rv = SignalSafeSelect(maxfdp1, &readset, NULL, NULL, &tv)) == -1)*/ if ((rv = select(maxfdp1, &readset, NULL, NULL, &tv)) == -1) { if (errno == EINTR) { while (msg_count) { msg_count--; r_msg(); } continue; } ret = -1; goto on_error; } if (rv == 0) { ret = -1; goto on_error; } if (FD_ISSET(sockfd, &readset)) { if ((rc = read(sockfd, buf, BUFSIZ)) < 0) { ret = -1; goto on_error; } else if (rc == 0) break; else if (strchr((void*)buf, 255)) /* 查找是否含有TELNET命令IAC */ telnetopt(sockfd, (void*)buf, rc); else { output((void*)buf, rc); oflush(); } } if (FD_ISSET(0, &readset)) { if ((rc = bbsnet_read(0, (void*)buf, BUFSIZ)) < 0) { ret = -1; goto on_error; } if (rc == 0) break; if ((key = list_select_remove_key(conf)) != KEY_INVALID) if (key == KEY_ONSIZE) bbsnet_send_winsize(sockfd); write(sockfd, buf, rc); } } bbsnet_report(host1[n], ip[n], now, 1); ret = 0; on_error: close(sockfd); clear(); redoscr(); return ret; }
int dark(int fd, user_info *uin, int t) { char x=0,y=0,turn=0,xx,yy,mark=0,color=-1; char data[100],shown[2]={0,0},result=0,peace=0; time_t rest,init=time(0); int key,datac; // screenline *screen; //for save the scre data[0]=0; start(uin); add_io(fd, 0); t=t?1:0; if(!t) { /* 兩邊棋盤資料同步 */ for(yy=0; yy<8; yy++) strncat(data, chess[yy], 4); do { datac=send(fd, data, strlen(data), 0); } while(datac<0); } else { do { key=igetkey(); if (key == I_OTHERDATA) { datac= recv(fd, data, sizeof(data), 0); if(datac<=0) {add_io(0, 0); return;} for(yy=0; yy<8; yy++) strncpy(chess[yy], data+yy*4, 4); } } while(key != I_OTHERDATA); } move(18,0); clrtoeol(); do { printtt(19, 56, "%s",t==turn?"自己":"對方"); refresh(); rest=time(0); do { if(t==turn) { show_cursor(y, x, 1); move(18, 0); } key=time(0)-init; datac=ttt+rest-time(0); if(datac<1 && turn==t) { change_record(1); add_io(0,0); bell(); pressanykey("時間到囉!!..這局輸囉.. :~("); return 0; } else if(datac<1) { change_record(0); add_io(0,0); bell(); pressanykey("對方可能睡著啦~ so算你贏了!! ^^Y"); return 0; } move(22,34); prints("%2d:%2d:%2d",key/3600,(key%3600)/60,key%60); printtt(21,47,"4%d;1m %d:%2d",datac<30?1:4,datac/60,datac%60); move(b_lines,0); clrtoeol(); prints("[45;37m 說明 [47;31m [←↑↓→/jikl][30m移動 [31m\ [Enter/Space][30m確定 [31m[w][30m傳訊 [31m[p][30m和棋 [31m[q]\ [30m投降 [31m[h][30mHelp [m"); refresh(); key=igetkey(); peace=0; if(key==I_OTHERDATA) { bell(); datac= recv(fd, data, sizeof(data), 0); if(datac<=0) {add_io(0, 0); return;} if(*data=='P') { getdata(18, 0, "對方提出和棋的要求..答應和棋嗎?? (y/n) [n]", data, 4, LCECHO, 0); move(18,0); clrtoeol(); do { datac=send(fd, data, 1, 0); } while(datac<0); if(*data=='y') { change_record(2); add_io(0, 0); pressanykey("雙方握手言和 :)"); return 0; } key=0; } else if(*data=='Q') { change_record(0); add_io(0, 0); pressanykey("耶耶耶..對方投降了.. ^^Y"); return 0; } else { yy=data[0]-1; xx=data[1]-1; y=data[2]-1; x=data[3]-1; if(darked(chess[y][x])) { /* 對方翻棋 */ if(color<0) { color=nexturn(red(chess[y][x])); show_color(color); } show_chess(y, x, chess[y][x], 0); chess[y][x]--; turn=nexturn(turn); } else { if(chess[y][x]) result=show_eaten(chess[y][x],shown[t]++,0); move_chess(y,x,yy,xx,&mark,&turn); } } } switch(key) { case 'h': { extern screenline* big_picture; screenline* screen0 = calloc(t_lines, sizeof(screenline)); memcpy(screen0, big_picture, t_lines * sizeof(screenline)); more("game/dark.help",YEA); //* 改成自己的路徑 memcpy(big_picture, screen0, t_lines * sizeof(screenline)); free(screen0); redoscr(); } break; case 'w': { extern screenline* big_picture; screenline* screen0 = calloc(2, sizeof(screenline)); memcpy(screen0, big_picture, 2 * sizeof(screenline)); my_write(uin->pid, "傳訊息: "); memcpy(big_picture, screen0, 2 * sizeof(screenline)); free(screen0); redoscr(); } break; case 'p': if(t==turn) { int keyy; if(peace) break; bell(); getdata(18, 0, "真的要和棋嗎?? (y/n) [n]", data, 4, LCECHO, 0); move(18, 0); clrtoeol(); if(*data!='y') break; prints("[33;1m詢問對手是否同意和棋..[5m請稍後... :)[m"); refresh(); peace=1; do { datac=send(fd, "P", 1, 0); } while(datac<0); do { keyy=igetkey(); if(keyy==I_OTHERDATA) { datac= recv(fd, data, sizeof(data), 0); if(datac<=0) {add_io(0, 0); return 0;} move(18, 0); clrtoeol(); if(*data=='y') { change_record(2); add_io(0, 0); pressanykey("雙方握手言和 :)"); return 0; } else pressanykey("對方不同意和棋.. :~"); } } while (keyy!=I_OTHERDATA); } break; case 'q': if(t==turn) { bell(); getdata(18, 0, "真的要投降嗎?? (y/n) [n]", data, 4, LCECHO, 0); move(18,0); clrtoeol(); if(*data!='y') break; do { datac=send(fd, "Q", 1, 0); } while(datac<0); change_record(1); add_io(0, 0); pressanykey("啊啊啊..我不行了..投降~ ^^;"); return 0; } break; default: if(t!=turn) key=0; break; } if(t!=turn) continue; switch(key) { case ' ': case 13: if(!mark && darked(chess[y][x])) { /* 翻棋 */ if(color<0) { color=red(chess[y][x]); show_color(color); } show_chess(y, x, chess[y][x], 0); chess[y][x]--; turn=nexturn(turn); } else if(mark) { /* 已 mark 的處理 */ if(!chess[y][x] && nexto(x-xx,y-yy)) /* 移動 */ move_chess(y,x,yy,xx,&mark,&turn); else if(!mychess(y,x,color) && !darked(chess[y][x])) { /* 吃對方的棋子 */ if(nexto2(x-xx,y-yy) && mark==6) { /* mark 起來的棋子不在隔壁(炮) */ char i,tmp=0; if(x==xx) for(i=min(y,yy)+1; i<max(y,yy); i++) tmp+=(chess[i][x]!=0); else for(i=min(x,xx)+1; i<max(x,xx); i++) tmp+=(chess[y][i]!=0); if(tmp==1 && chess[y][x]) { result=show_eaten(chess[y][x],shown[nexturn(t)]++,1); move_chess(y,x,yy,xx,&mark,&turn); } else cancel_mark(yy,xx,&mark,&key); } else { /* mark 起來的棋子在隔壁 */ if( nexto(x-xx,y-yy) && ((mark==7 && rank(chess[y][x])==1) || /* 小兵立大功 */ ( mark<=rank(chess[y][x]) && rank(chess[y][x])-mark!=6 )) ) { /* 將軍怕小兵 */ result=show_eaten(chess[y][x],shown[nexturn(t)]++,1); move_chess(y,x,yy,xx,&mark,&turn); } else cancel_mark(yy,xx,&mark,&key); } } else cancel_mark(yy,xx,&mark,&key); /* 不能移不能吃 */ } /* mark 起來 */ else if(!mark && chess[y][x] && mychess(y,x,color)) { /* mark 起來 */ show_chess(y, x, chess[y][x], 1); mark=rank(chess[y][x]); xx=x; yy=y; key=0; } else key=0; break; case 'u': if(mark) cancel_mark(yy, xx, &mark, &key); break; case KEY_LEFT: case 'j': show_cursor(y, x, 0); y=y==0?7:y-1; break; case KEY_RIGHT: case 'l': show_cursor(y, x, 0); y=y==7?0:y+1; break; case KEY_UP: case 'i': show_cursor(y, x, 0); x=x==0?3:x-1; break; case KEY_DOWN: case 'k': show_cursor(y, x, 0); x=x==3?0:x+1; break; } } while(key!=' ' && key!=13 && key!=I_OTHERDATA); show_cursor(y, x, 0); if(t==turn) continue; /* turn已經動過..so是相反的值 */ data[0]=yy+1; data[1]=xx+1; data[2]=y+1; data[3]=x+1; do { datac=send(fd, data, 4, 0); } while(datac<0); } while(!result); add_io(0, 0); if(!turn) { FILE *fs; init=time(0)-init; if(fs=fopen("log/dark.log","a+")) //* 可改成自己想要的路徑 { fprintf(fs,"%s win %s %d:%d\n",currutmp->userid,uin->userid,init/60,init%60); fclose(fs); } } change_record(1); pressanykey("恭禧你%s了 ^^Y",t==turn?"輸":"贏"); }
int igetch() { time_t now; char c; int hasaddio = 1; extern int RMSG; if ((uinfo.mode == CHAT1 || uinfo.mode == TALK || uinfo.mode == PAGE) && RMSG == true) hasaddio = 0; igetagain: if (ibufsize == icurrchar) { fd_set readfds, xds; struct timeval to; int sr, hifd; to.tv_sec = 0; to.tv_usec = 0; hifd = 1; FD_ZERO(&readfds); FD_SET(0, &readfds); if ((hasaddio && (i_newfd))&&(!inremsg)) { FD_SET(i_newfd, &readfds); if (hifd <= i_newfd) hifd = i_newfd + 1; } //TODO: igetkey重入问题 if ((uinfo.mode != POSTING && uinfo.mode != SMAIL && uinfo.mode != EDIT) || DEFINE(getCurrentUser(), DEF_LOGININFORM)) if (scrint&&!inremsg) { while (msg_count) { inremsg = true; msg_count--; r_msg(); refresh(); inremsg = false; } } if (kicked) return KEY_TIMEOUT; #ifdef SSHBBS sr = ssh_select(hifd, &readfds, NULL, NULL, &to); #else sr = select(hifd, &readfds, NULL, NULL, &to); #endif if (sr < 0 && errno == EINTR) { if (talkrequest) return KEY_TALK; if ((uinfo.mode != POSTING && uinfo.mode != SMAIL && uinfo.mode != EDIT) || DEFINE(getCurrentUser(), DEF_LOGININFORM)) if (scrint&&!inremsg) { while (msg_count) { inremsg = true; msg_count--; r_msg(); inremsg = false; } goto igetagain; } } if (sr < 0 && errno != EINTR) abort_bbs(0); if (sr == 0) { refresh(); if (flushf) (*flushf)(); while (1) { int alarm_timeout; hifd = 1; FD_ZERO(&xds); FD_SET(0, &xds); FD_ZERO(&readfds); FD_SET(0, &readfds); if ((hasaddio && (i_newfd))&&(!inremsg)) { FD_SET(i_newfd, &readfds); if (hifd <= i_newfd) hifd = i_newfd + 1; } alarm_timeout = 0; if (i_top) to = *i_top; else { while ((i_timeout != 0)||(i_timeoutusec!=0)) { to.tv_sec = i_timeout - (time(0) - i_begintimeout); to.tv_usec = i_timeoutusec; if ((to.tv_sec < 0) ||((to.tv_sec==0)&&(i_timeoutusec==0))) { i_timeout = 0; i_timeoutusec=0; if (i_timeout_func) (*i_timeout_func)(timeout_data); else return KEY_TIMEOUT; if (kicked) return KEY_TIMEOUT; continue; }; alarm_timeout = 1; break; }; if (!alarm_timeout) to.tv_sec = IDLE_TIMEOUT; } #ifdef SSHBBS sr = ssh_select(hifd, &readfds, NULL, &xds, &to); #else sr = select(hifd, &readfds, NULL, &xds, &to); #endif if (sr < 0 && errno == EINTR) { if (talkrequest) return KEY_TALK; } if (kicked) return KEY_TIMEOUT; if ((uinfo.mode != POSTING && uinfo.mode != SMAIL && uinfo.mode != EDIT) || DEFINE(getCurrentUser(), DEF_LOGININFORM)) if (!inremsg) { int saveerrno=errno; while (msg_count) { inremsg = true; msg_count--; r_msg(); refresh(); inremsg = false; } if (sr<0&&saveerrno==EINTR)continue; } if (sr == 0 && alarm_timeout) { i_timeout = 0; i_timeoutusec=0; if (i_timeout_func) (*i_timeout_func)(timeout_data); else return KEY_TIMEOUT; continue; } if (sr >= 0) break; if (errno == EINTR) continue; else abort_bbs(0); } if ((sr == 0) && (!i_top)) abort_bbs(0); if (sr == 0) return I_TIMEOUT; if (FD_ISSET(0, &xds)) abort_bbs(0); } if (hasaddio && (i_newfd && FD_ISSET(i_newfd, &readfds))) return I_OTHERDATA; #ifdef SSHBBS while ((ibufsize = ssh_read(0, inbuffer + 1, IBUFSIZE)) <= 0) #else while ((ibufsize = read(0, inbuffer + 1, IBUFSIZE)) <= 0) #endif { if (ibufsize == 0) longjmp(byebye, -1); if (ibufsize < 0 && errno != EINTR) longjmp(byebye, -1); } if (!filter_telnet(inbuffer + 1, &ibufsize)) { icurrchar = 0; ibufsize = 0; goto igetagain; } /* * add by KCN for GB/BIG5 encode */ if (convcode) { inbuf = big2gb(inbuffer + 1, &ibufsize, 0, getSession()); if (ibufsize == 0) { icurrchar = 0; goto igetagain; } } else inbuf = inbuffer + 1; /* * end */ icurrchar = 0; if (ibufsize > IBUFSIZE) { ibufsize = 0; goto igetagain; } } if (icurrchar >= ibufsize) { ibufsize = icurrchar; goto igetagain; } if (((inbuf[icurrchar] == '\n') && (lastch == '\r')) || ((inbuf[icurrchar] == '\r') && (lastch == '\n'))) { lastch = 0; goto igetagain; } else if (icurrchar != ibufsize) { if (((inbuf[icurrchar] == '\n') && (inbuf[icurrchar + 1] == '\r')) || ((inbuf[icurrchar] == '\r') && (inbuf[icurrchar + 1] == '\n'))) { icurrchar++; lastch = 0; } } else lastch = inbuf[icurrchar]; idle_count = 0; c = inbuf[icurrchar]; switch (c) { case Ctrl('@'): case Ctrl('L'): redoscr(); icurrchar++; now = time(0); uinfo.freshtime = now; if (now - old > 60) { UPDATE_UTMP(freshtime, uinfo); old = now; } goto igetagain; case Ctrl('Z'): if (scrint&&uinfo.mode!=LOCKSCREEN&&uinfo.mode!=NEW&&uinfo.mode!=LOGIN&&uinfo.mode!=BBSNET &&uinfo.mode!=WINMINE&&!inremsg) { icurrchar++; inremsg = true; r_msg(); inremsg = false; goto igetagain; } break; default: break; } icurrchar++; while ((icurrchar != ibufsize) && (inbuf[icurrchar] == 0)) icurrchar++; now = time(0); if (Ctrl('T') != c) uinfo.freshtime = now; /* * add by KCN , decrease temp_numposts */ if (lasttime + 60 * 60 * 8 < now) { lasttime = now; if (temp_numposts > 0) temp_numposts--; } if (now - old > 60) { UPDATE_UTMP(freshtime, uinfo); old = now; } return c; }
int igetch() { #ifdef _BBS_UTIL_ igetagain: if (ibufsize == icurrchar) { fd_set readfds; int sr; FD_ZERO(&readfds); FD_SET(0, &readfds); refresh(); while ((sr = select(16, &readfds, NULL, NULL, NULL)) < 0) /* bug fixed */ { if (errno == EINTR) continue; else { perror("select"); fprintf(stderr, "abnormal select conditions\n"); return -1; } } while ((ibufsize = read(0, inbuf, IBUFSIZE)) <= 0) { if (ibufsize < 0 && errno == EINTR) continue; exit(0); } icurrchar = 0; } if (inbuf[icurrchar] == CTRL('L')) { #ifdef USE_PFTERM redrawwin(); refresh(); #else redoscr(); #endif icurrchar++; goto igetagain; } /* else if (inbuf[icurrchar] == 0x0d) { icurrchar++; return '\n'; } */ return inbuf[icurrchar++]; #else igetagain: if (ibufsize == icurrchar) { int sr; struct pollfd pd[2]; char npd; #if 1 /* !! TEST !! */ if (dumb_term) oflush(); else refresh(); #endif if (flushf) (*flushf) (); pd[0].fd = 0; pd[0].events = POLLIN; pd[1].events = POLLIN; for (;;) { pd[0].revents = 0; if (i_newfd) { npd = 2; pd[1].fd = i_newfd; pd[1].revents = 0; } else npd = 1; sr = poll(pd, npd, 60000); if (sr < 0) { if (errno != EINTR) { perror("select"); fprintf(stderr, "abnormal select conditions\n"); return -1; } } else if (sr == 0) { if (i_top == &i_to) return I_TIMEOUT; if (uinfo.idle_time++ > IDLE_TIMEOUT) { if (!HAS_PERM(PERM_SYSOP)) /* lthuang */ { #ifdef BBSLOG_IDLEOUT bbsd_log_write("IDLEOUT", "%s", modestring(&uinfo, 0)); #endif clear(); show_byebye(TRUE); refresh(); abort_bbs(0); } } update_ulist(cutmp, &uinfo); } else break; } /* for loop */ if (i_newfd && (pd[1].events & pd[1].revents)) return I_OTHERDATA; if (!(pd[0].events & pd[0].revents)) goto igetagain; int len; do { len = tty_read(inbuf, IBUFSIZE); #ifdef DBG_OUTRPT // if (0) { static char xbuf[128]; sprintf(xbuf, ESC_STR "[s" ESC_STR "[2;1H [%ld] " ESC_STR "[u", len); write(1, xbuf, strlen(xbuf)); fsync(1); } #endif } while (len <= 0); ibufsize = len; icurrchar = 0; } i_top->tv_sec = 60; if(uinfo.idle_time) { uinfo.idle_time &= ~(uinfo.idle_time); update_ulist(cutmp, &uinfo); } if (inbuf[icurrchar] == CTRL('L')) { redoscr(); icurrchar++; goto igetagain; } else if (inbuf[icurrchar] == 0x0d) { icurrchar++; if (init_enter) { if (two_enter) press_enter++; return KEY_ENTER; } else { press_enter++; return KEY_ENTER; } } else { if (press_enter) { if (init_enter) { press_enter &= ~press_enter; if (inbuf[icurrchar] == '\0' || inbuf[icurrchar] == 0x0a) { icurrchar++; goto igetagain; } } else { init_enter++; press_enter &= ~press_enter; if (inbuf[icurrchar] == '\0' || inbuf[icurrchar] == 0x0a) { two_enter++; icurrchar++; goto igetagain; } else two_enter &= ~two_enter; } } } return inbuf[icurrchar++]; #endif /* !_BBS_UTIL_ */ }
int igetch() { register int ch; while(ch = dogetch()) { switch (ch) { case Ctrl('L'): redoscr(); continue; case Ctrl('I'): if(currutmp != NULL && currutmp->mode == MMENU) { screenline* screen = (screenline *)calloc(t_lines, sizeof(screenline)); vs_save(screen); t_idle(); vs_restore(screen); continue; } else return(ch); case Ctrl('Q'): /* wildcat : 快速離站 :p */ if(currutmp->mode && currutmp->mode != READING) { if(answer("\033[0;30;47m 確定要離站?? (y/N) \033[m") != 'y') return(ch); update_data(); u_exit("ABORT"); pressanykey("謝謝光臨, 記得常來喔 !"); exit(0); } else return (ch); case Ctrl('U'): resetutmpent(); if(currutmp != NULL && currutmp->mode != EDITING && currutmp->mode != LUSERS && currutmp->mode) { int mode0 = currutmp->mode; int stat0 = currstat; screenline* screen = (screenline *)calloc(t_lines, sizeof(screenline)); vs_save(screen); t_users(); vs_restore(screen); currutmp->mode = mode0; currstat = stat0; continue; } else return (ch); case Ctrl('R'): { if(currutmp == NULL) return (ch); else if(watermode > 0) { watermode = (watermode + oldmsg_count)% oldmsg_count + 1; t_display_new(0); continue; } else if (!currutmp->mode && (currutmp->chatid[0] == 2 || currutmp->chatid[0] == 3) && oldmsg_count && !watermode) { watermode=1; t_display_new(1); continue; } else if (currutmp->msgs[0].last_pid && currutmp->mode) { screenline* screen = (screenline *)calloc(t_lines, sizeof(screenline)); vs_save(screen); watermode=1; t_display_new(1); my_write(currutmp->msgs[0].last_pid, "水球丟回去:"); vs_restore(screen); continue; } else return (ch); } case '\n': /* Ptt把 \n拿掉 */ continue; case Ctrl('T'): if(watermode > 0 ) { watermode = (watermode + oldmsg_count - 2 )% oldmsg_count + 1; t_display_new(0); continue; } default: return (ch); } } }
void refresh() { register screenline *bp = big_picture; register int i, j, len; if (icurrchar != ibufsize) return; if ((docls) || (abs(scrollcnt) >= (scr_lns - 3))) { redoscr(); return; } if (scrollcnt < 0) { rel_move(0, 0); do { o_scrollrev(); } while (++scrollcnt); } else if (scrollcnt > 0) { rel_move(0, b_lines); do { ochar('\n'); } while (--scrollcnt); } for (i = 0, j = roll; i < scr_lns; i++, j++) { if (j >= scr_lns) j = 0; bp = &big_picture[j]; len = bp->len; if (bp->mode & MODIFIED && bp->smod < len) { bp->mode &= ~(MODIFIED); if (bp->emod >= len) bp->emod = len - 1; rel_move(bp->smod, i); if (bp->mode & STANDOUT) standoutput(bp->data, bp->smod, bp->emod + 1, bp->sso, bp->eso); else output(&bp->data[bp->smod], bp->emod - bp->smod + 1); tc_col = bp->emod + 1; if (tc_col >= scr_cols) { if (automargins) tc_col = scr_cols - 1; else { tc_col -= scr_cols; tc_line++; if (tc_line >= t_lines) tc_line = b_lines; } } } if (bp->oldlen > len) { rel_move(len, i); o_cleol(); } bp->oldlen = len; } rel_move(cur_col, cur_ln); oflush(); }