]> git.treefish.org Git - fex.git/blobdiff - bin/fexsend
Original release 20160919
[fex.git] / bin / fexsend
index f47bed4cc3ac51705665a63ee0d07a5b8e2f353a..fae77e9b79e977a1819e98b9345ea3e6fa54de3f 100755 (executable)
@@ -17,10 +17,10 @@ use IO::Handle;
 use IO::Socket::INET;
 use Getopt::Std;
 use File::Basename;
 use IO::Socket::INET;
 use Getopt::Std;
 use File::Basename;
-use Cwd qw'abs_path';
+use Cwd 'abs_path';
 use Fcntl qw':flock :mode';
 use Fcntl qw':flock :mode';
-use Digest::MD5 qw'md5_hex';  # encrypted ID / SID
-use Time::HiRes qw'time';
+use Digest::MD5 'md5_hex';  # encrypted ID / SID
+use Time::HiRes 'time';
 # use Smart::Comments;
 use constant k => 2**10;
 use constant M => 2**20;
 # use Smart::Comments;
 use constant k => 2**10;
 use constant M => 2**20;
@@ -37,7 +37,7 @@ our ($tpid,$frecipient);
 our ($FEXID,$FEXXX,$HOME);
 our (%alias);
 our $chunksize = 0;
 our ($FEXID,$FEXXX,$HOME);
 our (%alias);
 our $chunksize = 0;
-our $version = 20160328;
+our $version = 20160919;
 our $_0 = $0;
 our $DEBUG = $ENV{DEBUG};
 
 our $_0 = $0;
 our $DEBUG = $ENV{DEBUG};
 
@@ -248,6 +248,14 @@ Partner program xx is an internet clipboard. See: xx -h
 
 Partner program fexget is for downloading. See: fexget -h
 
 
 Partner program fexget is for downloading. See: fexget -h
 
+fexsend stores the login data (server, user and auth-ID) in the file
+$HOME/.fex/id
+The format of this file is ([data] is optional):
+
+server-URL[!proxy[:port[:chunk-size]]
+e-mail-address
+auth-ID
+
 For temporary usage of a HTTP proxy use:
   $0 -P your_proxy:port:chunksize_in_MB file recipient
 Example:
 For temporary usage of a HTTP proxy use:
   $0 -P your_proxy:port:chunksize_in_MB file recipient
 Example:
@@ -361,10 +369,15 @@ if ($xx) {
       $_ = <STDIN>||'';
       if (/^y/i) {
         my $new = `wget -nv -O- http://fex.belwue.de/download/fexsend`;
       $_ = <STDIN>||'';
       if (/^y/i) {
         my $new = `wget -nv -O- http://fex.belwue.de/download/fexsend`;
-        if ($new !~ /upgrade fexsend/) {
+        my $newversion = $1 if $new =~ /version = (\d+)/;
+        if ($new !~ /upgrade fexsend/ or not $newversion) {
           die "$0: bad update\n";
         }
           die "$0: bad update\n";
         }
-        system qw'cp -aL',$_0,$_0.'_old';
+        if ($newversion <= $version) {
+          die "$0: no newer version\n";
+        }
+        $_0 = abs_path($_0);
+        system qw'rsync -a',$_0,$_0.'_old';
         exit $? if $?;
         open $_0,'>',$_0 or die "$0: cannot write $_0. - $!\n";
         print {$_0} $new;
         exit $? if $?;
         open $_0,'>',$_0 or die "$0: cannot write $_0. - $!\n";
         print {$_0} $new;
@@ -372,6 +385,7 @@ if ($xx) {
         exec $_0,qw'-V .';
       }
     }
         exec $_0,qw'-V .';
       }
     }
+    exit;
     exit if "@ARGV" eq '.';
   }
 
     exit if "@ARGV" eq '.';
   }
 
@@ -3206,9 +3220,10 @@ sub query_sid {
   $sid = $id;
 
   if ($port eq 443 or $proxy) {
   $sid = $id;
 
   if ($port eq 443 or $proxy) {
+    return if $opt_d;
     return if $features;    # early return if we know enough
     return if $features;    # early return if we know enough
-    $req = "OPTIONS /FEX HTTP/1.1";
-    $req = "HEAD /index.html HTTP/1.1";
+    $req = "OPTIONS /FEX HTTP/1.1"; # does not work with (some) proxies
+    $req = "GET /SID HTTP/1.1";     # needed as FEATURES query
   } else {
     $req = "GET /SID HTTP/1.1";
   }
   } else {
     $req = "GET /SID HTTP/1.1";
   }
@@ -3469,7 +3484,8 @@ sub readahead {
 
 sub fileid {
   my $file = shift;
 
 sub fileid {
   my $file = shift;
-  my @s = stat($file);
+  my $dirmode = shift;
+  my @s = $dirmode ? lstat($file) : stat($file);
 
   if (@s) {
     return md5_hex($file.$s[0].$s[1].$s[7].$s[9]);
 
   if (@s) {
     return md5_hex($file.$s[0].$s[1].$s[7].$s[9]);
@@ -3528,6 +3544,9 @@ sub fmd {
           next if $file eq '..';
           if ($file eq '.') {
             $fmd .= fileid($dir);
           next if $file eq '..';
           if ($file eq '.') {
             $fmd .= fileid($dir);
+          } elsif (-l "$dir/$file") {
+            # hack for dangling symlinks: do not raise an error
+            $fmd .= fileid("$dir/$file",'dirmode');
           } else {
             $fmd .= fmd("$dir/$file");
           }
           } else {
             $fmd .= fmd("$dir/$file");
           }