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

📄 ftp.c

📁 tftp的示例代码,写得不错,值得一看
💻 C
📖 第 1 页 / 共 3 页
字号:
		/*		 * What we've got at this point is a string of comma		 * separated one-byte unsigned integer values.		 * The first four are the an IP address. The fifth is		 * the MSB of the port number, the sixth is the LSB.		 * From that we'll prepare a sockaddr_in.		 */		if (sscanf(pasv,"%d,%d,%d,%d,%d,%d",			   &a0, &a1, &a2, &a3, &p0, &p1) != 6) {			printf("Passive mode address scan failure. Shouldn't happen!\n");			goto bad;		}		bzero(&data_addr, sizeof(data_addr));		data_addr.sin_family = AF_INET;		a = (char *)&data_addr.sin_addr.s_addr;		a[0] = a0 & 0xff;		a[1] = a1 & 0xff;		a[2] = a2 & 0xff;		a[3] = a3 & 0xff;		p = (char *)&data_addr.sin_port;		p[0] = p0 & 0xff;		p[1] = p1 & 0xff;		if (connect(data, (struct sockaddr *)&data_addr,			    sizeof(data_addr)) < 0) {			perror("ftp: connect");			goto bad;		}#if defined(IP_TOS) && defined(IPTOS_THROUGPUT)		on = IPTOS_THROUGHPUT;		if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,			       sizeof(int)) < 0)			perror("ftp: setsockopt TOS (ignored)");#endif		return(0);	}noport:	data_addr = myctladdr;	if (sendport)		data_addr.sin_port = 0;	/* let system pick one */	if (data != -1)		close(data);	data = socket(AF_INET, SOCK_STREAM, 0);	if (data < 0) {		error (0, errno, "socket");		if (tmpno)			sendport = 1;		return (1);	}	if (!sendport)		if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {			error (0, errno, "setsockopt (reuse address)");			goto bad;		}	if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {		error (0, errno, "bind");		goto bad;	}	if (options & SO_DEBUG &&	    setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)		error (0, errno, "setsockopt (ignored)");	len = sizeof (data_addr);	if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {		error (0, errno, "getsockname");		goto bad;	}	if (listen(data, 1) < 0)		error (0, errno, "listen");	if (sendport) {		a = (char *)&data_addr.sin_addr;		p = (char *)&data_addr.sin_port;#define	UC(b)	(((int)b)&0xff)		result =		    command("PORT %d,%d,%d,%d,%d,%d",		      UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),		      UC(p[0]), UC(p[1]));		if (result == ERROR && sendport == -1) {			sendport = 0;			tmpno = 1;			goto noport;		}		return (result != COMPLETE);	}	if (tmpno)		sendport = 1;#if defined (IP_TOS) && defined (IPPROTO_IP) && defined (IPTOS_THROUGHPUT)	on = IPTOS_THROUGHPUT;	if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0)		error (0, errno, "setsockopt TOS (ignored)");#endif	return (0);bad:	close(data), data = -1;	if (tmpno)		sendport = 1;	return (1);}FILE *dataconn(lmode)	char *lmode;{	struct sockaddr_in from;	int s, fromlen = sizeof (from), tos;	if (passivemode)		return (fdopen(data, lmode));	s = accept(data, (struct sockaddr *) &from, &fromlen);	if (s < 0) {		error (0, errno, "accept");		close(data), data = -1;		return (NULL);	}	close(data);	data = s;#if defined (IP_TOS) && defined (IPPROTO_IP) && defined (IPTOS_THROUGHPUT)	tos = IPTOS_THROUGHPUT;	if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)		error (0, errno, "setsockopt TOS (ignored)");#endif	return (fdopen(data, lmode));}voidptransfer(direction, bytes, t0, t1)	char *direction;	long bytes;	struct timeval *t0, *t1;{	struct timeval td;	float s;	long bs;	if (verbose) {		tvsub(&td, t1, t0);		s = td.tv_sec + (td.tv_usec / 1000000.);#define	nz(x)	((x) == 0 ? 1 : (x))		bs = bytes / nz(s);		printf("%ld bytes %s in %.3g seconds (%ld bytes/s)\n",		    bytes, direction, s, bs);	}}/*voidtvadd(tsum, t0)	struct timeval *tsum, *t0;{	tsum->tv_sec += t0->tv_sec;	tsum->tv_usec += t0->tv_usec;	if (tsum->tv_usec > 1000000)		tsum->tv_sec++, tsum->tv_usec -= 1000000;}*/voidtvsub(tdiff, t1, t0)	struct timeval *tdiff, *t1, *t0;{	tdiff->tv_sec = t1->tv_sec - t0->tv_sec;	tdiff->tv_usec = t1->tv_usec - t0->tv_usec;	if (tdiff->tv_usec < 0)		tdiff->tv_sec--, tdiff->tv_usec += 1000000;}voidpsabort(sig)  int sig;{	abrtflag++;}voidpswitch(flag)	int flag;{	sig_t oldintr;	static struct comvars {		int connect;		char *name;		struct sockaddr_in mctl;		struct sockaddr_in hctl;		FILE *in;		FILE *out;		int tpe;		int curtpe;		int cpnd;		int sunqe;		int runqe;		int mcse;		int ntflg;		char nti[17];		char nto[17];		int mapflg;		char *mi;		char *mo;	} proxstruct = {0}, tmpstruct = {0};	struct comvars *ip, *op;	abrtflag = 0;	oldintr = signal(SIGINT, psabort);	if (flag) {		if (proxy)			return;		ip = &tmpstruct;		op = &proxstruct;		proxy++;	} else {		if (!proxy)			return;		ip = &proxstruct;		op = &tmpstruct;		proxy = 0;	}	ip->connect = connected;	connected = op->connect;	if (ip->name)		free (ip->name);	ip->name = hostname;	hostname = op->name;	op->name = 0;	ip->hctl = hisctladdr;	hisctladdr = op->hctl;	ip->mctl = myctladdr;	myctladdr = op->mctl;	ip->in = cin;	cin = op->in;	ip->out = cout;	cout = op->out;	ip->tpe = type;	type = op->tpe;	ip->curtpe = curtype;	curtype = op->curtpe;	ip->cpnd = cpend;	cpend = op->cpnd;	ip->sunqe = sunique;	sunique = op->sunqe;	ip->runqe = runique;	runique = op->runqe;	ip->mcse = mcase;	mcase = op->mcse;	ip->ntflg = ntflag;	ntflag = op->ntflg;	strncpy(ip->nti, ntin, sizeof(ntin) - 1);	(ip->nti)[strlen(ip->nti)] = '\0';	strcpy(ntin, op->nti);	strncpy(ip->nto, ntout, sizeof(ntout) - 1);	(ip->nto)[strlen(ip->nto)] = '\0';	strcpy(ntout, op->nto);	ip->mapflg = mapflag;	mapflag = op->mapflg;	if (ip->mi)		free (ip->mi);	ip->mi = mapin;	mapin = op->mi;	op->mi = 0;	if (ip->mo)		free (ip->mo);	ip->mo = mapout;	mapout = op->mo;	op->mo = 0;	signal(SIGINT, oldintr);	if (abrtflag) {		abrtflag = 0;		(*oldintr)(SIGINT);	}}voidabortpt(sig)  int sig;{	printf("\n");	fflush(stdout);	ptabflg++;	mflag = 0;	abrtflag = 0;	longjmp(ptabort, 1);}voidproxtrans(cmd, local, remote)	char *cmd, *local, *remote;{	sig_t oldintr;	int secndflag = 0, prox_type, nfnd;	char *cmd2;	fd_set mask;	if (strcmp(cmd, "RETR"))		cmd2 = "RETR";	else		cmd2 = runique ? "STOU" : "STOR";	if ((prox_type = type) == 0) {		if (unix_server && unix_proxy)			prox_type = TYPE_I;		else			prox_type = TYPE_A;	}	if (curtype != prox_type)		changetype(prox_type, 1);	if (command("PASV") != COMPLETE) {		printf("proxy server does not support third party transfers.\n");		return;	}	pswitch(0);	if (!connected) {		printf("No primary connection\n");		pswitch(1);		code = -1;		return;	}	if (curtype != prox_type)		changetype(prox_type, 1);	if (command("PORT %s", pasv) != COMPLETE) {		pswitch(1);		return;	}	if (setjmp(ptabort))		goto abort;	oldintr = signal(SIGINT, abortpt);	if (command("%s %s", cmd, remote) != PRELIM) {		signal(SIGINT, oldintr);		pswitch(1);		return;	}	sleep(2);	pswitch(1);	secndflag++;	if (command("%s %s", cmd2, local) != PRELIM)		goto abort;	ptflag++;	getreply(0);	pswitch(0);	getreply(0);	signal(SIGINT, oldintr);	pswitch(1);	ptflag = 0;	printf("local: %s remote: %s\n", local, remote);	return;abort:	signal(SIGINT, SIG_IGN);	ptflag = 0;	if (strcmp(cmd, "RETR") && !proxy)		pswitch(1);	else if (!strcmp(cmd, "RETR") && proxy)		pswitch(0);	if (!cpend && !secndflag) {  /* only here if cmd = "STOR" (proxy=1) */		if (command("%s %s", cmd2, local) != PRELIM) {			pswitch(0);			if (cpend)				abort_remote((FILE *) NULL);		}		pswitch(1);		if (ptabflg)			code = -1;		signal(SIGINT, oldintr);		return;	}	if (cpend)		abort_remote((FILE *) NULL);	pswitch(!proxy);	if (!cpend && !secndflag) {  /* only if cmd = "RETR" (proxy=1) */		if (command("%s %s", cmd2, local) != PRELIM) {			pswitch(0);			if (cpend)				abort_remote((FILE *) NULL);			pswitch(1);			if (ptabflg)				code = -1;			signal(SIGINT, oldintr);			return;		}	}	if (cpend)		abort_remote((FILE *) NULL);	pswitch(!proxy);	if (cpend) {		FD_ZERO(&mask);		FD_SET(fileno(cin), &mask);		if ((nfnd = empty(&mask, 10)) <= 0) {			if (nfnd < 0) {				error (0, errno, "abort");			}			if (ptabflg)				code = -1;			lostpeer();		}		getreply(0);		getreply(0);	}	if (proxy)		pswitch(0);	pswitch(1);	if (ptabflg)		code = -1;	signal(SIGINT, oldintr);}voidreset(argc, argv)	int argc;	char *argv[];{	fd_set mask;	int nfnd = 1;	FD_ZERO(&mask);	while (nfnd > 0) {		FD_SET(fileno(cin), &mask);		if ((nfnd = empty(&mask,0)) < 0) {			error (0, errno, "reset");			code = -1;			lostpeer();		}		else if (nfnd) {			getreply(0);		}	}}char *gunique(local)	char *local;{	static char *new = 0;	char *cp;	int d, count=0;	char ext = '1';	if (new)		free (new);	new = malloc (strlen (local) + 1 + 3 + 1); /* '.' + 100 + '\0' */	if (! new) {		printf ("gunique: malloc failed.\n");		return 0;	}	strcpy (new, local);	cp = new + strlen(new);	*cp++ = '.';	for (;;) {		struct stat st;		if (++count == 100) { 			printf("runique: can't find unique file name.\n");			return ((char *) 0);		}		*cp++ = ext;		*cp = '\0';		if (ext == '9')			ext = '0';		else			ext++;		if (stat (new, &st) != 0)		    if (errno == ENOENT)				return new;			else			  	return 0;		if (ext != '0')			cp--;		else if (*(cp - 2) == '.')			*(cp - 1) = '1';		else {			*(cp - 2) = *(cp - 2) + 1;			cp--;		}	}}voidabort_remote(din)	FILE *din;{	char buf[BUFSIZ];	int nfnd;	fd_set mask;	/*	 * send IAC in urgent mode instead of DM because 4.3BSD places oob mark	 * after urgent byte rather than before as is protocol now	 */	sprintf(buf, "%c%c%c", IAC, IP, IAC);	if (send(fileno(cout), buf, 3, MSG_OOB) != 3)		error (0, errno, "abort");	fprintf(cout,"%cABOR\r\n", DM);	fflush(cout);	FD_ZERO(&mask);	FD_SET(fileno(cin), &mask);	if (din) {		FD_SET(fileno(din), &mask);	}	if ((nfnd = empty(&mask, 10)) <= 0) {		if (nfnd < 0) {			error (0, errno, "abort");		}		if (ptabflg)			code = -1;		lostpeer();	}	if (din && FD_ISSET(fileno(din), &mask)) {		while (read(fileno(din), buf, BUFSIZ) > 0)			/* LOOP */;	}	if (getreply(0) == ERROR && code == 552) {		/* 552 needed for nic style abort */		getreply(0);	}	getreply(0);}

⌨️ 快捷键说明

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