summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.go106
1 files changed, 58 insertions, 48 deletions
diff --git a/main.go b/main.go
index 91cb83a..46f94d5 100644
--- a/main.go
+++ b/main.go
@@ -235,7 +235,7 @@ func copy(fnames []string) error {
func tmux_paste() error {
if out, err := exec.Command("tmux", "show", "-v", "set-clipboard").Output(); err != nil {
- return fmt.Errorf("error running 'tmux show -v set-clipboard': %w", err)
+ return fmt.Errorf("Error running 'tmux show -v set-clipboard': %w", err)
} else {
outStr := strings.TrimSpace(string(out))
debugLog.Println("'tmux show -v set-clipboard':", outStr)
@@ -245,7 +245,7 @@ func tmux_paste() error {
}
// refresh client list
if out, err := exec.Command("tmux", "refresh-client", "-l").Output(); err != nil {
- return fmt.Errorf("error running 'tmux refresh-client -l': %v", err)
+ return fmt.Errorf("Error running 'tmux refresh-client -l': %v", err)
} else {
debugLog.Println("tmux refresh-client output:", string(out))
}
@@ -305,58 +305,68 @@ func paste() error {
timeout := time.Duration(timeoutFlag*1_000_000_000) * time.Nanosecond
debugLog.Println("Beginning osc52 paste operation, timeout:", timeout)
- tty, err := opentty()
- if err != nil {
- errorLog.Println("opentty:", err)
- return err
- }
- defer closetty(tty)
-
- // Start OSC52
- fmt.Fprint(tty, oscOpen+"?"+oscClose)
-
- var ttyReader *bufio.Reader
- if verboseFlag {
- ttyReader = bufio.NewReader(&debugReader{
- prefix: "tty read",
- r: tty,
- })
- } else {
- ttyReader = bufio.NewReader(tty)
- }
+ if data, err := func() ([]byte, error) {
+ tty, err := opentty()
+ if err != nil {
+ return nil, fmt.Errorf("Error opening tty: %w", err)
+ }
+ defer closetty(tty)
- // time out intial read
- readChan := make(chan []byte, 1)
- defer close(readChan)
- go func() {
- if b, e := ttyReader.ReadSlice(';'); e != nil {
- errorLog.Println("Initial ReadSlice error:", e)
+ // Start OSC52
+ fmt.Fprint(tty, oscOpen+"?"+oscClose)
+
+ var ttyReader *bufio.Reader
+ if verboseFlag {
+ ttyReader = bufio.NewReader(&debugReader{
+ prefix: "tty read",
+ r: tty,
+ })
} else {
- readChan <- b
+ ttyReader = bufio.NewReader(tty)
}
- }()
- select {
- case b := <-readChan:
- if !bytes.Equal(b, []byte(OSC)) {
- errorLog.Printf("osc header mismatch: %q", b)
- return fmt.Errorf("osc header mismatch: %q", b)
+
+ // Define a struct to hold the read bytes and any error
+ type readResult struct {
+ data []byte
+ err error
}
- case <-time.After(timeout):
- debugLog.Println("tty read timeout")
- return fmt.Errorf("tty read timeout")
- }
- // ignore clipboard info
- if _, e := ttyReader.ReadSlice(';'); e != nil {
- errorLog.Println("clipboard metadata ReadSlice:", e)
- return fmt.Errorf("clipboard metadata ReadSlice: %w", e)
- }
+ // Time out initial read
+ readChan := make(chan readResult, 1)
+ defer close(readChan)
+
+ go func() {
+ b, e := ttyReader.ReadSlice(';')
+ readChan <- readResult{data: b, err: e}
+ }()
+
+ select {
+ case res := <-readChan:
+ if res.err != nil {
+ return nil, fmt.Errorf("Initial ReadSlice error: %w", res.err)
+ } else if !bytes.Equal(res.data, []byte(OSC)) {
+ return nil, fmt.Errorf("osc header mismatch: %q", res.data)
+ }
+ case <-time.After(timeout):
+ return nil, fmt.Errorf("tty read timeout")
+ }
+
+ // ignore clipboard info
+ if _, e := ttyReader.ReadSlice(';'); e != nil {
+ return nil, fmt.Errorf("Clipboard metadata ReadSlice error: %w", e)
+ }
- pr := pasteReader{r: ttyReader}
- decoder := base64.NewDecoder(base64.StdEncoding, &pr)
- if _, err = io.Copy(os.Stdout, decoder); err != nil {
- errorLog.Println("Error copying to stdout:", err)
- return fmt.Errorf("Error copying to stdout: %w", err)
+ pr := pasteReader{r: ttyReader}
+ decoder := base64.NewDecoder(base64.StdEncoding, &pr)
+ if data, err := io.ReadAll(decoder); err != nil {
+ return nil, fmt.Errorf("Error reading from decoder: %w", err)
+ } else {
+ return data, nil
+ }
+ }(); err != nil {
+ return err
+ } else if _, err := os.Stdout.Write(data); err != nil {
+ return fmt.Errorf("Error writing to stdout: %w", err)
}
debugLog.Println("Ended osc52")