]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - share/examples/kld/random_adaptor/random_adaptor_example.c
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / share / examples / kld / random_adaptor / random_adaptor_example.c
1 /*-
2  * Copyright (c) 2013 Arthur Mesh <arthurmesh@gmail.com>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer
10  *    in this position and unchanged.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  */
27
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
30
31 #include <sys/param.h>
32 #include <sys/kernel.h>
33 #include <sys/module.h>
34 #include <sys/selinfo.h>
35 #include <sys/systm.h>
36
37 #include <dev/random/random_adaptors.h>
38 #include <dev/random/randomdev.h>
39
40 #define RNG_NAME "example"
41
42 static int random_example_read(void *, int);
43
44 struct random_adaptor random_example = {
45         .ident = "Example RNG",
46         .init = (random_init_func_t *)random_null_func,
47         .deinit = (random_deinit_func_t *)random_null_func,
48         .read = random_example_read,
49         .write = (random_write_func_t *)random_null_func,
50         .reseed = (random_reseed_func_t *)random_null_func,
51         .seeded = 1,
52 };
53
54 /*
55  * Used under the license provided @ http://xkcd.com/221/
56  * http://creativecommons.org/licenses/by-nc/2.5/
57  */
58 static u_char
59 getRandomNumber(void)
60 {
61         return 4;   /* chosen by fair dice roll, guaranteed to be random */
62 }
63
64 static int
65 random_example_read(void *buf, int c)
66 {
67         u_char *b;
68         int count;
69
70         b = buf;
71
72         for (count = 0; count < c; count++) {
73                 b[count] = getRandomNumber();
74         }
75
76         printf("returning %d bytes of pure randomness\n", c);
77         return (c);
78 }
79
80 static int
81 random_example_modevent(module_t mod, int type, void *unused)
82 {
83
84         switch (type) {
85         case MOD_LOAD:
86                 random_adaptor_register(RNG_NAME, &random_example);
87                 EVENTHANDLER_INVOKE(random_adaptor_attach, &random_example);
88                 return (0);
89         }
90
91         return (EINVAL);
92 }
93
94 RANDOM_ADAPTOR_MODULE(random_example, random_example_modevent, 1);