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

📄 main.c

📁 proxy源代码,linux下的ftp 代理的源代码,大家多多支持啊
💻 C
字号:
/*    File: ftpproxy/main.c    Copyright (C) 1999, 2000  Wolfgang Zekoll  <wzk@quietsche-entchen.de>    Copyright (C) 2000, 2003  Andreas Schoenberg  <asg@ftpproxy.org>      This software is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.      This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.      You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdarg.h>#include <signal.h>#include <sys/wait.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/fcntl.h>#include <sys/socket.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#include <syslog.h>#include <sys/time.h>#include "ftp.h"#include "ip-lib.h"#include "lib.h"#if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__)#define LOGFACILITY	LOG_FTP#else#define LOGFACILITY	LOG_DAEMON#endifchar	*program =		"";char	progname[80] =		"";int	debug =			0;int	extralog =		0;int	bindport =		0;int	daemonmode =		0;int	showconfig =		0;extern int acceptloop(int sock);void missing_arg(int c, char *string){	fprintf (stderr, "%s: missing arg: -%c, %s\n", program, c, string);	exit (-1);}int main(int argc, char *argv[], char *envp[]){	int	c, i, k;	char	*p, option[80];	config_t *config;		if ((p = strrchr(argv[0], '/')) == NULL)		program = argv[0];	else {		copy_string(progname, &p[1], sizeof(progname));		program = progname;		}	config = allocate(sizeof(config_t));	config->timeout = 15 * 60;        config->allow_passwdblanks = 0;	config->allow_anyremote = 0;	strcpy(config->varname, "PROXY_");	openlog(program, LOG_PID, LOGFACILITY);	k = 1;	while (k < argc  &&  argv[k][0] == '-'  &&  argv[k][1] != 0) {		copy_string(option, argv[k++], sizeof(option));		for (i=1; (c = option[i]) != 0; i++) {			if (c == 'd') {				if (debug == 1)					debug = 2;				else					debug = 1;				}			else if (c == 'a') {				if (k >= argc)					missing_arg(c, "access control program");				copy_string(config->acp, argv[k++], sizeof(config->acp));				}			else if (c == 'B')				config->allow_passwdblanks = 1;			else if (c == 'b')				config->allow_blanks = 1;			else if (c == 'c') {				if (k >= argc)					missing_arg(c, "command control program");				copy_string(config->ccp, argv[k++], sizeof(config->ccp));				}			else if (c == 'e')				config->selectserver = 1;			else if (c == 'f'  ||  c == 'F') {				if (k >= argc)					missing_arg(c, "configuration file");				if (c == 'F')					showconfig = 1;				copy_string(config->configfile, argv[k++], sizeof(config->configfile));				}			else if (c == 'l')				extralog = 1;			else if (c == 'm')				config->monitor = 1;			else if (c == 'n')				config->numeric_only = 1;			else if (c == 'p') {				if (k >= argc)					missing_arg(c, "data port");				config->dataport = strtoul(argv[k++], NULL, 10);				if (config->dataport == 0)					config->dataport = 20;				}			else if (c == 'q') {				/*				 * Specify source interface for outgoing				 * connections -- 26JAN04asg				 */				if (k >= argc)					missing_arg(c, "source interface");				copy_string(config->sourceip, argv[k++], sizeof(config->sourceip));				}			else if (c == 's') {				if (k >= argc)					missing_arg(c, "server list");				config->serverlist = argv[k++];				}			else if (c == 't') {				if (k >= argc)					missing_arg(c, "timeout");				config->timeout = atoi(argv[k++]);				if (config->timeout < 1)					config->timeout = 60;				}			else if (c == 'u')				config->use_last_at = 1;			else if (c == 'v') {				if (k >= argc)					missing_arg(c, "varname prefix");				copy_string(config->varname, argv[k++], sizeof(config->varname));				}                        else if (c == 'x') {                                if (k >= argc)                                        missing_arg(c, "dynamic configuration program");                                copy_string(config->ctp, argv[k++], sizeof(config->ctp));                                }			else if (c == 'X') {				if (k >= argc)					missing_arg(c, "xferlog file");				copy_string(config->xferlog, argv[k++], sizeof(config->xferlog));				}			else if (c == 'y') {								/*				 * To make 'bad multihomed servers' happy and				 * to allow server-server transfers through the				 * proxy -- 31JAN02asg				 */				config->allow_anyremote = 1;				} 			else if (c == 'z') {				if (k >= argc)					missing_arg(c, "buffer size");				config->bsize = atoi(argv[k++]);				}			else if (c == 'V') { 				printf("ftp.proxy version: %s asg@ftpproxy.org\n", VERSION); 				exit (0); 				}				else if (c == 'D') {				if (k >= argc)					missing_arg(c, "port number");				bindport = strtoul(argv[k++], NULL, 10);				daemonmode = 1;				}			else {				fprintf (stderr, "%s: unknown option: -%c\n", program, c);				exit (-1);				}			}		}	/*	 * Print configuration if requested and exit	 */	if (showconfig != 0) {		int	havesection = 0;		char	*interface = "";		readconfig(config, config->configfile, "");		if (k < argc) {			interface = argv[k++];			havesection = readconfig(config, config->configfile, interface);			}		if (*interface == 0)			printf ("interface: global\n");		else {			printf ("interface: %s\n", interface);			printf ("status: %s\n", (havesection != 0)? "configured": "unconfigured");			}		printconfig(config);		exit (0);		}	/*	 * Normal processing starts here.	 */	if (config->selectserver == 0) {		/*		 * Fixed proxy server together with CTP doesn't make		 * much sense -- 040303asg		 */		if (*config->ctp != 0) {			p = argv[k++];/*			syslog(LOG_NOTICE, "configured to use ctp, ignoring server argument: %s", p); */			fprintf (stderr, "%s: configured to use ctp, ignoring server argument: %s", program, p);			}		else {			if (k >= argc) {				fprintf (stderr, "usage: %s [<options>] <server>\n", program);				exit (1);				}			copy_string(config->server, argv[k++], sizeof(config->server));			}		}	if (k < argc) {		fprintf (stderr, "%s: extra arguments on command line: %s ...\n", program, argv[k]);		exit (1);		}	if (*config->configfile != 0) {		syslog(LOG_NOTICE, "configured to use config file. %s", p);		readconfig(config, config->configfile, "");		}	if (daemonmode != 0) {		signal(SIGCHLD, SIG_IGN);		config->standalone = 1;		if (bindport > 0) {			int     sock;			sock = bind_to_port("", bindport);			acceptloop(sock);			}		signal(SIGCHLD, SIG_DFL);		}		proxy_request(config);	exit (0);}

⌨️ 快捷键说明

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