text: // Copyright 2019 The Chromium OS Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include <stdlib.h>
  
  #include <base/files/file.h>
  #include <base/files/file_path.h>
  #include <base/time/time.h>
  #include <brillo/flag_helper.h>
  
  namespace {
  constexpr int kNumBytesRead = 1024 * 1024;
  }
  
  // 'urandom' command-line tool:
  //
  // Based on the urandom python factory test. Reads 1MiB of data from
  // /dev/urandom for a specified amount of time.
  int main(int argc, char** argv) {
    DEFINE_int64(time_delta_ms, 0, "TimeDelta in ms to run routine for.");
    DEFINE_string(urandom_path, "/dev/urandom", "Path to urandom interface.");
    brillo::FlagHelper::Init(argc, argv, "urandom - diagnostic routine.");
  
    base::File urandom_file(base::FilePath(FLAGS_urandom_path),
                            base::File::FLAG_OPEN | base::File::FLAG_READ);
    if (!urandom_file.IsValid())
      return EXIT_FAILURE;
  
    char urandom_data[kNumBytesRead];
    base::TimeTicks end_time =
        base::TimeTicks::Now() +
        base::TimeDelta::FromMilliseconds(FLAGS_time_delta_ms);
    while (base::TimeTicks::Now() < end_time) {
      if (kNumBytesRead != urandom_file.Read(0, urandom_data, kNumBytesRead))
        return EXIT_FAILURE;
    }
  
    return EXIT_SUCCESS;
  }
  