#include <config.h>
#include <unistd.h>
#include <errno.h>
#if defined (HAVE_BRK) && !defined (HAVE_SBRK)
static void *initialbrk;
static void *curbrk;
static int
initbrk (void)
{
if (initialbrk == 0)
{
void *b;
b = brk (NULL);
if (b == (void *)-1)
return -1;
initialbrk = curbrk = b;
}
return (0);
}
void *
sbrk (intptr_t incr)
{
void *newbrk, *oldbrk;
if (initialbrk == 0 && initbrk () == -1)
{
errno = ENOMEM;
return (void *)-1;
}
if (incr == 0)
return curbrk;
if ((incr > 0 && (uintptr_t) curbrk + incr < (uintptr_t) curbrk) ||
(incr < 0 && (uintptr_t) curbrk + incr > (uintptr_t) curbrk))
{
errno = ENOMEM;
return (void *)-1;
}
newbrk = curbrk + incr;
if (newbrk < initialbrk)
{
errno = EINVAL;
return (void *)-1;
}
if (brk (newbrk) == (void *)-1)
return (void *)-1;
oldbrk = curbrk;
curbrk = newbrk;
return (oldbrk);
}
#endif