39 lines
884 B
C
39 lines
884 B
C
#pragma once
|
|
|
|
#include <zinnia/errno.h>
|
|
#include <zinnia/usercopy.h>
|
|
#include <zinnia/utils.h>
|
|
#include <stddef.h>
|
|
#include <uapi/uio.h>
|
|
|
|
typedef struct __iovec iovec_t;
|
|
|
|
struct iovec_iter {
|
|
iovec_t* iovecs;
|
|
size_t iovecs_len;
|
|
size_t total_len;
|
|
size_t total_offset;
|
|
size_t current_idx;
|
|
size_t current_offset;
|
|
};
|
|
|
|
static inline size_t iovec_iter_len(struct iovec_iter* iter) {
|
|
return iter->total_len - iter->total_offset;
|
|
}
|
|
|
|
// Creates an iovec iterator over kernel memory.
|
|
static inline struct iovec_iter iovec_iter_kernel(iovec_t* iovecs, size_t count) {
|
|
size_t total = 0;
|
|
for (size_t i = 0; i < count; i++)
|
|
total += iovecs[i].len;
|
|
|
|
return (struct iovec_iter){
|
|
.iovecs = iovecs,
|
|
.iovecs_len = count,
|
|
.total_len = total,
|
|
.total_offset = 0,
|
|
.current_idx = 0,
|
|
.current_offset = 0,
|
|
};
|
|
}
|