annotate buffer_static.c @ 712:8295148e8f44

buffer: rename internal 'used' member to a more obvious name It really keeps track of the number of readable bytes in the buffer. In other words, it keeps track of the size - hence the new name. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Tue, 19 Mar 2019 14:43:26 -0400
parents 0fa2f6606c5e
children 1c4d7ff0a682
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 /*
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 611
diff changeset
2 * Copyright (c) 2017-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
256
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
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
25 /*
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
26 * Static buffers
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
27 *
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
28 * Since we have a borrowed buffer we must never allow:
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
29 *
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
30 * - resizing of the buffer
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
31 * - freeing of the buffer
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
32 *
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
33 * Conveniently, if we leave the realloc op NULL, the generic code returns
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
34 * -ENOTSUP for us. Leaving the free op NULL turns it into a no-op.
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
35 *
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
36 * There is a slight difference between the read-only and read-write
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
37 * variants. Namely, the read-only variant does not support *any* writes or
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
38 * changes to the (apparent) buffer size. In both cases, -EROFS is
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
39 * returned. The read-write variant allows changes to the amount of used
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
40 * space, truncation, etc. as long as the result fits within the borrowed
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
41 * buffer.
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
42 */
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
43
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
44 static int static_buffer_check_append_ro(struct buffer *buffer, const void *data,
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
45 size_t size)
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
46 {
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
47 return -EROFS;
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
48 }
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
49
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
50 static int static_buffer_check_append_rw(struct buffer *buffer, const void *data,
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
51 size_t size)
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 {
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 611
diff changeset
53 if ((buffer->size + size) <= buffer->allocsize)
562
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
54 return 0;
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
55
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
56 return -ENOSPC;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
57 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
58
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
59 static int static_buffer_check_truncate_ro(struct buffer *buffer, size_t size)
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
60 {
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
61 return -EROFS;
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
62 }
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
63
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
64 static int static_buffer_check_truncate_rw(struct buffer *buffer, size_t size)
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
65 {
562
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
66 if (size <= buffer->allocsize)
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
67 return 0;
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
68
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
69 return -ENOSPC;
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
70 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
71
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
72 static int static_buffer_check_write_ro(struct buffer *buffer, const void *buf,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
73 size_t len, size_t off)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
74 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
75 return -EROFS;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
76 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
77
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
78 static int static_buffer_check_write_rw(struct buffer *buffer, const void *buf,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
79 size_t len, size_t off)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
80 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
81 if ((off + len) <= buffer->allocsize)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
82 return 0;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
83
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
84 return -ENOSPC;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
85 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
86
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
87 /* a read-only static buffer */
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
88 const struct buffer_ops static_buffer_ro = {
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
89 .check_append = static_buffer_check_append_ro,
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
90 .check_truncate = static_buffer_check_truncate_ro,
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
91 .check_write = static_buffer_check_write_ro,
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
92
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
93 .clear = generic_buffer_clear_panic,
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
94 .copyin = generic_buffer_copyin_panic,
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
95 .copyout = generic_buffer_copyout_memcpy,
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
96 };
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
97
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
98 /* a read-write static buffer */
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
99 const struct buffer_ops static_buffer_rw = {
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
100 .check_append = static_buffer_check_append_rw,
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
101 .check_truncate = static_buffer_check_truncate_rw,
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
102 .check_write = static_buffer_check_write_rw,
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
103
562
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
104 .clear = generic_buffer_clear_memset,
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
105 .copyin = generic_buffer_copyin_memcpy,
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
106 .copyout = generic_buffer_copyout_memcpy,
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
107 };