aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2015-08-09 20:41:59 +0200
committerGuilhem Moulin <guilhem@fripost.org>2015-08-09 20:41:59 +0200
commitc1549a74c99904fb2648240cab239d61ab0c9522 (patch)
tree37c574fb46e5c924c5059d49570987f635e7b060
parent8f56dacdbc3459959b3200e776387d34f91e968c (diff)
parentb1985240f59a22b27824c9fdcb79998a1c7c0396 (diff)
Merge branch 'master' into debian
-rwxr-xr-ximapsync14
-rw-r--r--imapsync.14
-rw-r--r--lib/Net/IMAP/Sync.pm22
3 files changed, 31 insertions, 9 deletions
diff --git a/imapsync b/imapsync
index b0226c3..a007089 100755
--- a/imapsync
+++ b/imapsync
@@ -27,7 +27,6 @@ use Getopt::Long qw/:config posix_default no_ignore_case gnu_compat
bundling auto_version/;
use DBI ();
use List::Util 'first';
-use POSIX 'strftime';
use lib 'lib';
use Net::IMAP::Sync qw/read_config compact_set $IMAP_text $IMAP_cond/;
@@ -92,10 +91,15 @@ my ($DBFILE, $LOCKFILE, $LOGGER_FD);
$LOCKFILE = $DBFILE =~ s/([^\/]+)\z/.$1.lck/r;
if (defined $CONF->{_} and defined $CONF->{_}->{logfile}) {
+ require 'POSIX.pm';
+ require 'Time/HiRes.pm';
open $LOGGER_FD, '>>', $CONF->{_}->{logfile}
or die "Can't open $CONF->{_}->{logfile}: $!\n";
$LOGGER_FD->autoflush(1);
}
+ elsif ($CONFIG{debug}) {
+ $LOGGER_FD = \*STDERR;
+ }
}
my $DBH;
@@ -196,14 +200,18 @@ $DBH->do('PRAGMA foreign_keys = ON');
sub msg($@) {
my $name = shift;
return unless @_;
- logger($name, @_) if defined $LOGGER_FD and $LOGGER_FD ne \*STDERR;
+ logger($name, @_) if defined $LOGGER_FD and $LOGGER_FD->fileno != fileno STDERR;
my $prefix = defined $name ? "$name: " : '';
print STDERR $prefix, @_, "\n";
}
sub logger($@) {
my $name = shift;
return unless @_ and defined $LOGGER_FD;
- my $prefix = strftime "%b %e %H:%M:%S ", localtime;
+ my $prefix = '';
+ if ($LOGGER_FD->fileno != fileno STDERR) {
+ my ($s, $us) = Time::HiRes::gettimeofday();
+ $prefix = POSIX::strftime("%b %e %H:%M:%S", localtime($s)).".$us ";
+ }
$prefix .= "$name: " if defined $name;
$LOGGER_FD->say($prefix, @_);
}
diff --git a/imapsync.1 b/imapsync.1
index d794d1a..b9ec795 100644
--- a/imapsync.1
+++ b/imapsync.1
@@ -185,7 +185,7 @@ Relative paths start from \fI$XDG_DATA_HOME/imapsync\fR, or
is unset.
This option is only available in the default section.
(Default: \(lq\fIhost\fR.db\)\(rq, where \fIhost\fR is taken from the
-\(lq[remote]\(rq or \(lq[local]\(rq sections, in that order.
+\(lq[remote]\(rq or \(lq[local]\(rq sections, in that order.)
.TP
.I list-mailbox
@@ -235,6 +235,8 @@ One of \(lqimap\(rq, \(lqimaps\(rq or \(lqtunnel\(rq.
IMAP over SSL/TLS connections over a INET socket.
\fItype\fR=tunnel causes \fBimapsync\fR to open a pipe to a
\fIcommand\fR instead of a raw socket.
+Note that specifying \fItype\fR=tunnel in the \(lq[remote]\(rq section
+makes the default \fIdatabase\fR to be \(lqlocalhost.db\(rq.
(Default: \(lqimaps\(rq.)
.TP
diff --git a/lib/Net/IMAP/Sync.pm b/lib/Net/IMAP/Sync.pm
index 47c6258..85ca487 100644
--- a/lib/Net/IMAP/Sync.pm
+++ b/lib/Net/IMAP/Sync.pm
@@ -23,7 +23,6 @@ use strict;
use Config::Tiny ();
use IO::Select ();
use List::Util 'first';
-use POSIX 'strftime';
use Socket 'SO_KEEPALIVE';
use Exporter 'import';
@@ -288,6 +287,11 @@ sub new($%) {
# are considered.
$self->{_MODIFIED} = {};
+ if (defined $self->{'logger-fd'} and $self->{'logger-fd'}->fileno != fileno STDERR) {
+ require 'POSIX.pm';
+ require 'Time/HiRes.pm';
+ }
+
# wait for the greeting
my $x = $self->_getline();
$x =~ s/\A\* (OK|PREAUTH) // or $self->panic($x);
@@ -343,9 +347,13 @@ sub new($%) {
elsif ($mech eq 'PLAIN') {
require 'MIME/Base64.pm';
$self->fail("Missing option $_") foreach grep {!defined $self->{$_}} qw/username password/;
- $command = "AUTHENTICATE $mech";
my $credentials = MIME::Base64::encode_base64("\x00".$username."\x00".$password, '');
- $callback = sub($) {return $credentials};
+ $command = "AUTHENTICATE $mech";
+ if ($self->_capable('SASL-IR')) { # RFC 4959 SASL-IR
+ $command .= " $credentials";
+ } else {
+ $callback = sub($) {return $credentials};
+ }
}
else {
$self->fail("Unsupported authentication mechanism: $mech");
@@ -392,7 +400,7 @@ sub DESTROY($) {
sub log($@) {
my $self = shift;
return unless @_;
- $self->logger(@_) if defined $self->{'logger-fd'} and $self->{'logger-fd'} ne \*STDERR;
+ $self->logger(@_) if defined $self->{'logger-fd'} and $self->{'logger-fd'}->fileno != fileno STDERR;
my $prefix = defined $self->{name} ? $self->{name} : '';
$prefix .= "($self->{_SELECTED})" if $self->{_STATE} eq 'SELECTED';
print STDERR $prefix, ': ', @_, "\n";
@@ -400,7 +408,11 @@ sub log($@) {
sub logger($@) {
my $self = shift;
return unless @_ and defined $self->{'logger-fd'};
- my $prefix = strftime "%b %e %H:%M:%S ", localtime;
+ my $prefix = '';
+ if ($self->{'logger-fd'}->fileno != fileno STDERR) {
+ my ($s, $us) = Time::HiRes::gettimeofday();
+ $prefix = POSIX::strftime("%b %e %H:%M:%S", localtime($s)).".$us ";
+ }
$prefix .= defined "$self->{name}" ? $self->{name} : '';
$prefix .= "($self->{_SELECTED})" if $self->{_STATE} eq 'SELECTED';
$self->{'logger-fd'}->say($prefix, ': ', @_);