as_rand.cpp

Thu, 06 Aug 2009 13:21:30 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 06 Aug 2009 13:21:30 +0200
changeset 15
0e0eb7c91312
parent 3
c1941114ca88
permissions
-rw-r--r--

Remove seemingly declarations unnecessary according to Qt 4.5.2 headers.

     1 //
     2 //  OSSP asgui - Accounting system graphical user interface
     3 //  Copyright (c) 2002-2009 The OSSP Project (http://www.ossp.org/)
     4 //  Copyright (c) 2002-2009 Ralf S. Engelschall <rse@engelschall.com>
     5 //  Copyright (c) 2002-2009 Michael Schloh von Bennewitz <michael@schloh.com>
     6 //  Copyright (c) 2002-2009 Cable & Wireless Telecommunications Services GmbH
     7 //
     8 //  This file is part of OSSP asgui, an accounting system graphical user
     9 //  interface which can be found at http://asgui.europalab.com/.
    10 //
    11 //  Permission to use, copy, modify, and distribute this software for
    12 //  any purpose with or without fee is hereby granted, provided that
    13 //  the above copyright notice and this permission notice appear in all
    14 //  copies.
    15 //
    16 //  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    17 //  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    18 //  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    19 //  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    20 //  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    21 //  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    22 //  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    23 //  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    24 //  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    25 //  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    26 //  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    27 //  SUCH DAMAGE.
    28 //
    29 //  as_rand.cpp: ISO C++ implementation
    30 //
    32 #include <fcntl.h>
    33 #include <cerrno>
    35 #include "as_rand.h"
    37 #if HAVE_UNISTD_H
    38 #include <unistd.h>
    39 #endif // HAVE_UNISTD_H
    40 #if HAVE_STDLIB_H
    41 #include <stdlib.h>
    42 #endif // HAVE_STDLIB_H
    44 #if TIME_WITH_SYS_TIME
    45 #include <sys/time.h>
    46 #include <time.h>
    47 #else
    48 #if HAVE_SYS_TIME_H
    49 #include <sys/time.h>
    50 #else
    51 #include <time.h>
    52 #endif // HAVE_SYS_TIME_H
    53 #endif // TIME_WITH_SYS_TIME
    56 namespace AS {
    58 // Constructor
    59 Rand::Rand(void)
    60 {
    61     this->nFd = -4; // Object fresh status
    62     this->openDevice();   // Open the random device
    63 //    if (this->nFd < 0)
    64 //        throw Genexcept("Could not open /dev/urandom or /dev/random.");
    65 }
    67 // Destructor
    68 Rand::~Rand(void)
    69 {
    70     this->closeDevice();  // Close the random device
    71     this->nFd = -4; // Return this object to its fresh status
    72 }
    74 //
    75 // Rand::openDevice(void)
    76 // Open the random device associated with this object
    77 //
    78 void Rand::openDevice(void)
    79 {
    80     struct timeval Time;
    82     if (this->nFd == -4) {  // -4 indicates a fresh object
    83         gettimeofday(&Time, 0);
    84         this->nFd = open("/dev/urandom", O_RDONLY);
    85         if (this->nFd == -1)
    86             this->nFd = open("/dev/random", O_RDONLY | O_NONBLOCK);
    87         srand((getpid() << 16) ^ getuid() ^ Time.tv_sec ^ Time.tv_usec); // Seed
    88     }
    90     // Improve randomness by stirring in entropy
    91     gettimeofday(&Time, 0);
    92     for (int nIter = (Time.tv_sec ^ Time.tv_usec) & 0x1F; nIter > 0; nIter--)
    93         rand();
    94 }
    96 //
    97 // Rand::closeDevice(void)
    98 // Close the random device associated with this object
    99 //
   100 void Rand::closeDevice(void)
   101 {
   102     if (this->nFd >= 0)
   103         close(this->nFd);
   104 }
   106 //
   107 // Rand::genData(void *pvBuf, int nBytes)
   108 // Generate a series of random data from the system
   109 // standard random devices /dev/[u|s]random
   110 //
   111 void Rand::genData(void *pBuf, int nBytes)
   112 {
   113     int nRead = 0;
   114     int nLost = 0;
   115     char *szOut = (char *)pBuf;
   117     if (this->nFd >= 0) {
   118         while (nBytes > 0) {
   119             nRead = read(this->nFd, szOut, nBytes);
   120             if ((nRead < 0) && ((errno == EINTR) || (errno == EAGAIN)))
   121                 continue;
   122             if (nRead <= 0) {
   123                 if (nLost++ == 8)
   124                     break;
   125                 continue;
   126             }
   127             nBytes -= nRead;
   128             szOut += nRead;
   129             nLost = 0;
   130         }
   131     }
   133     // For systems with no /dev/random, we do the next best thing
   134     for (int nIter = 0;  nIter< nBytes; nIter++)
   135         *szOut++ = rand() & 0xFF;
   136 }
   137 } // namespace AS

mercurial