1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,104 @@ 1.4 +// Copyright (c) 2006, Google Inc. 1.5 +// All rights reserved. 1.6 +// 1.7 +// Redistribution and use in source and binary forms, with or without 1.8 +// modification, are permitted provided that the following conditions are 1.9 +// met: 1.10 +// 1.11 +// * Redistributions of source code must retain the above copyright 1.12 +// notice, this list of conditions and the following disclaimer. 1.13 +// * Redistributions in binary form must reproduce the above 1.14 +// copyright notice, this list of conditions and the following disclaimer 1.15 +// in the documentation and/or other materials provided with the 1.16 +// distribution. 1.17 +// * Neither the name of Google Inc. nor the names of its 1.18 +// contributors may be used to endorse or promote products derived from 1.19 +// this software without specific prior written permission. 1.20 +// 1.21 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1.22 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1.23 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1.24 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1.25 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.26 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.27 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1.28 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1.29 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.30 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.31 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.32 + 1.33 +#include "common/linux/guid_creator.h" 1.34 + 1.35 +#include <assert.h> 1.36 +#include <pthread.h> 1.37 +#include <stdio.h> 1.38 +#include <stdlib.h> 1.39 +#include <time.h> 1.40 +#include <unistd.h> 1.41 + 1.42 +// 1.43 +// GUIDGenerator 1.44 +// 1.45 +// This class is used to generate random GUID. 1.46 +// Currently use random number to generate a GUID since Linux has 1.47 +// no native GUID generator. This should be OK since we don't expect 1.48 +// crash to happen very offen. 1.49 +// 1.50 +class GUIDGenerator { 1.51 + public: 1.52 + static uint32_t BytesToUInt32(const uint8_t bytes[]) { 1.53 + return ((uint32_t) bytes[0] 1.54 + | ((uint32_t) bytes[1] << 8) 1.55 + | ((uint32_t) bytes[2] << 16) 1.56 + | ((uint32_t) bytes[3] << 24)); 1.57 + } 1.58 + 1.59 + static void UInt32ToBytes(uint8_t bytes[], uint32_t n) { 1.60 + bytes[0] = n & 0xff; 1.61 + bytes[1] = (n >> 8) & 0xff; 1.62 + bytes[2] = (n >> 16) & 0xff; 1.63 + bytes[3] = (n >> 24) & 0xff; 1.64 + } 1.65 + 1.66 + static bool CreateGUID(GUID *guid) { 1.67 + InitOnce(); 1.68 + guid->data1 = random(); 1.69 + guid->data2 = (uint16_t)(random()); 1.70 + guid->data3 = (uint16_t)(random()); 1.71 + UInt32ToBytes(&guid->data4[0], random()); 1.72 + UInt32ToBytes(&guid->data4[4], random()); 1.73 + return true; 1.74 + } 1.75 + 1.76 + private: 1.77 + static void InitOnce() { 1.78 + pthread_once(&once_control, &InitOnceImpl); 1.79 + } 1.80 + 1.81 + static void InitOnceImpl() { 1.82 + srandom(time(NULL)); 1.83 + } 1.84 + 1.85 + static pthread_once_t once_control; 1.86 +}; 1.87 + 1.88 +pthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT; 1.89 + 1.90 +bool CreateGUID(GUID *guid) { 1.91 + return GUIDGenerator::CreateGUID(guid); 1.92 +} 1.93 + 1.94 +// Parse guid to string. 1.95 +bool GUIDToString(const GUID *guid, char *buf, int buf_len) { 1.96 + // Should allow more space the the max length of GUID. 1.97 + assert(buf_len > kGUIDStringLength); 1.98 + int num = snprintf(buf, buf_len, kGUIDFormatString, 1.99 + guid->data1, guid->data2, guid->data3, 1.100 + GUIDGenerator::BytesToUInt32(&(guid->data4[0])), 1.101 + GUIDGenerator::BytesToUInt32(&(guid->data4[4]))); 1.102 + if (num != kGUIDStringLength) 1.103 + return false; 1.104 + 1.105 + buf[num] = '\0'; 1.106 + return true; 1.107 +}