int storage_file_write(struct storage_msg *msg, const void *r, size_t req_len) { int rc; const struct storage_file_write_req *req = r; if (req_len < sizeof(*req)) { ALOGE("%s: invalid request length (%zd < %zd)\n", __func__, req_len, sizeof(*req)); msg->result = STORAGE_ERR_NOT_VALID; goto err_response; } int fd = lookup_fd(req->handle, true); if (write_with_retry(fd, &req->data[0], req_len - sizeof(*req), req->offset) < 0) { rc = errno; ALOGW("%s: error writing file (fd=%d): %s\n", __func__, fd, strerror(errno)); msg->result = translate_errno(rc); goto err_response; } msg->result = STORAGE_NO_ERROR; err_response: return ipc_respond(msg, NULL, 0); }
ssize_t writev_with_retry(int fd, const struct iovec *iov, size_t ic) { ssize_t len = 0; int i = 0; for(i=0; i<ic; ++i) { write_with_retry(fd, iov[i].iov_base, iov[i].iov_len); len += iov[i].iov_len; if(PlaybackDieNow(0)) { return -1; } } return len; }