- if (write(tap, data, len) != len)
- panic("Failed to write data to tap device.\n");
+ int n;
+ pollfd pfd[1];
+ pfd->fd = tap;
+ pfd->events = POLLOUT;
+
+ // `tap` is a nonblock fd. Here we try to write until success, and use
+ // poll to make a blocking wait.
+ while ((n = write(tap, data, len)) != len) {
+ if (errno != EAGAIN)
+ panic("Failed to write data to tap device.\n");
+ pfd->revents = 0;
+ int ret = poll(pfd, 1, -1);
+ // timeout is set to inf, we shouldn't get 0 in any case.
+ assert(ret != 0);
+ if (ret == -1 || (ret == 1 && (pfd->revents & POLLERR))) {
+ panic("Failed when polling to write data to tap device.\n");
+ }
+ }