func (c *client) startUpload(id uint64, inPath string) (cancel func()) { killChan := make(chan bool, 1) go func() { var detachment *pond.Message_Detachment var tmp *os.File var err error if tmp, err = ioutil.TempFile("" /* default tmp dir */, "pond-upload-"); err != nil { err = errors.New("failed to create temp file: " + err.Error()) } else { os.Remove(tmp.Name()) defer tmp.Close() detachment, err = saveEncrypted(c.rand, c.backgroundChan, tmp, id, inPath, killChan) if err == nil { err = c.uploadDetachment(c.backgroundChan, tmp, id, killChan) } } if err == nil { detachment.Url = proto.String(c.buildDetachmentURL(id)) c.log.Printf("Finished upload of %s", *detachment.Url) c.backgroundChan <- DetachmentComplete{id, detachment} } else { c.backgroundChan <- DetachmentError{id, err} } tmp.Close() }() return func() { killChan <- true } }