sel_ldr: Remove support for rodata segment at start of executable
[nativeclient.git] / service_runtime / gio_mem.c
blobbee85101d5b22eedb4ad05739d7a2cc3d2e66504
1 /*
2 * Copyright 2008, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 * NaCl Generic I/O interface implementation: memory buffer-based I/O.
35 #include "native_client/include/portability.h"
37 #include <string.h>
38 #include <errno.h>
40 #include "native_client/service_runtime/gio.h"
43 * Memory file is just read/write from/to an in-memory buffer. Once
44 * the buffer is consumed, there is no refilling/flushing.
47 struct GioVtbl const kGioMemoryFileVtbl = {
48 GioMemoryFileRead,
49 GioMemoryFileWrite,
50 GioMemoryFileSeek,
51 GioMemoryFileFlush,
52 GioMemoryFileClose,
53 GioMemoryFileDtor,
56 int GioMemoryFileCtor(struct GioMemoryFile *self,
57 char *buffer,
58 size_t len)
60 self->buffer = buffer;
61 self->len = len;
62 self->curpos = 0;
64 self->base.vtbl = &kGioMemoryFileVtbl;
65 return 1;
68 int GioMemoryFileRead(struct Gio *vself,
69 void *buf,
70 size_t count)
72 struct GioMemoryFile *self = (struct GioMemoryFile *) vself;
73 size_t remain;
74 size_t newpos;
76 /* is size_t signed? */
77 if (count < 0) {
78 errno = EINVAL;
79 return -1;
82 /* 0 <= self->curpos && self->curpos <= self->len */
83 remain = self->len - self->curpos;
84 /* 0 <= remain <= self->len */
85 if (count > remain) {
86 count = remain;
88 /* 0 <= count && count <= remain */
89 if (0 == count) {
90 return 0;
92 newpos = self->curpos + count;
93 /* self->curpos <= newpos && newpos <= self->len */
95 memcpy(buf, self->buffer + self->curpos, count);
96 self->curpos = newpos;
97 return count;
100 int GioMemoryFileWrite(struct Gio *vself,
101 void *buf,
102 size_t count)
104 struct GioMemoryFile *self = (struct GioMemoryFile *) vself;
105 size_t remain;
106 size_t newpos;
108 /* is size_t signed? */
109 if (count < 0) {
110 errno = EINVAL;
111 return -1;
114 /* 0 <= self->curpos && self->curpos <= self->len */
115 remain = self->len - self->curpos;
116 /* 0 <= remain <= self->len */
117 if (count > remain) {
118 count = remain;
120 /* 0 <= count && count <= remain */
121 if (0 == count) {
122 return 0;
124 newpos = self->curpos + count;
125 /* self->curpos <= newpos && newpos <= self->len */
127 memcpy(self->buffer + self->curpos, buf, count);
128 self->curpos = newpos;
129 /* we never extend a memory file */
130 return count;
133 off_t GioMemoryFileSeek(struct Gio *vself,
134 off_t offset,
135 int whence)
137 struct GioMemoryFile *self = (struct GioMemoryFile *) vself;
138 size_t new_pos;
140 switch (whence) {
141 case SEEK_SET:
142 new_pos = offset;
143 break;
144 case SEEK_CUR:
145 new_pos = self->curpos + offset;
146 break;
147 case SEEK_END:
148 new_pos = self->len + offset;
149 break;
150 default:
151 errno = EINVAL;
152 return -1;
154 if (new_pos < 0 || new_pos > self->len) {
155 errno = EINVAL;
156 return -1;
158 self->curpos = new_pos;
159 return new_pos;
162 int GioMemoryFileClose(struct Gio *vself)
164 return 0;
167 int GioMemoryFileFlush(struct Gio *vself)
169 return 0;
172 void GioMemoryFileDtor(struct Gio *vself)
174 return;