亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? remote.c

?? 使用BorlandC++4.5編譯的一個MUD客戶端程序
?? C
字號:
/* remote.c: Handle I/O to remote */

/*
 * $Id: remote.c 2.1 1995/10/24 15:46:14 tsurace Release $
 * $Log: remote.c $ * Revision 2.1  1995/10/24  15:46:14  tsurace * Roll. * * Revision 1.2  1995/10/18  22:08:21  tsurace * Removed potentially dangerous errno=WSAGetLastError() hack. * (Maybe sys_errlist[errno] invalid?) *
 * Revision 1.1  1995/10/12  20:51:58  tsurace
 * Initial revision
 *
 */

#include "vt.h"
#include <errno.h>
#include <fcntl.h>

#ifdef __WIN32__ /* windows sockets */
/*
 * Win32 notes:
 *
 * I (tekHedd) would like to thank, compliment, bless, worship,
 * and otherwise suck up to the programmer who encapsulated
 * socket code in remote.c, window code in window.c, etc.  I could
 * kiss you!  (But I won't.)  
 *
 * read(), write(), and close() may not be used on sockets, you must
 * use send(), recv(), and closesocket(), and also ioctlsocket().
 */
# include <dos.h> /* sleep() */
# include <winsock.h>
# include "win32/replace.h"
  typedef const struct sockaddr FAR * CONNECT_SOCKET_T;
# define EWOULDBLOCK WSAEWOULDBLOCK      /* not the same as errno.h */
# define errno WSAGetLastError() /* Tricky, dangerous */
#else /* Berkeley (real) sockets */
# include <sys/uio.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netdb.h>
  extern unsigned long inet_addr();
  extern int errno;
# define closesocket(an_fd) close(an_fd)
#endif /* __WIN32__ */

#ifdef PROTOTYPES
static int get_in_addr(char *, struct in_addr *);
static void receive_input(Unode *rmt);
#else
static void receive_input();
#endif

#ifndef FD_ZERO
typedef struct fd_set_tag {
	long masks[9];
} DESCR_MASK;
#define FD_SET(n, p)   ((p)->masks[(n) / 32] |=	 (1 << ((n) % 32)))
#define FD_CLR(n, p)   ((p)->masks[(n) / 32] &= ~(1 << ((n) % 32)))
#define FD_ISSET(n, p) ((p)->masks[(n) / 32] &	 (1 << ((n) % 32)))
#define FD_ZERO(p)     bzero((p), sizeof(*(p)))
#else
typedef fd_set DESCR_MASK;
#endif

#define INBUF_SIZE 1024
extern int sys_nerr;
Unode rmt_ring;				/* Dummy node for remotes ring */
Unode *cur_rmt = NULL;			/* Remote being processed      */
String kin;

void init_rmt()
{
	rmt_ring.next = rmt_ring.prev = &rmt_ring;
	rmt_ring.dummy = 1;
}

void cleanup_rmt(void)
{
    ;
}

static int get_in_addr(name, addr)
	char *name;
	struct in_addr *addr;
{
	struct hostent *hostent;

	if (isdigit(*name)) {
		addr->s_addr = inet_addr(name);
		return addr->s_addr != (unsigned long) -1L;
	}
	hostent = gethostbyname(name);
	if (!hostent)
		return 0;
	bcopy(hostent->h_addr, (char *) addr, sizeof(struct in_addr));
	return 1;
}

Unode *new_rmt(addr, port)
	char *addr;
	int port;
{
	struct sockaddr_in saddr;
	struct in_addr hostaddr;
	int fd;
	Unode *rmt;
 
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(port);
	if (!get_in_addr(addr, &hostaddr)) {
		vtc_errmsg = "Couldn't find host";
		return NULL;
	}
	vtc_errmsg = NULL;
	bcopy(&hostaddr, &saddr.sin_addr, sizeof(struct in_addr));
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd < 0)
		return NULL;
	if (connect(fd,
                    (CONNECT_SOCKET_T)&saddr,
                    sizeof(struct sockaddr_in)) < 0) {
		closesocket(fd);
		return NULL;
	}
#ifdef FNDELAY
	fcntl(fd, F_SETFL, FNDELAY);
#endif
#ifdef __WIN32__
        /* Inform windows of the new socket.  :/ */
        if (NULL != NewSocket (fd, FD_READ | FD_CLOSE))
        {
            vtc_errmsg = "WSAAsyncSelect failed";
            closesocket(fd); 
            return NULL;
        }
