diff --git a/main.go b/main.go index 24fa5ab..b3ec7ff 100644 --- a/main.go +++ b/main.go @@ -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 { diff --git a/src/croc/sending.go b/src/croc/sending.go index b580571..b565bf2 100644 --- a/src/croc/sending.go +++ b/src/croc/sending.go @@ -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) diff --git a/src/sender/sender.go b/src/sender/sender.go index 83d830c..1e54eb2 100644 --- a/src/sender/sender.go +++ b/src/sender/sender.go @@ -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())