1/*
2 * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <KernelExport.h>
8
9#include <safemode.h>
10#include <kernel.h>
11#include <syscalls.h>
12
13#include <string.h>
14
15
16extern "C" status_t
17get_safemode_option(const char* parameter, char* buffer, size_t* _bufferSize)
18{
19	status_t status = B_ENTRY_NOT_FOUND;
20
21	void* handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS);
22	if (handle != NULL) {
23		status = B_NAME_NOT_FOUND;
24
25		const char* value = get_driver_parameter(handle, parameter, NULL, NULL);
26		if (value != NULL) {
27			*_bufferSize = strlcpy(buffer, value, *_bufferSize);
28			status = B_OK;
29		}
30
31		unload_driver_settings(handle);
32	}
33
34	if (status != B_OK) {
35		// Try kernel settings file as a fall back
36		handle = load_driver_settings("kernel");
37		if (handle != NULL) {
38			const char* value = get_driver_parameter(handle, parameter, NULL,
39				NULL);
40			if (value != NULL) {
41				*_bufferSize = strlcpy(buffer, value, *_bufferSize);
42				status = B_OK;
43			}
44
45			unload_driver_settings(handle);
46		}
47	}
48
49	return status;
50}
51
52
53extern "C" bool
54get_safemode_boolean(const char* parameter, bool defaultValue)
55{
56	char value[16];
57	size_t length = sizeof(value);
58
59	if (get_safemode_option(parameter, value, &length) != B_OK)
60		return defaultValue;
61
62	return !strcasecmp(value, "on") || !strcasecmp(value, "true")
63		|| !strcmp(value, "1") || !strcasecmp(value, "yes")
64		|| !strcasecmp(value, "enabled");
65}
66
67
68//	#pragma mark - syscalls
69
70
71#ifndef _BOOT_MODE
72
73
74extern "C" status_t
75_user_get_safemode_option(const char* userParameter, char* userBuffer,
76	size_t* _userBufferSize)
77{
78	char parameter[B_FILE_NAME_LENGTH];
79	char buffer[B_PATH_NAME_LENGTH];
80	size_t bufferSize, originalBufferSize;
81
82	if (!IS_USER_ADDRESS(userParameter) || !IS_USER_ADDRESS(userBuffer)
83		|| !IS_USER_ADDRESS(_userBufferSize)
84		|| user_memcpy(&bufferSize, _userBufferSize, sizeof(size_t)) != B_OK
85		|| user_strlcpy(parameter, userParameter, B_FILE_NAME_LENGTH) < B_OK)
86		return B_BAD_ADDRESS;
87
88	if (bufferSize > B_PATH_NAME_LENGTH)
89		bufferSize = B_PATH_NAME_LENGTH;
90
91	originalBufferSize = bufferSize;
92	status_t status = get_safemode_option(parameter, buffer, &bufferSize);
93
94	if (status == B_OK
95		&& (user_strlcpy(userBuffer, buffer, originalBufferSize) < B_OK
96			|| user_memcpy(_userBufferSize, &bufferSize, sizeof(size_t))
97				!= B_OK))
98		return B_BAD_ADDRESS;
99
100	return status;
101}
102
103
104#endif	// !_BOOT_MODE
105