#endif
	rmt = unalloc();
	rmt->Raddr = vtstrdup(addr);
	rmt->Rport = port;
	rmt->Rfd = fd;
	rmt->Rbuf = New(String);
	*rmt->Rbuf = empty_string;
	rmt->Rtelnetbuf = New(String);
	*rmt->Rtelnetbuf = empty_string;
	rmt->Rwin = NULL;
	rmt->Rnetread = NULL;
	rmt->Rpromptread = NULL;
	rmt->Rrstack = NULL;
	rmt->Robj = NULL;
	rmt->Rback = rmt->Rbusy = rmt->Rraw = 0;
	rmt->Riac = rmt->Rintent = 0;
	rmt->Recho = 1;
	rmt->Rdisconnected = 0;
	rmt->prev = rmt_ring.prev;
	rmt->next = &rmt_ring;
	rmt_ring.prev = rmt_ring.prev->next = rmt;
	return rmt;
}

void disconnect(rmt)
	Unode *rmt;
{
	Func *func;
	Unode *old_rmt;
	int ormt_id;

	if (rmt->Rdisconnected)
		return;
	rmt->Rdisconnected = 1;
	func = find_func("disconnect_hook");
	if (func && func->cmd) {
		old_rmt = cur_rmt;
		if (cur_rmt)
			ormt_id = cur_rmt->id;
		cur_rmt = rmt;
		run_prog(func->cmd);
		cur_rmt = old_rmt && ormt_id == old_rmt->id ? old_rmt : NULL;
	}
	if (rmt->Rwin) {
		rmt->Rwin->Wrmt = NULL;
		update_echo_mode();
	}
	closesocket(rmt->Rfd);
	s_free(rmt->Rbuf);
	Discard(rmt->Rbuf, String);
	rmt->prev->next = rmt->next;
	rmt->next->prev = rmt->prev;
	if (cur_rmt == rmt)
		cur_rmt = NULL;
	destroy_pointers(rmt->frefs);
	break_pipe(rmt->Rrstack);
	discard_unode(rmt);
}

static void receive_input(rmt)
	Unode *rmt;
{
    int count;
    char block[INBUF_SIZE + 1];

    /* Get some data.  If we're interrupted or would block, don't worry! */
    count = recv(rmt->Rfd, block, INBUF_SIZE, 0);
    if (count > 0)       /* got some data */
    {
        block[count] = '\0';
        s_acat(rmt->Rbuf, block);
        rmt->Rinbuf = 1;
    }
    else if (-1 == count && errno != EINTR && errno != EWOULDBLOCK)
    {
        vtc_errflag = 1;
        vtc_errmsg = "Connection closed by foreign host";
        disconnect(rmt);
    }
    else /* 0 == count, disconnect on some versions of UNIX? */
    {
        vtc_errflag = 1;
        vtc_errmsg = NULL;
        disconnect(rmt);
    };
}

/*
 * In the unix version, this function processes all keyboard input.
 * 
 * In the MS-Windoze version, this is polled when the os tells us there
 * might be input on a socket, but keyboard input comes from events.
 */
int io_check(sec, usec)
	long sec, usec;
{
	struct timeval tv, *tvp;
 	DESCR_MASK readers; 
        DESCR_MASK exc;
	int count, nfd, fd;
	Unode *rp, *next;
	char block[INBUF_SIZE + 1];

	FD_ZERO(&readers);
	FD_ZERO(&exc);
	if (sec == -1) { 
		tvp = NULL; /* wait forever for input */
	} else {
		tv.tv_sec = sec;
		tv.tv_usec = usec;
		tvp = &tv;
	}
#ifdef __WIN32__ /* Can't use select() on stdin with Winsock */
    nfd = 0;
#else
 	FD_SET(0, &readers);  
	nfd = 1;
#endif /* __WIN32__ */
	for (rp = rmt_ring.next; !rp->dummy; rp = rp->next) {
		if ((rp->Rwin || rp->Rback) && !rp->Rbusy) {
			fd = rp->Rfd;
			FD_SET(fd, &readers);
			if (nfd <= fd)
				nfd = fd + 1;
		}
	}
	count = select(nfd, &readers, (DESCR_MASK *) NULL, &exc, tvp);
	if (count == 0 || count == -1 && errno == EINTR)
		return 0;
	if (count == -1)
		operror("select", NULL);
	for (rp = rmt_ring.next; !rp->dummy; rp = next) {
		next = rp->next;
		if ((rp->Rwin || rp->Rback) && !rp->Rbusy) {
			if (FD_ISSET(rp->Rfd, &readers))
				receive_input(rp);
		}
	};
#ifndef __WIN32__ /* Ignore stdin? */
	/* Check for keyboard input */
	if (FD_ISSET(0, &readers)) {
		do
			count = read(0, block, INBUF_SIZE);
		while (count == -1 && errno == EINTR);
		s_cat(&kin, cstr_sl(block, count));
	};
#endif
	return 1;
}


