to liblinux. Set errno correctly.
#include <stdlib.h>
#include <unistd.h>
+#include <errno.h>
#include "libsys.h"
int brk(void* end)
{
- return _syscall(__NR_brk, (quad) end, 0, 0);
+ int e = _syscall(__NR_brk, (quad) end, 0, 0);
+ if (e == -1)
+ errno = ENOMEM;
+ return e;
}
-/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/sbrk.c,v $
- * $State: Exp $
- * $Revision: 1.1 $
+/* $Source$
+ * $State$
+ * $Revision$
*/
#include <stdlib.h>
-#include <stdio.h>
#include <unistd.h>
+#include <errno.h>
#include "libsys.h"
#define OUT_OF_MEMORY (void*)(-1) /* sbrk returns this on failure */
-extern char _end[1];
-
-static char* current = _end;
+static char* current = NULL;
void* sbrk(intptr_t increment)
{
char* old;
char* new;
+ char* actual;
+
+ if (!current)
+ current = (char*) _syscall(__NR_brk, 0, 0, 0);
if (increment == 0)
return current;
old = current;
new = old + increment;
- if (brk(new) < 0)
+
+ actual = (char*) _syscall(__NR_brk, (quad) new, 0, 0);
+ if (actual < new)
+ {
+ errno = ENOMEM;
return OUT_OF_MEMORY;
+ }
- current = new;
+ current = actual;
return old;
}