move file processing until after recipient chimes in

This commit is contained in:
Zack Scholl 2018-09-22 06:51:08 -07:00
parent 4d9455c24b
commit 9cf6bdf4a8
3 changed files with 64 additions and 35 deletions

27
main.go
View File

@ -3,6 +3,9 @@ package main
import (
"errors"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"time"
@ -100,7 +103,26 @@ func send(c *cli.Context) error {
stat, _ := os.Stdin.Stat()
var fname string
if (stat.Mode() & os.ModeCharDevice) == 0 {
fname = "stdin"
f, err := ioutil.TempFile(".", "croc-stdin-")
if err != nil {
return err
}
_, err = io.Copy(f, os.Stdin)
if err != nil {
return err
}
err = f.Close()
if err != nil {
return err
}
fname = f.Name()
defer func() {
log.Println("removing %s", fname)
err = os.Remove(fname)
if err != nil {
log.Println(err)
}
}()
} else {
fname = c.Args().First()
}
@ -140,8 +162,7 @@ func send(c *cli.Context) error {
codePhrase,
codePhrase,
)
err = cr.Send(fname, codePhrase)
return err
return cr.Send(fname, codePhrase)
}
func receive(c *cli.Context) error {

View File

@ -60,6 +60,7 @@ func (c *Croc) Send(fname, codephrase string) (err error) {
err = <-errChan
if err == nil || waitingFor == 1 {
log.Debug("returning")
return
}
log.Debug(err)

View File

@ -42,42 +42,15 @@ func Send(done chan struct{}, c *websocket.Conn, fname string, codephrase string
}
func send(c *websocket.Conn, fname string, codephrase string) (err error) {
// check that the file exists
var f *os.File
var fstats models.FileStats
// normalize the file name
fname, err = filepath.Abs(fname)
_, filename := filepath.Split(fname)
f, err := os.Open(fname)
if err != nil {
return
}
fstat, err := f.Stat()
if err != nil {
return err
}
// get stats about the file
fstats := models.FileStats{filename, fstat.Size(), fstat.ModTime(), fstat.IsDir(), fstat.Name()}
if fstats.IsDir {
// zip the directory
fstats.SentName, err = zipper.ZipFile(fname, true)
// remove the file when leaving
defer os.Remove(fstats.SentName)
fname = fstats.SentName
if err != nil {
return
}
f.Close()
// reopen file
f, err = os.Open(fstats.SentName)
if err != nil {
return
}
fstat, err := f.Stat()
if err != nil {
return err
}
// get new size
fstats.Size = fstat.Size()
}
_, filename := filepath.Split(fname)
// get ready to generate session key
var sessionKey []byte
@ -107,6 +80,40 @@ func send(c *websocket.Conn, fname string, codephrase string) (err error) {
log.Debugf("got %d: %s", messageType, message)
switch step {
case 0:
// recipient might want file! gather file information
// get stats about the file
fstat, err := os.Stat(fname)
if err != nil {
return err
}
fstats = models.FileStats{filename, fstat.Size(), fstat.ModTime(), fstat.IsDir(), fstat.Name()}
if fstats.IsDir {
// zip the directory
fstats.SentName, err = zipper.ZipFile(fname, true)
// remove the file when leaving
defer os.Remove(fstats.SentName)
fname = fstats.SentName
fstat, err := os.Stat(fname)
if err != nil {
return err
}
// get new size
fstats.Size = fstat.Size()
}
// open the file
f, err = os.Open(fname)
if err != nil {
return err
}
defer func() {
err = f.Close()
if err != nil {
log.Debugf("problem closing file: %s", err.Error())
}
}()
// send pake data
log.Debugf("[%d] first, P sends u to Q", step)
c.WriteMessage(websocket.BinaryMessage, P.Bytes())