| Index: bootstat_log.c
|
| diff --git a/bootstat_log.c b/bootstat_log.c
|
| index 079c6f26196523a8c4856f11218e9c0fba795270..64bfe5dcc171814267a337fb7ab5b7c779efcc84 100644
|
| --- a/bootstat_log.c
|
| +++ b/bootstat_log.c
|
| @@ -6,51 +6,53 @@
|
| // facility.
|
|
|
| #include "bootstat.h"
|
| +#include "bootstat_test.h"
|
|
|
| -#include <stdio.h>
|
| +#include <assert.h>
|
| #include <stddef.h>
|
| +#include <stdio.h>
|
|
|
| -#include <sys/types.h>
|
| -#include <sys/stat.h>
|
| #include <sys/fcntl.h>
|
| +#include <sys/param.h>
|
| +#include <sys/stat.h>
|
| +#include <sys/types.h>
|
| #include <unistd.h>
|
|
|
| //
|
| +// Default path to directory where output statistics will be stored.
|
| +//
|
| +static const char kDefaultOutputDirectoryName[] = "/tmp";
|
| +
|
| +//
|
| // Paths to the statistics files we snapshot as part of the data to
|
| // be logged.
|
| //
|
| -static const char kUptimeStatisticsFileName[] = "/proc/uptime";
|
| +static const char kDefaultUptimeStatisticsFileName[] = "/proc/uptime";
|
|
|
| #if defined (__amd64__) || defined (__x86_64__) || defined (__i386__)
|
| -static const char kDiskStatisticsFileName[] = "/sys/block/sda/stat";
|
| +static const char kDefaultDiskStatisticsFileName[] = "/sys/block/sda/stat";
|
| #elif defined (__arm__)
|
| -static const char kDiskStatisticsFileName[] = "/sys/block/mmcblk0/stat";
|
| +static const char kDefaultDiskStatisticsFileName[] = "/sys/block/mmcblk0/stat";
|
| #else
|
| #error "unknown processor type?"
|
| #endif
|
|
|
| -
|
| -//
|
| -// Maximum length of any pathname for storing event statistics.
|
| -// Arbitrarily chosen, but see the comment below about truncation.
|
| -//
|
| -#define MAX_STAT_PATH 128
|
| -
|
| -//
|
| -// Output file creation mode: 0666, a.k.a. rw-rw-rw-.
|
| -//
|
| -static const int kFileCreationMode =
|
| - (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
|
| -
|
| +static const char *output_directory_name = kDefaultOutputDirectoryName;
|
| +static const char *uptime_statistics_file_name =
|
| + kDefaultUptimeStatisticsFileName;
|
| +static const char *disk_statistics_file_name = kDefaultDiskStatisticsFileName;
|
|
|
| static void append_logdata(const char* input_path,
|
| const char* output_name_prefix,
|
| const char* event_name)
|
| {
|
| - char output_path[MAX_STAT_PATH];
|
| + const mode_t kFileCreationMode =
|
| + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
|
| + char output_path[PATH_MAX];
|
| char buffer[256];
|
| ssize_t num_read;
|
| int ifd, ofd;
|
| + int output_path_len;
|
|
|
| ifd = open(input_path, O_RDONLY);
|
| if (ifd < 0) {
|
| @@ -58,20 +60,24 @@ static void append_logdata(const char* input_path,
|
| }
|
|
|
| //
|
| - // We don't want the file name "/tmp/uptime-..." truncated
|
| - // differently from the the name "/tmp/disk-...", so we truncate
|
| - // event_name separately using the "%.*s" format.
|
| + // For those not up on the more esoteric features of printf
|
| + // formats: the "%.*s" format is used to truncate the event name
|
| + // to the proper number of characters..
|
| //
|
| - // We expect that BOOTSTAT_MAX_EVENT_LEN is enough smaller than
|
| - // MAX_STAT_PATH that output_path will never be truncated.
|
| + // The assertion for output_path overflow should only be able to
|
| + // fail if output_directory_name is changed from its default,
|
| + // which can only happen in unit tests, and then only in the event
|
| + // of a serious test bug.
|
| //
|
| - (void) snprintf(output_path, sizeof(output_path), "/tmp/%s-%.*s",
|
| - output_name_prefix,
|
| - BOOTSTAT_MAX_EVENT_LEN - 1, event_name);
|
| + output_path_len = snprintf(output_path, sizeof(output_path), "%s/%s-%.*s",
|
| + output_directory_name,
|
| + output_name_prefix,
|
| + BOOTSTAT_MAX_EVENT_LEN - 1, event_name);
|
| + assert(output_path_len < sizeof(output_path));
|
| ofd = open(output_path, O_WRONLY | O_APPEND | O_CREAT,
|
| kFileCreationMode);
|
| if (ofd < 0) {
|
| - (void) close(ifd);
|
| + (void)close(ifd);
|
| return;
|
| }
|
|
|
| @@ -80,13 +86,40 @@ static void append_logdata(const char* input_path,
|
| if (num_written != num_read)
|
| break;
|
| }
|
| - (void) close(ofd);
|
| - (void) close(ifd);
|
| + (void)close(ofd);
|
| + (void)close(ifd);
|
| }
|
|
|
|
|
| void bootstat_log(const char* event_name)
|
| {
|
| - append_logdata(kUptimeStatisticsFileName, "uptime", event_name);
|
| - append_logdata(kDiskStatisticsFileName, "disk", event_name);
|
| + append_logdata(uptime_statistics_file_name, "uptime", event_name);
|
| + append_logdata(disk_statistics_file_name, "disk", event_name);
|
| +}
|
| +
|
| +
|
| +void bootstat_set_output_directory(const char* dirname)
|
| +{
|
| + if (dirname != NULL)
|
| + output_directory_name = dirname;
|
| + else
|
| + output_directory_name = kDefaultOutputDirectoryName;
|
| +}
|
| +
|
| +
|
| +void bootstat_set_uptime_file_name(const char* filename)
|
| +{
|
| + if (filename != NULL)
|
| + uptime_statistics_file_name = filename;
|
| + else
|
| + uptime_statistics_file_name = kDefaultUptimeStatisticsFileName;
|
| +}
|
| +
|
| +
|
| +void bootstat_set_disk_file_name(const char* filename)
|
| +{
|
| + if (filename != NULL)
|
| + disk_statistics_file_name = filename;
|
| + else
|
| + disk_statistics_file_name = kDefaultDiskStatisticsFileName;
|
| }
|
|
|