* Copyright 2016 Philippe Proulx <pproulx@efficios.com>
*/
-#define BT_COMP_LOG_SELF_COMP (file->self_comp)
-#define BT_LOG_OUTPUT_LEVEL (file->log_level)
-#define BT_LOG_TAG "PLUGIN/SRC.CTF.FS/FILE"
-#include "logging/comp-logging.h"
-
+#include <glib.h>
#include <stdio.h>
-#include <sys/types.h>
#include <sys/stat.h>
-#include <unistd.h>
-#include <glib.h>
+
+#include "cpp-common/vendor/fmt/format.h"
+
#include "file.hpp"
-BT_HIDDEN
void ctf_fs_file_destroy(struct ctf_fs_file *file)
{
- if (!file) {
- return;
- }
-
- if (file->fp) {
- BT_COMP_LOGD("Closing file \"%s\" (%p)",
- file->path ? file->path->str : NULL, file->fp);
-
- if (fclose(file->fp)) {
- BT_COMP_LOGE("Cannot close file \"%s\": %s",
- file->path ? file->path->str : "NULL",
- strerror(errno));
- }
- }
-
- if (file->path) {
- g_string_free(file->path, TRUE);
- }
-
- g_free(file);
+ if (!file) {
+ return;
+ }
+
+ if (file->fp) {
+ BT_CPPLOGD_SPEC(file->logger, "Closing file \"{}\" ({})",
+ file->path ? file->path->str : NULL, fmt::ptr(file->fp));
+
+ if (fclose(file->fp)) {
+ BT_CPPLOGE_SPEC(file->logger, "Cannot close file \"{}\": {}",
+ file->path ? file->path->str : "NULL", strerror(errno));
+ }
+ }
+
+ if (file->path) {
+ g_string_free(file->path, TRUE);
+ }
+
+ delete file;
}
-BT_HIDDEN
-struct ctf_fs_file *ctf_fs_file_create(bt_logging_level log_level,
- bt_self_component *self_comp)
+void ctf_fs_file_deleter::operator()(ctf_fs_file * const file) noexcept
{
- struct ctf_fs_file *file = g_new0(struct ctf_fs_file, 1);
+ ctf_fs_file_destroy(file);
+}
- if (!file) {
- goto error;
- }
+ctf_fs_file::UP ctf_fs_file_create(const bt2c::Logger& parentLogger)
+{
+ ctf_fs_file::UP file {new ctf_fs_file {parentLogger}};
- file->log_level = log_level;
- file->self_comp = self_comp;
- file->path = g_string_new(NULL);
- if (!file->path) {
- goto error;
- }
+ file->path = g_string_new(NULL);
+ if (!file->path) {
+ goto error;
+ }
- goto end;
+ goto end;
error:
- ctf_fs_file_destroy(file);
- file = NULL;
+ file.reset();
end:
- return file;
+ return file;
}
-BT_HIDDEN
int ctf_fs_file_open(struct ctf_fs_file *file, const char *mode)
{
- int ret = 0;
- struct stat stat;
-
- BT_COMP_LOGI("Opening file \"%s\" with mode \"%s\"", file->path->str, mode);
- file->fp = fopen(file->path->str, mode);
- if (!file->fp) {
- BT_COMP_LOGE_APPEND_CAUSE_ERRNO(file->self_comp,
- "Cannot open file", ": path=%s, mode=%s",
- file->path->str, mode);
- goto error;
- }
-
- BT_COMP_LOGI("Opened file: %p", file->fp);
-
- if (fstat(fileno(file->fp), &stat)) {
- BT_COMP_LOGE_APPEND_CAUSE_ERRNO(file->self_comp,
- "Cannot get file information",
- ": path=%s", file->path->str);
- goto error;
- }
-
- file->size = stat.st_size;
- BT_COMP_LOGI("File is %jd bytes", (intmax_t) file->size);
- goto end;
+ int ret = 0;
+ struct stat stat;
+
+ BT_CPPLOGI_SPEC(file->logger, "Opening file \"{}\" with mode \"{}\"", file->path->str, mode);
+ file->fp = fopen(file->path->str, mode);
+ if (!file->fp) {
+ BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(file->logger, "Cannot open file", ": path={}, mode={}",
+ file->path->str, mode);
+ goto error;
+ }
+
+ BT_CPPLOGI_SPEC(file->logger, "Opened file: {}", fmt::ptr(file->fp));
+
+ if (fstat(fileno(file->fp), &stat)) {
+ BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(file->logger, "Cannot get file information", ": path={}",
+ file->path->str);
+ goto error;
+ }
+
+ file->size = stat.st_size;
+ BT_CPPLOGI_SPEC(file->logger, "File is {} bytes", (intmax_t) file->size);
+ goto end;
error:
- ret = -1;
+ ret = -1;
- if (file->fp) {
- if (fclose(file->fp)) {
- BT_COMP_LOGE("Cannot close file \"%s\": %s", file->path->str,
- strerror(errno));
- }
- }
+ if (file->fp) {
+ if (fclose(file->fp)) {
+ BT_CPPLOGE_SPEC(file->logger, "Cannot close file \"{}\": {}", file->path->str,
+ strerror(errno));
+ }
+ }
end:
- return ret;
+ return ret;
}