1/*
2 * Copyright 2003-2009, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <pthread.h>
8#include <string.h>
9
10#include <OS.h>
11#include <image.h>
12
13#include <user_runtime.h>
14
15#include <runtime_loader.h>
16
17#include <fork.h>
18#include <libroot_private.h>
19#include <pthread_private.h>
20
21
22struct rld_export *__gRuntimeLoader = NULL;
23	// This little bugger is set to something meaningful by the runtime loader
24	// Ugly, eh?
25
26const void* __gCommPageAddress;
27
28char *__progname = NULL;
29int __libc_argc;
30char **__libc_argv;
31
32int __gABIVersion;
33int __gAPIVersion;
34int32 __gCPUCount;
35
36char _single_threaded = true;
37	// determines if I/O locking needed; needed for BeOS compatibility
38
39thread_id __main_thread_id;
40char **argv_save;
41	// needed for BeOS compatibility - they are set in the startup code
42	// (have a look at the glue/ directory)
43
44int _data_offset_main_;
45	// this is obviously needed for R4.5 compatiblity
46
47
48void
49initialize_before(image_id imageID)
50{
51	system_info info;
52	char *programPath = __gRuntimeLoader->program_args->args[0];
53	__gCommPageAddress = __gRuntimeLoader->commpage_address;
54	__gABIVersion = __gRuntimeLoader->abi_version;
55	__gAPIVersion = __gRuntimeLoader->api_version;
56
57	if (programPath) {
58		if ((__progname = strrchr(programPath, '/')) == NULL)
59			__progname = programPath;
60		else
61			__progname++;
62	}
63
64	__libc_argc = __gRuntimeLoader->program_args->arg_count;
65	__libc_argv = argv_save = __gRuntimeLoader->program_args->args;
66
67	__gRuntimeLoader->call_atexit_hooks_for_range
68		= _call_atexit_hooks_for_range;
69
70	if (__gRuntimeLoader->program_args->umask != (mode_t)-1)
71		umask(__gRuntimeLoader->program_args->umask);
72
73	__main_thread_id = pthread_self()->id = find_thread(NULL);
74
75	get_system_info(&info);
76	__gCPUCount = info.cpu_count;
77
78	__init_time((addr_t)__gCommPageAddress);
79	__init_env(__gRuntimeLoader->program_args);
80	__init_heap();
81	__init_env_post_heap();
82	__init_pwd_backend();
83	__init_stack_protector();
84	__set_stack_protection();
85}
86
87
88void _init_c_library_(void);
89void
90_init_c_library_(void)
91{
92	// This function is called from the BeOS start_dyn.o - so it's called once
93	// for every application that was compiled under BeOS.
94	// Our libroot functions are already initialized above, so we don't have to
95	// do anything here.
96}
97
98
99void
100terminate_after(image_id id)
101{
102	__heap_terminate_after();
103}
104