1bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// Copyright (c) 2006, Google Inc. 2bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// All rights reserved. 3bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 4bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// Redistribution and use in source and binary forms, with or without 5bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// modification, are permitted provided that the following conditions are 6bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// met: 7bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 8bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// * Redistributions of source code must retain the above copyright 9bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// notice, this list of conditions and the following disclaimer. 10bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// * Redistributions in binary form must reproduce the above 11bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// copyright notice, this list of conditions and the following disclaimer 12bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// in the documentation and/or other materials provided with the 13bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// distribution. 14bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// * Neither the name of Google Inc. nor the names of its 15bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// contributors may be used to endorse or promote products derived from 16bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// this software without specific prior written permission. 17bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 18bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 30bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly#include "common/linux/guid_creator.h" 31bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 32e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <assert.h> 336bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org#include <pthread.h> 34e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <stdio.h> 35e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <stdlib.h> 36e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <time.h> 37e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek#include <unistd.h> 38e1930985430ce289f4fe8525f51050e5d78cc44eted.mielczarek 39bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 40bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// GUIDGenerator 41bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 42bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// This class is used to generate random GUID. 43bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// Currently use random number to generate a GUID since Linux has 44bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// no native GUID generator. This should be OK since we don't expect 45bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// crash to happen very offen. 46bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// 47bcd46f007919b5063164c8c5c6c2bd4dfb62681elulyclass GUIDGenerator { 48bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly public: 496162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com static uint32_t BytesToUInt32(const uint8_t bytes[]) { 506162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com return ((uint32_t) bytes[0] 516162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com | ((uint32_t) bytes[1] << 8) 526162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com | ((uint32_t) bytes[2] << 16) 536162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com | ((uint32_t) bytes[3] << 24)); 5407466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com } 5507466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com 566162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com static void UInt32ToBytes(uint8_t bytes[], uint32_t n) { 5707466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com bytes[0] = n & 0xff; 5807466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com bytes[1] = (n >> 8) & 0xff; 5907466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com bytes[2] = (n >> 16) & 0xff; 6007466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com bytes[3] = (n >> 24) & 0xff; 6107466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com } 6207466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com 636bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org static bool CreateGUID(GUID *guid) { 646bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org InitOnce(); 65bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly guid->data1 = random(); 666162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com guid->data2 = (uint16_t)(random()); 676162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com guid->data3 = (uint16_t)(random()); 6807466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com UInt32ToBytes(&guid->data4[0], random()); 6907466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com UInt32ToBytes(&guid->data4[4], random()); 70bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly return true; 71bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly } 726bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org 736bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org private: 746bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org static void InitOnce() { 756bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org pthread_once(&once_control, &InitOnceImpl); 766bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org } 776bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org 786bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org static void InitOnceImpl() { 796bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org srandom(time(NULL)); 806bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org } 816bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org 826bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org static pthread_once_t once_control; 83bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly}; 84bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 856bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.orgpthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT; 86bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 87bcd46f007919b5063164c8c5c6c2bd4dfb62681elulybool CreateGUID(GUID *guid) { 886bfb8bdfeefedfe13e8165cb45af95c0d1d56941qsr@chromium.org return GUIDGenerator::CreateGUID(guid); 892e0e2234b9e9d7d82c4c3c20396bdf8f18007e6cmmentovai} 90bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 91bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly// Parse guid to string. 92bcd46f007919b5063164c8c5c6c2bd4dfb62681elulybool GUIDToString(const GUID *guid, char *buf, int buf_len) { 93bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly // Should allow more space the the max length of GUID. 94bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly assert(buf_len > kGUIDStringLength); 95bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly int num = snprintf(buf, buf_len, kGUIDFormatString, 96bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly guid->data1, guid->data2, guid->data3, 9707466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com GUIDGenerator::BytesToUInt32(&(guid->data4[0])), 9807466260e2dcdb18a7ff8b666c78c710747f28aejimblandy@gmail.com GUIDGenerator::BytesToUInt32(&(guid->data4[4]))); 99bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly if (num != kGUIDStringLength) 100bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly return false; 101bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly 102bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly buf[num] = '\0'; 103bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly return true; 104bcd46f007919b5063164c8c5c6c2bd4dfb62681eluly} 105