kovidgoyal/kitty · error

Failed to seek in image data output file

Error message

Failed to seek in image data output file: %s with error: %w

What it means

transmit_shm opened the frame file successfully but the Seek to the end (to determine data size) failed. The file's size can't be established, so transmission aborts.

Solutions

  1. Ensure the frame file is a regular file, not a pipe
  2. Keep encoded frames in memory (in_memory_bytes path) instead of files when possible
  3. Check filesystem health if seeking regularly fails
Defensive patterns

Strategy: retry

Validate before calling

if fi, err := os.Stat(f); err != nil || !fi.Mode().IsRegular() { /* reject pipes/special files */ }

Try / catch

if err != nil && strings.Contains(err.Error(), "Failed to seek") { /* retry with fresh file handle */ }

Prevention

When it happens

Trigger: f.Seek(0, io.SeekEnd) returning an error — typically when the 'file' is a pipe/FIFO, has been truncated concurrently, or is on a filesystem returning EIO.

Common situations: frame.filename pointing at a FIFO or special file; concurrent truncation; failing disk/NFS mount.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/d2bf4157cfba14ac. Report an issue: GitHub.

Appendix: source

Thrown at kittens/icat/transmit.go:95

		if frame.compose_onto > 0 {
			gc.SetOverlaidFrame(uint64(frame.compose_onto))
		}
		gc.SetLeftEdge(uint64(frame.left)).SetTopEdge(uint64(frame.top))
	}
	return gc
}

func transmit_shm(imgd *image_data, frame_num int, frame *image_frame) (err error) {
	var mmap shm.MMap
	var data_size int64
	if frame.in_memory_bytes == nil {
		f, err := os.Open(frame.filename)
		if err != nil {
			return fmt.Errorf("Failed to open image data output file: %s with error: %w", frame.filename, err)
		}
		defer f.Close()
		if data_size, err = f.Seek(0, io.SeekEnd); err != nil {
			return fmt.Errorf("Failed to seek in image data output file: %s with error: %w", frame.filename, err)
		}
		if _, err = f.Seek(0, io.SeekStart); err != nil {
			return fmt.Errorf("Failed to seek in image data output file: %s with error: %w", frame.filename, err)
		}
		if mmap, err = shm.CreateTemp("icat-*", uint64(data_size)); err != nil {
			return fmt.Errorf("Failed to create a SHM file for transmission: %w", err)
		}
		if _, err = io.ReadFull(f, mmap.Slice()); err != nil {
			mmap.Close()
			mmap.Unlink()
			return fmt.Errorf("Failed to read data from image output data file: %w", err)
		}
	} else {
		data_size = int64(len(frame.in_memory_bytes))
		if mmap, err = shm.CreateTemp("icat-*", uint64(data_size)); err != nil {
			return fmt.Errorf("Failed to create a SHM file for transmission: %w", err)
		}
		copy(mmap.Slice(), frame.in_memory_bytes)

View on GitHub (pinned to 6d5d0c4406)