Merge pull request #140 from hussainnaqvee/patch-1
[awesomized/libmemcached] / src / bin / common / checks.hpp
index 470b4b4a9e1da73701e46abdc7d2da4adc7c2d87..a78a3e86957d6338cfd2d63e4ef3cfd5b5d089c8 100644 (file)
@@ -1,6 +1,6 @@
 /*
     +--------------------------------------------------------------------+
-    | libmemcached - C/C++ Client Library for memcached                  |
+    | libmemcached-awesome - C/C++ Client Library for memcached          |
     +--------------------------------------------------------------------+
     | Redistribution and use in source and binary forms, with or without |
     | modification, are permitted under the terms of the BSD license.    |
@@ -9,7 +9,7 @@
     | the terms online at: https://opensource.org/licenses/BSD-3-Clause  |
     +--------------------------------------------------------------------+
     | Copyright (c) 2006-2014 Brian Aker   https://datadifferential.com/ |
-    | Copyright (c) 2020 Michael Wallner   <mike@php.net>                |
+    | Copyright (c) 2020-2021 Michael Wallner        https://awesome.co/ |
     +--------------------------------------------------------------------+
 */
 
@@ -18,6 +18,8 @@
 #include "options.hpp"
 #include "libmemcached/common.h"
 
+#include <cerrno>
+#include <cstring>
 #include <fstream>
 
 bool check_buffering(const client_options &opt, memcached_st &memc) {
@@ -52,6 +54,22 @@ bool check_memcached(const client_options &opt, memcached_st &memc) {
   return true;
 }
 
+bool check_return(const client_options &opt, memcached_st &memc, memcached_return_t rc) {
+  if (!memcached_success(rc)) {
+    if (!opt.isset("quiet")) {
+      if (!memcached_fatal(rc)) {
+        if (opt.isset("verbose")) {
+          std::cerr << "Failed: " << memcached_strerror(&memc, rc) << "\n";;
+        }
+      } else {
+        std::cerr << "Fatal error: " << memcached_last_error_message(&memc) << "\n";
+      }
+    }
+    return false;
+  }
+  return true;
+}
+
 bool check_return(const client_options &opt, memcached_st &memc, const char *key,
                   memcached_return_t rc) {
   if (!memcached_success(rc)) {
@@ -76,12 +94,32 @@ std::ostream *check_ostream(const client_options &opt, const char *file, std::of
     if (opt.isset("debug")) {
       std::cerr << "Opening '" << file << "' for writing.\n";
     }
-    stream.open(file);
+    errno = 0;
+    stream.open(file, std::ios::binary | std::ios::out);
     if (stream.is_open()) {
       return &stream;
     } else if (!opt.isset("quiet")) {
-      std::cerr << "Failed to open '" << file << "' for writing.\n";
+      std::cerr << "Failed to open '" << file << "' for writing: " << strerror(errno) << ".\n";
     }
   }
   return &std::cout;
 }
+
+std::istream *check_istream(const client_options &opt, const char *file, std::ifstream &stream) {
+  if (file && *file) {
+    if (file[0] != '-' || file[1] != 0) {
+      if (opt.isset("debug")) {
+        std::cerr << "Opening '" << file << "' for reading.\n";
+      }
+      errno = 0;
+      stream.open(file, std::ios::binary | std::ios::in);
+      if (stream.is_open()) {
+        return &stream;
+      } else if (!opt.isset("quiet")) {
+        std::cerr << "Failed to open '" << file << "' for reading: " << strerror(errno) << ".\n";
+      }
+      return nullptr;
+    }
+  }
+  return &std::cin;
+}