aboutsummaryrefslogtreecommitdiff
path: root/src/uuid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/uuid.cpp')
-rw-r--r--src/uuid.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/uuid.cpp b/src/uuid.cpp
index b8de9e1..c064d78 100644
--- a/src/uuid.cpp
+++ b/src/uuid.cpp
@@ -6,16 +6,45 @@
6 */ 6 */
7 7
8#include "bu/uuid.h" 8#include "bu/uuid.h"
9#include "bu/file.h"
10#include "bu/formatter.h"
11#include "bu/membuf.h"
12#include <string.h>
9 13
10Bu::Uuid::Uuid() 14Bu::Uuid::Uuid()
11{ 15{
12 clear(); 16 clear();
13} 17}
14 18
19Bu::Uuid::Uuid( const Uuid &src )
20{
21 memcpy( data, src.data, 16 );
22}
23
15Bu::Uuid::~Uuid() 24Bu::Uuid::~Uuid()
16{ 25{
17} 26}
18 27
28Bu::FString Bu::Uuid::toRawString()
29{
30 return Bu::FString( (char *)data, 16 );
31}
32
33Bu::FString Bu::Uuid::toString()
34{
35 Bu::MemBuf mb;
36 Bu::Formatter f( mb );
37
38 for( int j = 0; j < 16; j++ )
39 {
40 if( j == 4 || j == 6 || j == 8 || j == 10 )
41 f << '-';
42 f << Bu::Fmt::hex(2).caps(false) << (unsigned int)data[j];
43 }
44
45 return mb.getString();
46}
47
19#define msb( i ) (1<<(7-i)) 48#define msb( i ) (1<<(7-i))
20 49
21void Bu::Uuid::clear() 50void Bu::Uuid::clear()
@@ -23,3 +52,23 @@ void Bu::Uuid::clear()
23 data[7] = msb(0); 52 data[7] = msb(0);
24} 53}
25 54
55Bu::Uuid Bu::Uuid::gen()
56{
57 Bu::File fIn( "/proc/sys/kernel/random/uuid", Bu::File::Read );
58 char dat[36];
59 fIn.read( dat, 36 );
60 int iNibble = 0;
61 Uuid id;
62 memset( id.data, 0, 16 );
63 for( int j = 0; j < 36; j++ )
64 {
65 if( dat[j] == '-' )
66 continue;
67 unsigned char c = (dat[j]>='0'&&dat[j]<='9')?(dat[j]-'0'):(dat[j]-'a'+10);
68 id.data[iNibble/2] |= (iNibble%2==0)?(c<<4):(c);
69 iNibble++;
70 }
71
72 return id;
73}
74