Hello community, here is the log from the commit of package bareftp for openSUSE:Factory checked in at 2016-02-16 09:18:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/bareftp (Old) and /work/SRC/openSUSE:Factory/.bareftp.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bareftp" Changes: -------- --- /work/SRC/openSUSE:Factory/bareftp/bareftp.changes 2015-05-20 23:54:02.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.bareftp.new/bareftp.changes 2016-02-16 09:18:53.000000000 +0100 @@ -1,0 +2,14 @@ +Sat Jan 30 12:55:11 UTC 2016 - [email protected] + +- Update to version 0.3.11: + + Build script fixes. +- Enable GNOME keyring support: + + Remove --with-keyring=no configure parameter + (gnome-keyring-sharp was already set as a depency). +- Remove bareftp-dotnet4.patch: included upstream. +- Remove libtool BuildRequires: we don't patch the build system + anymore. +- Add bareftp-buildfix.patch: fix compilation errors. +- Add desktop and icon theme macros. + +------------------------------------------------------------------- Old: ---- bareftp-0.3.10.tar.gz bareftp-dotnet4.patch New: ---- bareftp-0.3.11.tar.gz bareftp-buildfix.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ bareftp.spec ++++++ --- /var/tmp/diff_new_pack.qiBCCD/_old 2016-02-16 09:18:53.000000000 +0100 +++ /var/tmp/diff_new_pack.qiBCCD/_new 2016-02-16 09:18:53.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package bareftp # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2011 Packman project # # All modifications and additions to the file contributed by third parties @@ -18,43 +18,40 @@ Name: bareftp -Version: 0.3.10 +Version: 0.3.11 Release: 0 Summary: A file transfer client for FTP/FTPS/SFTP License: GPL-2.0 Group: Productivity/Networking/Ftp/Clients Url: http://www.bareftp.org/ -Source0: http://www.bareftp.org/release/%{name}-%{version}.tar.gz -# PATCH-FIX-OPENSUSE- bareftp-dotnet4.patch [email protected] -- Build for .Net 4.0 target. Upstream is 'dead' (busy porting to python). -Patch0: bareftp-dotnet4.patch -Requires: gconf-sharp2 -Requires: gnome-keyring-sharp -Requires: gtk-sharp2 -Requires: mono-core - -BuildRoot: %{_tmppath}/%{name}-%{version}-build - +Source: http://www.bareftp.org/release/%{name}-%{version}.tar.gz +# PATCH-FIX-UPSTREAM bareftp-buildfix.patch [email protected] -- Fix obvious typos which cause compilation errors +Patch0: bareftp-buildfix.patch BuildRequires: gconf-sharp2 BuildRequires: glib2-devel BuildRequires: gnome-keyring-sharp-devel BuildRequires: gnome-sharp2 BuildRequires: gnome-vfs-sharp2 BuildRequires: gtk-sharp2 +BuildRequires: hicolor-icon-theme BuildRequires: intltool -# Needed for patch0 -BuildRequires: libtool BuildRequires: mono-data BuildRequires: mono-devel BuildRequires: mono-web BuildRequires: perl-XML-Parser BuildRequires: pkgconfig BuildRequires: update-desktop-files +BuildRoot: %{_tmppath}/%{name}-%{version}-build +Requires: gconf-sharp2 +Requires: gnome-keyring-sharp +Requires: gtk-sharp2 +Requires: mono-core %description bareFTP is a file transfer client supporting the FTP, FTP over SSL/TLS (FTPS) and SSH File Transfer Protocol (SFTP). It is written in C#, targeting the Mono framework and the GNOME desktop environment. bareFTP is released under -the terms of the GPL license. +the terms of the GPL. %prep @@ -62,9 +59,7 @@ %patch0 -p1 %build -# Needed for patch0 -autoreconf -fiv -I m4/shamrock -%configure --with-keyring=no --disable-static +%configure --disable-static %__make %{?jobs:-j%{jobs}} %install @@ -74,6 +69,14 @@ %suse_update_desktop_file %{name} Network FileTransfer %find_lang %{name} +%post +%desktop_database_post +%icon_theme_cache_post + +%postun +%desktop_database_postun +%icon_theme_cache_postun + %files -f %{name}.lang %defattr(-,root,root,-) %doc COPYING README ChangeLog AUTHORS ++++++ bareftp-0.3.10.tar.gz -> bareftp-0.3.11.tar.gz ++++++ ++++ 4710 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/INSTALL new/bareftp-0.3.11/INSTALL --- old/bareftp-0.3.10/INSTALL 2013-03-23 19:40:57.000000000 +0100 +++ new/bareftp-0.3.11/INSTALL 2014-08-26 01:03:47.000000000 +0200 @@ -1,7 +1,7 @@ Installation Instructions ************************* -Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation, +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, @@ -12,8 +12,8 @@ Basic Installation ================== - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/Makefile.am new/bareftp-0.3.11/Makefile.am --- old/bareftp-0.3.10/Makefile.am 2013-01-17 00:05:22.000000000 +0100 +++ new/bareftp-0.3.11/Makefile.am 2013-05-15 19:12:51.000000000 +0200 @@ -11,11 +11,11 @@ intltool-update.in SUBDIRS = \ - data \ - lib\ - src \ - m4 \ - po + data \ + lib\ + src \ + m4 \ + po #REWRITE = \ # sed -e "s|\@prefix\@|$(prefix)|g" \ @@ -24,13 +24,13 @@ # -e "s|\@MONO\@|$(MONO)|g" DISTCLEANFILES = \ - *.bak \ - *~ \ - *.pidb \ - intltool-extract \ - intltool-merge \ - intltool-update \ - po/.intltool-merge-cache + *.bak \ + *~ \ + *.pidb \ + intltool-extract \ + intltool-merge \ + intltool-update \ + po/.intltool-merge-cache MAINTAINERCLEANFILES = \ compile \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/compile new/bareftp-0.3.11/compile --- old/bareftp-0.3.10/compile 1970-01-01 01:00:00.000000000 +0100 +++ new/bareftp-0.3.11/compile 2014-08-26 01:03:47.000000000 +0200 @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Written by Tom Tromey <[email protected]>. +# +# This program 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, 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, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <[email protected]> or send patches to +# <[email protected]>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <[email protected]>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/configure.ac new/bareftp-0.3.11/configure.ac --- old/bareftp-0.3.10/configure.ac 2013-03-23 19:09:25.000000000 +0100 +++ new/bareftp-0.3.11/configure.ac 2013-10-18 16:36:41.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([bareftp], [0.3.10]) +AC_INIT([bareftp], [0.3.11]) AC_CANONICAL_SYSTEM AC_PREREQ(2.69) @@ -58,8 +58,8 @@ dnl Check Mono dnl SHAMROCK_CHECK_MONO_MODULE(1.1.10) -SHAMROCK_FIND_MONO_2_0_COMPILER SHAMROCK_FIND_MONO_RUNTIME +SHAMROCK_FIND_MONO_2_0_COMPILER_OR_HIGHER dnl Check for assemblies SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES([ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/m4/shamrock/mono.m4 new/bareftp-0.3.11/m4/shamrock/mono.m4 --- old/bareftp-0.3.10/m4/shamrock/mono.m4 2013-01-17 00:05:22.000000000 +0100 +++ new/bareftp-0.3.11/m4/shamrock/mono.m4 2014-08-26 01:01:33.000000000 +0200 @@ -8,6 +8,21 @@ SHAMROCK_FIND_PROGRAM_OR_BAIL(MCS, gmcs) ]) +AC_DEFUN([SHAMROCK_FIND_MONO_2_0_COMPILER_OR_HIGHER], +[ + if pkg-config --atleast-version=2.8 mono; then + SHAMROCK_FIND_PROGRAM(MCS, dmcs) + fi + + if test "x$MCS" = "x" ; then + SHAMROCK_FIND_PROGRAM(MCS, gmcs) + fi + + if test "x$MCS" = "x" ; then + AC_MSG_ERROR([You need to install 'dmcs' or 'gmcs']) + fi +]) + AC_DEFUN([SHAMROCK_FIND_MONO_RUNTIME], [ SHAMROCK_FIND_PROGRAM_OR_BAIL(MONO, mono) @@ -18,6 +33,13 @@ PKG_CHECK_MODULES(MONO_MODULE, mono >= $1) ]) +AC_DEFUN([SHAMROCK_CHECK_MONO_MODULE_NOBAIL], +[ + PKG_CHECK_MODULES(MONO_MODULE, mono >= $1, + HAVE_MONO_MODULE=yes, HAVE_MONO_MODULE=no) + AC_SUBST(HAVE_MONO_MODULE) +]) + AC_DEFUN([_SHAMROCK_CHECK_MONO_GAC_ASSEMBLIES], [ for asm in $(echo "$*" | cut -d, -f2- | sed 's/\,/ /g') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/missing new/bareftp-0.3.11/missing --- old/bareftp-0.3.10/missing 2013-03-23 19:40:57.000000000 +0100 +++ new/bareftp-0.3.11/missing 2014-08-26 01:03:47.000000000 +0200 @@ -1,7 +1,7 @@ #! /bin/sh # Common wrapper for a few potentially missing GNU programs. -scriptversion=2012-06-26.16; # UTC +scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard <[email protected]>, 1996. @@ -160,7 +160,7 @@ ;; autom4te*) echo "You might have modified some maintainer files that require" - echo "the 'automa4te' program to be rebuilt." + echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/src/bareFTP/AssemblyInfo.cs new/bareftp-0.3.11/src/bareFTP/AssemblyInfo.cs --- old/bareftp-0.3.10/src/bareFTP/AssemblyInfo.cs 2013-03-23 19:41:04.000000000 +0100 +++ new/bareftp-0.3.11/src/bareFTP/AssemblyInfo.cs 2014-08-26 01:03:54.000000000 +0200 @@ -2,7 +2,7 @@ using System.Reflection; using System.Runtime.CompilerServices; -[assembly: AssemblyVersion ("0.3.10")] +[assembly: AssemblyVersion ("0.3.11")] [assembly: AssemblyTitle ("bareFTP")] [assembly: AssemblyDescription ("bareFTP File Transfer Client")] [assembly: AssemblyCopyright ("Copyright (C) 2006-2010 Christian Eide")] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/FTPClient.cs new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/FTPClient.cs --- old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/FTPClient.cs 2013-01-17 00:05:22.000000000 +0100 +++ new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/FTPClient.cs 2013-12-15 21:28:13.000000000 +0100 @@ -30,9 +30,9 @@ namespace bareFTP.Protocol.Ftp { public class FTPClient - { - internal const string EOL = "\r\n"; - private static int DATA_PORT_RANGE_FROM = 1500; + { + internal const string EOL = "\r\n"; + private static int DATA_PORT_RANGE_FROM = 1500; private static int DATA_PORT_RANGE_TO = 65000; private static int BLOCK_SIZE = 512; private List<string> features; @@ -82,7 +82,7 @@ { tcpClient.Connect(bareFTP.Protocol.HostResolver.GetAddress(remoteHost), remotePort); Stream stream = tcpClient.GetStream(); - + writer = new StreamWriter(stream, System.Text.Encoding.ASCII); reader = new StreamReader(stream, System.Text.Encoding.ASCII); @@ -134,7 +134,7 @@ throw new Exception(string.Format("Certificate Error ({0})", ex.Message)); } - writer = new StreamWriter(sslstream, GetEncoding()); + writer = new StreamWriter(sslstream, GetEncoding()); reader = new StreamReader(sslstream, GetEncoding()); CheckReply(SendCommand("PBSZ 0"), 200); @@ -162,7 +162,7 @@ SetTransferType(Ftp.FTPFileTransferType.Binary); } - public bool CertificateValidation (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + public bool CertificateValidation (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if(sslPolicyErrors == SslPolicyErrors.None) { @@ -179,7 +179,7 @@ } else return true; - } + } } public void Close() @@ -227,7 +227,7 @@ public List<FTPReply> SendCommand(string command) { - Byte[] cmdBytes = GetEncoding().GetBytes((command+EOL).ToCharArray()); + Byte[] cmdBytes = GetEncoding().GetBytes((command+EOL).ToCharArray()); OnLogTextEmitted(new LogTextEmittedArgs(-1, command)); try { @@ -375,25 +375,25 @@ file.Status = bareFTP.Protocol.DownloadStatus.Downloading; - Stream networkStream = dsocket.GetStream(); - Byte[] buffer = new Byte[BLOCK_SIZE]; - int bytes = 0; - + Stream networkStream = dsocket.GetStream(); + Byte[] buffer = new Byte[BLOCK_SIZE]; + int bytes = 0; + read = true; - - while(read) - { + + while(read) + { bytes = (int)networkStream.Read(buffer, 0, buffer.Length); fstream.Write(buffer, 0, bytes); file.TransferedBytes += (long)bytes; - - if(bytes == 0) - read = false; + + if(bytes == 0) + read = false; } - + if(abort) { - networkStream.Close(); + networkStream.Close(); dsocket.Close(); file.Status = bareFTP.Protocol.DownloadStatus.Aborted; abort = false; @@ -402,7 +402,7 @@ else { file.Status = bareFTP.Protocol.DownloadStatus.Finished; - networkStream.Close(); + networkStream.Close(); dsocket.Close(); CheckReply(GetReply(), 226); } @@ -440,21 +440,21 @@ else CheckReply(SendCommand(string.Format("STOR {0}", file.Path.FileNameRemoteAbs)), 125, 150); - Stream networkStream = dsocket.GetStream(); - - Byte[] buffer = new Byte[BLOCK_SIZE]; - int bytes = 0; + Stream networkStream = dsocket.GetStream(); + + Byte[] buffer = new Byte[BLOCK_SIZE]; + int bytes = 0; file.Status = bareFTP.Protocol.DownloadStatus.Uploading; - - while(file.TransferedBytes < fslength && file.Status != DownloadStatus.Aborted && !abort) - { - bytes = (int)fstream.Read(buffer, 0, BLOCK_SIZE); + + while(file.TransferedBytes < fslength && file.Status != DownloadStatus.Aborted && !abort) + { + bytes = (int)fstream.Read(buffer, 0, BLOCK_SIZE); networkStream.Write(buffer, 0, bytes); - file.TransferedBytes += (long)bytes; + file.TransferedBytes += (long)bytes; } - networkStream.Close(); + networkStream.Close(); dsocket.Close(); if(abort) @@ -509,61 +509,61 @@ while (line != null && line.Length == 0) { - System.Threading.Thread.Sleep(100); - line = reader.ReadLine(); - } - if (line == null) - throw new SystemException("Unexpected null reply received"); - - if (line.Length < 3) - throw new SystemException("Short reply received"); + System.Threading.Thread.Sleep(100); + line = reader.ReadLine(); + } + if (line == null) + throw new SystemException("Unexpected null reply received"); + + if (line.Length < 3) + throw new SystemException("Short reply received"); string replyCode = line.Substring(0, 3); - + string reply = ""; - - if (line.Length > 4) - reply = line.Substring(4); - - // check for multiline response and build up - // the reply - if (line[3] == '-') - { + + if (line.Length > 4) + reply = line.Substring(4); + + // check for multiline response and build up + // the reply + if (line[3] == '-') + { bool complete = false; - //reply += Environment.NewLine; - while (!complete && line != null) - { - line = reader.ReadLine(); - if (line == null) - throw new SystemException("Unexpected null reply received"); + //reply += Environment.NewLine; + while (!complete && line != null) + { + line = reader.ReadLine(); + if (line == null) + throw new SystemException("Unexpected null reply received"); - if (line.Length == 0) - continue; + if (line.Length == 0) + continue; if(line.Length > 3) - { - if (line.Substring(0,3) == replyCode && line[3] == ' ') + { + if (line.Substring(0,3) == replyCode && line[3] == ' ') { complete = true; reply += "\r\n" + line.Substring(4); //replies.Add(new FTPReply(Convert.ToInt32(tmpreplyCode), tmpreply)); } else - reply += "\r\n" + line; + reply += "\r\n" + line; } - else - reply += "\r\n" + line;// + Environment.NewLine; - } + else + reply += "\r\n" + line;// + Environment.NewLine; + } } - replies.Add(new FTPReply(Convert.ToInt32(replyCode), reply)); + replies.Add(new FTPReply(Convert.ToInt32(replyCode), reply)); return replies; } catch(Exception ex) { throw ex; - } + } } public void Delete(string filename) @@ -592,11 +592,11 @@ CheckReply(SendCommand(string.Format("SITE CHMOD {0} {1}", mode, filename)), silent, 200); } - public void RenameFile(string fromRemoteFileName, string toRemoteFileName) - { + public void RenameFile(string fromRemoteFileName, string toRemoteFileName) + { CheckReply(SendCommand(string.Format("RNFR {0}", fromRemoteFileName)), 350); - CheckReply(SendCommand(string.Format("RNTO {0}", toRemoteFileName)), 250); + CheckReply(SendCommand(string.Format("RNTO {0}", toRemoteFileName)), 250); } internal List<string> ReadLines(Stream stream) @@ -609,31 +609,31 @@ using(StreamReader input = new StreamReader(stream, GetEncoding())) { - + string line = null; - while ((line = ReadLine(input)) != null) - lines.Add(line); - + while ((line = ReadLine(input)) != null) + lines.Add(line); + input.Close(); } return lines; } - internal virtual string ReadLine(TextReader input) + internal virtual string ReadLine(TextReader input) { return input.ReadLine(); } - internal DataSocket CreateDataSocket() - { + internal DataSocket CreateDataSocket() + { string hostIP = string.Empty; int port = 0; if(ftpMode == FTPMode.Passive) - { - List<FTPReply> replies = CheckReply(SendCommand("PASV"), 227); + { + List<FTPReply> replies = CheckReply(SendCommand("PASV"), 227); FTPReply replyObj = null; foreach(FTPReply repObj in replies) @@ -644,28 +644,28 @@ // If we have null here then throw exeption if(replyObj == null) throw new Exception("Did not receive proper response to PASV command"); - - string reply = replyObj.Message; - - Regex regEx = new Regex(@"(?<a0>\d{1,3}),(?<a1>\d{1,3}),(?<a2>\d{1,3}),(?<a3>\d{1,3}),(?<p0>\d{1,3}),(?<p1>\d{1,3})"); - Match m1 = regEx.Match(reply); - - string ipAddress = m1.Groups["a0"].Value + "." + m1.Groups["a1"].Value + "." + m1.Groups["a2"].Value + "." + m1.Groups["a3"].Value; - - int[] portParts = new int[2]; - portParts[0] = Int32.Parse(m1.Groups["p0"].Value); - portParts[1] = Int32.Parse(m1.Groups["p1"].Value); - port = (portParts[0] << 8) + portParts[1]; - - hostIP = ipAddress; + + string reply = replyObj.Message; + + Regex regEx = new Regex(@"(?<a0>\d{1,3}),(?<a1>\d{1,3}),(?<a2>\d{1,3}),(?<a3>\d{1,3}),(?<p0>\d{1,3}),(?<p1>\d{1,3})"); + Match m1 = regEx.Match(reply); + + string ipAddress = m1.Groups["a0"].Value + "." + m1.Groups["a1"].Value + "." + m1.Groups["a2"].Value + "." + m1.Groups["a3"].Value; + + int[] portParts = new int[2]; + portParts[0] = Int32.Parse(m1.Groups["p0"].Value); + portParts[1] = Int32.Parse(m1.Groups["p1"].Value); + port = (portParts[0] << 8) + portParts[1]; + + hostIP = ipAddress; } else if(ftpMode == FTPMode.Active) { - Random rnd = new Random((int)DateTime.Now.Ticks); + Random rnd = new Random((int)DateTime.Now.Ticks); port = DATA_PORT_RANGE_FROM + rnd.Next(DATA_PORT_RANGE_TO - DATA_PORT_RANGE_FROM); - int portHigh = port >> 8; + int portHigh = port >> 8; int portLow = port & 255; string command = string.Format("PORT {0}, {1}, {2}", @@ -682,32 +682,32 @@ else plevel = conf.FTPSDataChannelProtectionLevel; - return new DataSocket(hostIP, port, ftpMode, SSL, plevel, conf); + return new DataSocket(hostIP, port, ftpMode, SSL, plevel, conf); } - internal void SetTransferType(FTPFileTransferType type) - { - switch (type) - { - case FTPFileTransferType.ASCII: - SetMode("TYPE A"); - break; - case FTPFileTransferType.Binary: - SetMode("TYPE I"); - break; - default: - throw new Exception("Invalid File Transfer Type"); - } + internal void SetTransferType(FTPFileTransferType type) + { + switch (type) + { + case FTPFileTransferType.ASCII: + SetMode("TYPE A"); + break; + case FTPFileTransferType.Binary: + SetMode("TYPE I"); + break; + default: + throw new Exception("Invalid File Transfer Type"); + } } - internal void SetMode(string mode) - { - CheckReply(SendCommand(mode), 200); + internal void SetMode(string mode) + { + CheckReply(SendCommand(mode), 200); } - private IPAddress[] GetLocalAddressList() - { - return Dns.GetHostEntry(Dns.GetHostName()).AddressList; + private IPAddress[] GetLocalAddressList() + { + return Dns.GetHostEntry(Dns.GetHostName()).AddressList; } private void GetSiteFeatures() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/FTPConnection.cs new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/FTPConnection.cs --- old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/FTPConnection.cs 2013-01-17 00:05:22.000000000 +0100 +++ new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/FTPConnection.cs 2013-12-15 21:28:13.000000000 +0100 @@ -17,20 +17,20 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -using System; -using System.Net; -using System.IO; -using System.Text; -using System.Net.Sockets; -using System.Threading; +using System; +using System.Net; +using System.IO; +using System.Text; +using System.Net.Sockets; +using System.Threading; using System.Collections.Generic; -using System.Collections; +using System.Collections; using bareFTP.Protocol; using bareFTP.Preferences; -namespace bareFTP.Protocol.Ftp +namespace bareFTP.Protocol.Ftp { - public class FTPConnection : IProtocol + public class FTPConnection : IProtocol { protected FTPClient ftpClient; @@ -525,5 +525,5 @@ } catch{} } } - -} + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs --- old/bareftp-0.3.10/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs 2013-01-17 00:05:22.000000000 +0100 +++ new/bareftp-0.3.11/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs 2013-12-15 21:28:13.000000000 +0100 @@ -22,9 +22,7 @@ using System; using System.Collections.Generic; -using System.Text; -using System.Globalization; - +using System.Text;z namespace bareFTP.Protocol.Ftp { public class ListParser @@ -34,15 +32,16 @@ if(list == null || list.Count < 1) return new List<RemoteFile>(); - - string format1a = "MMM'-'d'-'yyyy"; string format1b = "MMM'-'dd'-'yyyy"; - string[] format1 = {format1a,format1b}; - string format2a = "MMM'-'d'-'yyyy'-'HH':'mm"; - string format2b = "MMM'-'dd'-'yyyy'-'HH':'mm"; - string format2c = "MMM'-'d'-'yyyy'-'H':'mm"; + + string format1a = "MMM'-'d'-'yyyy"; + string format1b = "MMM'-'dd'-'yyyy"; + string[] format1 = {format1a,format1b}; + string format2a = "MMM'-'d'-'yyyy'-'HH':'mm"; + string format2b = "MMM'-'dd'-'yyyy'-'HH':'mm"; + string format2c = "MMM'-'d'-'yyyy'-'H':'mm"; string format2d = "MMM'-'dd'-'yyyy'-'H':'mm"; string winformat = "MM'-'dd'-'yy hh':'mmtt"; - string mlsdformat = "yyyyMMddHHmmss"; + string mlsdformat = "yyyyMMddHHmmss"; string[] format2 = {format2a,format2b,format2c,format2d}; @@ -95,7 +94,7 @@ } else if(keyval[0].ToLower() == "modify") { - file.LastModified = DateTime.ParseExact(keyval[1].Substring(0,14), mlsdformat, + file.LastModified = DateTime.ParseExact(keyval[1].Substring(0,14), mlsdformat, ParsingCulture.DateTimeFormat, DateTimeStyles.None); } else if(keyval[0].ToLower() == "unix.mode") @@ -130,169 +129,169 @@ //////////////// - // field pos - int index = 0; - // first field is perms - string permissions = fields[index++]; - char ch = permissions[0]; - bool isDir = false; - bool isLink = false; - if (ch == 'd') - isDir = true; - else if (ch == 'l') - isLink = true; + // field pos + int index = 0; + // first field is perms + string permissions = fields[index++]; + char ch = permissions[0]; + bool isDir = false; + bool isLink = false; + if (ch == 'd') + isDir = true; + else if (ch == 'l') + isLink = true; // some servers don't supply the link count - int linkCount = 0; - if (Char.IsDigit(fields[index][0])) // assume it is if a digit - { - try - { - linkCount = System.Int32.Parse(fields[index++]); - } - catch (FormatException) - { - } - } - else if (fields[index][0] == '-') // IPXOS Treck FTP server - { - index++; + int linkCount = 0; + if (Char.IsDigit(fields[index][0])) // assume it is if a digit + { + try + { + linkCount = System.Int32.Parse(fields[index++]); + } + catch (FormatException) + { + } } - - - // owner and group - string owner = fields[index++]; - string group = fields[index++]; - - // size - long size = 0L; - string sizeStr = fields[index]; - // some listings don't have owner - make owner -> group & group -> size in - // this case, and use the sizeStr for the start of the date - if (!Char.IsDigit(sizeStr[0]) && Char.IsDigit(group[0])) - { - sizeStr = group; - group = owner; - owner = ""; - } - else - { - index++; - } - - try - { - size = Int64.Parse(sizeStr); - } - catch (FormatException) - { - throw new FormatException("Failed to parse size: " + sizeStr); - } - - // next 3 fields are the date time - - // we expect the month first on Unix. - // Connect:Enterprise UNIX has a weird extra field here - we test if the - // next field starts with a digit and if so, we skip it - if (Char.IsDigit(fields[index][0])) - index++; - - int dateTimePos = index; - DateTime lastModified; - StringBuilder stamp = new StringBuilder(fields[index++]); - stamp.Append('-').Append(fields[index++]).Append('-'); - - string field = fields[index++]; - if (field.IndexOf((System.Char) ':') < 0) - { - stamp.Append(field); // year - try - { - lastModified = DateTime.ParseExact(stamp.ToString(), format1, - ParsingCulture.DateTimeFormat, DateTimeStyles.None); - } - catch (FormatException) - { - //log.Error("Failed to parse date string '" + stamp.ToString() + "'"); - throw; - } - } - else - { - // add the year ourselves as not present - int year = ParsingCulture.Calendar.GetYear(DateTime.Now); - stamp.Append(year).Append('-').Append(field); - try - { - - lastModified = DateTime.ParseExact(stamp.ToString(), format2, - ParsingCulture.DateTimeFormat, DateTimeStyles.None); - } - catch (FormatException) - { - //log.Error("Failed to parse date string '" + stamp.ToString() + "'"); - throw; - } - - // can't be in the future - must be the previous year - // add 2 days for time zones (thanks hgfischer) - if (lastModified > DateTime.Now.AddDays(2)) - { - lastModified = lastModified.AddYears(-1); - } + else if (fields[index][0] == '-') // IPXOS Treck FTP server + { + index++; + } + + + // owner and group + string owner = fields[index++]; + string group = fields[index++]; + + // size + long size = 0L; + string sizeStr = fields[index]; + // some listings don't have owner - make owner -> group & group -> size in + // this case, and use the sizeStr for the start of the date + if (!Char.IsDigit(sizeStr[0]) && Char.IsDigit(group[0])) + { + sizeStr = group; + group = owner; + owner = ""; + } + else + { + index++; + } + + try + { + size = Int64.Parse(sizeStr); + } + catch (FormatException) + { + throw new FormatException("Failed to parse size: " + sizeStr); + } + + // next 3 fields are the date time + + // we expect the month first on Unix. + // Connect:Enterprise UNIX has a weird extra field here - we test if the + // next field starts with a digit and if so, we skip it + if (Char.IsDigit(fields[index][0])) + index++; + + int dateTimePos = index; + DateTime lastModified; + StringBuilder stamp = new StringBuilder(fields[index++]); + stamp.Append('-').Append(fields[index++]).Append('-'); + + string field = fields[index++]; + if (field.IndexOf((System.Char) ':') < 0) + { + stamp.Append(field); // year + try + { + lastModified = DateTime.ParseExact(stamp.ToString(), format1, + ParsingCulture.DateTimeFormat, DateTimeStyles.None); + } + catch (FormatException) + { + //log.Error("Failed to parse date string '" + stamp.ToString() + "'"); + throw; + } + } + else + { + // add the year ourselves as not present + int year = ParsingCulture.Calendar.GetYear(DateTime.Now); + stamp.Append(year).Append('-').Append(field); + try + { + + lastModified = DateTime.ParseExact(stamp.ToString(), format2, + ParsingCulture.DateTimeFormat, DateTimeStyles.None); + } + catch (FormatException) + { + //log.Error("Failed to parse date string '" + stamp.ToString() + "'"); + throw; + } + + // can't be in the future - must be the previous year + // add 2 days for time zones (thanks hgfischer) + if (lastModified > DateTime.Now.AddDays(2)) + { + lastModified = lastModified.AddYears(-1); + } } - + - // name of file or dir. Extract symlink if possible - string name = null; - string linkedname = null; - - // we've got to find the starting point of the name. We - // do this by finding the pos of all the date/time fields, then - // the name - to ensure we don't get tricked up by a userid the - // same as the filename,for example - int pos = 0; - bool ok = true; - for (int i = dateTimePos; i < dateTimePos + 3; i++) - { - pos = s.IndexOf(fields[i], pos); - if (pos < 0) - { - ok = false; - break; - } - else { - pos += fields[i].Length; - } - } - if (ok) - { - string remainder = s.Substring(pos).Trim(); - if (!isLink) - name = remainder; - else - { - // symlink, try to extract it - pos = remainder.IndexOf("->"); - if (pos <= 0) - { - // couldn't find symlink, give up & just assign as name - name = remainder; - } - else - { - int len = 2; // Length of "->" - name = remainder.Substring(0, (pos) - (0)).Trim(); - if (pos + len < remainder.Length) - linkedname = remainder.Substring(pos + len).Trim(); - } - } - } - else - { - throw new FormatException("Failed to retrieve name: " + s); - } + // name of file or dir. Extract symlink if possible + string name = null; + string linkedname = null; + + // we've got to find the starting point of the name. We + // do this by finding the pos of all the date/time fields, then + // the name - to ensure we don't get tricked up by a userid the + // same as the filename,for example + int pos = 0; + bool ok = true; + for (int i = dateTimePos; i < dateTimePos + 3; i++) + { + pos = s.IndexOf(fields[i], pos); + if (pos < 0) + { + ok = false; + break; + } + else { + pos += fields[i].Length; + } + } + if (ok) + { + string remainder = s.Substring(pos).Trim(); + if (!isLink) + name = remainder; + else + { + // symlink, try to extract it + pos = remainder.IndexOf("->"); + if (pos <= 0) + { + // couldn't find symlink, give up & just assign as name + name = remainder; + } + else + { + int len = 2; // Length of "->" + name = remainder.Substring(0, (pos) - (0)).Trim(); + if (pos + len < remainder.Length) + linkedname = remainder.Substring(pos + len).Trim(); + } + } + } + else + { + throw new FormatException("Failed to retrieve name: " + s); + } RemoteFile file = new RemoteFile(); file.Filename = name; @@ -318,49 +317,49 @@ { List<string> fields = getFields(s); - // first two fields are date time - DateTime lastModified = DateTime.ParseExact(fields[0] + " " + fields[1], - winformat, ParsingCulture.DateTimeFormat); - - // dir flag - bool isDir = false; - long size = 0L; - if (fields[2].ToUpper().Equals("<DIR>")) - isDir = true; - else - { - try - { - size = Int64.Parse(fields[2]); - } - catch (FormatException) - { - throw new FormatException("Failed to parse size: " + fields[2]); - } - } - - // we've got to find the starting point of the name. We - // do this by finding the pos of all the date/time fields, then - // the name - to ensure we don't get tricked up by a date or dir the - // same as the filename, for example - int pos = 0; - bool ok = true; - for (int i = 0; i < 3; i++) - { - pos = s.IndexOf(fields[i], pos); - if (pos < 0) - { - ok = false; - break; - } - else { - pos += fields[i].Length; - } - } - if (ok) + // first two fields are date time + DateTime lastModified = DateTime.ParseExact(fields[0] + " " + fields[1], + winformat, ParsingCulture.DateTimeFormat); + + // dir flag + bool isDir = false; + long size = 0L; + if (fields[2].ToUpper().Equals("<DIR>")) + isDir = true; + else + { + try + { + size = Int64.Parse(fields[2]); + } + catch (FormatException) + { + throw new FormatException("Failed to parse size: " + fields[2]); + } + } + + // we've got to find the starting point of the name. We + // do this by finding the pos of all the date/time fields, then + // the name - to ensure we don't get tricked up by a date or dir the + // same as the filename, for example + int pos = 0; + bool ok = true; + for (int i = 0; i < 3; i++) + { + pos = s.IndexOf(fields[i], pos); + if (pos < 0) + { + ok = false; + break; + } + else { + pos += fields[i].Length; + } + } + if (ok) { - - string name = s.Substring(pos).Trim(); + + string name = s.Substring(pos).Trim(); RemoteFile file = new RemoteFile(); file.Filename = name; file.Size = size; @@ -372,11 +371,11 @@ file.IsLink = false; file.Linkdest = String.Empty; - files.Add(file); - } - else - { - throw new FormatException("Failed to retrieve name: " + s); + files.Add(file); + } + else + { + throw new FormatException("Failed to retrieve name: " + s); } } @@ -387,27 +386,27 @@ } - public static List<string> getFields(string str) { - List<string> fields = new List<string>(); - StringBuilder field = new StringBuilder(); + public static List<string> getFields(string str) { + List<string> fields = new List<string>(); + StringBuilder field = new StringBuilder(); - for (int i = 0; i < str.Length; i++) { - char ch = str[i]; - if (!Char.IsWhiteSpace(ch)) - field.Append(ch); - else { - if (field.Length > 0) { - fields.Add(field.ToString()); + for (int i = 0; i < str.Length; i++) { + char ch = str[i]; + if (!Char.IsWhiteSpace(ch)) + field.Append(ch); + else { + if (field.Length > 0) { + fields.Add(field.ToString()); field.Length = 0; - - } - } - } - // pick up last field - if (field.Length > 0) { - fields.Add(field.ToString()); - } - return fields; + + } + } + } + // pick up last field + if (field.Length > 0) { + fields.Add(field.ToString()); + } + return fields; } } } ++++++ bareftp-buildfix.patch ++++++ diff -ru bareftp-0.3.11-old/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs bareftp-0.3.11-new/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs --- bareftp-0.3.11-old/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs 2013-12-15 22:28:13.000000000 +0200 +++ bareftp-0.3.11-new/src/bareFTP.Protocol.Ftp/ftp/ListParser.cs 2014-11-08 09:32:47.336869813 +0200 @@ -22,7 +22,8 @@ using System; using System.Collections.Generic; -using System.Text;z +using System.Text; +using System.Globalization; namespace bareFTP.Protocol.Ftp { public class ListParser
