static void xfd_op_1(void* data) { struct xfd_op_ctx* ctx = data; ssize_t ret; if (ctx->op == XFD_OP_READ) { do { WITH_IO_SIGNALS_ALLOWED(); ret = read(ctx->fd, ctx->buf, ctx->size); } while (ret == -1 && errno == EINTR); if (ret == -1) die_errno("read(%d)", ctx->fd); } else { assert(ctx->op == XFD_OP_WRITE); do { WITH_IO_SIGNALS_ALLOWED(); ret = write(ctx->fd, ctx->buf, ctx->size); } while (ret == -1 && errno == EINTR); if (ret == -1) die_errno("write(%d)", ctx->fd); } ctx->result = ret; }
size_t read_all_adb_encoded(int fd, void* buf, size_t sz) { char encbuf[4096]; unsigned state = 0; char* dec = buf; char* decend = dec + sz; ssize_t ret; size_t nr_read = 0; while (nr_read < sz) { do { WITH_IO_SIGNALS_ALLOWED(); ret = read(fd, encbuf, XMIN(sz - nr_read, sizeof (encbuf))); } while (ret == -1 && errno == EINTR); if (ret < 0) die_errno("read[adbenc]"); if (ret < 1) break; const char* in = encbuf; const char* inend = encbuf + ret; char* cur_dec = dec; adb_decode(&state, &dec, decend, &in, inend); nr_read += dec - cur_dec; } return nr_read; }
int xpoll(struct pollfd* fds, nfds_t nfds, int timeout) { WITH_IO_SIGNALS_ALLOWED(); int pollret; do { pollret = poll(fds, nfds, timeout); } while (pollret == -1 && errno == EINTR); return pollret; }
void dbglock(void) { int saved_errno = errno; if (!dbg_enabled_p()) return; if (dbglock_fd == -1) return; if (dbglock_level++ == 0) { WITH_IO_SIGNALS_ALLOWED(); flock(dbglock_fd, LOCK_EX); } cleanup_commit(cleanup_allocate(), cleanup_dbglock, 0); errno = saved_errno; }
void write_all(int fd, const void* buf, size_t sz) { size_t nr_written = 0; int ret; const char* pos = buf; while (nr_written < sz) { do { WITH_IO_SIGNALS_ALLOWED(); ret = write(fd, &pos[nr_written], sz - nr_written); } while (ret == -1 && errno == EINTR); if (ret < 0) die_errno("write(%d)", fd); nr_written += ret; } }
size_t read_all(int fd, void* buf, size_t sz) { size_t nr_read = 0; int ret; char* pos = buf; while (nr_read < sz) { do { WITH_IO_SIGNALS_ALLOWED(); ret = read(fd, &pos[nr_read], sz - nr_read); } while (ret == -1 && errno == EINTR); if (ret < 0) die_errno("read(%d)", fd); if (ret < 1) break; nr_read += ret; } return nr_read; }