⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif#if 0voidsnooze_hup(num)	int num;{	int s, ret;#ifndef NO_UNIX_SOCKETS	struct sockaddr_un sock_un;#endif	struct sockaddr_in sock_in;	char buff[256];		ret = -1;	if (slirp_socket_passwd) {		s = socket(AF_INET, SOCK_STREAM, 0);		if (s < 0)		   slirp_exit(1);		sock_in.sin_family = AF_INET;		sock_in.sin_addr.s_addr = slirp_socket_addr;		sock_in.sin_port = htons(slirp_socket_port);		if (connect(s, (struct sockaddr *)&sock_in, sizeof(sock_in)) != 0)		   slirp_exit(1); /* just exit...*/		sprintf(buff, "kill %s:%d", slirp_socket_passwd, slirp_socket_unit);		write(s, buff, strlen(buff)+1);	}#ifndef NO_UNIX_SOCKETS	  else {		s = socket(AF_UNIX, SOCK_STREAM, 0);		if (s < 0)		   slirp_exit(1);		sock_un.sun_family = AF_UNIX;		strcpy(sock_un.sun_path, socket_path);		if (connect(s, (struct sockaddr *)&sock_un,			      sizeof(sock_un.sun_family) + sizeof(sock_un.sun_path)) != 0)		   slirp_exit(1);		sprintf(buff, "kill none:%d", slirp_socket_unit);		write(s, buff, strlen(buff)+1);	}#endif	slirp_exit(0);}		voidsnooze(){	sigset_t s;	int i;		/* Don't need our data anymore */	/* XXX This makes SunOS barf *//*	brk(0); */		/* Close all fd's */	for (i = 255; i >= 0; i--)	   close(i);		signal(SIGQUIT, slirp_exit);	signal(SIGHUP, snooze_hup);	sigemptyset(&s);		/* Wait for any signal */	sigsuspend(&s);		/* Just in case ... */	exit(255);}voidrelay(s)	int s;{	char buf[8192];	int n;	fd_set readfds;	struct ttys *ttyp;		/* Don't need our data anymore */	/* XXX This makes SunOS barf *//*	brk(0); */		signal(SIGQUIT, slirp_exit);	signal(SIGHUP, slirp_exit);        signal(SIGINT, slirp_exit);	signal(SIGTERM, slirp_exit);		/* Fudge to get term_raw and term_restore to work */	if (NULL == (ttyp = tty_attach (0, slirp_tty))) {         lprint ("Error: tty_attach failed in misc.c:relay()\r\n");         slirp_exit (1);    }	ttyp->fd = 0;	ttyp->flags |= TTY_CTTY;	term_raw(ttyp);		while (1) {		FD_ZERO(&readfds);				FD_SET(0, &readfds);		FD_SET(s, &readfds);				n = select(s+1, &readfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);				if (n <= 0)		   slirp_exit(0);				if (FD_ISSET(0, &readfds)) {			n = read(0, buf, 8192);			if (n <= 0)			   slirp_exit(0);			n = writen(s, buf, n);			if (n <= 0)			   slirp_exit(0);		}				if (FD_ISSET(s, &readfds)) {			n = read(s, buf, 8192);			if (n <= 0)			   slirp_exit(0);			n = writen(0, buf, n);			if (n <= 0)			   slirp_exit(0);		}	}		/* Just in case.... */	exit(1);}#endifint (*lprint_print) _P((void *, const char *, va_list));char *lprint_ptr, *lprint_ptr2, **lprint_arg;void#ifdef __STDC__lprint(const char *format, ...)#elselprint(va_alist) va_dcl#endif{	va_list args;        #ifdef __STDC__        va_start(args, format);#else        char *format;        va_start(args);        format = va_arg(args, char *);#endif#if 0	/* If we're printing to an sbuf, make sure there's enough room */	/* XXX +100? */	if (lprint_sb) {		if ((lprint_ptr - lprint_sb->sb_wptr) >=		    (lprint_sb->sb_datalen - (strlen(format) + 100))) {			int deltaw = lprint_sb->sb_wptr - lprint_sb->sb_data;			int deltar = lprint_sb->sb_rptr - lprint_sb->sb_data;			int deltap = lprint_ptr -         lprint_sb->sb_data;			                        			lprint_sb->sb_data = (char *)realloc(lprint_sb->sb_data,							     lprint_sb->sb_datalen + TCP_SNDSPACE);						/* Adjust all values */			lprint_sb->sb_wptr = lprint_sb->sb_data + deltaw;			lprint_sb->sb_rptr = lprint_sb->sb_data + deltar;			lprint_ptr =         lprint_sb->sb_data + deltap;						lprint_sb->sb_datalen += TCP_SNDSPACE;		}	}#endif		if (lprint_print)	   lprint_ptr += (*lprint_print)(*lprint_arg, format, args);		/* Check if they want output to be logged to file as well */	if (lfd) {		/* 		 * Remove \r's		 * otherwise you'll get ^M all over the file		 */		int len = strlen(format);		char *bptr1, *bptr2;				bptr1 = bptr2 = strdup(format);				while (len--) {			if (*bptr1 == '\r')			   memcpy(bptr1, bptr1+1, len+1);			else			   bptr1++;		}		vfprintf(lfd, bptr2, args);		free(bptr2);	}	va_end(args);}voidadd_emu(buff)	char *buff;{	u_int lport, fport;	u_int8_t tos = 0, emu = 0;	char buff1[256], buff2[256], buff4[128];	char *buff3 = buff4;	struct emu_t *emup;	struct socket *so;		if (sscanf(buff, "%256s %256s", buff2, buff1) != 2) {		lprint("Error: Bad arguments\r\n");		return;	}		if (sscanf(buff1, "%d:%d", &lport, &fport) != 2) {		lport = 0;		if (sscanf(buff1, "%d", &fport) != 1) {			lprint("Error: Bad first argument\r\n");			return;		}	}		if (sscanf(buff2, "%128[^:]:%128s", buff1, buff3) != 2) {		buff3 = 0;		if (sscanf(buff2, "%256s", buff1) != 1) {			lprint("Error: Bad second argument\r\n");			return;		}	}		if (buff3) {		if (strcmp(buff3, "lowdelay") == 0)		   tos = IPTOS_LOWDELAY;		else if (strcmp(buff3, "throughput") == 0)		   tos = IPTOS_THROUGHPUT;		else {			lprint("Error: Expecting \"lowdelay\"/\"throughput\"\r\n");			return;		}	}		if (strcmp(buff1, "ftp") == 0)	   emu = EMU_FTP;	else if (strcmp(buff1, "irc") == 0)	   emu = EMU_IRC;	else if (strcmp(buff1, "none") == 0)	   emu = EMU_NONE; /* ie: no emulation */	else {		lprint("Error: Unknown service\r\n");		return;	}		/* First, check that it isn't already emulated */	for (emup = tcpemu; emup; emup = emup->next) {		if (emup->lport == lport && emup->fport == fport) {			lprint("Error: port already emulated\r\n");			return;		}	}		/* link it */	emup = (struct emu_t *)malloc(sizeof (struct emu_t));	emup->lport = (u_int16_t)lport;	emup->fport = (u_int16_t)fport;	emup->tos = tos;	emup->emu = emu;	emup->next = tcpemu;	tcpemu = emup;		/* And finally, mark all current sessions, if any, as being emulated */	for (so = tcb.so_next; so != &tcb; so = so->so_next) {		if ((lport && lport == ntohs(so->so_lport)) ||		    (fport && fport == ntohs(so->so_fport))) {			if (emu)			   so->so_emu = emu;			if (tos)			   so->so_iptos = tos;		}	}		lprint("Adding emulation for %s to port %d/%d\r\n", buff1, emup->lport, emup->fport);}#ifdef BAD_SPRINTF#undef vsprintf#undef sprintf/* * Some BSD-derived systems have a sprintf which returns char * */intvsprintf_len(string, format, args)	char *string;	const char *format;	va_list args;{	vsprintf(string, format, args);	return strlen(string);}int#ifdef __STDC__sprintf_len(char *string, const char *format, ...)#elsesprintf_len(va_alist) va_dcl#endif{	va_list args;#ifdef __STDC__	va_start(args, format);#else	char *string;	char *format;	va_start(args);	string = va_arg(args, char *);	format = va_arg(args, char *);#endif	vsprintf(string, format, args);	return strlen(string);}#endifvoidu_sleep(usec)	int usec;{	struct timeval t;	fd_set fdset;		FD_ZERO(&fdset);		t.tv_sec = 0;	t.tv_usec = usec * 1000;		select(0, &fdset, &fdset, &fdset, &t);}/* * Set fd blocking and non-blocking */voidfd_nonblock(fd)	int fd;{#ifdef FIONBIO	int opt = 1;		ioctlsocket(fd, FIONBIO, &opt);#else	int opt;		opt = fcntl(fd, F_GETFL, 0);	opt |= O_NONBLOCK;	fcntl(fd, F_SETFL, opt);#endif}voidfd_block(fd)	int fd;{#ifdef FIONBIO	int opt = 0;		ioctlsocket(fd, FIONBIO, &opt);#else	int opt;		opt = fcntl(fd, F_GETFL, 0);	opt &= ~O_NONBLOCK;	fcntl(fd, F_SETFL, opt);#endif}#if 0/* * invoke RSH */intrsh_exec(so,ns, user, host, args)	struct socket *so;	struct socket *ns;	char *user;	char *host;	char *args;{	int fd[2];	int fd0[2];	int s;	char buff[256];		DEBUG_CALL("rsh_exec");	DEBUG_ARG("so = %lx", (long)so);		if (pipe(fd)<0) {          lprint("Error: pipe failed: %s\n", strerror(errno));          return 0;	}/* #ifdef HAVE_SOCKETPAIR */#if 1        if (socketpair(PF_UNIX,SOCK_STREAM,0, fd0) == -1) {          close(fd[0]);          close(fd[1]);          lprint("Error: openpty failed: %s\n", strerror(errno));          return 0;        }#else        if (slirp_openpty(&fd0[0], &fd0[1]) == -1) {          close(fd[0]);          close(fd[1]);          lprint("Error: openpty failed: %s\n", strerror(errno));          return 0;        }#endif		switch(fork()) {	 case -1:           lprint("Error: fork failed: %s\n", strerror(errno));           close(fd[0]);           close(fd[1]);           close(fd0[0]);           close(fd0[1]);           return 0;           	 case 0:           close(fd[0]);           close(fd0[0]);           		/* Set the DISPLAY */           if (x_port >= 0) {#ifdef HAVE_SETENV             sprintf(buff, "%s:%d.%d", inet_ntoa(our_addr), x_port, x_screen);             setenv("DISPLAY", buff, 1);#else             sprintf(buff, "DISPLAY=%s:%d.%d", inet_ntoa(our_addr), x_port, x_screen);             putenv(buff);#endif           }                      dup2(fd0[1], 0);           dup2(fd0[1], 1);           dup2(fd[1], 2);           for (s = 3; s <= 255; s++)             close(s);                      execlp("rsh","rsh","-l", user, host, args, NULL);                      /* Ooops, failed, let's tell the user why */                      sprintf(buff, "Error: execlp of %s failed: %s\n",                    "rsh", strerror(errno));           write(2, buff, strlen(buff)+1);           close(0); close(1); close(2); /* XXX */           exit(1);                   default:          close(fd[1]);          close(fd0[1]);          ns->s=fd[0];          so->s=fd0[0];                    return 1;	}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -