(pollFn pollFunc, eventFD int32, fds ...int32)
| 394 | } |
| 395 | |
| 396 | func poll(pollFn pollFunc, eventFD int32, fds ...int32) error { |
| 397 | if len(fds) == 0 { |
| 398 | panic("file descriptors not specified") |
| 399 | } |
| 400 | |
| 401 | pollFDs := []unix.PollFd{ |
| 402 | { |
| 403 | Fd: eventFD, |
| 404 | Events: unix.POLLIN, |
| 405 | Revents: 0, |
| 406 | }, |
| 407 | } |
| 408 | |
| 409 | for _, fd := range fds { |
| 410 | pollFD := unix.PollFd{Fd: fd, Events: unix.POLLIN, Revents: 0} |
| 411 | pollFDs = append(pollFDs, pollFD) |
| 412 | } |
| 413 | |
| 414 | for { |
| 415 | if _, err := unix.Poll(pollFDs, -1); err != nil { |
| 416 | if errors.Is(err, unix.EINTR) { |
| 417 | logrus.Debugf("Failed to poll(2): %s: ignoring", err) |
| 418 | continue |
| 419 | } |
| 420 | |
| 421 | return fmt.Errorf("poll(2) failed: %w", err) |
| 422 | } |
| 423 | |
| 424 | var err error |
| 425 | |
| 426 | if pollFDs[0].Revents&unix.POLLIN != 0 { |
| 427 | logrus.Debug("Returned from eventfd: POLLIN") |
| 428 | err = context.Canceled |
| 429 | |
| 430 | for { |
| 431 | buffer := make([]byte, 8) |
| 432 | if n, err := unix.Read(int(eventFD), buffer); n != len(buffer) || err != nil { |
| 433 | break |
| 434 | } |
| 435 | } |
| 436 | } else if pollFDs[0].Revents&unix.POLLNVAL != 0 { |
| 437 | logrus.Debug("Returned from eventfd: POLLNVAL") |
| 438 | err = context.Canceled |
| 439 | } |
| 440 | |
| 441 | if err := pollFn(err, pollFDs[1:]); !errors.Is(err, errContinue) { |
| 442 | return err |
| 443 | } |
| 444 | } |
| 445 | } |
| 446 | |
| 447 | func resolveContainerAndImageNames(container, containerArg, distroCLI, imageCLI, releaseCLI string) ( |
| 448 | string, string, string, error, |
no test coverage detected
searching dependent graphs…