| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "metrics_library.h" | 5 #include "metrics_library.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <sys/file.h> | 8 #include <sys/file.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 | 10 |
| 11 #include <cstdarg> | 11 #include <cstdarg> |
| 12 #include <cstdio> | 12 #include <cstdio> |
| 13 #include <cstring> | 13 #include <cstring> |
| 14 | 14 |
| 15 #include <base/eintr_wrapper.h> |
| 16 |
| 15 #define READ_WRITE_ALL_FILE_FLAGS \ | 17 #define READ_WRITE_ALL_FILE_FLAGS \ |
| 16 (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) | 18 (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) |
| 17 | 19 |
| 18 static const char kAutotestPath[] = "/var/log/metrics/autotest-events"; | 20 static const char kAutotestPath[] = "/var/log/metrics/autotest-events"; |
| 19 static const char kUMAEventsPath[] = "/var/log/metrics/uma-events"; | 21 static const char kUMAEventsPath[] = "/var/log/metrics/uma-events"; |
| 20 static const char kConsentFile[] = "/home/chronos/Consent To Send Stats"; | 22 static const char kConsentFile[] = "/home/chronos/Consent To Send Stats"; |
| 21 static const int32_t kBufferSize = 1024; | 23 static const int32_t kBufferSize = 1024; |
| 22 | 24 |
| 23 time_t MetricsLibrary::cached_enabled_time_ = 0; | 25 time_t MetricsLibrary::cached_enabled_time_ = 0; |
| 24 bool MetricsLibrary::cached_enabled_ = false; | 26 bool MetricsLibrary::cached_enabled_ = false; |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 else | 125 else |
| 124 cached_enabled_ = false; | 126 cached_enabled_ = false; |
| 125 } | 127 } |
| 126 return cached_enabled_; | 128 return cached_enabled_; |
| 127 } | 129 } |
| 128 | 130 |
| 129 bool MetricsLibrary::SendMessageToChrome(int32_t length, const char* message) { | 131 bool MetricsLibrary::SendMessageToChrome(int32_t length, const char* message) { |
| 130 if (!AreMetricsEnabled()) | 132 if (!AreMetricsEnabled()) |
| 131 return true; | 133 return true; |
| 132 | 134 |
| 133 int chrome_fd = open(uma_events_file_, | 135 int chrome_fd = HANDLE_EINTR(open(uma_events_file_, |
| 134 O_WRONLY | O_APPEND | O_CREAT, | 136 O_WRONLY | O_APPEND | O_CREAT, |
| 135 READ_WRITE_ALL_FILE_FLAGS); | 137 READ_WRITE_ALL_FILE_FLAGS)); |
| 136 // If we failed to open it, return. | 138 // If we failed to open it, return. |
| 137 if (chrome_fd < 0) { | 139 if (chrome_fd < 0) { |
| 138 PrintError("open", uma_events_file_, errno); | 140 PrintError("open", uma_events_file_, errno); |
| 139 return false; | 141 return false; |
| 140 } | 142 } |
| 141 | 143 |
| 142 // Need to chmod because open flags are anded with umask. Ignore the | 144 // Need to chmod because open flags are anded with umask. Ignore the |
| 143 // exit code -- a chronos process may fail chmoding because the file | 145 // exit code -- a chronos process may fail chmoding because the file |
| 144 // has been created by a root process but that should be OK. | 146 // has been created by a root process but that should be OK. |
| 145 fchmod(chrome_fd, READ_WRITE_ALL_FILE_FLAGS); | 147 fchmod(chrome_fd, READ_WRITE_ALL_FILE_FLAGS); |
| 146 | 148 |
| 147 // Grab an exclusive lock to protect Chrome from truncating | 149 // Grab an exclusive lock to protect Chrome from truncating |
| 148 // underneath us. Keep the file locked as briefly as possible. | 150 // underneath us. Keep the file locked as briefly as possible. |
| 149 if (flock(chrome_fd, LOCK_EX) < 0) { | 151 if (HANDLE_EINTR(flock(chrome_fd, LOCK_EX)) < 0) { |
| 150 PrintError("flock", uma_events_file_, errno); | 152 PrintError("flock", uma_events_file_, errno); |
| 151 close(chrome_fd); | 153 HANDLE_EINTR(close(chrome_fd)); |
| 152 return false; | 154 return false; |
| 153 } | 155 } |
| 154 | 156 |
| 155 bool success = true; | 157 bool success = true; |
| 156 if (write(chrome_fd, message, length) != length) { | 158 if (HANDLE_EINTR(write(chrome_fd, message, length)) != length) { |
| 157 PrintError("write", uma_events_file_, errno); | 159 PrintError("write", uma_events_file_, errno); |
| 158 success = false; | 160 success = false; |
| 159 } | 161 } |
| 160 | 162 |
| 161 // Release the file lock and close file. | 163 // Close the file and release the lock. |
| 162 if (flock(chrome_fd, LOCK_UN) < 0) { | 164 HANDLE_EINTR(close(chrome_fd)); |
| 163 PrintError("unlock", uma_events_file_, errno); | |
| 164 success = false; | |
| 165 } | |
| 166 close(chrome_fd); | |
| 167 return success; | 165 return success; |
| 168 } | 166 } |
| 169 | 167 |
| 170 int32_t MetricsLibrary::FormatChromeMessage(int32_t buffer_size, char* buffer, | 168 int32_t MetricsLibrary::FormatChromeMessage(int32_t buffer_size, char* buffer, |
| 171 const char* format, ...) { | 169 const char* format, ...) { |
| 172 int32_t message_length; | 170 int32_t message_length; |
| 173 size_t len_size = sizeof(message_length); | 171 size_t len_size = sizeof(message_length); |
| 174 | 172 |
| 175 // Format the non-LENGTH contents in the buffer by leaving space for | 173 // Format the non-LENGTH contents in the buffer by leaving space for |
| 176 // LENGTH at the start of the buffer. | 174 // LENGTH at the start of the buffer. |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 int32_t message_length = | 260 int32_t message_length = |
| 263 FormatChromeMessage(kBufferSize, message, | 261 FormatChromeMessage(kBufferSize, message, |
| 264 "crash%c%s", '\0', crash_kind); | 262 "crash%c%s", '\0', crash_kind); |
| 265 | 263 |
| 266 if (message_length < 0) | 264 if (message_length < 0) |
| 267 return false; | 265 return false; |
| 268 | 266 |
| 269 // Send the message. | 267 // Send the message. |
| 270 return SendMessageToChrome(message_length, message); | 268 return SendMessageToChrome(message_length, message); |
| 271 } | 269 } |
| OLD | NEW |