Annotation of libaitio/src/aio.c, revision 1.2.8.1
1.2.8.1 ! misho 1: /*************************************************************************
! 2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
! 3: * by Michael Pounov <misho@openbsd-bg.org>
! 4: *
! 5: * $Author: misho $
! 6: * $Id: aitio.c,v 1.4 2011/04/19 20:00:31 misho Exp $
! 7: *
! 8: *************************************************************************/
1.2 misho 9: #include "global.h"
10:
11:
12: /*
13: * io_rread() Raw VFS read function
14: * @fd = File handle
15: * @buf = Read buffer
16: * @nbytes = Read buffer size
17: * @offset = Read from position, if -1 read nbytes from current position
18: * @update = Update file handle position !0
19: * return: -1 error or !=-1 readed bytes
20: */
21: inline int
22: io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
23: {
24: int ret;
25: #ifdef AIO_OPS
26: off_t old = 0;
27: struct aiocb acb;
28: #endif
29:
30: if (!buf) {
31: io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
32: return -1;
33: }
34: if (!nbytes)
35: return 0;
36: if (offset == -1) {
37: offset = lseek(fd, 0, SEEK_CUR);
38: if (offset == -1) {
39: LOGERR;
40: return -1;
41: }
42: }
43:
44: #ifdef AIO_OPS
45: /* This made for generate EOF for file */
46: if (!update && (old = lseek(fd, 0, SEEK_CUR)) == -1) {
47: LOGERR;
48: return -1;
49: }
50: if (offset >= lseek(fd, 0, SEEK_END))
51: return 0;
52: if (!update)
53: lseek(fd, old, SEEK_SET);
54:
55: memset(buf, 0, nbytes);
56: memset(&acb, 0, sizeof acb);
57: acb.aio_fildes = fd;
58: acb.aio_nbytes = nbytes;
59: acb.aio_buf = buf;
60: acb.aio_offset = offset;
61:
62: if (aio_read(&acb) == -1) {
63: LOGERR;
64: return -1;
65: }
66:
67: while (aio_error(&acb) == EINPROGRESS);
68: ret = aio_return(&acb);
69: if (ret == -1) {
70: LOGERR;
71: return -1;
72: } else
73: ret = acb.aio_nbytes;
74: #else
75: ret = pread(fd, buf, nbytes, offset);
76: if (ret == -1) {
77: LOGERR;
78: return -1;
79: }
80: #endif
81:
82: if (update)
83: lseek(fd, offset + ret, SEEK_SET);
84:
85: return ret;
86: }
87:
88: /*
89: * io_rwrite() Raw VFS write function
90: * @fd = File handle
91: * @buf = Write buffer
92: * @nbytes = Write bytes from buffer
93: * @offset = Write at position, if -1 write nbytes from current position
94: * @update = Update file handle position !0
95: * return: -1 error or !=-1 writed bytes
96: */
97: inline int
98: io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
99: {
100: int ret;
101: #ifdef AIO_OPS
102: struct aiocb acb;
103: #endif
104:
105: if (!buf) {
106: io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
107: return -1;
108: }
109: if (!nbytes)
110: return 0;
111: if (offset == -1) {
112: offset = lseek(fd, 0, SEEK_CUR);
113: if (offset == -1) {
114: LOGERR;
115: return -1;
116: }
117: }
118:
119: #ifdef AIO_OPS
120: memset(&acb, 0, sizeof acb);
121: acb.aio_fildes = fd;
122: acb.aio_nbytes = nbytes;
123: acb.aio_buf = buf;
124: acb.aio_offset = offset;
125:
126: if (aio_write(&acb) == -1) {
127: LOGERR;
128: return -1;
129: }
130:
131: while (aio_error(&acb) == EINPROGRESS);
132: ret = aio_return(&acb);
133: if (ret == -1) {
134: LOGERR;
135: return -1;
136: } else
137: ret = acb.aio_nbytes;
138: #else
139: ret = pwrite(fd, buf, nbytes, offset);
140: if (ret == -1) {
141: LOGERR;
142: return -1;
143: }
144: #endif
145:
146: if (update)
147: lseek(fd, offset + ret, SEEK_SET);
148:
149:
150: return ret;
151: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>