|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2017 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include <config.h>
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include <pwd.h>
|
|
Packit |
8f70b4 |
#include <unistd.h>
|
|
Packit |
8f70b4 |
#include <stdlib.h>
|
|
Packit |
8f70b4 |
#include <sys/types.h>
|
|
Packit |
8f70b4 |
#include <sys/socket.h>
|
|
Packit |
8f70b4 |
#include <netinet/in.h>
|
|
Packit |
8f70b4 |
#include <errno.h>
|
|
Packit |
8f70b4 |
#include <stddef.h>
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "ResMgr.h"
|
|
Packit |
8f70b4 |
#include "url.h"
|
|
Packit |
8f70b4 |
#include "GetPass.h"
|
|
Packit |
8f70b4 |
#include "ascii_ctype.h"
|
|
Packit |
8f70b4 |
#include "configmake.h"
|
|
Packit |
8f70b4 |
#include "misc.h"
|
|
Packit |
8f70b4 |
#include "localcharset.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *FtpProxyValidate(xstring_c *p)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
ParsedURL url(*p);
|
|
Packit |
8f70b4 |
if(url.host==0)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
p->truncate(0);
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(url.proto)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(strcmp(url.proto,"ftp") && strcmp(url.proto,"http"))
|
|
Packit |
8f70b4 |
return _("Proxy protocol unsupported");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(url.user && !url.pass)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
url.pass.set(GetPass(_("ftp:proxy password: ")));
|
|
Packit |
8f70b4 |
p->truncate();
|
|
Packit |
8f70b4 |
url.CombineTo(*p);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *SetValidate(xstring_c& s,const char *const *set,const char *name)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
const char *const *scan;
|
|
Packit |
8f70b4 |
for(scan=set; *scan; scan++)
|
|
Packit |
8f70b4 |
if(s.eq(*scan))
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring &j=xstring::get_tmp();
|
|
Packit |
8f70b4 |
if(name)
|
|
Packit |
8f70b4 |
j.setf(_("%s must be one of: "),name);
|
|
Packit |
8f70b4 |
else
|
|
Packit |
8f70b4 |
j.set(_("must be one of: "));
|
|
Packit |
8f70b4 |
bool had_empty=false;
|
|
Packit |
8f70b4 |
for(scan=set; *scan; scan++) {
|
|
Packit |
8f70b4 |
if(!**scan) {
|
|
Packit |
8f70b4 |
had_empty=true;
|
|
Packit |
8f70b4 |
continue;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(scan>set)
|
|
Packit |
8f70b4 |
j.append(", ");
|
|
Packit |
8f70b4 |
j.append(*scan);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(had_empty)
|
|
Packit |
8f70b4 |
j.append(_(", or empty"));
|
|
Packit |
8f70b4 |
return j;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *FtpProxyAuthTypeValidate(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static const char *const valid_set[]={
|
|
Packit |
8f70b4 |
"user", "joined", "joined-acct", "open", "proxy-user@host", 0
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
return SetValidate(*s,valid_set,"ftp:proxy-auth-type");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *HttpProxyValidate(xstring_c *p)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
ParsedURL url(*p);
|
|
Packit |
8f70b4 |
if(url.host==0)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
p->truncate(0);
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(url.proto)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(strcmp(url.proto,"http")
|
|
Packit |
8f70b4 |
&& strcmp(url.proto,"https"))
|
|
Packit |
8f70b4 |
return _("Proxy protocol unsupported");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *PutOrPost(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(strcasecmp(*s,"PUT") && strcasecmp(*s,"POST"))
|
|
Packit |
8f70b4 |
return _("only PUT and POST values allowed");
|
|
Packit |
8f70b4 |
for(char *scan=s->get_non_const(); *scan; scan++)
|
|
Packit |
8f70b4 |
*scan=to_ascii_upper((unsigned char)*scan);
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *const af_list[]=
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
"inet",
|
|
Packit |
8f70b4 |
#if INET6
|
|
Packit |
8f70b4 |
"inet6",
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
0
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
static
|
|
Packit |
8f70b4 |
const char *OrderValidate(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static xstring error;
|
|
Packit |
8f70b4 |
xstring fixed;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char * const delim="\t ";
|
|
Packit |
8f70b4 |
char *s1=alloca_strdup(*s);
|
|
Packit |
8f70b4 |
for(s1=strtok(s1,delim); s1; s1=strtok(0,delim))
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
const char *const *f;
|
|
Packit |
8f70b4 |
for(f=af_list; *f; f++)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(!strcasecmp(s1,*f))
|
|
Packit |
8f70b4 |
break;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(!*f)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
error.setf(_("unknown address family `%s'"),s1);
|
|
Packit |
8f70b4 |
return error;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(fixed)
|
|
Packit |
8f70b4 |
fixed.vappend(" ",s1,NULL);
|
|
Packit |
8f70b4 |
else
|
|
Packit |
8f70b4 |
fixed.set(s1);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
s->set(fixed);
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static const char *SortByValidate(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static const char * const valid_set[]={
|
|
Packit |
8f70b4 |
"name", "name-desc", "size", "size-desc", "date", "date-desc", 0
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
return SetValidate(*s,valid_set,"mirror:order-by");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#if USE_SSL
|
|
Packit |
8f70b4 |
static
|
|
Packit |
8f70b4 |
const char *AuthArgValidate(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
for(char *i=s->get_non_const(); *i; i++)
|
|
Packit |
8f70b4 |
*i=to_ascii_upper(*i);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *const valid_set[]={
|
|
Packit |
8f70b4 |
"SSL", "TLS", "TLS-P", "TLS-C", 0
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
return SetValidate(*s,valid_set,"ftp:ssl-auth");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
static
|
|
Packit |
8f70b4 |
const char *ProtValidate(xstring_c *s)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
for(char *i=s->get_non_const(); *i; i++)
|
|
Packit |
8f70b4 |
*i=to_ascii_upper(*i);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *const valid_set[]={
|
|
Packit |
8f70b4 |
"C", "S", "E", "P", "", 0
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
return SetValidate(*s,valid_set,"ftps:initial-prot");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static ResType lftp_vars[] = {
|
|
Packit |
8f70b4 |
{"ftp:abor-max-wait", "15s", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:acct", "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:anon-pass", "lftp@", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:anon-user", "anonymous",0,0},
|
|
Packit |
8f70b4 |
{"ftp:auto-sync-mode", "", ResMgr::ERegExpValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:auto-passive-mode", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:bind-data-socket", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:catch-size", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:charset", "", ResMgr::CharsetValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:client", PACKAGE "/" VERSION,0,0},
|
|
Packit |
8f70b4 |
{"ftp:compressed-re", "\\.(bz2|[glrsx7]z|lzma|lz[hox]|[ai]ce|apk|ar[cj]|cab|cfs|dar|[je]ar|lha|isz|pak|rar|sitx?|t(gz|bz2|lz)|tar\\.(gz|xz|bz2|lzma)|war|zipx?|zoo|[arz0][0-9][0-9])$",ResMgr::ERegExpValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ftp:device-prefix", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:fix-pasv-address", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ignore-pasv-address", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:fxp-force", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:fxp-passive-source", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ftp:fxp-passive-sscn", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ftp:home", "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:site" "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:site-group", "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:lang", "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:list-empty-ok", "no", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:list-options", "", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:mode-z-level", "6", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:nop-interval", "120", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:passive-mode", "on", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:port-range", "full", ResMgr::RangeValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:port-ipv4", "", ResMgr::IPv4AddrValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:prefer-epsv", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:proxy", "", FtpProxyValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:proxy-auth-type", "user", FtpProxyAuthTypeValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:rest-list", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:rest-stor", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:timezone", "GMT", 0,0},
|
|
Packit |
8f70b4 |
{"ftp:too-many-re", "(Too many|No more) connections",ResMgr::ERegExpValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:skey-allow", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:skey-force", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:netkey-allow", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
#if USE_SSL
|
|
Packit |
8f70b4 |
{"ftp:ssl-allow", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-force", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-protect-data", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-protect-fxp", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-protect-list", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-auth", "TLS", AuthArgValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-allow-anonymous", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-use-ccc", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-shutdown-timeout", "5", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-data-use-keys", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:ssl-copy-sid", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftps:initial-prot", "", ProtValidate,0},
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
{"ftp:stat-interval", "1", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:strict-multiline", "off", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:sync-mode", "on", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:trust-feat", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-abor", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-allo", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-feat", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-fxp", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-hftp", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-mdtm", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-mdtm-overloaded", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-mlsd", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-mode-z", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-pret", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-site-chmod", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-site-idle", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-site-utime", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-site-utime2", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-size", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-stat", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-stat-for-list", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-telnet-iac", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-tvfs", "auto", ResMgr::TriBoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-ip-tos", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-utf8", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:use-quit", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:verify-address", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:verify-port", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:web-mode", "off", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:waiting-150-timeout", "5", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
#define RETRY_530 \
|
|
Packit |
8f70b4 |
"too many|overloaded|try (again |back )?later|is restricted to|"\
|
|
Packit |
8f70b4 |
"maximum number|number of connect|only.*session.*allowed|more connection|already connected|simultaneous login"
|
|
Packit |
8f70b4 |
{"ftp:retry-530", RETRY_530,ResMgr::ERegExpValidate,0},
|
|
Packit |
8f70b4 |
{"ftp:retry-530-anonymous", "Login incorrect",ResMgr::ERegExpValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:cache", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:cache-control", "", 0,0},
|
|
Packit |
8f70b4 |
{"hftp:decode", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:proxy", "", HttpProxyValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-authorization", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-head", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-mkcol", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-propfind", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-range", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-allprop", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"hftp:use-type", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:accept", "*/*", 0,0},
|
|
Packit |
8f70b4 |
{"http:accept-language", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:accept-charset", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:accept-encoding", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:authorization", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:cache", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:cache-control", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:decode", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:proxy", "", HttpProxyValidate,0},
|
|
Packit |
8f70b4 |
{"http:use-mkcol", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:use-propfind", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:use-range", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:use-allprop", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"http:user-agent", PACKAGE "/" VERSION,0,0},
|
|
Packit |
8f70b4 |
{"http:cookie", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:set-cookies", "no", 0,0},
|
|
Packit |
8f70b4 |
{"http:post-content-type", "application/x-www-form-urlencoded",0,0},
|
|
Packit |
8f70b4 |
{"http:put-method", "PUT", PutOrPost,0},
|
|
Packit |
8f70b4 |
{"http:put-content-type", "", 0,0},
|
|
Packit |
8f70b4 |
{"http:referer", "", 0,0},
|
|
Packit |
8f70b4 |
#if USE_SSL
|
|
Packit |
8f70b4 |
{"https:proxy", "", HttpProxyValidate,0},
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
{"net:idle", "3m", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"net:limit-max", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:limit-rate", "0:0", ResMgr::UNumberPairValidate,0},
|
|
Packit |
8f70b4 |
{"net:limit-total-max", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:limit-total-rate", "0:0", ResMgr::UNumberPairValidate,0},
|
|
Packit |
8f70b4 |
{"net:max-retries", "1000", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:persist-retries", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:no-proxy", "", 0,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"net:reconnect-interval-base","30", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:reconnect-interval-multiplier","1.5",ResMgr::FloatValidate,0},
|
|
Packit |
8f70b4 |
{"net:reconnect-interval-max","600", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:socket-buffer", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:socket-maxseg", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:socket-bind-ipv4", "", ResMgr::IPv4AddrValidate,0},
|
|
Packit |
8f70b4 |
#if INET6
|
|
Packit |
8f70b4 |
{"net:socket-bind-ipv6", "", ResMgr::IPv6AddrValidate,0},
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
{"net:timeout", "5m", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"net:connection-limit", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"net:connection-limit-timer","5m", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"net:connection-takeover", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"mirror:sort-by", "name", SortByValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:order", "*.sfv *.sig *.md5* *.sum * */", 0,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:parallel-directories", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:parallel-transfer-count", "0",ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"mirror:exclude-regex", "(^|/)(\\.in\\.|\\.nfs)",ResMgr::ERegExpValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:include-regex", "", ResMgr::ERegExpValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:use-pget-n", "0", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"mirror:set-permissions", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:dereference", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:skip-noaccess", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:no-empty-dirs", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:require-source", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"mirror:overwrite", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"sftp:auto-confirm", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:max-packets-in-flight","16", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:protocol-version", "6", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:size-read", "32k", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:size-write", "32k", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:connect-program", "ssh -a -x",0,0},
|
|
Packit |
8f70b4 |
{"sftp:server-program", "sftp", 0,0},
|
|
Packit |
8f70b4 |
{"sftp:charset", "", ResMgr::CharsetValidate,0},
|
|
Packit |
8f70b4 |
{"sftp:use-full-path", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"file:charset", "", ResMgr::CharsetValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"file:use-lock", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"file:use-fallocate", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"dns:cache-enable", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"dns:cache-expire", "1h", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"dns:cache-size", "256", ResMgr::UNumberValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"dns:fatal-timeout", "7d", ResMgr::TimeIntervalValidate,0},
|
|
Packit |
8f70b4 |
{"dns:max-retries", "1000", ResMgr::UNumberValidate,0},
|
|
Packit |
8f70b4 |
{"dns:name", "", 0,ResMgr::HasClosure},
|
|
Packit |
8f70b4 |
#if INET6
|
|
Packit |
8f70b4 |
# define DEFAULT_ORDER "inet6 inet"
|
|
Packit |
8f70b4 |
#else
|
|
Packit |
8f70b4 |
# define DEFAULT_ORDER "inet"
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
{"dns:order", DEFAULT_ORDER, OrderValidate,0},
|
|
Packit |
8f70b4 |
{"dns:SRV-query", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"dns:use-fork", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
#ifdef DNSSEC_LOCAL_VALIDATION
|
|
Packit |
8f70b4 |
{"dns:strict-dnssec", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"fish:auto-confirm", "no", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"fish:shell", "/bin/sh",0,0},
|
|
Packit |
8f70b4 |
{"fish:connect-program", "ssh -a -x",0,0},
|
|
Packit |
8f70b4 |
{"fish:charset", "", ResMgr::CharsetValidate,0},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"color:dir-colors", "", 0,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
{"xfer:destination-directory","", 0,0},
|
|
Packit |
8f70b4 |
{"xfer:verify", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:verify-command", "", ResMgr::FileExecutable,0},
|
|
Packit |
8f70b4 |
{"xfer:auto-rename", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:max-log-size", "1M", ResMgr::UNumberValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:use-temp-file", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:temp-file-name", ".in.*", 0,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:timeout", "1d", ResMgr::TimeIntervalValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:clobber", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:make-backup", "yes", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:keep-backup", "no", ResMgr::BoolValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:backup-suffix", "~%Y%m%d%H%M%S~",0,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"xfer:parallel", "1", ResMgr::UNumberValidate,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
// deprecated settings
|
|
Packit |
8f70b4 |
{"xfer:log", "log:enabled/xfer", 0,ResMgr::AliasValidate},
|
|
Packit |
8f70b4 |
{"xfer:log-file", "log:file/xfer", 0,ResMgr::AliasValidate},
|
|
Packit |
8f70b4 |
{"xfer:max-log-size", "log:max-size/xfer", 0,ResMgr::AliasValidate},
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#if USE_SSL
|
|
Packit |
8f70b4 |
{"ssl:ca-file", "", ResMgr::FileReadable,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ssl:crl-file", "", ResMgr::FileReadable,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ssl:key-file", "", ResMgr::FileReadable,0},
|
|
Packit |
8f70b4 |
{"ssl:cert-file", "", ResMgr::FileReadable,0},
|
|
Packit |
8f70b4 |
{"ssl:check-hostname", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ssl:verify-certificate", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ssl:use-sni", "yes", ResMgr::BoolValidate,0},
|
|
Packit |
8f70b4 |
{"ssl:priority", "", 0,0},
|
|
Packit |
8f70b4 |
# if USE_OPENSSL
|
|
Packit |
8f70b4 |
{"ssl:ca-path", "", ResMgr::DirReadable,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
{"ssl:crl-path", "", ResMgr::DirReadable,ResMgr::NoClosure},
|
|
Packit |
8f70b4 |
# endif
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
{0}
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
static ResDecls lftp_vars_register(lftp_vars);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifdef HAVE_LANGINFO_H
|
|
Packit |
8f70b4 |
# include <langinfo.h>
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool ResType::class_inited;
|
|
Packit |
8f70b4 |
void ResType::ClassInit()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(class_inited)
|
|
Packit |
8f70b4 |
return;
|
|
Packit |
8f70b4 |
class_inited=true;
|
|
Packit |
8f70b4 |
for(ResType *scan=types_by_name->each_begin(); scan; scan=types_by_name->each_next())
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(scan->defvalue && scan->val_valid)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
xstring_c dv(scan->defvalue);
|
|
Packit |
8f70b4 |
const char *error=(*scan->val_valid)(&dv;;
|
|
Packit |
8f70b4 |
if(error)
|
|
Packit |
8f70b4 |
fprintf(stderr,"Default value for %s is invalid: %s\n",scan->name,error);
|
|
Packit |
8f70b4 |
else if(strcmp(dv,scan->defvalue))
|
|
Packit |
8f70b4 |
fprintf(stderr,"Default value for %s (%s) is not in canonic form: %s\n",scan->name,scan->defvalue,dv.get());
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
// inherit http proxy from environment
|
|
Packit |
8f70b4 |
const char *http_proxy=getenv("http_proxy");
|
|
Packit |
8f70b4 |
if(http_proxy)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
Set("http:proxy",0,http_proxy);
|
|
Packit |
8f70b4 |
Set("hftp:proxy",0,http_proxy);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#if USE_SSL
|
|
Packit |
8f70b4 |
const char *https_proxy=getenv("https_proxy");
|
|
Packit |
8f70b4 |
if(https_proxy)
|
|
Packit |
8f70b4 |
Set("https:proxy",0,https_proxy);
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *ftp_proxy=getenv("ftp_proxy");
|
|
Packit |
8f70b4 |
if(ftp_proxy)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(!strncmp(ftp_proxy,"ftp://",6))
|
|
Packit |
8f70b4 |
Set("ftp:proxy",0,ftp_proxy);
|
|
Packit |
8f70b4 |
else if(!strncmp(ftp_proxy,"http://",7))
|
|
Packit |
8f70b4 |
Set("hftp:proxy",0,ftp_proxy);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *no_proxy=getenv("no_proxy");
|
|
Packit |
8f70b4 |
if(no_proxy)
|
|
Packit |
8f70b4 |
Set("net:no-proxy",0,no_proxy);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#if INET6
|
|
Packit |
8f70b4 |
// check if ipv6 is really supported
|
|
Packit |
8f70b4 |
int s=socket(AF_INET6,SOCK_STREAM,IPPROTO_TCP);
|
|
Packit |
8f70b4 |
if(s==-1 && (errno==EINVAL
|
|
Packit |
8f70b4 |
#ifdef EAFNOSUPPORT
|
|
Packit |
8f70b4 |
|| errno==EAFNOSUPPORT
|
|
Packit |
8f70b4 |
#endif
|
|
Packit |
8f70b4 |
))
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
Set("dns:order",0,"inet");
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
if(s!=-1)
|
|
Packit |
8f70b4 |
close(s);
|
|
Packit |
8f70b4 |
#endif // INET6
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *module_path=getenv("LFTP_MODULE_PATH");
|
|
Packit |
8f70b4 |
if(module_path)
|
|
Packit |
8f70b4 |
Set("module:path",0,module_path);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *dir_colors=getenv("LS_COLORS");
|
|
Packit |
8f70b4 |
if(!dir_colors)
|
|
Packit |
8f70b4 |
dir_colors=getenv("ZLS_COLORS"); /* zsh */
|
|
Packit |
8f70b4 |
if(dir_colors)
|
|
Packit |
8f70b4 |
Set("color:dir-colors",0,dir_colors);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *cs=locale_charset();
|
|
Packit |
8f70b4 |
if(cs && cs[0])
|
|
Packit |
8f70b4 |
Set("file:charset",0,cs);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *time_style=getenv("TIME_STYLE");
|
|
Packit |
8f70b4 |
if(time_style && *time_style)
|
|
Packit |
8f70b4 |
Set("cmd:time-style",0,time_style);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
SetDefault("xfer:verify-command",0,PKGDATADIR"/verify-file");
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *ctx="xfer";
|
|
Packit |
8f70b4 |
SetDefault("log:enabled",ctx,"yes");
|
|
Packit |
8f70b4 |
SetDefault("log:show-time",ctx,"yes");
|
|
Packit |
8f70b4 |
SetDefault("log:file",ctx,dir_file(get_lftp_data_dir(),"transfer_log"));
|
|
Packit |
8f70b4 |
}
|