Annotation of libaitio/src/aio.c, revision 1.2.8.3
1.2.8.1 misho 1: /*************************************************************************
1.2.8.2 misho 2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
1.2.8.1 misho 4: *
5: * $Author: misho $
1.2.8.3 ! misho 6: * $Id: aio.c,v 1.2.8.2 2011/04/19 22:32:16 misho Exp $
1.2.8.1 misho 7: *
1.2.8.2 misho 8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
1.2.8.3 ! misho 30: 4. Neither the name of AITNET nor the names of its contributors
1.2.8.2 misho 31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
1.2.8.3 ! misho 34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
1.2.8.2 misho 35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
1.2 misho 46: #include "global.h"
47:
48:
49: /*
50: * io_rread() Raw VFS read function
51: * @fd = File handle
52: * @buf = Read buffer
53: * @nbytes = Read buffer size
54: * @offset = Read from position, if -1 read nbytes from current position
55: * @update = Update file handle position !0
56: * return: -1 error or !=-1 readed bytes
57: */
58: inline int
59: io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
60: {
61: int ret;
62: #ifdef AIO_OPS
63: off_t old = 0;
64: struct aiocb acb;
65: #endif
66:
67: if (!buf) {
68: io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
69: return -1;
70: }
71: if (!nbytes)
72: return 0;
73: if (offset == -1) {
74: offset = lseek(fd, 0, SEEK_CUR);
75: if (offset == -1) {
76: LOGERR;
77: return -1;
78: }
79: }
80:
81: #ifdef AIO_OPS
82: /* This made for generate EOF for file */
83: if (!update && (old = lseek(fd, 0, SEEK_CUR)) == -1) {
84: LOGERR;
85: return -1;
86: }
87: if (offset >= lseek(fd, 0, SEEK_END))
88: return 0;
89: if (!update)
90: lseek(fd, old, SEEK_SET);
91:
92: memset(buf, 0, nbytes);
93: memset(&acb, 0, sizeof acb);
94: acb.aio_fildes = fd;
95: acb.aio_nbytes = nbytes;
96: acb.aio_buf = buf;
97: acb.aio_offset = offset;
98:
99: if (aio_read(&acb) == -1) {
100: LOGERR;
101: return -1;
102: }
103:
104: while (aio_error(&acb) == EINPROGRESS);
105: ret = aio_return(&acb);
106: if (ret == -1) {
107: LOGERR;
108: return -1;
109: } else
110: ret = acb.aio_nbytes;
111: #else
112: ret = pread(fd, buf, nbytes, offset);
113: if (ret == -1) {
114: LOGERR;
115: return -1;
116: }
117: #endif
118:
119: if (update)
120: lseek(fd, offset + ret, SEEK_SET);
121:
122: return ret;
123: }
124:
125: /*
126: * io_rwrite() Raw VFS write function
127: * @fd = File handle
128: * @buf = Write buffer
129: * @nbytes = Write bytes from buffer
130: * @offset = Write at position, if -1 write nbytes from current position
131: * @update = Update file handle position !0
132: * return: -1 error or !=-1 writed bytes
133: */
134: inline int
135: io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
136: {
137: int ret;
138: #ifdef AIO_OPS
139: struct aiocb acb;
140: #endif
141:
142: if (!buf) {
143: io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
144: return -1;
145: }
146: if (!nbytes)
147: return 0;
148: if (offset == -1) {
149: offset = lseek(fd, 0, SEEK_CUR);
150: if (offset == -1) {
151: LOGERR;
152: return -1;
153: }
154: }
155:
156: #ifdef AIO_OPS
157: memset(&acb, 0, sizeof acb);
158: acb.aio_fildes = fd;
159: acb.aio_nbytes = nbytes;
160: acb.aio_buf = buf;
161: acb.aio_offset = offset;
162:
163: if (aio_write(&acb) == -1) {
164: LOGERR;
165: return -1;
166: }
167:
168: while (aio_error(&acb) == EINPROGRESS);
169: ret = aio_return(&acb);
170: if (ret == -1) {
171: LOGERR;
172: return -1;
173: } else
174: ret = acb.aio_nbytes;
175: #else
176: ret = pwrite(fd, buf, nbytes, offset);
177: if (ret == -1) {
178: LOGERR;
179: return -1;
180: }
181: #endif
182:
183: if (update)
184: lseek(fd, offset + ret, SEEK_SET);
185:
186:
187: return ret;
188: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>