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
76extern "C" uint32
77__swap_int32(uint32 value)
78{
79	return value >> 24 | ((value >> 8) & 0xff00) | value << 24
80		| ((value << 8) & 0xff0000);
81}
82
83
84// Copied from libroot/os/thread.c:
85
86
87extern "C" status_t
88_get_thread_info(thread_id thread, thread_info *info, size_t size)
89{
90	if (info == NULL || size != sizeof(thread_info))
91		return B_BAD_VALUE;
92
93	return _kern_get_thread_info(thread, info);
94}
95
96
97extern "C" status_t
98snooze(bigtime_t timeout)
99{
100	return B_ERROR;
101}
102
103
104/*!	Mini atoi(), so we don't have to include the libroot dependencies.
105 */
106extern "C" int
107atoi(const char* num)
108{
109	int result = 0;
110	while (*num >= '0' && *num <= '9') {
111		result = (result * 10) + (*num - '0');
112		num++;
113	}
114
115	return result;
116}
117
118
119#if RUNTIME_LOADER_TRACING
120
121extern "C" void
122ktrace_printf(const char *format, ...)
123{
124	va_list list;
125	va_start(list, format);
126
127	char buffer[1024];
128	vsnprintf(buffer, sizeof(buffer), format, list);
129	_kern_ktrace_output(buffer);
130
131	va_end(list);
132}
133
134#endif // RUNTIME_LOADER_TRACING
135