void sckif(int timeout, int sck) { /* If the given socket is -1, try both sockets, unix and tcp. */ if(sck == -1) { if(stcpsck != -1) sckif(timeout, stcpsck); if(sunixsck != -1) sckif(timeout, sunixsck); return; } signal(SIGPIPE, SIG_IGN); if(waitread(sck, timeout, 0)) { struct sockaddr client; socklen_t scksize = sizeof(struct sockaddr); int csck = accept(sck, & client, & scksize); if(-1 != csck) { if(waitread(csck, 0, 100000)) { FILE * fd = fdopen(csck, "r"); if(fd) { char * line = NULL, * ptr = NULL, reply[REPLYBUFSIZE]; unsigned size = 0; getln(& line, & size, fd); if(line && size > 0 && !ferror(fd)) { if((ptr = strchr(line, 13)) || (ptr = strchr(line, 10))) * ptr = 0; execcmd(line, reply); } if(line) free(line); if(strlen(reply)) { write(csck, reply, strlen(reply)); } fclose(fd); } } shutdown(csck, SHUT_RDWR); close(csck); } } }
/********************************************************************************************************* ** 函数名称: __tshellXmodemCleanup ** 功能描述: Xmodem 操作遇到 control-C 时的清除动作 ** 输 入 : iFile 操作文件描述符 ** 输 出 : 0 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __tshellXmodemCleanup (INT iFile) { struct timeval tmval = {2, 0}; CHAR cTemp[16]; if (iFile >= 0) { close(iFile); } /* * 由于一些终端软件结束文件传输时, 会连续发送 __LW_XMODEM_CAN 0x18 命令, * 所以会造成系统转换为 OPT_TERMINAL 模式时与 ctrl+x 命令冲突, 造成系统重启, * 所以这里需要等待 2s 的平静时间. */ while (waitread(STD_IN, &tmval) == 1) { if (read(STD_IN, cTemp, sizeof(cTemp)) <= 0) { break; } } ioctl(STD_IN, FIOSETOPTIONS, OPT_TERMINAL); ioctl(STD_OUT, FIOSETOPTIONS, OPT_TERMINAL); ioctl(STD_IN, FIORFLUSH, 0); /* 清除读缓冲数据 */ }
/* * Blocks until a descriptor is readable. */ void ensure_readable(int fd) { if (! waitread(fd, poll_wait_sec)) { fprintf(stderr, "\nfd %d went %d sec with no reply!\n", fd, poll_wait_sec); exit(1); } }
/* ** readable() ** ** Poll a socket for pending input. Returns immediately. This is a front-end ** to waitread() below. ** ** Input: file descriptor to poll ** Output: 1 if data is available for reading */ int readable(int fd) { return(waitread(fd, 0)); }