Exemplo n.º 1
0
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);
		}
	}
}
Exemplo n.º 2
0
/*********************************************************************************************************
** 函数名称: __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);
	}
}
Exemplo n.º 4
0
/*
** 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));
}