Skip to content

Commit 6bde05a

Browse files
committed
libs/bsd: Implement getentropy(2).
With generic_syscall to avoid using a FD. Change-Id: Id1702118bb673f06a861e4f0ad3401ce3d45cbd0 Reviewed-on: https://review.haiku-os.org/c/haiku/+/31 Reviewed-by: waddlesplash <waddlesplash@gmail.com> Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
1 parent d57510c commit 6bde05a

File tree

5 files changed

+90
-0
lines changed

5 files changed

+90
-0
lines changed

headers/compatibility/bsd/unistd.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ char *getusershell(void);
2828
int issetugid(void);
2929
void setusershell(void);
3030

31+
int getentropy(void *buf, size_t buflen);
32+
3133
#ifdef __cplusplus
3234
}
3335
#endif

headers/private/system/random_defs.h

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright 2023, Haiku, Inc. All rights reserved.
3+
* Distributed under the terms of the MIT License.
4+
*/
5+
#ifndef _KERNEL_RANDOM_DEFS_H
6+
#define _KERNEL_RANDOM_DEFS_H
7+
8+
9+
#include <stddef.h>
10+
11+
12+
#define RANDOM_SYSCALLS "random"
13+
#define RANDOM_GET_ENTROPY 1
14+
15+
16+
struct random_get_entropy_args {
17+
void* buffer;
18+
size_t length;
19+
};
20+
21+
22+
#endif /* _KERNEL_RANDOM_DEFS_H */

src/add-ons/kernel/bus_managers/random/driver.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313

1414
#include <device_manager.h>
1515
#include <Drivers.h>
16+
#include <generic_syscall.h>
17+
#include <kernel.h>
1618
#include <malloc.h>
19+
#include <random_defs.h>
1720
#include <string.h>
1821
#include <util/AutoLock.h>
1922

@@ -103,6 +106,33 @@ random_control(void *cookie, uint32 op, void *arg, size_t length)
103106
}
104107

105108

109+
static status_t
110+
random_generic_syscall(const char* subsystem, uint32 function, void* buffer,
111+
size_t bufferSize)
112+
{
113+
switch (function) {
114+
case RANDOM_GET_ENTROPY:
115+
{
116+
random_get_entropy_args args;
117+
if (bufferSize != sizeof(args) || !IS_USER_ADDRESS(buffer))
118+
return B_BAD_VALUE;
119+
120+
if (user_memcpy(&args, buffer, sizeof(args)) != B_OK)
121+
return B_BAD_ADDRESS;
122+
if (!IS_USER_ADDRESS(args.buffer))
123+
return B_BAD_ADDRESS;
124+
125+
status_t result = random_read(NULL, 0, args.buffer, &args.length);
126+
if (result < 0)
127+
return result;
128+
129+
return user_memcpy(buffer, &args, sizeof(args));
130+
}
131+
}
132+
return B_BAD_HANDLER;
133+
}
134+
135+
106136
static status_t
107137
random_close(void *cookie)
108138
{
@@ -197,6 +227,8 @@ random_init_driver(device_node *node, void **cookie)
197227

198228
info->node = node;
199229

230+
register_generic_syscall(RANDOM_SYSCALLS, random_generic_syscall, 1, 0);
231+
200232
*cookie = info;
201233
return B_OK;
202234
}
@@ -207,6 +239,8 @@ random_uninit_driver(void *_cookie)
207239
{
208240
CALLED();
209241

242+
unregister_generic_syscall(RANDOM_SYSCALLS, 1);
243+
210244
RANDOM_UNINIT();
211245

212246
mutex_destroy(&sRandomLock);

src/libs/bsd/Jamfile

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
1717
explicit_bzero.c
1818
fgetln.c
1919
fts.c
20+
getentropy.c
2021
getpass.c
2122
issetugid.c
2223
kqueue.cpp

src/libs/bsd/getentropy.c

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright 2023, Haiku, Inc. All rights reserved.
3+
* Distributed under the terms of the MIT License.
4+
*/
5+
6+
#include <unistd.h>
7+
8+
#include <libroot/errno_private.h>
9+
#include <random_defs.h>
10+
#include <syscalls.h>
11+
12+
13+
int
14+
getentropy(void *buf, size_t buflen)
15+
{
16+
status_t status;
17+
struct random_get_entropy_args args;
18+
args.buffer = buf;
19+
args.length = buflen;
20+
21+
status = _kern_generic_syscall(RANDOM_SYSCALLS, RANDOM_GET_ENTROPY,
22+
&args, sizeof(args));
23+
if (args.length < buflen)
24+
status = EIO;
25+
26+
if (status < 0) {
27+
__set_errno(status);
28+
return -1;
29+
}
30+
return 0;
31+
}

0 commit comments

Comments
 (0)