@tab @url{download/nncp-0.1.tar.xz, link} @url{download/nncp-0.1.tar.xz.sig, sign}
@tab @code{8F71D65B 70865EBF FE802CDF A5C14D00 A9FD6559 FD722E60 5D97E82C 5E2412C2}
+@item @ref{Release 0.2, 0.2} @tab 740 KiB
+@tab @url{download/nncp-0.2.tar.xz, link} @url{download/nncp-0.2.tar.xz.sig, sign}
+@tab @code{00BEAC5A 0C4083B0 42E3152B ACA6FF20 12768B82 CE24D716 8E04279C ECE14DB7}
+
@end multitable
@item @ref{nncp-caller} command appeared: cron-ed TCP daemon caller.
@item @ref{nncp-pkt} command can decompress the data.
@end itemize
+
+@node Release 0.3
+@section Release 0.3
+Fixed compatibility with Go 1.6.
@menu
* Occasional connection to mail server: UsecaseMail.
+* Lightweight fast POP3/IMAP4 replacement: UsecasePOP.
* Unreliable/expensive communication link: UsecaseUnreliable.
* Slow/expensive link for high-volume data, bad QoS: UsecaseQoS.
* Extreme terrestrial environments, no link: UsecaseNoLink.
will call local @command{sendmail} command to deliver them just like
that happened on the same machine.
+@node UsecasePOP
+@section Lightweight fast POP3/IMAP4 replacement
+
+@ref{nncp-daemon} can be connected with @ref{nncp-caller} for a long
+time -- it can create TCP connection that lasts for many hours. When
+SMTP server receives mail, it will call @ref{nncp-mail} creating an
+outbound encrypted packet. Daemon checks outbound directory each second
+and immediately sends notification about undelivered packets to remote
+side, that also downloads it at once.
+
+There are only dozens of bytes notifying about incoming packets, dozens
+of bytes telling to download those packets. Mail packets are compressed
+(POP3 and IMAP4 as a rule do not). You have lightweight, compressed,
+low-delay, reliable link for the mail with strong encryption and mutual
+sides authentication!
+
@node UsecaseUnreliable
@section Unreliable/expensive communication link
find . -name .git -type d | xargs rm -fr
find . -name .gitignore -delete
+rm .gitmodules
cd ..
tar cvf nncp-"$release".tar nncp-"$release"
fd.Close()
continue
}
- fd.Seek(0, io.SeekStart)
+ fd.Seek(0, 0)
tmp, err := ctx.NewTmpFileWHash()
if err != nil {
log.Fatalln(err)
package nncp
import (
- "io"
"os"
"path/filepath"
"strconv"
fd.Close()
continue
}
- fd.Seek(0, io.SeekStart)
+ fd.Seek(0, 0)
ctx.LogD("jobs", SDS{
"xx": string(xx),
"node": pktEnc.Sender,
var buf []byte
if freq.Offset < fullSize {
state.ctx.LogD("sp-file", sdsp, "seeking")
- if _, err = fd.Seek(int64(freq.Offset), io.SeekStart); err != nil {
+ if _, err = fd.Seek(int64(freq.Offset), 0); err != nil {
state.ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "")
break
}
SdsAdd(sdsp, SDS{"offset": strconv.FormatInt(int64(file.Offset), 10)}),
"seeking",
)
- if _, err = fd.Seek(int64(file.Offset), io.SeekStart); err != nil {
+ if _, err = fd.Seek(int64(file.Offset), 0); err != nil {
state.ctx.LogE("sp-file", SdsAdd(sdsp, SDS{"err": err}), "")
fd.Close()
return nil, err
}
state.wg.Add(1)
defer state.wg.Done()
- fd.Seek(0, io.SeekStart)
+ fd.Seek(0, 0)
state.ctx.LogD("sp-file", sdsp, "checking")
gut, err := Check(fd, file.Hash[:])
fd.Close()