1/* 2 * Copyright 2005-2006, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 * 5 * Copyright 2001, Travis Geiselbrecht. All rights reserved. 6 * Distributed under the terms of the NewOS License. 7 */ 8 9 10#include "runtime_loader_private.h" 11 12#include <syscalls.h> 13 14#include <string.h> 15#include <stdio.h> 16#include <stdlib.h> 17#include <unistd.h> 18 19 20char *(*gGetEnv)(const char *name) = NULL; 21 22 23extern "C" char * 24getenv(const char *name) 25{ 26 if (gGetEnv != NULL) { 27 // Use libroot's getenv() as soon as it is available to us - the 28 // environment in gProgramArgs is static. 29 return gGetEnv(name); 30 } 31 32 char **environ = gProgramArgs->env; 33 int32 length = strlen(name); 34 int32 i; 35 36 for (i = 0; environ[i] != NULL; i++) { 37 if (!strncmp(name, environ[i], length) && environ[i][length] == '=') 38 return environ[i] + length + 1; 39 } 40 41 return NULL; 42} 43 44 45extern "C" int 46printf(const char *format, ...) 47{ 48 char buffer[1024]; 49 va_list args; 50 51 va_start(args, format); 52 int length = vsnprintf(buffer, sizeof(buffer), format, args); 53 va_end(args); 54 55 _kern_write(STDERR_FILENO, 0, buffer, length); 56 57 return length; 58} 59 60 61extern "C" void 62dprintf(const char *format, ...) 63{ 64 char buffer[1024]; 65 66 va_list list; 67 va_start(list, format); 68 69 vsnprintf(buffer, sizeof(buffer), format, list); 70 _kern_debug_output(buffer); 71 72 va_end(list); 73} 74 75#if __GNUC__ == 2 76extern "C" uint32 77__swap_int32(uint32 value) 78{ 79 return value >> 24 | ((value >> 8) & 0xff00) | value << 24 80 | ((value << 8) & 0xff0000); 81} 82#endif 83 84 85// Copied from libroot/os/thread.c: 86 87 88extern "C" status_t 89_get_thread_info(thread_id thread, thread_info *info, size_t size) 90{ 91 if (info == NULL || size != sizeof(thread_info)) 92 return B_BAD_VALUE; 93 94 return _kern_get_thread_info(thread, info); 95} 96 97 98extern "C" status_t 99snooze(bigtime_t timeout) 100{ 101 return B_ERROR; 102} 103 104 105/*! Mini atoi(), so we don't have to include the libroot dependencies. 106 */ 107extern "C" int 108atoi(const char* num) 109{ 110 int result = 0; 111 while (*num >= '0' && *num <= '9') { 112 result = (result * 10) + (*num - '0'); 113 num++; 114 } 115 116 return result; 117} 118 119 120#if RUNTIME_LOADER_TRACING 121 122extern "C" void 123ktrace_printf(const char *format, ...) 124{ 125 va_list list; 126 va_start(list, format); 127 128 char buffer[1024]; 129 vsnprintf(buffer, sizeof(buffer), format, list); 130 _kern_ktrace_output(buffer); 131 132 va_end(list); 133} 134 135#endif // RUNTIME_LOADER_TRACING 136