Blame src/resource.cc

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
}