xref: /freebsd/lib/libc/gen/aio_read2.c (revision 06cb1c3f9528f088bdaf10d28dcfe7eeaad726d3)
1*06cb1c3fSKonstantin Belousov /*-
2*06cb1c3fSKonstantin Belousov  * SPDX-License-Identifier: BSD-2-Clause
3*06cb1c3fSKonstantin Belousov  *
4*06cb1c3fSKonstantin Belousov  * Copyright (c) 2024 The FreeBSD Foundation
5*06cb1c3fSKonstantin Belousov  *
6*06cb1c3fSKonstantin Belousov  * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
7*06cb1c3fSKonstantin Belousov  * under sponsorship from the FreeBSD Foundation.
8*06cb1c3fSKonstantin Belousov  *
9*06cb1c3fSKonstantin Belousov  * Redistribution and use in source and binary forms, with or without
10*06cb1c3fSKonstantin Belousov  * modification, are permitted provided that the following conditions
11*06cb1c3fSKonstantin Belousov  * are met:
12*06cb1c3fSKonstantin Belousov  * 1. Redistributions of source code must retain the above copyright
13*06cb1c3fSKonstantin Belousov  *    notice, this list of conditions and the following disclaimer.
14*06cb1c3fSKonstantin Belousov  * 2. Redistributions in binary form must reproduce the above copyright
15*06cb1c3fSKonstantin Belousov  *    notice, this list of conditions and the following disclaimer in the
16*06cb1c3fSKonstantin Belousov  *    documentation and/or other materials provided with the distribution.
17*06cb1c3fSKonstantin Belousov  *
18*06cb1c3fSKonstantin Belousov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19*06cb1c3fSKonstantin Belousov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*06cb1c3fSKonstantin Belousov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*06cb1c3fSKonstantin Belousov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22*06cb1c3fSKonstantin Belousov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*06cb1c3fSKonstantin Belousov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*06cb1c3fSKonstantin Belousov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*06cb1c3fSKonstantin Belousov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26*06cb1c3fSKonstantin Belousov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27*06cb1c3fSKonstantin Belousov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28*06cb1c3fSKonstantin Belousov  * SUCH DAMAGE.
29*06cb1c3fSKonstantin Belousov  */
30*06cb1c3fSKonstantin Belousov 
31*06cb1c3fSKonstantin Belousov #include <sys/aio.h>
32*06cb1c3fSKonstantin Belousov #include <errno.h>
33*06cb1c3fSKonstantin Belousov #include <stddef.h>
34*06cb1c3fSKonstantin Belousov 
35*06cb1c3fSKonstantin Belousov int
36*06cb1c3fSKonstantin Belousov aio_read2(struct aiocb *iocb, int flags)
37*06cb1c3fSKonstantin Belousov {
38*06cb1c3fSKonstantin Belousov 	int error;
39*06cb1c3fSKonstantin Belousov 
40*06cb1c3fSKonstantin Belousov 	if ((flags & ~(AIO_OP2_FOFFSET)) != 0) {
41*06cb1c3fSKonstantin Belousov 		errno = EINVAL;
42*06cb1c3fSKonstantin Belousov 		return (-1);
43*06cb1c3fSKonstantin Belousov 	}
44*06cb1c3fSKonstantin Belousov 	iocb->aio_lio_opcode = LIO_READ;
45*06cb1c3fSKonstantin Belousov 	if ((flags & AIO_OP2_FOFFSET) != 0)
46*06cb1c3fSKonstantin Belousov 		iocb->aio_lio_opcode |= LIO_FOFFSET;
47*06cb1c3fSKonstantin Belousov 
48*06cb1c3fSKonstantin Belousov 	error = lio_listio(LIO_NOWAIT, &iocb, 1, NULL);
49*06cb1c3fSKonstantin Belousov 	if (error == -1 && errno == EIO) {
50*06cb1c3fSKonstantin Belousov 		error = aio_error(iocb);
51*06cb1c3fSKonstantin Belousov 		if (error != -1 && error != 0)
52*06cb1c3fSKonstantin Belousov 			errno = error;
53*06cb1c3fSKonstantin Belousov 		error = -1;
54*06cb1c3fSKonstantin Belousov 	}
55*06cb1c3fSKonstantin Belousov 	return (error);
56*06cb1c3fSKonstantin Belousov }
57