xref: /aosp_15_r20/external/kmod/shared/scratchbuf.c (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker  * kmod - interface to kernel module operations
3*cc4ad7daSAndroid Build Coastguard Worker  *
4*cc4ad7daSAndroid Build Coastguard Worker  * Copyright (C) 2016  Intel Corporation. All rights reserved.
5*cc4ad7daSAndroid Build Coastguard Worker  *
6*cc4ad7daSAndroid Build Coastguard Worker  * This library is free software; you can redistribute it and/or
7*cc4ad7daSAndroid Build Coastguard Worker  * modify it under the terms of the GNU Lesser General Public
8*cc4ad7daSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation; either
9*cc4ad7daSAndroid Build Coastguard Worker  * version 2.1 of the License, or (at your option) any later version.
10*cc4ad7daSAndroid Build Coastguard Worker  *
11*cc4ad7daSAndroid Build Coastguard Worker  * This library is distributed in the hope that it will be useful,
12*cc4ad7daSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*cc4ad7daSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*cc4ad7daSAndroid Build Coastguard Worker  * Lesser General Public License for more details.
15*cc4ad7daSAndroid Build Coastguard Worker  *
16*cc4ad7daSAndroid Build Coastguard Worker  * You should have received a copy of the GNU Lesser General Public
17*cc4ad7daSAndroid Build Coastguard Worker  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*cc4ad7daSAndroid Build Coastguard Worker  */
19*cc4ad7daSAndroid Build Coastguard Worker #include "scratchbuf.h"
20*cc4ad7daSAndroid Build Coastguard Worker 
21*cc4ad7daSAndroid Build Coastguard Worker #include <errno.h>
22*cc4ad7daSAndroid Build Coastguard Worker #include <string.h>
23*cc4ad7daSAndroid Build Coastguard Worker 
scratchbuf_init(struct scratchbuf * buf,char * stackbuf,size_t size)24*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_init(struct scratchbuf *buf, char *stackbuf, size_t size)
25*cc4ad7daSAndroid Build Coastguard Worker {
26*cc4ad7daSAndroid Build Coastguard Worker 	buf->bytes = stackbuf;
27*cc4ad7daSAndroid Build Coastguard Worker 	buf->size = size;
28*cc4ad7daSAndroid Build Coastguard Worker 	buf->need_free = false;
29*cc4ad7daSAndroid Build Coastguard Worker }
30*cc4ad7daSAndroid Build Coastguard Worker 
scratchbuf_alloc(struct scratchbuf * buf,size_t size)31*cc4ad7daSAndroid Build Coastguard Worker int scratchbuf_alloc(struct scratchbuf *buf, size_t size)
32*cc4ad7daSAndroid Build Coastguard Worker {
33*cc4ad7daSAndroid Build Coastguard Worker 	char *tmp;
34*cc4ad7daSAndroid Build Coastguard Worker 
35*cc4ad7daSAndroid Build Coastguard Worker 	if (size <= buf->size)
36*cc4ad7daSAndroid Build Coastguard Worker 		return 0;
37*cc4ad7daSAndroid Build Coastguard Worker 
38*cc4ad7daSAndroid Build Coastguard Worker 	if (buf->need_free) {
39*cc4ad7daSAndroid Build Coastguard Worker 		tmp = realloc(buf->bytes, size);
40*cc4ad7daSAndroid Build Coastguard Worker 		if (tmp == NULL)
41*cc4ad7daSAndroid Build Coastguard Worker 			return -ENOMEM;
42*cc4ad7daSAndroid Build Coastguard Worker 	} else {
43*cc4ad7daSAndroid Build Coastguard Worker 		tmp = malloc(size);
44*cc4ad7daSAndroid Build Coastguard Worker 		if (tmp == NULL)
45*cc4ad7daSAndroid Build Coastguard Worker 			return -ENOMEM;
46*cc4ad7daSAndroid Build Coastguard Worker 		memcpy(tmp, buf->bytes, buf->size);
47*cc4ad7daSAndroid Build Coastguard Worker 	}
48*cc4ad7daSAndroid Build Coastguard Worker 
49*cc4ad7daSAndroid Build Coastguard Worker 	buf->size = size;
50*cc4ad7daSAndroid Build Coastguard Worker 	buf->bytes = tmp;
51*cc4ad7daSAndroid Build Coastguard Worker 	buf->need_free = true;
52*cc4ad7daSAndroid Build Coastguard Worker 
53*cc4ad7daSAndroid Build Coastguard Worker 	return 0;
54*cc4ad7daSAndroid Build Coastguard Worker }
55*cc4ad7daSAndroid Build Coastguard Worker 
scratchbuf_release(struct scratchbuf * buf)56*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_release(struct scratchbuf *buf)
57*cc4ad7daSAndroid Build Coastguard Worker {
58*cc4ad7daSAndroid Build Coastguard Worker 	if (buf->need_free)
59*cc4ad7daSAndroid Build Coastguard Worker 		free(buf->bytes);
60*cc4ad7daSAndroid Build Coastguard Worker }
61