| 1423 | } |
| 1424 | |
| 1425 | func (c *closerStack) push(name string, closer io.Closer) error { |
| 1426 | c.Lock() |
| 1427 | if c.closed { |
| 1428 | c.Unlock() |
| 1429 | // since we're refusing to push it on the stack, close it now |
| 1430 | err := closer.Close() |
| 1431 | c.logger.Error(context.Background(), |
| 1432 | "closed item rejected push", slog.F("name", name), slog.Error(err)) |
| 1433 | return xerrors.Errorf("already closed: %w", c.err) |
| 1434 | } |
| 1435 | c.closers = append(c.closers, closerWithName{name: name, closer: closer}) |
| 1436 | c.Unlock() |
| 1437 | return nil |
| 1438 | } |
| 1439 | |
| 1440 | // rawSSHCopier handles copying raw SSH data between the conn and the pair (r, w). |
| 1441 | type rawSSHCopier struct { |