1/*	$NetBSD: vmbuf.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
2
3/*	$KAME: vmbuf.c,v 1.11 2001/11/26 16:54:29 sakane Exp $	*/
4
5/*
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include "config.h"
35
36#define NONEED_DRM
37
38#include <sys/types.h>
39#include <sys/param.h>
40
41#include <stdlib.h>
42#include <stdio.h>
43#include <string.h>
44
45#include "var.h"
46#include "misc.h"
47#include "vmbuf.h"
48#include "debug.h"
49#include "plog.h"
50#include "gcmalloc.h"
51
52vchar_t *
53vmalloc(size)
54	size_t size;
55{
56	vchar_t *var;
57
58	if ((var = (vchar_t *)racoon_malloc(sizeof(*var))) == NULL)
59		return NULL;
60
61	var->l = size;
62	if (size == 0) {
63		var->v = NULL;
64	} else {
65		var->v = (caddr_t)racoon_calloc(1, size);
66		if (var->v == NULL) {
67			(void)racoon_free(var);
68			return NULL;
69		}
70	}
71
72	return var;
73}
74
75vchar_t *
76vrealloc(ptr, size)
77	vchar_t *ptr;
78	size_t size;
79{
80	caddr_t v;
81
82	if (ptr != NULL) {
83		if (ptr->l == 0) {
84			(void)vfree(ptr);
85			return vmalloc(size); /* zero-fill it? */
86		}
87
88		if ((v = (caddr_t)racoon_realloc(ptr->v, size)) == NULL) {
89			(void)vfree(ptr);
90			return NULL;
91		}
92
93		if ( size > ptr->l)
94			memset(v + ptr->l, 0, size - ptr->l);
95		ptr->v = v;
96		ptr->l = size;
97	} else {
98		if ((ptr = vmalloc(size)) == NULL)
99			return NULL;
100	}
101
102	return ptr;
103}
104
105void
106vfree(var)
107	vchar_t *var;
108{
109	if (var == NULL)
110		return;
111
112	if (var->v)
113		(void)racoon_free(var->v);
114
115	(void)racoon_free(var);
116
117	return;
118}
119
120vchar_t *
121vdup(src)
122	vchar_t *src;
123{
124	vchar_t *new;
125
126	if (src == NULL) {
127		plog(LLV_ERROR, LOCATION, NULL, "vdup(NULL) called\n");
128		return NULL;
129	}
130
131	if ((new = vmalloc(src->l)) == NULL)
132		return NULL;
133
134	memcpy(new->v, src->v, src->l);
135
136	return new;
137}
138