Module: check_mk
Branch: master
Commit: d495ae0f4003ead144cc537197999ffac5bf198a
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d495ae0f4003ea…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Tue May 3 11:08:02 2016 +0200
C++-ified some code.
* Use C++ strings instead of C strings, removing the need for arbitrary
length restrictions and APIs from the 70s.
* Use vectors instead of hand-rolled naked arrays. Ask Scott M. for a
rationale... ;-)
* Compilers don't read comments, and neither do programmers, at least most
of the time. So make the ownership of dynamically allocated buffers
explicit in their signature.
---
livestatus/src/BlobColumn.cc | 12 +++++-----
livestatus/src/BlobColumn.h | 4 +++-
livestatus/src/HostFileColumn.cc | 45 ++++++++++++++++----------------------
livestatus/src/HostFileColumn.h | 5 +++--
livestatus/src/Query.cc | 10 ++++-----
livestatus/src/Query.h | 2 +-
6 files changed, 36 insertions(+), 42 deletions(-)
diff --git a/livestatus/src/BlobColumn.cc b/livestatus/src/BlobColumn.cc
index d064dcd..1bd0b7e 100644
--- a/livestatus/src/BlobColumn.cc
+++ b/livestatus/src/BlobColumn.cc
@@ -23,14 +23,12 @@
// Boston, MA 02110-1301 USA.
#include "BlobColumn.h"
-#include <stdlib.h>
#include "Query.h"
+using std::unique_ptr;
+using std::vector;
+
void BlobColumn::output(void *data, Query *query) {
- int size;
- char *buffer = getBlob(data, &size);
- query->outputBlob(buffer, size);
- if (buffer != nullptr) {
- free(buffer);
- }
+ unique_ptr<vector<char>> blob = getBlob(data);
+ query->outputBlob(blob.get());
}
diff --git a/livestatus/src/BlobColumn.h b/livestatus/src/BlobColumn.h
index 3d9d74e..6a14f1a 100644
--- a/livestatus/src/BlobColumn.h
+++ b/livestatus/src/BlobColumn.h
@@ -26,7 +26,9 @@
#define BlobColumn_h
#include "config.h" // IWYU pragma: keep
+#include <memory>
#include <string>
+#include <vector>
#include "Column.h"
class Query;
@@ -35,7 +37,7 @@ public:
BlobColumn(std::string name, std::string description, int indirect_offset,
int extra_offset)
: Column(name, description, indirect_offset, extra_offset) {}
- virtual char *getBlob(void *data, int *size) = 0;
+ virtual std::unique_ptr<std::vector<char>> getBlob(void *data) = 0;
void output(void *, Query *) override;
int type() override { return COLTYPE_BLOB; }
};
diff --git a/livestatus/src/HostFileColumn.cc b/livestatus/src/HostFileColumn.cc
index 6aaf547..ff92349 100644
--- a/livestatus/src/HostFileColumn.cc
+++ b/livestatus/src/HostFileColumn.cc
@@ -23,9 +23,9 @@
// Boston, MA 02110-1301 USA.
#include "HostFileColumn.h"
+#include <errno.h>
#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "logger.h"
@@ -35,7 +35,10 @@
#include "nagios.h"
#endif
+using std::make_unique;
using std::string;
+using std::unique_ptr;
+using std::vector;
HostFileColumn::HostFileColumn(string name, string description,
const char *base_dir, const char *suffix,
@@ -44,10 +47,7 @@ HostFileColumn::HostFileColumn(string name, string description,
, _base_dir(base_dir)
, _suffix(suffix) {}
-// returns a buffer to be freed afterwards!! Return 0
-// in size of a missing file
-char *HostFileColumn::getBlob(void *data, int *size) {
- *size = 0;
+unique_ptr<vector<char>> HostFileColumn::getBlob(void *data) {
if (_base_dir[0] == 0) {
return nullptr; // Path is not configured
}
@@ -63,37 +63,30 @@ char *HostFileColumn::getBlob(void *data, int *size) {
const char *host_name = static_cast<host *>(data)->name;
#endif
- char path[4096];
- snprintf(path, sizeof(path), "%s/%s%s", _base_dir.c_str(), host_name,
- _suffix.c_str());
- int fd = open(path, O_RDONLY);
+ string path = _base_dir + "/" + host_name + _suffix;
+ int fd = open(path.c_str(), O_RDONLY);
if (fd < 0) {
- logger(LG_WARN, "Requested file %s not existing", path);
+ logger(LG_WARN, "Cannot open %s: %s", path.c_str(), strerror(errno));
return nullptr;
}
- *size = lseek(fd, 0, SEEK_END);
- if (*size < 0) {
+ off_t size = lseek(fd, 0, SEEK_END);
+ if (size < 0) {
close(fd);
- *size = 0;
- logger(LG_WARN, "Cannot seek to end of file %s", path);
+ logger(LG_WARN, "Cannot seek to end of %s: %s", path.c_str(),
+ strerror(errno));
return nullptr;
}
lseek(fd, 0, SEEK_SET);
- char *buffer = static_cast<char *>(malloc(*size));
- if (buffer == nullptr) {
- close(fd);
- return nullptr;
- }
-
- ssize_t read_bytes = read(fd, buffer, *size);
+ unique_ptr<vector<char>> result =
make_unique<vector<char>>(size);
+ ssize_t read_bytes = read(fd, &(*result)[0], size);
close(fd);
- if (read_bytes != *size) {
- logger(LG_WARN, "Cannot read %d from %s", *size, path);
- free(buffer);
+ if (read_bytes != size) {
+ logger(LG_WARN, "Cannot read %ld bytes from %s: %s", long(size),
+ path.c_str(), strerror(errno));
return nullptr;
}
- return buffer;
+ return result;
}
diff --git a/livestatus/src/HostFileColumn.h b/livestatus/src/HostFileColumn.h
index e500e02..9c9910a 100644
--- a/livestatus/src/HostFileColumn.h
+++ b/livestatus/src/HostFileColumn.h
@@ -26,7 +26,9 @@
#define HostFileColumn_h
#include "config.h" // IWYU pragma: keep
+#include <memory>
#include <string>
+#include <vector>
#include "BlobColumn.h"
class HostFileColumn : public BlobColumn {
@@ -38,8 +40,7 @@ public:
const char *base_dir, const char *suffix,
int indirect_offset, int extra_offset = -1);
- // returns a buffer to be freed afterwards!!
- char *getBlob(void *data, int *size) override;
+ std::unique_ptr<std::vector<char>> getBlob(void *data) override;
};
#endif // HostFileColumn_h
diff --git a/livestatus/src/Query.cc b/livestatus/src/Query.cc
index 8010c29..5ef1847 100644
--- a/livestatus/src/Query.cc
+++ b/livestatus/src/Query.cc
@@ -1077,16 +1077,16 @@ void Query::outputUnicodeEscape(unsigned value) {
_output->addBuffer(buf, 6);
}
-void Query::outputBlob(const char *buffer, int size) {
+void Query::outputBlob(const vector<char> *blob) {
if (_output_format != OUTPUT_FORMAT_CSV) {
- if (buffer != nullptr) {
- outputString(buffer, size);
+ if (blob != nullptr) {
+ outputString(&(*blob)[0], blob->size());
} else {
outputNull();
}
} else {
- if (buffer != nullptr) {
- _output->addBuffer(buffer, size);
+ if (blob != nullptr) {
+ _output->addBuffer(&(*blob)[0], blob->size());
}
}
}
diff --git a/livestatus/src/Query.h b/livestatus/src/Query.h
index bc17901..2fe2074 100644
--- a/livestatus/src/Query.h
+++ b/livestatus/src/Query.h
@@ -112,7 +112,7 @@ public:
void outputAsciiEscape(char value);
void outputUnicodeEscape(unsigned value);
void outputString(const char *, int len = -1);
- void outputBlob(const char *buffer, int size);
+ void outputBlob(const std::vector<char> *blob);
void outputBeginList();
void outputListSeparator();
void outputEndList();