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