1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include "../tests.h"
#include <camellia.h>
static void
test_settime(void) {
uint64_t ns = 1000000000;
uint64_t base = 1337 * ns;
union {
uint64_t t;
char buf[8];
} u;
hid_t h = camellia_open("/dev/bintime", OPEN_RW);
/* check if time is reasonable */
test(h >= 0);
test(_sys_read(h, u.buf, 8, 0) == 8);
test(0 < u.t);
test(u.t < ns); /* this should've taken less than a second */
/* try changing the time */
u.t = base;
test(_sys_write(h, u.buf, 8, 0, 0) == 8);
/* did we succeed? */
u.t = 0;
test(_sys_read(h, u.buf, 8, 0) == 8);
test(base < u.t);
test(u.t < base + ns);
/* clone the handle */
hid_t h2 = _sys_dup(h, 0, DUP_SEARCH | DUP_RDONLY);
test(h2 >= 0);
/* i shouldn't be able to write to it */
u.t = 0;
test(_sys_write(h2, u.buf, 8, 0, 0) == -EACCES);
/* but reads should be fine */
test(_sys_read(h2, u.buf, 8, 0) == 8);
test(base < u.t);
test(u.t < base + ns);
}
void
r_k_time(void)
{
run_test(test_settime);
}
|