134192Sjdp/*-
234192Sjdp * Copyright 1996-1998 John D. Polstra.
334192Sjdp * All rights reserved.
434192Sjdp *
534192Sjdp * Redistribution and use in source and binary forms, with or without
634192Sjdp * modification, are permitted provided that the following conditions
734192Sjdp * are met:
834192Sjdp * 1. Redistributions of source code must retain the above copyright
934192Sjdp *    notice, this list of conditions and the following disclaimer.
1034192Sjdp * 2. Redistributions in binary form must reproduce the above copyright
1134192Sjdp *    notice, this list of conditions and the following disclaimer in the
1234192Sjdp *    documentation and/or other materials provided with the distribution.
1334192Sjdp *
1434192Sjdp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1534192Sjdp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1634192Sjdp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1734192Sjdp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1834192Sjdp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1934192Sjdp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2034192Sjdp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2134192Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2234192Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2334192Sjdp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2434192Sjdp *
2550476Speter * $FreeBSD$
2634192Sjdp */
2734192Sjdp
2834192Sjdp#include <stddef.h>
2934192Sjdp#include <stdlib.h>
3034192Sjdp#include <string.h>
31225152Skib#include <unistd.h>
32225152Skib#include "rtld.h"
33225152Skib#include "rtld_printf.h"
3434192Sjdp
3534192Sjdpvoid *
36233307Skibxcalloc(size_t number, size_t size)
3734192Sjdp{
38233307Skib	void *p;
39233307Skib
40233307Skib	p = calloc(number, size);
41233307Skib	if (p == NULL) {
42233307Skib		rtld_fdputstr(STDERR_FILENO, "Out of memory\n");
43233307Skib		_exit(1);
44233307Skib	}
45233307Skib	return (p);
4634192Sjdp}
4734192Sjdp
4834192Sjdpvoid *
4934192Sjdpxmalloc(size_t size)
5034192Sjdp{
5134192Sjdp    void *p = malloc(size);
52225152Skib    if (p == NULL) {
53225152Skib	rtld_fdputstr(STDERR_FILENO, "Out of memory\n");
54225152Skib	_exit(1);
55225152Skib    }
5634192Sjdp    return p;
5734192Sjdp}
5834192Sjdp
5934192Sjdpchar *
60233357Skibxstrdup(const char *str)
6134192Sjdp{
62233357Skib	char *copy;
63233357Skib	size_t len;
64233357Skib
65233357Skib	len = strlen(str) + 1;
66233357Skib	copy = xmalloc(len);
67233357Skib	memcpy(copy, str, len);
68233357Skib	return (copy);
6934192Sjdp}
70259043Skib
71259043Skibvoid *
72259043Skibmalloc_aligned(size_t size, size_t align)
73259043Skib{
74259043Skib	void *mem, *res;
75259043Skib
76262334Sdavidxu	if (align < sizeof(void *))
77262334Sdavidxu		align = sizeof(void *);
78262277Sdavidxu
79262277Sdavidxu	mem = xmalloc(size + sizeof(void *) + align - 1);
80262277Sdavidxu	res = (void *)round((uintptr_t)mem + sizeof(void *), align);
81259043Skib	*(void **)((uintptr_t)res - sizeof(void *)) = mem;
82259043Skib	return (res);
83259043Skib}
84259043Skib
85259043Skibvoid
86259043Skibfree_aligned(void *ptr)
87259043Skib{
88259043Skib	void *mem;
89259043Skib	uintptr_t x;
90259043Skib
91259043Skib	if (ptr == NULL)
92259043Skib		return;
93259043Skib	x = (uintptr_t)ptr;
94259043Skib	x -= sizeof(void *);
95259043Skib	mem = *(void **)x;
96259043Skib	free(mem);
97259043Skib}
98