x_dumper.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 203 行

C,V
203
字号
head	1.2;
access;
symbols;
locks
	dls:1.2; strict;
comment	@ * @;


1.2
date	97.09.21.19.29.03;	author dls;	state Dist;
branches;
next	1.1;

1.1
date	94.08.12.06.02.59;	author dls;	state Old;
branches;
next	;


desc
@@


1.2
log
@pre-3e code
@
text
@/* x_dumper.c - x_dumper */

#include <conf.h>
#include <kernel.h>
#include <proc.h>
#include <network.h>


static	dump();
static	int	count, recd = 0;
static	char	buf[256];		/* for sprintf()'s */

/*------------------------------------------------------------------------
 *  x_dumper  -  (command dumper) dump data to a remote TCP echo
 *------------------------------------------------------------------------
 */
COMMAND	x_dumper(stdin, stdout, stderr, nargs, args)
int	stdin, stdout, stderr, nargs;
char	*args[];
{
	char *rhost;
	int cmax;

	if (nargs == 1) {
		write(stderr, "usage: dumper host [count]\n", 27);
		return SYSERR;
	}
	cmax = 1024;
	if (nargs == 3) {
		cmax = atoi(args[2]);
		if (cmax <= 0) {
			write(stderr, "dumper: illegal count\n", 22);
			return SYSERR;
		}
	}
	rhost = args[1];
	dump(rhost, cmax, stdout, stderr);
	return OK;
}

static
dump(rhost, cmax, stdout, stderr)
char	*rhost;
int	cmax, stdout, stderr;
{
	IPaddr	addr;
	char host[22];		/* allows "XXX.XXX.XXX.XXX:XXXXX\0" */
	int fd, cc, wrv;
	char	*inbuf, *outbuf;
	int	sent;
#define	BUFSZ	4000

	inbuf = (char *)getmem(BUFSZ);
	outbuf = (char *)getmem(BUFSZ);
	if ((addr = name2ip(rhost)) == SYSERR) {
		write(stdout, "unknown host\n", 13);
		freemem(inbuf, BUFSZ);
		freemem(outbuf, BUFSZ);
		return SYSERR;
	}
	ip2dot(host, addr);
	strcat(host, ":7");
	fd = open(TCP, host, ANYLPORT);
	if (fd == SYSERR) {
		freemem(inbuf, BUFSZ);
		freemem(outbuf, BUFSZ);
		return SYSERR;
	}
	if (fd < 0) {
		sprintf(buf, "open: %s\n", tcperror[-fd]);
		write(stderr, buf, strlen(buf));
		freemem(inbuf, BUFSZ);
		freemem(outbuf, BUFSZ);
		return SYSERR;
	}
	count = recd = 0;
	while (1) {
		int	cctot;
		int	i;

		do {
			outbuf[count % BUFSZ] = count %26 + 'a';
			++count;
		} while (count % BUFSZ);
		cctot = 0;
		sent = BUFSZ;
		if (count > cmax) {
			count = cmax;
			sent = count % BUFSZ;
		}
		wrv = write(fd, outbuf, sent);
		if (wrv < 0) {
			summary(stdout);
			sprintf(buf, "write: %s\n", tcperror[-wrv]);
			write(stderr, buf, strlen(buf));
			close(fd);
			freemem(inbuf, BUFSZ);
			freemem(outbuf, BUFSZ);
			return SYSERR;
		}

		while (cctot < sent) {
			int cc;

			cc = read(fd, &inbuf[cctot], BUFSZ-cctot);
			if (cc <= 0 || cc == SYSERR) {
				summary(stdout);
				sprintf(buf, "read: %s\n", tcperror[-cc]);
				write(stderr, buf, strlen(buf));
				close(fd);
				freemem(inbuf, BUFSZ);
				freemem(outbuf, BUFSZ);
				return SYSERR;
			}
			recd += cc;
			cctot += cc;
		}
		for (i=0; i<sent; ++i)
			if (inbuf[i] != outbuf[i])
				break;
		if (i != sent) {
			int start, finish;

			count -= sent;
			start = i-10;
			if (start < 0)
				start = 0;
			finish = i+11;
			if (finish > sent-1)
				finish = sent-1;
			inbuf[finish] = '\0';
			outbuf[finish] = '\0';
			sprintf(buf, "in %d: %s\n", count, &inbuf[start]);
			write(stdout, buf, strlen(buf));
			sprintf(buf, "out %d: %s\n", count, &outbuf[start]);
			write(stdout, buf, strlen(buf));
			summary(stdout);
			close(fd);
			freemem(inbuf, BUFSZ);
			freemem(outbuf, BUFSZ);
			return SYSERR;
		}
		if (count == cmax)
			break;
	}
	summary(stdout);
	close(fd);
	freemem(inbuf, BUFSZ);
	freemem(outbuf, BUFSZ);
	return OK;
}


summary(stdout)
{
	sprintf(buf, "%d sent, %d rec'd\n", count, recd);
	write(stdout, buf, strlen(buf));
}
@


1.1
log
@Initial revision
@
text
@d55 1
a55 1
	if (name2ip(addr, rhost) == SYSERR) {
d61 2
a62 2
	sprintf(host, "%u.%u.%u.%u:7", BYTE(addr, 0), BYTE(addr, 1),
		BYTE(addr, 2), BYTE(addr, 3));
@

⌨️ 快捷键说明

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