static coroutine_fn int ssh_co_readv(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { BDRVSSHState *s = bs->opaque; int ret; qemu_co_mutex_lock(&s->lock); ret = ssh_read(s, bs, sector_num * BDRV_SECTOR_SIZE, nb_sectors * BDRV_SECTOR_SIZE, qiov); qemu_co_mutex_unlock(&s->lock); return ret; }
int raw_read(int fd, char *buf, int len) { #ifdef SSHBBS return ssh_read(fd, buf, len); #else int i,j,retlen=0; retlen = read(fd,buf,len); for (i=0; i<retlen; i++) { if (i>0&&((unsigned char)buf[i-1]==0xff)&&((unsigned char)buf[i]==0xff)) { retlen--; for (j=i; j<retlen; j++) buf[j]=buf[j+1]; continue; } if (i>0&&buf[i-1]==0x0d&&buf[i]==0x00) { retlen--; for (j=i; j<retlen; j++) buf[j]=buf[j+1]; continue; } } return retlen; #endif }
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; }