parent
3d212b0252
commit
f1282c1133
@ -0,0 +1,65 @@
|
|||||||
|
#define __LIBRARY__
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define EINVAL 4
|
||||||
|
|
||||||
|
extern char ** environ;
|
||||||
|
#define __environ environ
|
||||||
|
|
||||||
|
char * ___strtok;
|
||||||
|
volatile int errno;
|
||||||
|
|
||||||
|
_syscall1(int,setup,void *,BIOS)
|
||||||
|
|
||||||
|
volatile void exit(int exit_code)
|
||||||
|
{
|
||||||
|
__asm__("int $0x80"::"a" (__NR_exit),"b" (exit_code));
|
||||||
|
while(1); /* to avoid warning of compiler */
|
||||||
|
}
|
||||||
|
|
||||||
|
extern char _end;
|
||||||
|
void * ___brk_addr = &_end;
|
||||||
|
|
||||||
|
int brk(void * end_data_segment)
|
||||||
|
{
|
||||||
|
long __res;
|
||||||
|
__asm__ volatile ("int $0x80"
|
||||||
|
: "=a" (__res)
|
||||||
|
: "0" (__NR_brk),"b" ((long)(end_data_segment)));
|
||||||
|
if (__res >= 0) {
|
||||||
|
___brk_addr = end_data_segment;
|
||||||
|
return (int) __res;
|
||||||
|
}
|
||||||
|
errno = -__res;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * sbrk(ptrdiff_t increment)
|
||||||
|
{
|
||||||
|
char *oldbrk;
|
||||||
|
|
||||||
|
if (increment == 0)
|
||||||
|
return ___brk_addr;
|
||||||
|
|
||||||
|
oldbrk = ___brk_addr;
|
||||||
|
if (brk(oldbrk + increment) < 0)
|
||||||
|
return (char *) -1;
|
||||||
|
|
||||||
|
return oldbrk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the value of the environment variable NAME. */
|
||||||
|
char * getenv(register const char *name)
|
||||||
|
{
|
||||||
|
register const size_t len = strlen(name);
|
||||||
|
register char **ep;
|
||||||
|
|
||||||
|
for (ep = __environ; *ep != NULL; ++ep)
|
||||||
|
if (!strncmp(*ep, name, len) && (*ep)[len] == '=')
|
||||||
|
return &(*ep)[len + 1];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
Loading…
Reference in new issue