10a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $NetBSD: vmbuf.c,v 1.4 2006/09/09 16:22:10 manu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $KAME: vmbuf.c,v 1.11 2001/11/26 16:54:29 sakane Exp $ */ 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved. 80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without 100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions 110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met: 120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright 130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer. 140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright 150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer in the 160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * documentation and/or other materials provided with the distribution. 170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors 180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * may be used to endorse or promote products derived from this software 190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * without specific prior written permission. 200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE. 320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define NONEED_DRM 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h> 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h" 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h" 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h" 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h" 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvmalloc(size) 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t size; 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *var; 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((var = (vchar_t *)racoon_malloc(sizeof(*var))) == NULL) 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang var->l = size; 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (size == 0) { 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang var->v = NULL; 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang var->v = (caddr_t)racoon_calloc(1, size); 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (var->v == NULL) { 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void)racoon_free(var); 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return var; 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvrealloc(ptr, size) 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *ptr; 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t size; 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t v; 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ptr != NULL) { 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ptr->l == 0) { 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void)vfree(ptr); 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return vmalloc(size); /* zero-fill it? */ 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((v = (caddr_t)racoon_realloc(ptr->v, size)) == NULL) { 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void)vfree(ptr); 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ( size > ptr->l) 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(v + ptr->l, 0, size - ptr->l); 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ptr->v = v; 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ptr->l = size; 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((ptr = vmalloc(size)) == NULL) 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return ptr; 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvfree(var) 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *var; 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (var == NULL) 1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (var->v) 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void)racoon_free(var->v); 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void)racoon_free(var); 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvdup(src) 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *src; 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *new; 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (src == NULL) { 1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "vdup(NULL) called\n"); 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((new = vmalloc(src->l)) == NULL) 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(new->v, src->v, src->l); 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return new; 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 138