int transmit(rmt, cstr)
	Unode *rmt;
	Cstr cstr;
{
	int written;

	if (rmt->Rdisconnected)
		return -1;
	while (cstr.l > 0) {
		written = send(rmt->Rfd, cstr.s, cstr.l, 0);
		if (written == -1) {
			if (errno == EWOULDBLOCK) {
				sleep(1);
				continue;
			}
			vtc_errflag = 1;
			vtc_errmsg = NULL;
			disconnect(rmt);
			return -1;
		}
		cstr.s += written;
		cstr.l -= written;
		if (cstr.l)
			sleep(1);
	}
	return 0;
}

int input_waiting(fd)
	int fd;
{
	struct timeval tv;
	DESCR_MASK readers;

	tv.tv_sec = tv.tv_usec = 0;
	FD_ZERO(&readers);
	FD_SET(fd, &readers);
	return select(fd + 1, &readers, (DESCR_MASK *) NULL,
		      (DESCR_MASK *) NULL, &tv);
}

int process_remote_text(rmt)
	Unode *rmt;
{
	int rid = rmt->id;
	char *s;

	for (s = rmt->Rbuf->c.s; *s; s++) {
		if (!(rmt->Rwin || rmt->Rback) || rmt->Rbusy) {
			s_cpy(rmt->Rbuf, cstr_sl(s, rmt->Rbuf->c.l -
				(s - rmt->Rbuf->c.s)));
			telnet_state_machine(rmt, 0);
			return 1;
		}
		rmt->Rinbuf = (s[1] != 0);
		telnet_state_machine(rmt, (unsigned char) *s);
		if (rmt->id != rid)
			return 0;
	}
	telnet_state_machine(rmt, 0);
	s_term(rmt->Rbuf, 0);
	rmt->Rinbuf = (rmt->Rbuf->c.l != 0);
	return 1;
}

