OSDN Git Service

* fhandler.h: Add comment.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / fhandler_random.cc
1 /* fhandler_dev_random.cc: code to access /dev/random
2
3    Copyright 2000 Cygnus Solutions.
4
5    Written by Corinna Vinschen (vinschen@cygnus.com)
6
7 This file is part of Cygwin.
8
9 This software is a copyrighted work licensed under the terms of the
10 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
11 details. */
12
13 #include <errno.h>
14 #include "winsup.h"
15
16 #define RANDOM   8
17 #define URANDOM  9
18
19 fhandler_dev_random::fhandler_dev_random (const char *name, int nunit)
20   : fhandler_base (FH_RANDOM, name),
21     unit(nunit),
22     crypt_prov((HCRYPTPROV)NULL)
23 {
24   set_cb (sizeof *this);
25 }
26
27 int
28 fhandler_dev_random::open (const char *, int flags, mode_t)
29 {
30   set_flags (flags);
31   return 1;
32 }
33
34 int
35 fhandler_dev_random::write (const void *, size_t len)
36 {
37   return len;
38 }
39
40 int
41 fhandler_dev_random::read (void *ptr, size_t len)
42 {
43   if (!len)
44     return 0;
45   if (!crypt_prov
46       && !CryptAcquireContext (&crypt_prov, NULL, MS_DEF_PROV, PROV_RSA_FULL,
47                                CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)
48       && !CryptAcquireContext (&crypt_prov, NULL, MS_DEF_PROV, PROV_RSA_FULL,
49                                CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET
50                                | CRYPT_NEWKEYSET ))
51     {
52       __seterrno ();
53       return -1;
54     }
55   if (!CryptGenRandom (crypt_prov, len, (BYTE *)ptr))
56     {
57       __seterrno ();
58       return -1;
59     }
60   return len;
61 }
62
63 off_t
64 fhandler_dev_random::lseek (off_t, int)
65 {
66   return 0;
67 }
68
69 int
70 fhandler_dev_random::close (void)
71 {
72   if (crypt_prov)
73     while (!CryptReleaseContext (crypt_prov, 0)
74            && GetLastError () == ERROR_BUSY)
75       Sleep(10);
76   return 0;
77 }
78
79 int
80 fhandler_dev_random::dup (fhandler_base *child)
81 {
82   fhandler_dev_random *fhr = (fhandler_dev_random *) child;
83   fhr->unit = unit;
84   fhr->crypt_prov = (HCRYPTPROV)NULL;
85   return 0;
86 }
87
88 void
89 fhandler_dev_random::dump ()
90 {
91   paranoid_printf("here, fhandler_dev_random");
92 }
93