annotate buffer_const.c @ 261:6795f8427fed

buffer: allow buffer truncation This is a similar idea to the POSIX truncate() function. It sets the used buffer size to a certain value. If the new size is larger than the old size, the newly visible bytes are zeroed out. If the new size is smaller than the old size, the bytes at the end are "lost" but the underlying buffer allocation remains unchanged. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Tue, 11 Jul 2017 00:39:14 +0300
parents f82b45b662c9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
2 * Copyright (c) 2017 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #include "buffer_impl.h"
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25 static int const_buffer_check_append(struct buffer *buffer, const void *data,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 size_t size)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28 return -EROFS;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
31 static int const_buffer_check_truncate(struct buffer *buffer, size_t size)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
32 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
33 return -EROFS;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
34 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
35
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 const struct buffer_ops const_buffer = {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37 .check_append = const_buffer_check_append,
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
38 .check_truncate = const_buffer_check_truncate,
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
39
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40 /*
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41 * no need for:
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42 * - realloc since we have a borrowed const buffer
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
43 * - free since we have a borrowed const buffer
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
44 */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
45
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
46 .clear = generic_buffer_clear_panic,
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
47 .copyin = generic_buffer_copyin_panic,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48 };