void give_remote(rmt, is, isgoahead)
	Unode *rmt;
	Istr *is;
	int isgoahead;
{
	Func *func;

	is->refs++;
	if (rmt->Rrstack && !isgoahead) {
		resume_istr(&rmt->Rrstack, is);
	} else {
		func = (isgoahead) ? rmt->Rpromptread : rmt->Rnetread;
		if (func) {
			run_prog_istr(func->cmd, is, NULL, rmt);
		} else {
			output(rmt->Rwin, is->rs->str.c.s);
			if (!isgoahead)
				output(rmt->Rwin, "\n");
		}
	}
	dec_ref_istr(is);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草精品视频| 国产精品77777| 精品中文字幕一区二区| 国产成a人亚洲精| 欧美一级免费大片| 亚洲人成小说网站色在线| 美女一区二区久久| 欧洲色大大久久| 中文字幕佐山爱一区二区免费| 久久精品国产成人一区二区三区 | 午夜久久久久久久久久一区二区| 毛片av一区二区三区| 在线视频国产一区| 国产精品的网站| 国产电影一区在线| 欧美r级在线观看| 午夜亚洲福利老司机| 一本色道a无线码一区v| 国产欧美一区二区三区在线老狼| 另类小说欧美激情| 欧美一卡2卡3卡4卡| 亚洲一二三区不卡| 日本高清视频一区二区| 亚洲欧美另类久久久精品2019| 国产电影一区二区三区| 久久久综合精品| 狠狠色综合播放一区二区| 欧美一卡二卡在线| 免费成人在线影院| 欧美一个色资源| 久久精品国产精品亚洲综合| 欧美一区二区三区日韩| 免费在线一区观看| 日韩精品专区在线影院重磅| 蜜臀av一级做a爰片久久| 欧美一区永久视频免费观看| 日韩国产成人精品| 日韩片之四级片| 老司机一区二区| 2024国产精品视频| 国产91高潮流白浆在线麻豆 | 免费成人在线播放| 欧美一区二区三区系列电影| 日韩精品五月天| 日韩一区二区影院| 亚洲精品欧美综合四区| 99久久er热在这里只有精品66| 亚洲欧洲成人av每日更新| 91老师片黄在线观看| 亚洲理论在线观看| 欧美另类一区二区三区| 肉肉av福利一精品导航| 欧美不卡在线视频| 高潮精品一区videoshd| 亚洲视频1区2区| 欧美精品久久一区| 国产精品一区在线观看你懂的| 亚洲国产激情av| 91福利国产精品| 久久99久久99精品免视看婷婷| 国产亚洲欧美激情| 色天天综合久久久久综合片| 首页国产欧美久久| 久久久久久黄色| 色婷婷激情综合| 美国十次综合导航| 国产精品久久久爽爽爽麻豆色哟哟| 97国产一区二区| 欧美aaaaaa午夜精品| 中文字幕欧美日韩一区| 欧美精品亚洲一区二区在线播放| 国内精品伊人久久久久av一坑| 中文字幕一区二区三| 7777女厕盗摄久久久| 成人做爰69片免费看网站| 亚洲午夜激情网站| 久久蜜桃香蕉精品一区二区三区| 91电影在线观看| 国产精品羞羞答答xxdd| 午夜视频在线观看一区二区| 国产亚洲欧美日韩俺去了| 欧美日韩国产综合一区二区| 国产成人夜色高潮福利影视| 亚洲动漫第一页| 国产欧美精品一区| 欧美mv日韩mv| 欧美另类一区二区三区| www.亚洲免费av| 精品一区二区三区视频| 视频一区二区三区在线| 亚洲三级在线免费| 国产精品沙发午睡系列990531| 欧美精品在线一区二区| av一区二区三区黑人| 国产精品小仙女| 韩国女主播一区二区三区| 天堂午夜影视日韩欧美一区二区| 国产欧美中文在线| 久久一夜天堂av一区二区三区| 欧美精品电影在线播放| 在线免费不卡电影| 99re这里只有精品首页| 国产成人精品免费| 久久爱另类一区二区小说| 天天综合日日夜夜精品| 夜夜操天天操亚洲| 国产午夜精品久久久久久久 | 久久久久9999亚洲精品| 欧洲精品一区二区| 99精品1区2区| 不卡电影一区二区三区| 国产成人av电影在线| 九九国产精品视频| 美腿丝袜在线亚洲一区| 日本最新不卡在线| 日产精品久久久久久久性色| 天天综合天天做天天综合| 午夜精品福利一区二区三区av| 亚洲美女偷拍久久| 亚洲夂夂婷婷色拍ww47| 亚洲综合一区二区精品导航| 亚洲国产成人av好男人在线观看| 亚洲免费av观看| 一区二区不卡在线播放| 亚洲自拍偷拍九九九| 天天av天天翘天天综合网| 日韩中文字幕一区二区三区| 日韩电影在线看| 国产专区欧美精品| 不卡视频在线观看| 在线看国产一区| 91精品国产色综合久久不卡蜜臀 | 亚洲在线观看免费| 亚洲成a人v欧美综合天堂| 婷婷六月综合网| 久久99久久久久| 成人黄色在线视频| 欧美性感一类影片在线播放| 亚洲成人第一页| 久久久不卡影院| 亚洲视频免费观看| 五月婷婷激情综合网| 久久精品国产网站| 91性感美女视频| 欧美日韩不卡一区二区| 亚洲精品一区二区三区福利| 国产精品全国免费观看高清 | 久久众筹精品私拍模特| 久久久久久久久久久电影| 国产精品色呦呦| 婷婷激情综合网| 成人黄页毛片网站| 日韩一区二区在线看片| 中文字幕在线观看一区| 无吗不卡中文字幕| 丁香亚洲综合激情啪啪综合| 欧美日韩在线三级| 国产日韩av一区二区| 天天操天天干天天综合网| 懂色av一区二区三区免费观看| 欧美日韩成人综合在线一区二区| 久久久久久久久久电影| 午夜亚洲福利老司机| 国产成a人亚洲精品| 欧美一区在线视频| 亚洲最大色网站| 国产成人午夜视频| 日韩欧美自拍偷拍| 一区二区成人在线| 成人网在线播放| 日韩精品最新网址| 亚洲成av人片在www色猫咪| 国产91色综合久久免费分享| 91麻豆精品国产自产在线 | 久久婷婷成人综合色| 亚洲尤物在线视频观看| 成人av午夜电影| 国产亚洲综合av| 老鸭窝一区二区久久精品| 一本久久综合亚洲鲁鲁五月天| 久久综合久久综合久久| 爽爽淫人综合网网站| 欧美影院一区二区| 亚洲卡通欧美制服中文| www.性欧美| 国产日韩欧美精品一区| 激情深爱一区二区| 欧美一级久久久| 日韩激情一二三区| 欧美精品在线一区二区| 亚洲国产欧美日韩另类综合| 99国产精品久久| 亚洲色图一区二区三区| 91香蕉视频污| 亚洲天天做日日做天天谢日日欢| 成人av影视在线观看| 国产精品网站导航| 成人国产精品免费网站| 欧美国产激情一区二区三区蜜月| 国产一区二区三区国产|