tools/lib/api/io.h

Source file repositories/reference/linux-study-clean/tools/lib/api/io.h

File Facts

System
Linux kernel
Corpus path
tools/lib/api/io.h
Extension
.h
Size
4338 bytes
Lines
202
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct io {
	/* File descriptor being read/ */
	int fd;
	/* Size of the read buffer. */
	unsigned int buf_len;
	/* Pointer to storage for buffering read. */
	char *buf;
	/* End of the storage. */
	char *end;
	/* Currently accessed data pointer. */
	char *data;
	/* Read timeout, 0 implies no timeout. */
	int timeout_ms;
	/* Set true on when the end of file on read error. */
	bool eof;
};

static inline void io__init(struct io *io, int fd,
			    char *buf, unsigned int buf_len)
{
	io->fd = fd;
	io->buf_len = buf_len;
	io->buf = buf;
	io->end = buf;
	io->data = buf;
	io->timeout_ms = 0;
	io->eof = false;
}

/* Read from fd filling the buffer. Called when io->data == io->end. */
static inline int io__fill_buffer(struct io *io)
{
	ssize_t n;

	if (io->eof)
		return -1;

	if (io->timeout_ms != 0) {
		struct pollfd pfds[] = {
			{
				.fd = io->fd,
				.events = POLLIN,
			},
		};

		n = poll(pfds, 1, io->timeout_ms);
		if (n == 0)
			errno = ETIMEDOUT;
		if (n > 0 && !(pfds[0].revents & POLLIN)) {
			errno = EIO;
			n = -1;
		}
		if (n <= 0) {
			io->eof = true;
			return -1;
		}
	}
	n = read(io->fd, io->buf, io->buf_len);

	if (n <= 0) {
		io->eof = true;
		return -1;
	}
	io->data = &io->buf[0];
	io->end = &io->buf[n];
	return 0;
}

/* Reads one character from the "io" file with similar semantics to fgetc. */
static inline int io__get_char(struct io *io)
{
	if (io->data == io->end) {
		int ret = io__fill_buffer(io);

		if (ret)
			return ret;
	}
	return *io->data++;
}

/* Read a hexadecimal value with no 0x prefix into the out argument hex. If the
 * first character isn't hexadecimal returns -2, io->eof returns -1, otherwise
 * returns the character after the hexadecimal value which may be -1 for eof.
 * If the read value is larger than a u64 the high-order bits will be dropped.
 */
static inline int io__get_hex(struct io *io, __u64 *hex)
{
	bool first_read = true;

	*hex = 0;

Annotation

Implementation Notes