diff options
Diffstat (limited to '')
-rw-r--r-- | misc/rfc4122-uuid.txt (renamed from misc/rfc4122) | 693 | ||||
-rw-r--r-- | src/myriadfs.cpp | 144 | ||||
-rw-r--r-- | src/myriadfs.h | 32 | ||||
-rw-r--r-- | src/tests/myriadfs.cpp | 24 | ||||
-rw-r--r-- | src/tests/uuid.cpp | 1 | ||||
-rw-r--r-- | src/tools/myriadfs.cpp | 124 | ||||
-rw-r--r-- | src/uuid.cpp | 10 | ||||
-rw-r--r-- | src/uuid.h | 3 |
8 files changed, 589 insertions, 442 deletions
diff --git a/misc/rfc4122 b/misc/rfc4122-uuid.txt index 5c5a8a5..31ceaab 100644 --- a/misc/rfc4122 +++ b/misc/rfc4122-uuid.txt | |||
@@ -1,136 +1,9 @@ | |||
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | 1 | |
2 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | 2 | |
3 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | 3 | |
4 | <head> | 4 | |
5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | 5 | |
6 | <meta name="robots" content="index,follow" /> | 6 | |
7 | <meta name="creator" content="rfcmarkup version 1.73" /> | ||
8 | <link rel="icon" href="/images/rfc.png" type="image/png" /> | ||
9 | <link rel="shortcut icon" href="/images/rfc.png" type="image/png" /> | ||
10 | <title>RFC 4122 - A Universally Unique IDentifier (UUID) URN Namespace</title> | ||
11 | |||
12 | <style type="text/css"> | ||
13 | body { | ||
14 | margin: 0px 8px; | ||
15 | font-size: 1em; | ||
16 | } | ||
17 | h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { | ||
18 | font-weight: bold; | ||
19 | line-height: 0pt; | ||
20 | display: inline; | ||
21 | white-space: pre; | ||
22 | font-family: monospace; | ||
23 | font-size: 1em; | ||
24 | font-weight: bold; | ||
25 | } | ||
26 | pre { | ||
27 | font-size: 1em; | ||
28 | margin-top: 0px; | ||
29 | margin-bottom: 0px; | ||
30 | } | ||
31 | .pre { | ||
32 | white-space: pre; | ||
33 | font-family: monospace; | ||
34 | } | ||
35 | .header{ | ||
36 | font-weight: bold; | ||
37 | } | ||
38 | .newpage { | ||
39 | page-break-before: always; | ||
40 | } | ||
41 | .invisible { | ||
42 | text-decoration: none; | ||
43 | color: white; | ||
44 | } | ||
45 | @media print { | ||
46 | body { | ||
47 | font-size: 10.5pt; | ||
48 | } | ||
49 | h1, h2, h3, h4, h5, h6 { | ||
50 | font-size: 10.5pt; | ||
51 | } | ||
52 | |||
53 | a:link, a:visited { | ||
54 | color: inherit; | ||
55 | text-decoration: none; | ||
56 | } | ||
57 | .noprint { | ||
58 | display: none; | ||
59 | } | ||
60 | } | ||
61 | @media screen { | ||
62 | .grey, .grey a:link, .grey a:visited { | ||
63 | color: #777; | ||
64 | } | ||
65 | .docinfo { | ||
66 | background-color: #EEE; | ||
67 | } | ||
68 | .top { | ||
69 | border-top: 7px solid #EEE; | ||
70 | } | ||
71 | .bgwhite { background-color: white; } | ||
72 | .bgred { background-color: #F44; } | ||
73 | .bggrey { background-color: #666; } | ||
74 | .bgbrown { background-color: #840; } | ||
75 | .bgorange { background-color: #FA0; } | ||
76 | .bgyellow { background-color: #EE0; } | ||
77 | .bgmagenta{ background-color: #F4F; } | ||
78 | .bgblue { background-color: #66F; } | ||
79 | .bgcyan { background-color: #4DD; } | ||
80 | .bggreen { background-color: #4F4; } | ||
81 | |||
82 | .legend { font-size: 90%; } | ||
83 | .cplate { font-size: 70%; border: solid grey 1px; } | ||
84 | } | ||
85 | </style> | ||
86 | |||
87 | <script type="text/javascript"><!-- | ||
88 | function addHeaderTags() { | ||
89 | var spans = document.getElementsByTagName("span"); | ||
90 | for (var i=0; i < spans.length; i++) { | ||
91 | var elem = spans[i]; | ||
92 | if (elem) { | ||
93 | var level = elem.getAttribute("class"); | ||
94 | if (level == "h1" || level == "h2" || level == "h3" || level == "h4" || level == "h5" || level == "h6") { | ||
95 | elem.innerHTML = "<"+level+">"+elem.innerHTML+"</"+level+">"; | ||
96 | } | ||
97 | } | ||
98 | } | ||
99 | } | ||
100 | var legend_html = "Colour legend:<br /> <table> <tr><td>Unknown:</td> <td><span class='cplate bgwhite'> </span></td></tr> <tr><td>Draft:</td> <td><span class='cplate bgred'> </span></td></tr> <tr><td>Informational:</td> <td><span class='cplate bgorange'> </span></td></tr> <tr><td>Experimental:</td> <td><span class='cplate bgyellow'> </span></td></tr> <tr><td>Best Common Practice:</td><td><span class='cplate bgmagenta'> </span></td></tr> <tr><td>Proposed Standard:</td><td><span class='cplate bgblue'> </span></td></tr> <tr><td>Draft Standard:</td> <td><span class='cplate bgcyan'> </span></td></tr> <tr><td>Standard:</td> <td><span class='cplate bggreen'> </span></td></tr> <tr><td>Historic:</td> <td><span class='cplate bggrey'> </span></td></tr> <tr><td>Obsolete:</td> <td><span class='cplate bgbrown'> </span></td></tr> </table>"; | ||
101 | function showElem(id) { | ||
102 | var elem = document.getElementById(id); | ||
103 | elem.innerHTML = eval(id+"_html"); | ||
104 | elem.style.visibility='visible'; | ||
105 | } | ||
106 | function hideElem(id) { | ||
107 | var elem = document.getElementById(id); | ||
108 | elem.style.visibility='hidden'; | ||
109 | elem.innerHTML = ""; | ||
110 | } | ||
111 | // --> | ||
112 | </script> | ||
113 | </head> | ||
114 | <body onload="addHeaderTags()"> | ||
115 | <div style="height: 13px;"> | ||
116 | <div onmouseover="this.style.cursor='pointer';" | ||
117 | onclick="showElem('legend');" | ||
118 | onmouseout="hideElem('legend')" | ||
119 | style="height: 6px; position: absolute;" | ||
120 | class="pre noprint docinfo bgblue" | ||
121 | title="Click for colour legend." > </div> | ||
122 | <div id="legend" | ||
123 | class="docinfo noprint pre legend" | ||
124 | style="position:absolute; top: 4px; left: 4ex; visibility:hidden; background-color: white; padding: 4px 9px 5px 7px; border: solid #345 1px; " | ||
125 | onmouseover="showElem('legend');" | ||
126 | onmouseout="hideElem('legend');"> | ||
127 | </div> | ||
128 | </div> | ||
129 | <span class="pre noprint docinfo top">[<a href="../html/" title="Document search and retrieval page">RFCs/IDs</a>] [<a href="/rfc/rfc4122.txt" title="Plaintext version of this document">Plain Text</a>] [From <a href="draft-mealling-uuid-urn">draft-mealling-uuid-urn</a>] </span><br /> | ||
130 | <span class="pre noprint docinfo"> </span><br /> | ||
131 | <span class="pre noprint docinfo"> PROPOSED STANDARD</span><br /> | ||
132 | <span class="pre noprint docinfo"> <a href="http://www.rfc-editor.org/errata_search.php?rfc=4122">Errata</a></span><br /> | ||
133 | <pre> | ||
134 | Network Working Group P. Leach | 7 | Network Working Group P. Leach |
135 | Request for Comments: 4122 Microsoft | 8 | Request for Comments: 4122 Microsoft |
136 | Category: Standards Track M. Mealling | 9 | Category: Standards Track M. Mealling |
@@ -140,7 +13,7 @@ Category: Standards Track M. Mealling | |||
140 | July 2005 | 13 | July 2005 |
141 | 14 | ||
142 | 15 | ||
143 | <span class="h1">A Universally Unique IDentifier (UUID) URN Namespace</span> | 16 | A Universally Unique IDentifier (UUID) URN Namespace |
144 | 17 | ||
145 | Status of This Memo | 18 | Status of This Memo |
146 | 19 | ||
@@ -182,41 +55,41 @@ Abstract | |||
182 | 55 | ||
183 | 56 | ||
184 | 57 | ||
185 | <span class="grey">Leach, et al. Standards Track [Page 1]</span> | 58 | Leach, et al. Standards Track [Page 1] |
186 | </pre><pre class='newpage'><a name="page-2" id="page-2" href="#page-2" class="invisible"> </a> | 59 | |
187 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 60 | RFC 4122 A UUID URN Namespace July 2005 |
188 | 61 | ||
189 | 62 | ||
190 | Table of Contents | 63 | Table of Contents |
191 | 64 | ||
192 | <a href="#section-1">1</a>. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-2">2</a> | 65 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2 |
193 | <a href="#section-2">2</a>. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-3">3</a> | 66 | 2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . 3 |
194 | <a href="#section-3">3</a>. Namespace Registration Template . . . . . . . . . . . . . . . <a href="#page-3">3</a> | 67 | 3. Namespace Registration Template . . . . . . . . . . . . . . . 3 |
195 | <a href="#section-4">4</a>. Specification . . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-5">5</a> | 68 | 4. Specification . . . . . . . . . . . . . . . . . . . . . . . . 5 |
196 | <a href="#section-4.1">4.1</a>. Format. . . . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-5">5</a> | 69 | 4.1. Format. . . . . . . . . . . . . . . . . . . . . . . . . . 5 |
197 | <a href="#section-4.1.1">4.1.1</a>. Variant. . . . . . . . . . . . . . . . . . . . . . <a href="#page-6">6</a> | 70 | 4.1.1. Variant. . . . . . . . . . . . . . . . . . . . . . 6 |
198 | <a href="#section-4.1.2">4.1.2</a>. Layout and Byte Order. . . . . . . . . . . . . . . <a href="#page-6">6</a> | 71 | 4.1.2. Layout and Byte Order. . . . . . . . . . . . . . . 6 |
199 | <a href="#section-4.1.3">4.1.3</a>. Version. . . . . . . . . . . . . . . . . . . . . . <a href="#page-7">7</a> | 72 | 4.1.3. Version. . . . . . . . . . . . . . . . . . . . . . 7 |
200 | <a href="#section-4.1.4">4.1.4</a>. Timestamp. . . . . . . . . . . . . . . . . . . . . <a href="#page-8">8</a> | 73 | 4.1.4. Timestamp. . . . . . . . . . . . . . . . . . . . . 8 |
201 | <a href="#section-4.1.5">4.1.5</a>. Clock Sequence . . . . . . . . . . . . . . . . . . <a href="#page-8">8</a> | 74 | 4.1.5. Clock Sequence . . . . . . . . . . . . . . . . . . 8 |
202 | <a href="#section-4.1.6">4.1.6</a>. Node . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-9">9</a> | 75 | 4.1.6. Node . . . . . . . . . . . . . . . . . . . . . . . 9 |
203 | <a href="#section-4.1.7">4.1.7</a>. Nil UUID . . . . . . . . . . . . . . . . . . . . . <a href="#page-9">9</a> | 76 | 4.1.7. Nil UUID . . . . . . . . . . . . . . . . . . . . . 9 |
204 | <a href="#section-4.2">4.2</a>. Algorithms for Creating a Time-Based UUID . . . . . . . . <a href="#page-9">9</a> | 77 | 4.2. Algorithms for Creating a Time-Based UUID . . . . . . . . 9 |
205 | <a href="#section-4.2.1">4.2.1</a>. Basic Algorithm. . . . . . . . . . . . . . . . . . <a href="#page-10">10</a> | 78 | 4.2.1. Basic Algorithm. . . . . . . . . . . . . . . . . . 10 |
206 | <a href="#section-4.2.2">4.2.2</a>. Generation Details . . . . . . . . . . . . . . . . <a href="#page-12">12</a> | 79 | 4.2.2. Generation Details . . . . . . . . . . . . . . . . 12 |
207 | <a href="#section-4.3">4.3</a>. Algorithm for Creating a Name-Based UUID. . . . . . . . . <a href="#page-13">13</a> | 80 | 4.3. Algorithm for Creating a Name-Based UUID. . . . . . . . . 13 |
208 | 4.4. Algorithms for Creating a UUID from Truly Random or | 81 | 4.4. Algorithms for Creating a UUID from Truly Random or |
209 | Pseudo-Random Numbers . . . . . . . . . . . . . . . . . . <a href="#page-14">14</a> | 82 | Pseudo-Random Numbers . . . . . . . . . . . . . . . . . . 14 |
210 | <a href="#section-4.5">4.5</a>. Node IDs that Do Not Identify the Host. . . . . . . . . . <a href="#page-15">15</a> | 83 | 4.5. Node IDs that Do Not Identify the Host. . . . . . . . . . 15 |
211 | <a href="#section-5">5</a>. Community Considerations . . . . . . . . . . . . . . . . . . . <a href="#page-15">15</a> | 84 | 5. Community Considerations . . . . . . . . . . . . . . . . . . . 15 |
212 | <a href="#section-6">6</a>. Security Considerations . . . . . . . . . . . . . . . . . . . <a href="#page-16">16</a> | 85 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 16 |
213 | <a href="#section-7">7</a>. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . <a href="#page-16">16</a> | 86 | 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 16 |
214 | <a href="#section-8">8</a>. Normative References . . . . . . . . . . . . . . . . . . . . . <a href="#page-16">16</a> | 87 | 8. Normative References . . . . . . . . . . . . . . . . . . . . . 16 |
215 | <a href="#appendix-A">A</a>. <a href="#appendix-A">Appendix A</a> - Sample Implementation . . . . . . . . . . . . . . <a href="#page-18">18</a> | 88 | A. Appendix A - Sample Implementation . . . . . . . . . . . . . . 18 |
216 | <a href="#appendix-B">B</a>. <a href="#appendix-B">Appendix B</a> - Sample Output of utest . . . . . . . . . . . . . <a href="#page-29">29</a> | 89 | B. Appendix B - Sample Output of utest . . . . . . . . . . . . . 29 |
217 | <a href="#appendix-C">C</a>. <a href="#appendix-C">Appendix C</a> - Some Name Space IDs . . . . . . . . . . . . . . . <a href="#page-30">30</a> | 90 | C. Appendix C - Some Name Space IDs . . . . . . . . . . . . . . . 30 |
218 | 91 | ||
219 | <span class="h2"><a name="section-1">1</a>. Introduction</span> | 92 | 1. Introduction |
220 | 93 | ||
221 | This specification defines a Uniform Resource Name namespace for | 94 | This specification defines a Uniform Resource Name namespace for |
222 | UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally | 95 | UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally |
@@ -227,23 +100,23 @@ Table of Contents | |||
227 | to implement services using UUIDs as URNs. Nothing in this document | 100 | to implement services using UUIDs as URNs. Nothing in this document |
228 | should be construed to override the DCE standards that defined UUIDs. | 101 | should be construed to override the DCE standards that defined UUIDs. |
229 | 102 | ||
230 | There is an ITU-T Recommendation and ISO/IEC Standard [<a href="#ref-3" title='"Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components"'>3</a>] that are | 103 | There is an ITU-T Recommendation and ISO/IEC Standard [3] that are |
231 | derived from earlier versions of this document. Both sets of | 104 | derived from earlier versions of this document. Both sets of |
232 | specifications have been aligned, and are fully technically | 105 | specifications have been aligned, and are fully technically |
233 | compatible. In addition, a global registration function is being | 106 | compatible. In addition, a global registration function is being |
234 | provided by the Telecommunications Standardisation Bureau of ITU-T; | 107 | provided by the Telecommunications Standardisation Bureau of ITU-T; |
235 | for details see <<a href="http://www.itu.int/ITU-T/asn1/uuid.html">http://www.itu.int/ITU-T/asn1/uuid.html</a>>. | 108 | for details see <http://www.itu.int/ITU-T/asn1/uuid.html>. |
236 | 109 | ||
237 | 110 | ||
238 | 111 | ||
239 | 112 | ||
240 | 113 | ||
241 | <span class="grey">Leach, et al. Standards Track [Page 2]</span> | 114 | Leach, et al. Standards Track [Page 2] |
242 | </pre><pre class='newpage'><a name="page-3" id="page-3" href="#page-3" class="invisible"> </a> | 115 | |
243 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 116 | RFC 4122 A UUID URN Namespace July 2005 |
244 | 117 | ||
245 | 118 | ||
246 | <span class="h2"><a name="section-2">2</a>. Motivation</span> | 119 | 2. Motivation |
247 | 120 | ||
248 | One of the main reasons for using UUIDs is that no centralized | 121 | One of the main reasons for using UUIDs is that no centralized |
249 | authority is required to administer them (although one format uses | 122 | authority is required to administer them (although one format uses |
@@ -263,7 +136,7 @@ Table of Contents | |||
263 | registration process allows for UUIDs to be one of the URNs with the | 136 | registration process allows for UUIDs to be one of the URNs with the |
264 | lowest minting cost. | 137 | lowest minting cost. |
265 | 138 | ||
266 | <span class="h2"><a name="section-3">3</a>. Namespace Registration Template</span> | 139 | 3. Namespace Registration Template |
267 | 140 | ||
268 | Namespace ID: UUID | 141 | Namespace ID: UUID |
269 | Registration Information: | 142 | Registration Information: |
@@ -282,7 +155,7 @@ Table of Contents | |||
282 | very persistent objects across a network. | 155 | very persistent objects across a network. |
283 | 156 | ||
284 | The internal representation of a UUID is a specific sequence of | 157 | The internal representation of a UUID is a specific sequence of |
285 | bits in memory, as described in <a href="#section-4">Section 4</a>. To accurately | 158 | bits in memory, as described in Section 4. To accurately |
286 | represent a UUID as a URN, it is necessary to convert the bit | 159 | represent a UUID as a URN, it is necessary to convert the bit |
287 | sequence to a string representation. | 160 | sequence to a string representation. |
288 | 161 | ||
@@ -294,13 +167,13 @@ Table of Contents | |||
294 | 167 | ||
295 | 168 | ||
296 | 169 | ||
297 | <span class="grey">Leach, et al. Standards Track [Page 3]</span> | 170 | Leach, et al. Standards Track [Page 3] |
298 | </pre><pre class='newpage'><a name="page-4" id="page-4" href="#page-4" class="invisible"> </a> | 171 | |
299 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 172 | RFC 4122 A UUID URN Namespace July 2005 |
300 | 173 | ||
301 | 174 | ||
302 | The formal definition of the UUID string representation is | 175 | The formal definition of the UUID string representation is |
303 | provided by the following ABNF [<a href="#ref-7" title='"Augmented BNF for Syntax Specifications: ABNF"'>7</a>]: | 176 | provided by the following ABNF [7]: |
304 | 177 | ||
305 | UUID = time-low "-" time-mid "-" | 178 | UUID = time-low "-" time-mid "-" |
306 | time-high-and-version "-" | 179 | time-high-and-version "-" |
@@ -324,7 +197,7 @@ Table of Contents | |||
324 | urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 | 197 | urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 |
325 | 198 | ||
326 | Relevant ancillary documentation: | 199 | Relevant ancillary documentation: |
327 | [<a href="#ref-1" title='"Network Computing Architecture"'>1</a>][2] | 200 | [1][2] |
328 | Identifier uniqueness considerations: | 201 | Identifier uniqueness considerations: |
329 | This document specifies three algorithms to generate UUIDs: the | 202 | This document specifies three algorithms to generate UUIDs: the |
330 | first leverages the unique values of 802 MAC addresses to | 203 | first leverages the unique values of 802 MAC addresses to |
@@ -350,12 +223,12 @@ Table of Contents | |||
350 | 223 | ||
351 | 224 | ||
352 | 225 | ||
353 | <span class="grey">Leach, et al. Standards Track [Page 4]</span> | 226 | Leach, et al. Standards Track [Page 4] |
354 | </pre><pre class='newpage'><a name="page-5" id="page-5" href="#page-5" class="invisible"> </a> | 227 | |
355 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 228 | RFC 4122 A UUID URN Namespace July 2005 |
356 | 229 | ||
357 | 230 | ||
358 | or privacy concerns make its use undesirable, <a href="#section-4.5">Section 4.5</a> | 231 | or privacy concerns make its use undesirable, Section 4.5 |
359 | specifies two alternatives. Another approach is to use version 3 | 232 | specifies two alternatives. Another approach is to use version 3 |
360 | or version 4 UUIDs as defined below. | 233 | or version 4 UUIDs as defined below. |
361 | 234 | ||
@@ -364,7 +237,7 @@ Table of Contents | |||
364 | 237 | ||
365 | Rules for Lexical Equivalence: | 238 | Rules for Lexical Equivalence: |
366 | Consider each field of the UUID to be an unsigned integer as shown | 239 | Consider each field of the UUID to be an unsigned integer as shown |
367 | in the table in section <a href="#section-4.1.2">Section 4.1.2</a>. Then, to compare a pair of | 240 | in the table in section Section 4.1.2. Then, to compare a pair of |
368 | UUIDs, arithmetically compare the corresponding fields from each | 241 | UUIDs, arithmetically compare the corresponding fields from each |
369 | UUID in order of significance and according to their data type. | 242 | UUID in order of significance and according to their data type. |
370 | Two UUIDs are equal if and only if all the corresponding fields | 243 | Two UUIDs are equal if and only if all the corresponding fields |
@@ -396,9 +269,9 @@ Table of Contents | |||
396 | Scope: | 269 | Scope: |
397 | UUIDs are global in scope. | 270 | UUIDs are global in scope. |
398 | 271 | ||
399 | <span class="h2"><a name="section-4">4</a>. Specification</span> | 272 | 4. Specification |
400 | 273 | ||
401 | <span class="h3"><a name="section-4.1">4.1</a>. Format</span> | 274 | 4.1. Format |
402 | 275 | ||
403 | The UUID format is 16 octets; some bits of the eight octet variant | 276 | The UUID format is 16 octets; some bits of the eight octet variant |
404 | field specified below determine finer structure. | 277 | field specified below determine finer structure. |
@@ -406,12 +279,12 @@ Table of Contents | |||
406 | 279 | ||
407 | 280 | ||
408 | 281 | ||
409 | <span class="grey">Leach, et al. Standards Track [Page 5]</span> | 282 | Leach, et al. Standards Track [Page 5] |
410 | </pre><pre class='newpage'><a name="page-6" id="page-6" href="#page-6" class="invisible"> </a> | 283 | |
411 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 284 | RFC 4122 A UUID URN Namespace July 2005 |
412 | 285 | ||
413 | 286 | ||
414 | <span class="h4"><a name="section-4.1.1">4.1.1</a>. Variant</span> | 287 | 4.1.1. Variant |
415 | 288 | ||
416 | The variant field determines the layout of the UUID. That is, the | 289 | The variant field determines the layout of the UUID. That is, the |
417 | interpretation of all other bits in the UUID depends on the setting | 290 | interpretation of all other bits in the UUID depends on the setting |
@@ -438,7 +311,7 @@ Table of Contents | |||
438 | defined here is not guaranteed, and is not likely to be an issue in | 311 | defined here is not guaranteed, and is not likely to be an issue in |
439 | practice. | 312 | practice. |
440 | 313 | ||
441 | <span class="h4"><a name="section-4.1.2">4.1.2</a>. Layout and Byte Order</span> | 314 | 4.1.2. Layout and Byte Order |
442 | 315 | ||
443 | To minimize confusion about bit assignments within octets, the UUID | 316 | To minimize confusion about bit assignments within octets, the UUID |
444 | record definition is defined only in terms of fields that are | 317 | record definition is defined only in terms of fields that are |
@@ -462,9 +335,9 @@ Table of Contents | |||
462 | 335 | ||
463 | 336 | ||
464 | 337 | ||
465 | <span class="grey">Leach, et al. Standards Track [Page 6]</span> | 338 | Leach, et al. Standards Track [Page 6] |
466 | </pre><pre class='newpage'><a name="page-7" id="page-7" href="#page-7" class="invisible"> </a> | 339 | |
467 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 340 | RFC 4122 A UUID URN Namespace July 2005 |
468 | 341 | ||
469 | 342 | ||
470 | clock_seq_hi_and_rese unsigned 8 8 The high field of the | 343 | clock_seq_hi_and_rese unsigned 8 8 The high field of the |
@@ -500,7 +373,7 @@ Table of Contents | |||
500 | | node (2-5) | | 373 | | node (2-5) | |
501 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 374 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
502 | 375 | ||
503 | <span class="h4"><a name="section-4.1.3">4.1.3</a>. Version</span> | 376 | 4.1.3. Version |
504 | 377 | ||
505 | The version number is in the most significant 4 bits of the time | 378 | The version number is in the most significant 4 bits of the time |
506 | stamp (bits 4 through 7 of the time_hi_and_version field). | 379 | stamp (bits 4 through 7 of the time_hi_and_version field). |
@@ -518,9 +391,9 @@ Table of Contents | |||
518 | 391 | ||
519 | 392 | ||
520 | 393 | ||
521 | <span class="grey">Leach, et al. Standards Track [Page 7]</span> | 394 | Leach, et al. Standards Track [Page 7] |
522 | </pre><pre class='newpage'><a name="page-8" id="page-8" href="#page-8" class="invisible"> </a> | 395 | |
523 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 396 | RFC 4122 A UUID URN Namespace July 2005 |
524 | 397 | ||
525 | 398 | ||
526 | 0 0 1 1 3 The name-based version | 399 | 0 0 1 1 3 The name-based version |
@@ -538,7 +411,7 @@ Table of Contents | |||
538 | The version is more accurately a sub-type; again, we retain the term | 411 | The version is more accurately a sub-type; again, we retain the term |
539 | for compatibility. | 412 | for compatibility. |
540 | 413 | ||
541 | <span class="h4"><a name="section-4.1.4">4.1.4</a>. Timestamp</span> | 414 | 4.1.4. Timestamp |
542 | 415 | ||
543 | The timestamp is a 60-bit value. For UUID version 1, this is | 416 | The timestamp is a 60-bit value. For UUID version 1, this is |
544 | represented by Coordinated Universal Time (UTC) as a count of 100- | 417 | represented by Coordinated Universal Time (UTC) as a count of 100- |
@@ -552,12 +425,12 @@ Table of Contents | |||
552 | offset. | 425 | offset. |
553 | 426 | ||
554 | For UUID version 3 or 5, the timestamp is a 60-bit value constructed | 427 | For UUID version 3 or 5, the timestamp is a 60-bit value constructed |
555 | from a name as described in <a href="#section-4.3">Section 4.3</a>. | 428 | from a name as described in Section 4.3. |
556 | 429 | ||
557 | For UUID version 4, the timestamp is a randomly or pseudo-randomly | 430 | For UUID version 4, the timestamp is a randomly or pseudo-randomly |
558 | generated 60-bit value, as described in <a href="#section-4.4">Section 4.4</a>. | 431 | generated 60-bit value, as described in Section 4.4. |
559 | 432 | ||
560 | <span class="h4"><a name="section-4.1.5">4.1.5</a>. Clock Sequence</span> | 433 | 4.1.5. Clock Sequence |
561 | 434 | ||
562 | For UUID version 1, the clock sequence is used to help avoid | 435 | For UUID version 1, the clock sequence is used to help avoid |
563 | duplicates that could arise when the clock is set backwards in time | 436 | duplicates that could arise when the clock is set backwards in time |
@@ -574,9 +447,9 @@ Table of Contents | |||
574 | 447 | ||
575 | 448 | ||
576 | 449 | ||
577 | <span class="grey">Leach, et al. Standards Track [Page 8]</span> | 450 | Leach, et al. Standards Track [Page 8] |
578 | </pre><pre class='newpage'><a name="page-9" id="page-9" href="#page-9" class="invisible"> </a> | 451 | |
579 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 452 | RFC 4122 A UUID URN Namespace July 2005 |
580 | 453 | ||
581 | 454 | ||
582 | Similarly, if the node ID changes (e.g., because a network card has | 455 | Similarly, if the node ID changes (e.g., because a network card has |
@@ -593,12 +466,12 @@ Table of Contents | |||
593 | The initial value MUST NOT be correlated to the node identifier. | 466 | The initial value MUST NOT be correlated to the node identifier. |
594 | 467 | ||
595 | For UUID version 3 or 5, the clock sequence is a 14-bit value | 468 | For UUID version 3 or 5, the clock sequence is a 14-bit value |
596 | constructed from a name as described in <a href="#section-4.3">Section 4.3</a>. | 469 | constructed from a name as described in Section 4.3. |
597 | 470 | ||
598 | For UUID version 4, clock sequence is a randomly or pseudo-randomly | 471 | For UUID version 4, clock sequence is a randomly or pseudo-randomly |
599 | generated 14-bit value as described in <a href="#section-4.4">Section 4.4</a>. | 472 | generated 14-bit value as described in Section 4.4. |
600 | 473 | ||
601 | <span class="h4"><a name="section-4.1.6">4.1.6</a>. Node</span> | 474 | 4.1.6. Node |
602 | 475 | ||
603 | For UUID version 1, the node field consists of an IEEE 802 MAC | 476 | For UUID version 1, the node field consists of an IEEE 802 MAC |
604 | address, usually the host address. For systems with multiple IEEE | 477 | address, usually the host address. For systems with multiple IEEE |
@@ -608,34 +481,34 @@ Table of Contents | |||
608 | transmitted on an 802.3 LAN. | 481 | transmitted on an 802.3 LAN. |
609 | 482 | ||
610 | For systems with no IEEE address, a randomly or pseudo-randomly | 483 | For systems with no IEEE address, a randomly or pseudo-randomly |
611 | generated value may be used; see <a href="#section-4.5">Section 4.5</a>. The multicast bit must | 484 | generated value may be used; see Section 4.5. The multicast bit must |
612 | be set in such addresses, in order that they will never conflict with | 485 | be set in such addresses, in order that they will never conflict with |
613 | addresses obtained from network cards. | 486 | addresses obtained from network cards. |
614 | 487 | ||
615 | For UUID version 3 or 5, the node field is a 48-bit value constructed | 488 | For UUID version 3 or 5, the node field is a 48-bit value constructed |
616 | from a name as described in <a href="#section-4.3">Section 4.3</a>. | 489 | from a name as described in Section 4.3. |
617 | 490 | ||
618 | For UUID version 4, the node field is a randomly or pseudo-randomly | 491 | For UUID version 4, the node field is a randomly or pseudo-randomly |
619 | generated 48-bit value as described in <a href="#section-4.4">Section 4.4</a>. | 492 | generated 48-bit value as described in Section 4.4. |
620 | 493 | ||
621 | <span class="h4"><a name="section-4.1.7">4.1.7</a>. Nil UUID</span> | 494 | 4.1.7. Nil UUID |
622 | 495 | ||
623 | The nil UUID is special form of UUID that is specified to have all | 496 | The nil UUID is special form of UUID that is specified to have all |
624 | 128 bits set to zero. | 497 | 128 bits set to zero. |
625 | 498 | ||
626 | <span class="h3"><a name="section-4.2">4.2</a>. Algorithms for Creating a Time-Based UUID</span> | 499 | 4.2. Algorithms for Creating a Time-Based UUID |
627 | 500 | ||
628 | Various aspects of the algorithm for creating a version 1 UUID are | 501 | Various aspects of the algorithm for creating a version 1 UUID are |
629 | discussed in the following sections. | 502 | discussed in the following sections. |
630 | 503 | ||
631 | 504 | ||
632 | 505 | ||
633 | <span class="grey">Leach, et al. Standards Track [Page 9]</span> | 506 | Leach, et al. Standards Track [Page 9] |
634 | </pre><pre class='newpage'><a name="page-10" id="page-10" href="#page-10" class="invisible"> </a> | 507 | |
635 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 508 | RFC 4122 A UUID URN Namespace July 2005 |
636 | 509 | ||
637 | 510 | ||
638 | <span class="h4"><a name="section-4.2.1">4.2.1</a>. Basic Algorithm</span> | 511 | 4.2.1. Basic Algorithm |
639 | 512 | ||
640 | The following algorithm is simple, correct, and inefficient: | 513 | The following algorithm is simple, correct, and inefficient: |
641 | 514 | ||
@@ -663,7 +536,7 @@ Table of Contents | |||
663 | o Release the global lock. | 536 | o Release the global lock. |
664 | 537 | ||
665 | o Format a UUID from the current timestamp, clock sequence, and node | 538 | o Format a UUID from the current timestamp, clock sequence, and node |
666 | ID values according to the steps in <a href="#section-4.2.2">Section 4.2.2</a>. | 539 | ID values according to the steps in Section 4.2.2. |
667 | 540 | ||
668 | If UUIDs do not need to be frequently generated, the above algorithm | 541 | If UUIDs do not need to be frequently generated, the above algorithm |
669 | may be perfectly adequate. For higher performance requirements, | 542 | may be perfectly adequate. For higher performance requirements, |
@@ -686,12 +559,12 @@ Table of Contents | |||
686 | 559 | ||
687 | 560 | ||
688 | 561 | ||
689 | <span class="grey">Leach, et al. Standards Track [Page 10]</span> | 562 | Leach, et al. Standards Track [Page 10] |
690 | </pre><pre class='newpage'><a name="page-11" id="page-11" href="#page-11" class="invisible"> </a> | 563 | |
691 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 564 | RFC 4122 A UUID URN Namespace July 2005 |
692 | 565 | ||
693 | 566 | ||
694 | <span class="h5"><a name="section-4.2.1.1">4.2.1.1</a>. Reading Stable Storage</span> | 567 | 4.2.1.1. Reading Stable Storage |
695 | 568 | ||
696 | The state only needs to be read from stable storage once at boot | 569 | The state only needs to be read from stable storage once at boot |
697 | time, if it is read into a system-wide shared volatile store (and | 570 | time, if it is read into a system-wide shared volatile store (and |
@@ -708,7 +581,7 @@ Table of Contents | |||
708 | sequence to a random value, then instead of keeping it in stable | 581 | sequence to a random value, then instead of keeping it in stable |
709 | store, the current node ID may be returned. | 582 | store, the current node ID may be returned. |
710 | 583 | ||
711 | <span class="h5"><a name="section-4.2.1.2">4.2.1.2</a>. System Clock Resolution</span> | 584 | 4.2.1.2. System Clock Resolution |
712 | 585 | ||
713 | The timestamp is generated from the system time, whose resolution may | 586 | The timestamp is generated from the system time, whose resolution may |
714 | be less than the resolution of the UUID timestamp. | 587 | be less than the resolution of the UUID timestamp. |
@@ -733,7 +606,7 @@ Table of Contents | |||
733 | will permit higher speed allocation by making multiple UUIDs | 606 | will permit higher speed allocation by making multiple UUIDs |
734 | potentially available for each time stamp value. | 607 | potentially available for each time stamp value. |
735 | 608 | ||
736 | <span class="h5"><a name="section-4.2.1.3">4.2.1.3</a>. Writing Stable Storage</span> | 609 | 4.2.1.3. Writing Stable Storage |
737 | 610 | ||
738 | The state does not always need to be written to stable store every | 611 | The state does not always need to be written to stable store every |
739 | time a UUID is generated. The timestamp in the stable store can be | 612 | time a UUID is generated. The timestamp in the stable store can be |
@@ -742,9 +615,9 @@ Table of Contents | |||
742 | 615 | ||
743 | 616 | ||
744 | 617 | ||
745 | <span class="grey">Leach, et al. Standards Track [Page 11]</span> | 618 | Leach, et al. Standards Track [Page 11] |
746 | </pre><pre class='newpage'><a name="page-12" id="page-12" href="#page-12" class="invisible"> </a> | 619 | |
747 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 620 | RFC 4122 A UUID URN Namespace July 2005 |
748 | 621 | ||
749 | 622 | ||
750 | the clock sequence and node ID remain unchanged, only the shared | 623 | the clock sequence and node ID remain unchanged, only the shared |
@@ -753,19 +626,19 @@ Table of Contents | |||
753 | typical time it takes the system to reboot, a crash will not cause a | 626 | typical time it takes the system to reboot, a crash will not cause a |
754 | reinitialization of the clock sequence. | 627 | reinitialization of the clock sequence. |
755 | 628 | ||
756 | <span class="h5"><a name="section-4.2.1.4">4.2.1.4</a>. Sharing State Across Processes</span> | 629 | 4.2.1.4. Sharing State Across Processes |
757 | 630 | ||
758 | If it is too expensive to access shared state each time a UUID is | 631 | If it is too expensive to access shared state each time a UUID is |
759 | generated, then the system-wide generator can be implemented to | 632 | generated, then the system-wide generator can be implemented to |
760 | allocate a block of time stamps each time it is called; a per- | 633 | allocate a block of time stamps each time it is called; a per- |
761 | process generator can allocate from that block until it is exhausted. | 634 | process generator can allocate from that block until it is exhausted. |
762 | 635 | ||
763 | <span class="h4"><a name="section-4.2.2">4.2.2</a>. Generation Details</span> | 636 | 4.2.2. Generation Details |
764 | 637 | ||
765 | Version 1 UUIDs are generated according to the following algorithm: | 638 | Version 1 UUIDs are generated according to the following algorithm: |
766 | 639 | ||
767 | o Determine the values for the UTC-based timestamp and clock | 640 | o Determine the values for the UTC-based timestamp and clock |
768 | sequence to be used in the UUID, as described in <a href="#section-4.2.1">Section 4.2.1</a>. | 641 | sequence to be used in the UUID, as described in Section 4.2.1. |
769 | 642 | ||
770 | o For the purposes of this algorithm, consider the timestamp to be a | 643 | o For the purposes of this algorithm, consider the timestamp to be a |
771 | 60-bit unsigned integer and the clock sequence to be a 14-bit | 644 | 60-bit unsigned integer and the clock sequence to be a 14-bit |
@@ -798,9 +671,9 @@ Table of Contents | |||
798 | 671 | ||
799 | 672 | ||
800 | 673 | ||
801 | <span class="grey">Leach, et al. Standards Track [Page 12]</span> | 674 | Leach, et al. Standards Track [Page 12] |
802 | </pre><pre class='newpage'><a name="page-13" id="page-13" href="#page-13" class="invisible"> </a> | 675 | |
803 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 676 | RFC 4122 A UUID URN Namespace July 2005 |
804 | 677 | ||
805 | 678 | ||
806 | o Set the 6 least significant bits (bits zero through 5) of the | 679 | o Set the 6 least significant bits (bits zero through 5) of the |
@@ -814,7 +687,7 @@ Table of Contents | |||
814 | o Set the node field to the 48-bit IEEE address in the same order of | 687 | o Set the node field to the 48-bit IEEE address in the same order of |
815 | significance as the address. | 688 | significance as the address. |
816 | 689 | ||
817 | <span class="h3"><a name="section-4.3">4.3</a>. Algorithm for Creating a Name-Based UUID</span> | 690 | 4.3. Algorithm for Creating a Name-Based UUID |
818 | 691 | ||
819 | The version 3 or 5 UUID is meant for generating UUIDs from "names" | 692 | The version 3 or 5 UUID is meant for generating UUIDs from "names" |
820 | that are drawn from, and unique within, some "name space". The | 693 | that are drawn from, and unique within, some "name space". The |
@@ -845,18 +718,18 @@ Table of Contents | |||
845 | as follows: | 718 | as follows: |
846 | 719 | ||
847 | o Allocate a UUID to use as a "name space ID" for all UUIDs | 720 | o Allocate a UUID to use as a "name space ID" for all UUIDs |
848 | generated from names in that name space; see <a href="#appendix-C">Appendix C</a> for some | 721 | generated from names in that name space; see Appendix C for some |
849 | pre-defined values. | 722 | pre-defined values. |
850 | 723 | ||
851 | o Choose either MD5 [<a href="#ref-4" title='"The MD5 Message-Digest Algorithm "'>4</a>] or SHA-1 [<a href="#ref-8" title='"Secure Hash Standard"'>8</a>] as the hash algorithm; If | 724 | o Choose either MD5 [4] or SHA-1 [8] as the hash algorithm; If |
852 | backward compatibility is not an issue, SHA-1 is preferred. | 725 | backward compatibility is not an issue, SHA-1 is preferred. |
853 | 726 | ||
854 | 727 | ||
855 | 728 | ||
856 | 729 | ||
857 | <span class="grey">Leach, et al. Standards Track [Page 13]</span> | 730 | Leach, et al. Standards Track [Page 13] |
858 | </pre><pre class='newpage'><a name="page-14" id="page-14" href="#page-14" class="invisible"> </a> | 731 | |
859 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 732 | RFC 4122 A UUID URN Namespace July 2005 |
860 | 733 | ||
861 | 734 | ||
862 | o Convert the name to a canonical sequence of octets (as defined by | 735 | o Convert the name to a canonical sequence of octets (as defined by |
@@ -876,7 +749,7 @@ Table of Contents | |||
876 | 749 | ||
877 | o Set the four most significant bits (bits 12 through 15) of the | 750 | o Set the four most significant bits (bits 12 through 15) of the |
878 | time_hi_and_version field to the appropriate 4-bit version number | 751 | time_hi_and_version field to the appropriate 4-bit version number |
879 | from <a href="#section-4.1.3">Section 4.1.3</a>. | 752 | from Section 4.1.3. |
880 | 753 | ||
881 | o Set the clock_seq_hi_and_reserved field to octet 8 of the hash. | 754 | o Set the clock_seq_hi_and_reserved field to octet 8 of the hash. |
882 | 755 | ||
@@ -890,7 +763,7 @@ Table of Contents | |||
890 | 763 | ||
891 | o Convert the resulting UUID to local byte order. | 764 | o Convert the resulting UUID to local byte order. |
892 | 765 | ||
893 | <span class="h3"><a name="section-4.4">4.4</a>. Algorithms for Creating a UUID from Truly Random or</span> | 766 | 4.4. Algorithms for Creating a UUID from Truly Random or |
894 | Pseudo-Random Numbers | 767 | Pseudo-Random Numbers |
895 | 768 | ||
896 | The version 4 UUID is meant for generating UUIDs from truly-random or | 769 | The version 4 UUID is meant for generating UUIDs from truly-random or |
@@ -903,28 +776,28 @@ Table of Contents | |||
903 | 776 | ||
904 | o Set the four most significant bits (bits 12 through 15) of the | 777 | o Set the four most significant bits (bits 12 through 15) of the |
905 | time_hi_and_version field to the 4-bit version number from | 778 | time_hi_and_version field to the 4-bit version number from |
906 | <a href="#section-4.1.3">Section 4.1.3</a>. | 779 | Section 4.1.3. |
907 | 780 | ||
908 | o Set all the other bits to randomly (or pseudo-randomly) chosen | 781 | o Set all the other bits to randomly (or pseudo-randomly) chosen |
909 | values. | 782 | values. |
910 | 783 | ||
911 | 784 | ||
912 | 785 | ||
913 | <span class="grey">Leach, et al. Standards Track [Page 14]</span> | 786 | Leach, et al. Standards Track [Page 14] |
914 | </pre><pre class='newpage'><a name="page-15" id="page-15" href="#page-15" class="invisible"> </a> | 787 | |
915 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 788 | RFC 4122 A UUID URN Namespace July 2005 |
916 | 789 | ||
917 | 790 | ||
918 | See <a href="#section-4.5">Section 4.5</a> for a discussion on random numbers. | 791 | See Section 4.5 for a discussion on random numbers. |
919 | 792 | ||
920 | <span class="h3"><a name="section-4.5">4.5</a>. Node IDs that Do Not Identify the Host</span> | 793 | 4.5. Node IDs that Do Not Identify the Host |
921 | 794 | ||
922 | This section describes how to generate a version 1 UUID if an IEEE | 795 | This section describes how to generate a version 1 UUID if an IEEE |
923 | 802 address is not available, or its use is not desired. | 796 | 802 address is not available, or its use is not desired. |
924 | 797 | ||
925 | One approach is to contact the IEEE and get a separate block of | 798 | One approach is to contact the IEEE and get a separate block of |
926 | addresses. At the time of writing, the application could be found at | 799 | addresses. At the time of writing, the application could be found at |
927 | <<a href="http://standards.ieee.org/regauth/oui/pilot-ind.html">http://standards.ieee.org/regauth/oui/pilot-ind.html</a>>, and the cost | 800 | <http://standards.ieee.org/regauth/oui/pilot-ind.html>, and the cost |
928 | was US$550. | 801 | was US$550. |
929 | 802 | ||
930 | A better solution is to obtain a 47-bit cryptographic quality random | 803 | A better solution is to obtain a 47-bit cryptographic quality random |
@@ -942,7 +815,7 @@ Table of Contents | |||
942 | correct local/global bit. | 815 | correct local/global bit. |
943 | 816 | ||
944 | Advice on generating cryptographic-quality random numbers can be | 817 | Advice on generating cryptographic-quality random numbers can be |
945 | found in <a href="./rfc1750">RFC1750</a> [<a href="#ref-5" title='"Randomness Requirements for Security"'>5</a>]. | 818 | found in RFC1750 [5]. |
946 | 819 | ||
947 | In addition, items such as the computer's name and the name of the | 820 | In addition, items such as the computer's name and the name of the |
948 | operating system, while not strictly speaking random, will help | 821 | operating system, while not strictly speaking random, will help |
@@ -952,11 +825,11 @@ Table of Contents | |||
952 | specific, because both the data available and the functions to obtain | 825 | specific, because both the data available and the functions to obtain |
953 | them are often very system specific. A generic approach, however, is | 826 | them are often very system specific. A generic approach, however, is |
954 | to accumulate as many sources as possible into a buffer, use a | 827 | to accumulate as many sources as possible into a buffer, use a |
955 | message digest such as MD5 [<a href="#ref-4" title='"The MD5 Message-Digest Algorithm "'>4</a>] or SHA-1 [<a href="#ref-8" title='"Secure Hash Standard"'>8</a>], take an arbitrary 6 | 828 | message digest such as MD5 [4] or SHA-1 [8], take an arbitrary 6 |
956 | bytes from the hash value, and set the multicast bit as described | 829 | bytes from the hash value, and set the multicast bit as described |
957 | above. | 830 | above. |
958 | 831 | ||
959 | <span class="h2"><a name="section-5">5</a>. Community Considerations</span> | 832 | 5. Community Considerations |
960 | 833 | ||
961 | The use of UUIDs is extremely pervasive in computing. They comprise | 834 | The use of UUIDs is extremely pervasive in computing. They comprise |
962 | the core identifier infrastructure for many operating systems | 835 | the core identifier infrastructure for many operating systems |
@@ -966,15 +839,15 @@ Table of Contents | |||
966 | 839 | ||
967 | 840 | ||
968 | 841 | ||
969 | <span class="grey">Leach, et al. Standards Track [Page 15]</span> | 842 | Leach, et al. Standards Track [Page 15] |
970 | </pre><pre class='newpage'><a name="page-16" id="page-16" href="#page-16" class="invisible"> </a> | 843 | |
971 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 844 | RFC 4122 A UUID URN Namespace July 2005 |
972 | 845 | ||
973 | 846 | ||
974 | This specification attempts to standardize that practice as openly as | 847 | This specification attempts to standardize that practice as openly as |
975 | possible and in a way that attempts to benefit the entire Internet. | 848 | possible and in a way that attempts to benefit the entire Internet. |
976 | 849 | ||
977 | <span class="h2"><a name="section-6">6</a>. Security Considerations</span> | 850 | 6. Security Considerations |
978 | 851 | ||
979 | Do not assume that UUIDs are hard to guess; they should not be used | 852 | Do not assume that UUIDs are hard to guess; they should not be used |
980 | as security capabilities (identifiers whose mere possession grants | 853 | as security capabilities (identifiers whose mere possession grants |
@@ -990,7 +863,7 @@ Table of Contents | |||
990 | be willing to rely on the random number source at all hosts. If this | 863 | be willing to rely on the random number source at all hosts. If this |
991 | is not feasible, the namespace variant should be used. | 864 | is not feasible, the namespace variant should be used. |
992 | 865 | ||
993 | <span class="h2"><a name="section-7">7</a>. Acknowledgments</span> | 866 | 7. Acknowledgments |
994 | 867 | ||
995 | This document draws heavily on the OSF DCE specification for UUIDs. | 868 | This document draws heavily on the OSF DCE specification for UUIDs. |
996 | Ted Ts'o provided helpful comments, especially on the byte ordering | 869 | Ted Ts'o provided helpful comments, especially on the byte ordering |
@@ -1002,42 +875,42 @@ Table of Contents | |||
1002 | S. Engelschall, John Larmouth, and Paul Thorpe. Professor Larmouth | 875 | S. Engelschall, John Larmouth, and Paul Thorpe. Professor Larmouth |
1003 | was also invaluable in achieving coordination with ISO/IEC. | 876 | was also invaluable in achieving coordination with ISO/IEC. |
1004 | 877 | ||
1005 | <span class="h2"><a name="section-8">8</a>. Normative References</span> | 878 | 8. Normative References |
1006 | 879 | ||
1007 | [<a name="ref-1" id="ref-1">1</a>] Zahn, L., Dineen, T., and P. Leach, "Network Computing | 880 | [1] Zahn, L., Dineen, T., and P. Leach, "Network Computing |
1008 | Architecture", ISBN 0-13-611674-4, January 1990. | 881 | Architecture", ISBN 0-13-611674-4, January 1990. |
1009 | 882 | ||
1010 | [<a name="ref-2" id="ref-2">2</a>] "DCE: Remote Procedure Call", Open Group CAE Specification C309, | 883 | [2] "DCE: Remote Procedure Call", Open Group CAE Specification C309, |
1011 | ISBN 1-85912-041-5, August 1994. | 884 | ISBN 1-85912-041-5, August 1994. |
1012 | 885 | ||
1013 | [<a name="ref-3" id="ref-3">3</a>] ISO/IEC 9834-8:2004 Information Technology, "Procedures for the | 886 | [3] ISO/IEC 9834-8:2004 Information Technology, "Procedures for the |
1014 | operation of OSI Registration Authorities: Generation and | 887 | operation of OSI Registration Authorities: Generation and |
1015 | registration of Universally Unique Identifiers (UUIDs) and their | 888 | registration of Universally Unique Identifiers (UUIDs) and their |
1016 | use as ASN.1 Object Identifier components" ITU-T Rec. X.667, | 889 | use as ASN.1 Object Identifier components" ITU-T Rec. X.667, |
1017 | 2004. | 890 | 2004. |
1018 | 891 | ||
1019 | [<a name="ref-4" id="ref-4">4</a>] Rivest, R., "The MD5 Message-Digest Algorithm ", <a href="./rfc1321">RFC 1321</a>, April | 892 | [4] Rivest, R., "The MD5 Message-Digest Algorithm ", RFC 1321, April |
1020 | 1992. | 893 | 1992. |
1021 | 894 | ||
1022 | 895 | ||
1023 | 896 | ||
1024 | 897 | ||
1025 | <span class="grey">Leach, et al. Standards Track [Page 16]</span> | 898 | Leach, et al. Standards Track [Page 16] |
1026 | </pre><pre class='newpage'><a name="page-17" id="page-17" href="#page-17" class="invisible"> </a> | 899 | |
1027 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 900 | RFC 4122 A UUID URN Namespace July 2005 |
1028 | 901 | ||
1029 | 902 | ||
1030 | [<a name="ref-5" id="ref-5">5</a>] Eastlake, D., 3rd, Schiller, J., and S. Crocker, "Randomness | 903 | [5] Eastlake, D., 3rd, Schiller, J., and S. Crocker, "Randomness |
1031 | Requirements for Security", <a href="./bcp106">BCP 106</a>, <a href="./rfc4086">RFC 4086</a>, June 2005. | 904 | Requirements for Security", BCP 106, RFC 4086, June 2005. |
1032 | 905 | ||
1033 | [<a name="ref-6" id="ref-6">6</a>] Moats, R., "URN Syntax", <a href="./rfc2141">RFC 2141</a>, May 1997. | 906 | [6] Moats, R., "URN Syntax", RFC 2141, May 1997. |
1034 | 907 | ||
1035 | [<a name="ref-7" id="ref-7">7</a>] Crocker, D. and P. Overell, "Augmented BNF for Syntax | 908 | [7] Crocker, D. and P. Overell, "Augmented BNF for Syntax |
1036 | Specifications: ABNF", <a href="./rfc2234">RFC 2234</a>, November 1997. | 909 | Specifications: ABNF", RFC 2234, November 1997. |
1037 | 910 | ||
1038 | [<a name="ref-8" id="ref-8">8</a>] National Institute of Standards and Technology, "Secure Hash | 911 | [8] National Institute of Standards and Technology, "Secure Hash |
1039 | Standard", FIPS PUB 180-1, April 1995, | 912 | Standard", FIPS PUB 180-1, April 1995, |
1040 | <<a href="http://www.itl.nist.gov/fipspubs/fip180-1.htm">http://www.itl.nist.gov/fipspubs/fip180-1.htm</a>>. | 913 | <http://www.itl.nist.gov/fipspubs/fip180-1.htm>. |
1041 | 914 | ||
1042 | 915 | ||
1043 | 916 | ||
@@ -1078,12 +951,12 @@ Table of Contents | |||
1078 | 951 | ||
1079 | 952 | ||
1080 | 953 | ||
1081 | <span class="grey">Leach, et al. Standards Track [Page 17]</span> | 954 | Leach, et al. Standards Track [Page 17] |
1082 | </pre><pre class='newpage'><a name="page-18" id="page-18" href="#page-18" class="invisible"> </a> | 955 | |
1083 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 956 | RFC 4122 A UUID URN Namespace July 2005 |
1084 | 957 | ||
1085 | 958 | ||
1086 | <span class="h2"><a name="appendix-A">Appendix A</a>. <a href="#appendix-A">Appendix A</a> - Sample Implementation</span> | 959 | Appendix A. Appendix A - Sample Implementation |
1087 | 960 | ||
1088 | This implementation consists of 5 files: uuid.h, uuid.c, sysdep.h, | 961 | This implementation consists of 5 files: uuid.h, uuid.c, sysdep.h, |
1089 | sysdep.c and utest.c. The uuid.* files are the system independent | 962 | sysdep.c and utest.c. The uuid.* files are the system independent |
@@ -1100,7 +973,7 @@ copyrt.h | |||
1100 | 973 | ||
1101 | /* | 974 | /* |
1102 | ** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. | 975 | ** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. |
1103 | ** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & | 976 | ** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & |
1104 | ** Digital Equipment Corporation, Maynard, Mass. | 977 | ** Digital Equipment Corporation, Maynard, Mass. |
1105 | ** Copyright (c) 1998 Microsoft. | 978 | ** Copyright (c) 1998 Microsoft. |
1106 | ** To anyone who acknowledges that this file is provided "AS IS" | 979 | ** To anyone who acknowledges that this file is provided "AS IS" |
@@ -1134,9 +1007,9 @@ typedef struct { | |||
1134 | 1007 | ||
1135 | 1008 | ||
1136 | 1009 | ||
1137 | <span class="grey">Leach, et al. Standards Track [Page 18]</span> | 1010 | Leach, et al. Standards Track [Page 18] |
1138 | </pre><pre class='newpage'><a name="page-19" id="page-19" href="#page-19" class="invisible"> </a> | 1011 | |
1139 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1012 | RFC 4122 A UUID URN Namespace July 2005 |
1140 | 1013 | ||
1141 | 1014 | ||
1142 | /* uuid_create -- generate a UUID */ | 1015 | /* uuid_create -- generate a UUID */ |
@@ -1173,10 +1046,10 @@ int uuid_compare(uuid_t *u1, uuid_t *u2); | |||
1173 | uuid.c | 1046 | uuid.c |
1174 | 1047 | ||
1175 | #include "copyrt.h" | 1048 | #include "copyrt.h" |
1176 | #include <string.h> | 1049 | #include <string.h> |
1177 | #include <stdio.h> | 1050 | #include <stdio.h> |
1178 | #include <stdlib.h> | 1051 | #include <stdlib.h> |
1179 | #include <time.h> | 1052 | #include <time.h> |
1180 | #include "sysdep.h" | 1053 | #include "sysdep.h" |
1181 | #include "uuid.h" | 1054 | #include "uuid.h" |
1182 | 1055 | ||
@@ -1190,9 +1063,9 @@ static void format_uuid_v1(uuid_t *uuid, unsigned16 clockseq, | |||
1190 | 1063 | ||
1191 | 1064 | ||
1192 | 1065 | ||
1193 | <span class="grey">Leach, et al. Standards Track [Page 19]</span> | 1066 | Leach, et al. Standards Track [Page 19] |
1194 | </pre><pre class='newpage'><a name="page-20" id="page-20" href="#page-20" class="invisible"> </a> | 1067 | |
1195 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1068 | RFC 4122 A UUID URN Namespace July 2005 |
1196 | 1069 | ||
1197 | 1070 | ||
1198 | static void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], | 1071 | static void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], |
@@ -1212,15 +1085,15 @@ int uuid_create(uuid_t *uuid) | |||
1212 | /* acquire system-wide lock so we're alone */ | 1085 | /* acquire system-wide lock so we're alone */ |
1213 | LOCK; | 1086 | LOCK; |
1214 | /* get time, node ID, saved state from non-volatile storage */ | 1087 | /* get time, node ID, saved state from non-volatile storage */ |
1215 | get_current_time(&timestamp); | 1088 | get_current_time(×tamp); |
1216 | get_ieee_node_identifier(&node); | 1089 | get_ieee_node_identifier(&node); |
1217 | f = read_state(&clockseq, &last_time, &last_node); | 1090 | f = read_state(&clockseq, &last_time, &last_node); |
1218 | 1091 | ||
1219 | /* if no NV state, or if clock went backwards, or node ID | 1092 | /* if no NV state, or if clock went backwards, or node ID |
1220 | changed (e.g., new network card) change clockseq */ | 1093 | changed (e.g., new network card) change clockseq */ |
1221 | if (!f || memcmp(&node, &last_node, sizeof node)) | 1094 | if (!f || memcmp(&node, &last_node, sizeof node)) |
1222 | clockseq = true_random(); | 1095 | clockseq = true_random(); |
1223 | else if (timestamp < last_time) | 1096 | else if (timestamp < last_time) |
1224 | clockseq++; | 1097 | clockseq++; |
1225 | 1098 | ||
1226 | /* save the state for next time */ | 1099 | /* save the state for next time */ |
@@ -1240,23 +1113,23 @@ void format_uuid_v1(uuid_t* uuid, unsigned16 clock_seq, | |||
1240 | { | 1113 | { |
1241 | /* Construct a version 1 uuid with the information we've gathered | 1114 | /* Construct a version 1 uuid with the information we've gathered |
1242 | plus a few constants. */ | 1115 | plus a few constants. */ |
1243 | uuid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); | 1116 | uuid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); |
1244 | uuid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); | 1117 | uuid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); |
1245 | uuid->time_hi_and_version = | 1118 | uuid->time_hi_and_version = |
1246 | 1119 | ||
1247 | 1120 | ||
1248 | 1121 | ||
1249 | <span class="grey">Leach, et al. Standards Track [Page 20]</span> | 1122 | Leach, et al. Standards Track [Page 20] |
1250 | </pre><pre class='newpage'><a name="page-21" id="page-21" href="#page-21" class="invisible"> </a> | 1123 | |
1251 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1124 | RFC 4122 A UUID URN Namespace July 2005 |
1252 | 1125 | ||
1253 | 1126 | ||
1254 | (unsigned short)((timestamp >> 48) & 0x0FFF); | 1127 | (unsigned short)((timestamp >> 48) & 0x0FFF); |
1255 | uuid->time_hi_and_version |= (1 << 12); | 1128 | uuid->time_hi_and_version |= (1 << 12); |
1256 | uuid->clock_seq_low = clock_seq & 0xFF; | 1129 | uuid->clock_seq_low = clock_seq & 0xFF; |
1257 | uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8; | 1130 | uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8; |
1258 | uuid->clock_seq_hi_and_reserved |= 0x80; | 1131 | uuid->clock_seq_hi_and_reserved |= 0x80; |
1259 | memcpy(&uuid->node, &node, sizeof uuid->node); | 1132 | memcpy(&uuid->node, &node, sizeof uuid->node); |
1260 | } | 1133 | } |
1261 | 1134 | ||
1262 | /* data type for UUID generator persistent state */ | 1135 | /* data type for UUID generator persistent state */ |
@@ -1280,7 +1153,7 @@ int read_state(unsigned16 *clockseq, uuid_time_t *timestamp, | |||
1280 | fp = fopen("state", "rb"); | 1153 | fp = fopen("state", "rb"); |
1281 | if (fp == NULL) | 1154 | if (fp == NULL) |
1282 | return 0; | 1155 | return 0; |
1283 | fread(&st, sizeof st, 1, fp); | 1156 | fread(&st, sizeof st, 1, fp); |
1284 | fclose(fp); | 1157 | fclose(fp); |
1285 | inited = 1; | 1158 | inited = 1; |
1286 | } | 1159 | } |
@@ -1302,9 +1175,9 @@ void write_state(unsigned16 clockseq, uuid_time_t timestamp, | |||
1302 | 1175 | ||
1303 | 1176 | ||
1304 | 1177 | ||
1305 | <span class="grey">Leach, et al. Standards Track [Page 21]</span> | 1178 | Leach, et al. Standards Track [Page 21] |
1306 | </pre><pre class='newpage'><a name="page-22" id="page-22" href="#page-22" class="invisible"> </a> | 1179 | |
1307 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1180 | RFC 4122 A UUID URN Namespace July 2005 |
1308 | 1181 | ||
1309 | 1182 | ||
1310 | if (!inited) { | 1183 | if (!inited) { |
@@ -1316,9 +1189,9 @@ void write_state(unsigned16 clockseq, uuid_time_t timestamp, | |||
1316 | st.cs = clockseq; | 1189 | st.cs = clockseq; |
1317 | st.ts = timestamp; | 1190 | st.ts = timestamp; |
1318 | st.node = node; | 1191 | st.node = node; |
1319 | if (timestamp >= next_save) { | 1192 | if (timestamp >= next_save) { |
1320 | fp = fopen("state", "wb"); | 1193 | fp = fopen("state", "wb"); |
1321 | fwrite(&st, sizeof st, 1, fp); | 1194 | fwrite(&st, sizeof st, 1, fp); |
1322 | fclose(fp); | 1195 | fclose(fp); |
1323 | /* schedule next save for 10 seconds from now */ | 1196 | /* schedule next save for 10 seconds from now */ |
1324 | next_save = timestamp + (10 * 10 * 1000 * 1000); | 1197 | next_save = timestamp + (10 * 10 * 1000 * 1000); |
@@ -1336,13 +1209,13 @@ void get_current_time(uuid_time_t *timestamp) | |||
1336 | uuid_time_t time_now; | 1209 | uuid_time_t time_now; |
1337 | 1210 | ||
1338 | if (!inited) { | 1211 | if (!inited) { |
1339 | get_system_time(&time_now); | 1212 | get_system_time(&time_now); |
1340 | uuids_this_tick = UUIDS_PER_TICK; | 1213 | uuids_this_tick = UUIDS_PER_TICK; |
1341 | inited = 1; | 1214 | inited = 1; |
1342 | } | 1215 | } |
1343 | 1216 | ||
1344 | for ( ; ; ) { | 1217 | for ( ; ; ) { |
1345 | get_system_time(&time_now); | 1218 | get_system_time(&time_now); |
1346 | 1219 | ||
1347 | /* if clock reading changed since last UUID generated, */ | 1220 | /* if clock reading changed since last UUID generated, */ |
1348 | if (time_last != time_now) { | 1221 | if (time_last != time_now) { |
@@ -1351,16 +1224,16 @@ void get_current_time(uuid_time_t *timestamp) | |||
1351 | time_last = time_now; | 1224 | time_last = time_now; |
1352 | break; | 1225 | break; |
1353 | } | 1226 | } |
1354 | if (uuids_this_tick < UUIDS_PER_TICK) { | 1227 | if (uuids_this_tick < UUIDS_PER_TICK) { |
1355 | uuids_this_tick++; | 1228 | uuids_this_tick++; |
1356 | break; | 1229 | break; |
1357 | } | 1230 | } |
1358 | 1231 | ||
1359 | 1232 | ||
1360 | 1233 | ||
1361 | <span class="grey">Leach, et al. Standards Track [Page 22]</span> | 1234 | Leach, et al. Standards Track [Page 22] |
1362 | </pre><pre class='newpage'><a name="page-23" id="page-23" href="#page-23" class="invisible"> </a> | 1235 | |
1363 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1236 | RFC 4122 A UUID URN Namespace July 2005 |
1364 | 1237 | ||
1365 | 1238 | ||
1366 | /* going too fast for our clock; spin */ | 1239 | /* going too fast for our clock; spin */ |
@@ -1377,10 +1250,10 @@ static unsigned16 true_random(void) | |||
1377 | uuid_time_t time_now; | 1250 | uuid_time_t time_now; |
1378 | 1251 | ||
1379 | if (!inited) { | 1252 | if (!inited) { |
1380 | get_system_time(&time_now); | 1253 | get_system_time(&time_now); |
1381 | time_now = time_now / UUIDS_PER_TICK; | 1254 | time_now = time_now / UUIDS_PER_TICK; |
1382 | srand((unsigned int) | 1255 | srand((unsigned int) |
1383 | (((time_now >> 32) ^ time_now) & 0xffffffff)); | 1256 | (((time_now >> 32) ^ time_now) & 0xffffffff)); |
1384 | inited = 1; | 1257 | inited = 1; |
1385 | } | 1258 | } |
1386 | 1259 | ||
@@ -1403,10 +1276,10 @@ void uuid_create_md5_from_name(uuid_t *uuid, uuid_t nsid, void *name, | |||
1403 | net_nsid.time_mid = htons(net_nsid.time_mid); | 1276 | net_nsid.time_mid = htons(net_nsid.time_mid); |
1404 | net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); | 1277 | net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); |
1405 | 1278 | ||
1406 | MD5Init(&c); | 1279 | MD5Init(&c); |
1407 | MD5Update(&c, &net_nsid, sizeof net_nsid); | 1280 | MD5Update(&c, &net_nsid, sizeof net_nsid); |
1408 | MD5Update(&c, name, namelen); | 1281 | MD5Update(&c, name, namelen); |
1409 | MD5Final(hash, &c); | 1282 | MD5Final(hash, &c); |
1410 | 1283 | ||
1411 | /* the hash is in network byte order at this point */ | 1284 | /* the hash is in network byte order at this point */ |
1412 | format_uuid_v3or5(uuid, hash, 3); | 1285 | format_uuid_v3or5(uuid, hash, 3); |
@@ -1414,9 +1287,9 @@ void uuid_create_md5_from_name(uuid_t *uuid, uuid_t nsid, void *name, | |||
1414 | 1287 | ||
1415 | 1288 | ||
1416 | 1289 | ||
1417 | <span class="grey">Leach, et al. Standards Track [Page 23]</span> | 1290 | Leach, et al. Standards Track [Page 23] |
1418 | </pre><pre class='newpage'><a name="page-24" id="page-24" href="#page-24" class="invisible"> </a> | 1291 | |
1419 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1292 | RFC 4122 A UUID URN Namespace July 2005 |
1420 | 1293 | ||
1421 | 1294 | ||
1422 | void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name, | 1295 | void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name, |
@@ -1433,10 +1306,10 @@ void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name, | |||
1433 | net_nsid.time_mid = htons(net_nsid.time_mid); | 1306 | net_nsid.time_mid = htons(net_nsid.time_mid); |
1434 | net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); | 1307 | net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version); |
1435 | 1308 | ||
1436 | SHA1_Init(&c); | 1309 | SHA1_Init(&c); |
1437 | SHA1_Update(&c, &net_nsid, sizeof net_nsid); | 1310 | SHA1_Update(&c, &net_nsid, sizeof net_nsid); |
1438 | SHA1_Update(&c, name, namelen); | 1311 | SHA1_Update(&c, name, namelen); |
1439 | SHA1_Final(hash, &c); | 1312 | SHA1_Final(hash, &c); |
1440 | 1313 | ||
1441 | /* the hash is in network byte order at this point */ | 1314 | /* the hash is in network byte order at this point */ |
1442 | format_uuid_v3or5(uuid, hash, 5); | 1315 | format_uuid_v3or5(uuid, hash, 5); |
@@ -1448,40 +1321,40 @@ void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], int v) | |||
1448 | { | 1321 | { |
1449 | /* convert UUID to local byte order */ | 1322 | /* convert UUID to local byte order */ |
1450 | memcpy(uuid, hash, sizeof *uuid); | 1323 | memcpy(uuid, hash, sizeof *uuid); |
1451 | uuid->time_low = ntohl(uuid->time_low); | 1324 | uuid->time_low = ntohl(uuid->time_low); |
1452 | uuid->time_mid = ntohs(uuid->time_mid); | 1325 | uuid->time_mid = ntohs(uuid->time_mid); |
1453 | uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version); | 1326 | uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version); |
1454 | 1327 | ||
1455 | /* put in the variant and version bits */ | 1328 | /* put in the variant and version bits */ |
1456 | uuid->time_hi_and_version &= 0x0FFF; | 1329 | uuid->time_hi_and_version &= 0x0FFF; |
1457 | uuid->time_hi_and_version |= (v << 12); | 1330 | uuid->time_hi_and_version |= (v << 12); |
1458 | uuid->clock_seq_hi_and_reserved &= 0x3F; | 1331 | uuid->clock_seq_hi_and_reserved &= 0x3F; |
1459 | uuid->clock_seq_hi_and_reserved |= 0x80; | 1332 | uuid->clock_seq_hi_and_reserved |= 0x80; |
1460 | } | 1333 | } |
1461 | 1334 | ||
1462 | /* uuid_compare -- Compare two UUID's "lexically" and return */ | 1335 | /* uuid_compare -- Compare two UUID's "lexically" and return */ |
1463 | #define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1; | 1336 | #define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1; |
1464 | int uuid_compare(uuid_t *u1, uuid_t *u2) | 1337 | int uuid_compare(uuid_t *u1, uuid_t *u2) |
1465 | { | 1338 | { |
1466 | int i; | 1339 | int i; |
1467 | 1340 | ||
1468 | CHECK(u1->time_low, u2->time_low); | 1341 | CHECK(u1->time_low, u2->time_low); |
1469 | CHECK(u1->time_mid, u2->time_mid); | 1342 | CHECK(u1->time_mid, u2->time_mid); |
1470 | 1343 | ||
1471 | 1344 | ||
1472 | 1345 | ||
1473 | <span class="grey">Leach, et al. Standards Track [Page 24]</span> | 1346 | Leach, et al. Standards Track [Page 24] |
1474 | </pre><pre class='newpage'><a name="page-25" id="page-25" href="#page-25" class="invisible"> </a> | 1347 | |
1475 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1348 | RFC 4122 A UUID URN Namespace July 2005 |
1476 | 1349 | ||
1477 | 1350 | ||
1478 | CHECK(u1->time_hi_and_version, u2->time_hi_and_version); | 1351 | CHECK(u1->time_hi_and_version, u2->time_hi_and_version); |
1479 | CHECK(u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved); | 1352 | CHECK(u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved); |
1480 | CHECK(u1->clock_seq_low, u2->clock_seq_low) | 1353 | CHECK(u1->clock_seq_low, u2->clock_seq_low) |
1481 | for (i = 0; i < 6; i++) { | 1354 | for (i = 0; i < 6; i++) { |
1482 | if (u1->node[i] < u2->node[i]) | 1355 | if (u1->node[i] < u2->node[i]) |
1483 | return -1; | 1356 | return -1; |
1484 | if (u1->node[i] > u2->node[i]) | 1357 | if (u1->node[i] > u2->node[i]) |
1485 | return 1; | 1358 | return 1; |
1486 | } | 1359 | } |
1487 | return 0; | 1360 | return 0; |
@@ -1496,15 +1369,15 @@ sysdep.h | |||
1496 | #define WININC 0 | 1369 | #define WININC 0 |
1497 | 1370 | ||
1498 | #ifdef WININC | 1371 | #ifdef WININC |
1499 | #include <windows.h> | 1372 | #include <windows.h> |
1500 | #else | 1373 | #else |
1501 | #include <sys/types.h> | 1374 | #include <sys/types.h> |
1502 | #include <sys/time.h> | 1375 | #include <sys/time.h> |
1503 | #include <sys/sysinfo.h> | 1376 | #include <sys/sysinfo.h> |
1504 | #endif | 1377 | #endif |
1505 | 1378 | ||
1506 | #include "global.h" | 1379 | #include "global.h" |
1507 | /* change to point to where MD5 .h's live; <a href="./rfc1321">RFC 1321</a> has sample | 1380 | /* change to point to where MD5 .h's live; RFC 1321 has sample |
1508 | implementation */ | 1381 | implementation */ |
1509 | #include "md5.h" | 1382 | #include "md5.h" |
1510 | 1383 | ||
@@ -1526,9 +1399,9 @@ typedef unsigned char byte; | |||
1526 | 1399 | ||
1527 | 1400 | ||
1528 | 1401 | ||
1529 | <span class="grey">Leach, et al. Standards Track [Page 25]</span> | 1402 | Leach, et al. Standards Track [Page 25] |
1530 | </pre><pre class='newpage'><a name="page-26" id="page-26" href="#page-26" class="invisible"> </a> | 1403 | |
1531 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1404 | RFC 4122 A UUID URN Namespace July 2005 |
1532 | 1405 | ||
1533 | 1406 | ||
1534 | #define unsigned64_t unsigned __int64 | 1407 | #define unsigned64_t unsigned __int64 |
@@ -1551,7 +1424,7 @@ void get_random_info(char seed[16]); | |||
1551 | sysdep.c | 1424 | sysdep.c |
1552 | 1425 | ||
1553 | #include "copyrt.h" | 1426 | #include "copyrt.h" |
1554 | #include <stdio.h> | 1427 | #include <stdio.h> |
1555 | #include "sysdep.h" | 1428 | #include "sysdep.h" |
1556 | 1429 | ||
1557 | /* system dependent call to get IEEE node ID. | 1430 | /* system dependent call to get IEEE node ID. |
@@ -1566,25 +1439,25 @@ void get_ieee_node_identifier(uuid_node_t *node) | |||
1566 | if (!inited) { | 1439 | if (!inited) { |
1567 | fp = fopen("nodeid", "rb"); | 1440 | fp = fopen("nodeid", "rb"); |
1568 | if (fp) { | 1441 | if (fp) { |
1569 | fread(&saved_node, sizeof saved_node, 1, fp); | 1442 | fread(&saved_node, sizeof saved_node, 1, fp); |
1570 | fclose(fp); | 1443 | fclose(fp); |
1571 | } | 1444 | } |
1572 | else { | 1445 | else { |
1573 | get_random_info(seed); | 1446 | get_random_info(seed); |
1574 | seed[0] |= 0x01; | 1447 | seed[0] |= 0x01; |
1575 | memcpy(&saved_node, seed, sizeof saved_node); | 1448 | memcpy(&saved_node, seed, sizeof saved_node); |
1576 | fp = fopen("nodeid", "wb"); | 1449 | fp = fopen("nodeid", "wb"); |
1577 | if (fp) { | 1450 | if (fp) { |
1578 | fwrite(&saved_node, sizeof saved_node, 1, fp); | 1451 | fwrite(&saved_node, sizeof saved_node, 1, fp); |
1579 | fclose(fp); | 1452 | fclose(fp); |
1580 | } | 1453 | } |
1581 | } | 1454 | } |
1582 | 1455 | ||
1583 | 1456 | ||
1584 | 1457 | ||
1585 | <span class="grey">Leach, et al. Standards Track [Page 26]</span> | 1458 | Leach, et al. Standards Track [Page 26] |
1586 | </pre><pre class='newpage'><a name="page-27" id="page-27" href="#page-27" class="invisible"> </a> | 1459 | |
1587 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1460 | RFC 4122 A UUID URN Namespace July 2005 |
1588 | 1461 | ||
1589 | 1462 | ||
1590 | inited = 1; | 1463 | inited = 1; |
@@ -1606,7 +1479,7 @@ void get_system_time(uuid_time_t *uuid_time) | |||
1606 | Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. | 1479 | Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. |
1607 | The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) | 1480 | The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) |
1608 | + 18 years and 5 leap days. */ | 1481 | + 18 years and 5 leap days. */ |
1609 | GetSystemTimeAsFileTime((FILETIME *)&time); | 1482 | GetSystemTimeAsFileTime((FILETIME *)&time); |
1610 | time.QuadPart += | 1483 | time.QuadPart += |
1611 | 1484 | ||
1612 | (unsigned __int64) (1000*1000*10) // seconds | 1485 | (unsigned __int64) (1000*1000*10) // seconds |
@@ -1615,7 +1488,7 @@ void get_system_time(uuid_time_t *uuid_time) | |||
1615 | *uuid_time = time.QuadPart; | 1488 | *uuid_time = time.QuadPart; |
1616 | } | 1489 | } |
1617 | 1490 | ||
1618 | /* Sample code, not for use in production; see <a href="./rfc1750">RFC 1750</a> */ | 1491 | /* Sample code, not for use in production; see RFC 1750 */ |
1619 | void get_random_info(char seed[16]) | 1492 | void get_random_info(char seed[16]) |
1620 | { | 1493 | { |
1621 | MD5_CTX c; | 1494 | MD5_CTX c; |
@@ -1629,24 +1502,24 @@ void get_random_info(char seed[16]) | |||
1629 | char hostname[MAX_COMPUTERNAME_LENGTH + 1]; | 1502 | char hostname[MAX_COMPUTERNAME_LENGTH + 1]; |
1630 | } r; | 1503 | } r; |
1631 | 1504 | ||
1632 | MD5Init(&c); | 1505 | MD5Init(&c); |
1633 | GlobalMemoryStatus(&r.m); | 1506 | GlobalMemoryStatus(&r.m); |
1634 | GetSystemInfo(&r.s); | 1507 | GetSystemInfo(&r.s); |
1635 | GetSystemTimeAsFileTime(&r.t); | 1508 | GetSystemTimeAsFileTime(&r.t); |
1636 | QueryPerformanceCounter(&r.pc); | 1509 | QueryPerformanceCounter(&r.pc); |
1637 | r.tc = GetTickCount(); | 1510 | r.tc = GetTickCount(); |
1638 | 1511 | ||
1639 | 1512 | ||
1640 | 1513 | ||
1641 | <span class="grey">Leach, et al. Standards Track [Page 27]</span> | 1514 | Leach, et al. Standards Track [Page 27] |
1642 | </pre><pre class='newpage'><a name="page-28" id="page-28" href="#page-28" class="invisible"> </a> | 1515 | |
1643 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1516 | RFC 4122 A UUID URN Namespace July 2005 |
1644 | 1517 | ||
1645 | 1518 | ||
1646 | r.l = MAX_COMPUTERNAME_LENGTH + 1; | 1519 | r.l = MAX_COMPUTERNAME_LENGTH + 1; |
1647 | GetComputerName(r.hostname, &r.l); | 1520 | GetComputerName(r.hostname, &r.l); |
1648 | MD5Update(&c, &r, sizeof r); | 1521 | MD5Update(&c, &r, sizeof r); |
1649 | MD5Final(seed, &c); | 1522 | MD5Final(seed, &c); |
1650 | } | 1523 | } |
1651 | 1524 | ||
1652 | #else | 1525 | #else |
@@ -1655,7 +1528,7 @@ void get_system_time(uuid_time_t *uuid_time) | |||
1655 | { | 1528 | { |
1656 | struct timeval tp; | 1529 | struct timeval tp; |
1657 | 1530 | ||
1658 | gettimeofday(&tp, (struct timezone *)0); | 1531 | gettimeofday(&tp, (struct timezone *)0); |
1659 | 1532 | ||
1660 | /* Offset between UUID formatted times and Unix formatted times. | 1533 | /* Offset between UUID formatted times and Unix formatted times. |
1661 | UUID UTC base time is October 15, 1582. | 1534 | UUID UTC base time is October 15, 1582. |
@@ -1665,7 +1538,7 @@ void get_system_time(uuid_time_t *uuid_time) | |||
1665 | + I64(0x01B21DD213814000); | 1538 | + I64(0x01B21DD213814000); |
1666 | } | 1539 | } |
1667 | 1540 | ||
1668 | /* Sample code, not for use in production; see <a href="./rfc1750">RFC 1750</a> */ | 1541 | /* Sample code, not for use in production; see RFC 1750 */ |
1669 | void get_random_info(char seed[16]) | 1542 | void get_random_info(char seed[16]) |
1670 | { | 1543 | { |
1671 | MD5_CTX c; | 1544 | MD5_CTX c; |
@@ -1675,12 +1548,12 @@ void get_random_info(char seed[16]) | |||
1675 | char hostname[257]; | 1548 | char hostname[257]; |
1676 | } r; | 1549 | } r; |
1677 | 1550 | ||
1678 | MD5Init(&c); | 1551 | MD5Init(&c); |
1679 | sysinfo(&r.s); | 1552 | sysinfo(&r.s); |
1680 | gettimeofday(&r.t, (struct timezone *)0); | 1553 | gettimeofday(&r.t, (struct timezone *)0); |
1681 | gethostname(r.hostname, 256); | 1554 | gethostname(r.hostname, 256); |
1682 | MD5Update(&c, &r, sizeof r); | 1555 | MD5Update(&c, &r, sizeof r); |
1683 | MD5Final(seed, &c); | 1556 | MD5Final(seed, &c); |
1684 | } | 1557 | } |
1685 | 1558 | ||
1686 | #endif | 1559 | #endif |
@@ -1689,14 +1562,14 @@ utest.c | |||
1689 | 1562 | ||
1690 | #include "copyrt.h" | 1563 | #include "copyrt.h" |
1691 | #include "sysdep.h" | 1564 | #include "sysdep.h" |
1692 | #include <stdio.h> | 1565 | #include <stdio.h> |
1693 | #include "uuid.h" | 1566 | #include "uuid.h" |
1694 | 1567 | ||
1695 | 1568 | ||
1696 | 1569 | ||
1697 | <span class="grey">Leach, et al. Standards Track [Page 28]</span> | 1570 | Leach, et al. Standards Track [Page 28] |
1698 | </pre><pre class='newpage'><a name="page-29" id="page-29" href="#page-29" class="invisible"> </a> | 1571 | |
1699 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1572 | RFC 4122 A UUID URN Namespace July 2005 |
1700 | 1573 | ||
1701 | 1574 | ||
1702 | uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */ | 1575 | uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */ |
@@ -1714,7 +1587,7 @@ void puid(uuid_t u) | |||
1714 | printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid, | 1587 | printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid, |
1715 | u.time_hi_and_version, u.clock_seq_hi_and_reserved, | 1588 | u.time_hi_and_version, u.clock_seq_hi_and_reserved, |
1716 | u.clock_seq_low); | 1589 | u.clock_seq_low); |
1717 | for (i = 0; i < 6; i++) | 1590 | for (i = 0; i < 6; i++) |
1718 | printf("%2.2x", u.node[i]); | 1591 | printf("%2.2x", u.node[i]); |
1719 | printf("\n"); | 1592 | printf("\n"); |
1720 | } | 1593 | } |
@@ -1725,20 +1598,20 @@ void main(int argc, char **argv) | |||
1725 | uuid_t u; | 1598 | uuid_t u; |
1726 | int f; | 1599 | int f; |
1727 | 1600 | ||
1728 | uuid_create(&u); | 1601 | uuid_create(&u); |
1729 | printf("uuid_create(): "); puid(u); | 1602 | printf("uuid_create(): "); puid(u); |
1730 | 1603 | ||
1731 | f = uuid_compare(&u, &u); | 1604 | f = uuid_compare(&u, &u); |
1732 | printf("uuid_compare(u,u): %d\n", f); /* should be 0 */ | 1605 | printf("uuid_compare(u,u): %d\n", f); /* should be 0 */ |
1733 | f = uuid_compare(&u, &NameSpace_DNS); | 1606 | f = uuid_compare(&u, &NameSpace_DNS); |
1734 | printf("uuid_compare(u, NameSpace_DNS): %d\n", f); /* s.b. 1 */ | 1607 | printf("uuid_compare(u, NameSpace_DNS): %d\n", f); /* s.b. 1 */ |
1735 | f = uuid_compare(&NameSpace_DNS, &u); | 1608 | f = uuid_compare(&NameSpace_DNS, &u); |
1736 | printf("uuid_compare(NameSpace_DNS, u): %d\n", f); /* s.b. -1 */ | 1609 | printf("uuid_compare(NameSpace_DNS, u): %d\n", f); /* s.b. -1 */ |
1737 | uuid_create_md5_from_name(&u, NameSpace_DNS, "www.widgets.com", 15); | 1610 | uuid_create_md5_from_name(&u, NameSpace_DNS, "www.widgets.com", 15); |
1738 | printf("uuid_create_md5_from_name(): "); puid(u); | 1611 | printf("uuid_create_md5_from_name(): "); puid(u); |
1739 | } | 1612 | } |
1740 | 1613 | ||
1741 | <span class="h2"><a name="appendix-B">Appendix B</a>. <a href="#appendix-B">Appendix B</a> - Sample Output of utest</span> | 1614 | Appendix B. Appendix B - Sample Output of utest |
1742 | 1615 | ||
1743 | uuid_create(): 7d444840-9dc0-11d1-b245-5ffdce74fad2 | 1616 | uuid_create(): 7d444840-9dc0-11d1-b245-5ffdce74fad2 |
1744 | uuid_compare(u,u): 0 | 1617 | uuid_compare(u,u): 0 |
@@ -1750,12 +1623,12 @@ void main(int argc, char **argv) | |||
1750 | 1623 | ||
1751 | 1624 | ||
1752 | 1625 | ||
1753 | <span class="grey">Leach, et al. Standards Track [Page 29]</span> | 1626 | Leach, et al. Standards Track [Page 29] |
1754 | </pre><pre class='newpage'><a name="page-30" id="page-30" href="#page-30" class="invisible"> </a> | 1627 | |
1755 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1628 | RFC 4122 A UUID URN Namespace July 2005 |
1756 | 1629 | ||
1757 | 1630 | ||
1758 | <span class="h2"><a name="appendix-C">Appendix C</a>. <a href="#appendix-C">Appendix C</a> - Some Name Space IDs</span> | 1631 | Appendix C. Appendix C - Some Name Space IDs |
1759 | 1632 | ||
1760 | This appendix lists the name space IDs for some potentially | 1633 | This appendix lists the name space IDs for some potentially |
1761 | interesting name spaces, as initialized C structures and in the | 1634 | interesting name spaces, as initialized C structures and in the |
@@ -1806,9 +1679,9 @@ void main(int argc, char **argv) | |||
1806 | 1679 | ||
1807 | 1680 | ||
1808 | 1681 | ||
1809 | <span class="grey">Leach, et al. Standards Track [Page 30]</span> | 1682 | Leach, et al. Standards Track [Page 30] |
1810 | </pre><pre class='newpage'><a name="page-31" id="page-31" href="#page-31" class="invisible"> </a> | 1683 | |
1811 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1684 | RFC 4122 A UUID URN Namespace July 2005 |
1812 | 1685 | ||
1813 | 1686 | ||
1814 | Authors' Addresses | 1687 | Authors' Addresses |
@@ -1832,7 +1705,7 @@ Authors' Addresses | |||
1832 | 1705 | ||
1833 | Phone: +1-678-581-9656 | 1706 | Phone: +1-678-581-9656 |
1834 | EMail: michael@refactored-networks.com | 1707 | EMail: michael@refactored-networks.com |
1835 | URI: <a href="http://www.refactored-networks.com">http://www.refactored-networks.com</a> | 1708 | URI: http://www.refactored-networks.com |
1836 | 1709 | ||
1837 | 1710 | ||
1838 | Rich Salz | 1711 | Rich Salz |
@@ -1843,7 +1716,7 @@ Authors' Addresses | |||
1843 | 1716 | ||
1844 | Phone: +1 617-864-0455 | 1717 | Phone: +1 617-864-0455 |
1845 | EMail: rsalz@datapower.com | 1718 | EMail: rsalz@datapower.com |
1846 | URI: <a href="http://www.datapower.com">http://www.datapower.com</a> | 1719 | URI: http://www.datapower.com |
1847 | 1720 | ||
1848 | 1721 | ||
1849 | 1722 | ||
@@ -1862,9 +1735,9 @@ Authors' Addresses | |||
1862 | 1735 | ||
1863 | 1736 | ||
1864 | 1737 | ||
1865 | <span class="grey">Leach, et al. Standards Track [Page 31]</span> | 1738 | Leach, et al. Standards Track [Page 31] |
1866 | </pre><pre class='newpage'><a name="page-32" id="page-32" href="#page-32" class="invisible"> </a> | 1739 | |
1867 | <span class="grey"><a href="./rfc4122">RFC 4122</a> A UUID URN Namespace July 2005</span> | 1740 | RFC 4122 A UUID URN Namespace July 2005 |
1868 | 1741 | ||
1869 | 1742 | ||
1870 | Full Copyright Statement | 1743 | Full Copyright Statement |
@@ -1872,7 +1745,7 @@ Full Copyright Statement | |||
1872 | Copyright (C) The Internet Society (2005). | 1745 | Copyright (C) The Internet Society (2005). |
1873 | 1746 | ||
1874 | This document is subject to the rights, licenses and restrictions | 1747 | This document is subject to the rights, licenses and restrictions |
1875 | contained in <a href="./bcp78">BCP 78</a>, and except as set forth therein, the authors | 1748 | contained in BCP 78, and except as set forth therein, the authors |
1876 | retain all their rights. | 1749 | retain all their rights. |
1877 | 1750 | ||
1878 | This document and the information contained herein are provided on an | 1751 | This document and the information contained herein are provided on an |
@@ -1892,14 +1765,14 @@ Intellectual Property | |||
1892 | might or might not be available; nor does it represent that it has | 1765 | might or might not be available; nor does it represent that it has |
1893 | made any independent effort to identify any such rights. Information | 1766 | made any independent effort to identify any such rights. Information |
1894 | on the procedures with respect to rights in RFC documents can be | 1767 | on the procedures with respect to rights in RFC documents can be |
1895 | found in <a href="./bcp78">BCP 78</a> and <a href="./bcp79">BCP 79</a>. | 1768 | found in BCP 78 and BCP 79. |
1896 | 1769 | ||
1897 | Copies of IPR disclosures made to the IETF Secretariat and any | 1770 | Copies of IPR disclosures made to the IETF Secretariat and any |
1898 | assurances of licenses to be made available, or the result of an | 1771 | assurances of licenses to be made available, or the result of an |
1899 | attempt made to obtain a general license or permission for the use of | 1772 | attempt made to obtain a general license or permission for the use of |
1900 | such proprietary rights by implementers or users of this | 1773 | such proprietary rights by implementers or users of this |
1901 | specification can be obtained from the IETF on-line IPR repository at | 1774 | specification can be obtained from the IETF on-line IPR repository at |
1902 | <a href="http://www.ietf.org/ipr">http://www.ietf.org/ipr</a>. | 1775 | http://www.ietf.org/ipr. |
1903 | 1776 | ||
1904 | The IETF invites any interested party to bring to its attention any | 1777 | The IETF invites any interested party to bring to its attention any |
1905 | copyrights, patents or patent applications, or other proprietary | 1778 | copyrights, patents or patent applications, or other proprietary |
@@ -1919,10 +1792,4 @@ Acknowledgement | |||
1919 | 1792 | ||
1920 | 1793 | ||
1921 | Leach, et al. Standards Track [Page 32] | 1794 | Leach, et al. Standards Track [Page 32] |
1922 | </pre><pre class='newpage'> | 1795 | |
1923 | |||
1924 | </pre><br /> | ||
1925 | <span class="noprint"><small><small>Html markup produced by rfcmarkup 1.73, available from | ||
1926 | <a href="http://tools.ietf.org/tools/rfcmarkup/">http://tools.ietf.org/tools/rfcmarkup/</a> | ||
1927 | </small></small></span> | ||
1928 | </body></html> | ||
diff --git a/src/myriadfs.cpp b/src/myriadfs.cpp index 4e2a0f6..8312bce 100644 --- a/src/myriadfs.cpp +++ b/src/myriadfs.cpp | |||
@@ -45,7 +45,17 @@ Bu::MyriadFs::MyriadFs( Bu::Stream &rStore, int iBlockSize ) : | |||
45 | 45 | ||
46 | int8_t iVer; | 46 | int8_t iVer; |
47 | ms.read( &iVer, 1 ); | 47 | ms.read( &iVer, 1 ); |
48 | throw MyriadFsException("You totally have a MyriadFs stream, version %d, but they can't be loaded yet.", iVer ); | 48 | |
49 | int32_t iNumNodes; | ||
50 | ms.read( &iNumNodes, 4 ); | ||
51 | for( int32_t j = 0; j < iNumNodes; j++ ) | ||
52 | { | ||
53 | int32_t iNode; | ||
54 | int32_t iPos; | ||
55 | ms.read( &iNode, 4 ); | ||
56 | ms.read( &iPos, 4 ); | ||
57 | hNodeIndex.insert( iNode, iPos ); | ||
58 | } | ||
49 | } | 59 | } |
50 | else | 60 | else |
51 | { | 61 | { |
@@ -125,26 +135,103 @@ Bu::MyriadStream Bu::MyriadFs::open( const Bu::String &sPath, int iMode ) | |||
125 | if( iParent < 0 ) | 135 | if( iParent < 0 ) |
126 | throw; | 136 | throw; |
127 | 137 | ||
138 | // This means that an intermediate path component couldn't be found | ||
139 | if( e.getErrorCode() == 1 ) | ||
140 | throw; | ||
141 | |||
128 | // The file wasn't found, but the path leading up to it was. | 142 | // The file wasn't found, but the path leading up to it was. |
129 | // first, figure out the final path element... | 143 | // first, figure out the final path element... |
130 | Bu::String::const_iterator iStart = sPath.begin(); | 144 | Bu::String::const_iterator iStart = sPath.begin(); |
131 | if( *iStart == '/' ) | 145 | if( *iStart == '/' ) |
132 | iStart++; | 146 | iStart++; |
133 | sio << "Scanning for filename:" << sio.nl; | 147 | sio << "Scanning for filename:" << sio.nl; |
134 | for( Bu::String::const_iterator iEnd = iStart.find('/')+1; iEnd; iStart = iEnd ) { } | 148 | for( Bu::String::const_iterator iEnd = iStart.find('/'); iEnd; |
149 | iStart = iEnd+1, iEnd = iStart.find('/') ) { } | ||
135 | Bu::String sName( iStart, sPath.end() ); | 150 | Bu::String sName( iStart, sPath.end() ); |
136 | sio << "End filename: " << sName << sio.nl; | 151 | sio << "End filename: " << sName << sio.nl; |
137 | sio << "Parent inode: " << iParent << sio.nl; | 152 | sio << "Parent inode: " << iParent << sio.nl; |
138 | iNode = create( iParent, sName, 0664|typeRegFile ); | 153 | iNode = create( iParent, sName, 0664|typeRegFile, 0 ); |
139 | sio << "New iNode: " << iNode << sio.nl; | 154 | sio << "New iNode: " << iNode << sio.nl; |
140 | return openByInode( iNode ); | 155 | return openByInode( iNode ); |
141 | } | 156 | } |
157 | } | ||
158 | |||
159 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms ) | ||
160 | { | ||
161 | create( sPath, iPerms, 0 ); | ||
162 | } | ||
142 | 163 | ||
143 | return mStore.openStream( 2 ); | 164 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms, |
165 | uint16_t iDevHi, uint16_t iDevLo ) | ||
166 | { | ||
167 | create( sPath, iPerms, ((uint32_t)iDevHi<<16)|(uint32_t)iDevLo ); | ||
168 | } | ||
169 | |||
170 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms, | ||
171 | uint32_t uSpecial ) | ||
172 | { | ||
173 | int32_t iParent = -1; | ||
174 | int32_t iNode; | ||
175 | try | ||
176 | { | ||
177 | iNode = lookupInode( sPath, iParent ); | ||
178 | sio << "File found." << sio.nl; | ||
179 | // The file was found | ||
180 | throw Bu::MyriadFsException("Path already exists."); | ||
181 | } | ||
182 | catch( Bu::MyriadFsException &e ) | ||
183 | { | ||
184 | if( iParent < 0 ) | ||
185 | throw; | ||
186 | |||
187 | // This means that an intermediate path component couldn't be found | ||
188 | if( e.getErrorCode() == 1 ) | ||
189 | throw; | ||
190 | |||
191 | // The file wasn't found, but the path leading up to it was. | ||
192 | // first, figure out the final path element... | ||
193 | Bu::String::const_iterator iStart = sPath.begin(); | ||
194 | if( *iStart == '/' ) | ||
195 | iStart++; | ||
196 | sio << "Scanning for filename:" << sio.nl; | ||
197 | for( Bu::String::const_iterator iEnd = iStart.find('/'); iEnd; | ||
198 | iStart = iEnd+1, iEnd = iStart.find('/') ) { } | ||
199 | Bu::String sName( iStart, sPath.end() ); | ||
200 | sio << "End filename: " << sName << sio.nl; | ||
201 | sio << "Parent inode: " << iParent << sio.nl; | ||
202 | iNode = create( iParent, sName, iPerms, uSpecial ); | ||
203 | sio << "New iNode: " << iNode << sio.nl; | ||
204 | } | ||
205 | } | ||
206 | |||
207 | void Bu::MyriadFs::mkDir( const Bu::String &sPath, uint16_t iPerms ) | ||
208 | { | ||
209 | create( sPath, (iPerms&permMask)|typeDir, 0 ); | ||
210 | } | ||
211 | |||
212 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( const Bu::String &sPath ) | ||
213 | { | ||
214 | int32_t iParent = -1; | ||
215 | int32_t iNode = lookupInode( sPath, iParent ); | ||
216 | return readDir( iNode ); | ||
217 | } | ||
218 | |||
219 | dev_t Bu::MyriadFs::devToSys( uint32_t uDev ) | ||
220 | { | ||
221 | return (((uDev&0xFFFF0000)>>8)&0xFF00) | ((uDev&0xFF)); | ||
222 | } | ||
223 | |||
224 | uint32_t Bu::MyriadFs::sysToDev( dev_t uDev ) | ||
225 | { | ||
226 | return (((uint32_t)uDev&0xFF00)<<8) | ((uint32_t)uDev&0xFF); | ||
144 | } | 227 | } |
145 | 228 | ||
146 | int32_t Bu::MyriadFs::lookupInode( const Bu::String &sPath, int32_t &iParent ) | 229 | int32_t Bu::MyriadFs::lookupInode( const Bu::String &sPath, int32_t &iParent ) |
147 | { | 230 | { |
231 | if( sPath == "/" ) | ||
232 | { | ||
233 | return 0; | ||
234 | } | ||
148 | if( sPath[0] == '/' ) | 235 | if( sPath[0] == '/' ) |
149 | { | 236 | { |
150 | // Absolute lookup | 237 | // Absolute lookup |
@@ -185,7 +272,7 @@ int32_t Bu::MyriadFs::lookupInode( Bu::String::const_iterator iStart, | |||
185 | // Not the last one in our path, double check it's a dir | 272 | // Not the last one in our path, double check it's a dir |
186 | if( ((*i).uPerms&typeMask) == typeDir ) | 273 | if( ((*i).uPerms&typeMask) == typeDir ) |
187 | { | 274 | { |
188 | return lookupInode( iEnd+1, (*i).iNode ); | 275 | return lookupInode( iEnd+1, (*i).iNode, iParent ); |
189 | } | 276 | } |
190 | else | 277 | else |
191 | { | 278 | { |
@@ -198,13 +285,16 @@ int32_t Bu::MyriadFs::lookupInode( Bu::String::const_iterator iStart, | |||
198 | } | 285 | } |
199 | } | 286 | } |
200 | 287 | ||
201 | throw Bu::MyriadFsException( 1, "Path not found"); | 288 | if( iEnd ) |
289 | throw Bu::MyriadFsException( 1, "Path not found"); | ||
290 | else | ||
291 | throw Bu::MyriadFsException( 2, "Path not found"); | ||
202 | } | 292 | } |
203 | 293 | ||
204 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( int32_t iNode ) | 294 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( int32_t iNode ) |
205 | { | 295 | { |
206 | Bu::MyriadStream ms = openByInode( iNode ); | 296 | Bu::MyriadStream ms = openByInode( iNode ); |
207 | int32_t iNumChildren; | 297 | int32_t iNumChildren = 0; |
208 | ms.read( &iNumChildren, 4 ); | 298 | ms.read( &iNumChildren, 4 ); |
209 | 299 | ||
210 | Bu::MyriadStream is = mStore.openStream( 2 ); | 300 | Bu::MyriadStream is = mStore.openStream( 2 ); |
@@ -236,7 +326,7 @@ Bu::MyriadStream Bu::MyriadFs::openByInode( int32_t iNode ) | |||
236 | case typeDir: | 326 | case typeDir: |
237 | case typeSymLink: | 327 | case typeSymLink: |
238 | case typeRegFile: | 328 | case typeRegFile: |
239 | return mStore.openStream( rs.iStreamIndex ); | 329 | return mStore.openStream( rs.uStreamIndex ); |
240 | 330 | ||
241 | default: | 331 | default: |
242 | throw Bu::MyriadFsException( | 332 | throw Bu::MyriadFsException( |
@@ -245,22 +335,22 @@ Bu::MyriadStream Bu::MyriadFs::openByInode( int32_t iNode ) | |||
245 | } | 335 | } |
246 | 336 | ||
247 | int32_t Bu::MyriadFs::create( int32_t iParent, const Bu::String &sName, | 337 | int32_t Bu::MyriadFs::create( int32_t iParent, const Bu::String &sName, |
248 | uint16_t uPerms ) | 338 | uint16_t uPerms, uint32_t uSpecial ) |
249 | { | 339 | { |
250 | Bu::MyriadStream ms = openByInode( iParent ); | 340 | Bu::MyriadStream ms = openByInode( iParent ); |
251 | int32_t iNumChildren; | 341 | int32_t iNumChildren = 0; |
252 | ms.read( &iNumChildren, 4 ); | 342 | ms.read( &iNumChildren, 4 ); |
253 | iNumChildren++; | 343 | iNumChildren++; |
254 | ms.setPos( 0 ); | 344 | ms.setPos( 0 ); |
255 | ms.write( &iNumChildren, 4 ); | 345 | ms.write( &iNumChildren, 4 ); |
256 | ms.setPos( iNumChildren*4 ); // Actually 4+(iNumChildren-1)*4 :-P | 346 | ms.setPos( iNumChildren*4 ); // Actually 4+(iNumChildren-1)*4 :-P |
257 | int32_t iNode = allocInode( sName, iParent, uPerms ); | 347 | int32_t iNode = allocInode( sName, iParent, uPerms, uSpecial ); |
258 | ms.write( &iNode, 4 ); | 348 | ms.write( &iNode, 4 ); |
259 | return iNode; | 349 | return iNode; |
260 | } | 350 | } |
261 | 351 | ||
262 | int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, | 352 | int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, |
263 | uint16_t uPerms ) | 353 | uint16_t uPerms, uint32_t uSpecial ) |
264 | { | 354 | { |
265 | int32_t iNode = 0; | 355 | int32_t iNode = 0; |
266 | for(; iNode < 0xfffffff; iNode++ ) | 356 | for(; iNode < 0xfffffff; iNode++ ) |
@@ -279,14 +369,29 @@ int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, | |||
279 | rs.iLinks = 1; | 369 | rs.iLinks = 1; |
280 | switch( (uPerms&typeMask) ) | 370 | switch( (uPerms&typeMask) ) |
281 | { | 371 | { |
282 | case typeDir: | ||
283 | case typeRegFile: | 372 | case typeRegFile: |
284 | case typeSymLink: | 373 | case typeSymLink: |
285 | rs.iStreamIndex = mStore.createStream(); | 374 | rs.uStreamIndex = mStore.createStream(); |
375 | break; | ||
376 | |||
377 | case typeDir: | ||
378 | rs.uStreamIndex = mStore.createStream(); | ||
379 | { | ||
380 | Bu::MyriadStream msDir = mStore.openStream( | ||
381 | rs.uStreamIndex | ||
382 | ); | ||
383 | uint32_t uSize = 0; | ||
384 | msDir.write( &uSize, 4 ); | ||
385 | } | ||
386 | break; | ||
387 | |||
388 | case typeChrDev: | ||
389 | case typeBlkDev: | ||
390 | rs.uStreamIndex = uSpecial; | ||
286 | break; | 391 | break; |
287 | 392 | ||
288 | default: | 393 | default: |
289 | rs.iStreamIndex = 0; | 394 | rs.uStreamIndex = 0; |
290 | break; | 395 | break; |
291 | } | 396 | } |
292 | rs.iParentNode = iParent; | 397 | rs.iParentNode = iParent; |
@@ -320,11 +425,18 @@ void Bu::MyriadFs::stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ) | |||
320 | rBuf.iATime = rs.iATime; | 425 | rBuf.iATime = rs.iATime; |
321 | rBuf.iMTime = rs.iMTime; | 426 | rBuf.iMTime = rs.iMTime; |
322 | rBuf.iCTime = rs.iCTime; | 427 | rBuf.iCTime = rs.iCTime; |
428 | rBuf.uDev = 0; | ||
429 | rBuf.iSize = 0; | ||
323 | switch( (rBuf.uPerms&typeMask) ) | 430 | switch( (rBuf.uPerms&typeMask) ) |
324 | { | 431 | { |
325 | case typeRegFile: | 432 | case typeRegFile: |
326 | case typeSymLink: | 433 | case typeSymLink: |
327 | rBuf.iSize = mStore.getStreamSize( rs.iStreamIndex ); | 434 | rBuf.iSize = mStore.getStreamSize( rs.uStreamIndex ); |
435 | break; | ||
436 | |||
437 | case typeChrDev: | ||
438 | case typeBlkDev: | ||
439 | rBuf.uDev = rs.uStreamIndex; | ||
328 | break; | 440 | break; |
329 | 441 | ||
330 | default: | 442 | default: |
diff --git a/src/myriadfs.h b/src/myriadfs.h index 808444b..3eecca5 100644 --- a/src/myriadfs.h +++ b/src/myriadfs.h | |||
@@ -8,6 +8,8 @@ | |||
8 | #ifndef MYRIAD_FS_H | 8 | #ifndef MYRIAD_FS_H |
9 | #define MYRIAD_FS_H | 9 | #define MYRIAD_FS_H |
10 | 10 | ||
11 | #include <sys/types.h> | ||
12 | |||
11 | #include "bu/myriad.h" | 13 | #include "bu/myriad.h" |
12 | 14 | ||
13 | namespace Bu | 15 | namespace Bu |
@@ -38,9 +40,9 @@ namespace Bu | |||
38 | * Basic node header format: | 40 | * Basic node header format: |
39 | * int32_t iUser | 41 | * int32_t iUser |
40 | * int32_t iGroup | 42 | * int32_t iGroup |
41 | * int16_t iPerms | 43 | * uint16_t uPerms |
42 | * int16_t iLinks | 44 | * int16_t iLinks |
43 | * int32_t iStreamIndex | 45 | * uint32_t uStreamIndex |
44 | * int32_t iParentNode | 46 | * int32_t iParentNode |
45 | * int64_t iATime | 47 | * int64_t iATime |
46 | * int64_t iMTime | 48 | * int64_t iMTime |
@@ -51,14 +53,14 @@ namespace Bu | |||
51 | * Some types get special formats for their assosiated data stream, or | 53 | * Some types get special formats for their assosiated data stream, or |
52 | * other special considerations, here's a list: | 54 | * other special considerations, here's a list: |
53 | * | 55 | * |
54 | * - typeFifo: No stream, iStreamIndex unused (probably) | 56 | * - typeFifo: No stream, uStreamIndex unused (probably) |
55 | * - typeChrDev: No stream, iStreamIndex is device hi/lo | 57 | * - typeChrDev: No stream, uStreamIndex is device hi/lo |
56 | * - typeDir: The stream contains a directory contents listing, described | 58 | * - typeDir: The stream contains a directory contents listing, described |
57 | * below | 59 | * below |
58 | * - typeBlkDev: No stream, iStreamIndex is device hi/lo | 60 | * - typeBlkDev: No stream, uStreamIndex is device hi/lo |
59 | * - typeRegFile: The stream is the file data | 61 | * - typeRegFile: The stream is the file data |
60 | * - typeSymLink: The stream is the destination of the symlink | 62 | * - typeSymLink: The stream is the destination of the symlink |
61 | * - typeSocket: No steram, iStreamIndex unused (probably) | 63 | * - typeSocket: No steram, uStreamIndex unused (probably) |
62 | * | 64 | * |
63 | * Directory streams have this simple listing format. They contain a list | 65 | * Directory streams have this simple listing format. They contain a list |
64 | * of all child elements, with no particular order at the moment. The . and | 66 | * of all child elements, with no particular order at the moment. The . and |
@@ -89,6 +91,7 @@ namespace Bu | |||
89 | permSticky = 0001000, | 91 | permSticky = 0001000, |
90 | permSetGid = 0002000, | 92 | permSetGid = 0002000, |
91 | permSetUid = 0004000, | 93 | permSetUid = 0004000, |
94 | permMask = 0007777, | ||
92 | typeFifo = 0010000, | 95 | typeFifo = 0010000, |
93 | typeChrDev = 0020000, | 96 | typeChrDev = 0020000, |
94 | typeDir = 0040000, | 97 | typeDir = 0040000, |
@@ -127,14 +130,23 @@ namespace Bu | |||
127 | int64_t iMTime; | 130 | int64_t iMTime; |
128 | int64_t iCTime; | 131 | int64_t iCTime; |
129 | int32_t iSize; | 132 | int32_t iSize; |
133 | uint32_t uDev; | ||
130 | Bu::String sName; | 134 | Bu::String sName; |
131 | }; | 135 | }; |
132 | typedef Bu::List<Stat> Dir; | 136 | typedef Bu::List<Stat> Dir; |
133 | 137 | ||
134 | void stat( const Bu::String &sPath, Stat &rBuf ); | 138 | void stat( const Bu::String &sPath, Stat &rBuf ); |
135 | MyriadStream open( const Bu::String &sPath, int iMode ); | 139 | MyriadStream open( const Bu::String &sPath, int iMode ); |
136 | // void create( const Bu::String &sPath, uint16_t iPerms ); | 140 | void create( const Bu::String &sPath, uint16_t iPerms ); |
141 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
142 | uint16_t iDevHi, uint16_t iDevLo ); | ||
143 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
144 | uint32_t uSpecial ); | ||
145 | void mkDir( const Bu::String &sPath, uint16_t iPerms ); | ||
146 | Dir readDir( const Bu::String &sPath ); | ||
137 | 147 | ||
148 | static dev_t devToSys( uint32_t uDev ); | ||
149 | static uint32_t sysToDev( dev_t uDev ); | ||
138 | 150 | ||
139 | private: | 151 | private: |
140 | class RawStat | 152 | class RawStat |
@@ -144,7 +156,7 @@ namespace Bu | |||
144 | int32_t iGroup; | 156 | int32_t iGroup; |
145 | uint16_t uPerms; | 157 | uint16_t uPerms; |
146 | int16_t iLinks; | 158 | int16_t iLinks; |
147 | int32_t iStreamIndex; | 159 | uint32_t uStreamIndex; |
148 | int32_t iParentNode; | 160 | int32_t iParentNode; |
149 | int64_t iATime; | 161 | int64_t iATime; |
150 | int64_t iMTime; | 162 | int64_t iMTime; |
@@ -160,9 +172,9 @@ namespace Bu | |||
160 | Dir readDir( int32_t iNode ); | 172 | Dir readDir( int32_t iNode ); |
161 | MyriadStream openByInode( int32_t iNode ); | 173 | MyriadStream openByInode( int32_t iNode ); |
162 | int32_t create( int32_t iParent, const Bu::String &sName, | 174 | int32_t create( int32_t iParent, const Bu::String &sName, |
163 | uint16_t uPerms ); | 175 | uint16_t uPerms, uint32_t uSpecial ); |
164 | int32_t allocInode( const Bu::String &sName, int32_t iParent, | 176 | int32_t allocInode( const Bu::String &sName, int32_t iParent, |
165 | uint16_t uPerms ); | 177 | uint16_t uPerms, uint32_t uSpecial ); |
166 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); | 178 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); |
167 | void writeHeader(); | 179 | void writeHeader(); |
168 | 180 | ||
diff --git a/src/tests/myriadfs.cpp b/src/tests/myriadfs.cpp index fd96c02..5946b27 100644 --- a/src/tests/myriadfs.cpp +++ b/src/tests/myriadfs.cpp | |||
@@ -8,19 +8,41 @@ using namespace Bu; | |||
8 | 8 | ||
9 | int main( int argc, char *argv[] ) | 9 | int main( int argc, char *argv[] ) |
10 | { | 10 | { |
11 | Bu::MemBuf mb; | 11 | // Bu::MemBuf mb; |
12 | Bu::File mb("store.myr", File::Read|File::Write|File::Create ); | ||
12 | Bu::MyriadFs mfs( mb, 512 ); | 13 | Bu::MyriadFs mfs( mb, 512 ); |
13 | 14 | ||
15 | sio << "Creating dirs..." << sio.nl; | ||
16 | mfs.create("/etc", Bu::MyriadFs::typeDir|0755 ); | ||
17 | mfs.create("/dev", Bu::MyriadFs::typeDir|0755 ); | ||
18 | mfs.create("/usr", Bu::MyriadFs::typeDir|0755 ); | ||
19 | |||
20 | mfs.create("/dev/null", Bu::MyriadFs::typeChrDev|0666, 1, 3 ); | ||
21 | mfs.create("/dev/zero", Bu::MyriadFs::typeChrDev|0666, 1, 5 ); | ||
22 | mfs.create("/dev/sda", Bu::MyriadFs::typeBlkDev|0660, 8, 0 ); | ||
23 | |||
24 | sio << "Creating files..." << sio.nl; | ||
14 | { | 25 | { |
15 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); | 26 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); |
16 | ms.write("world!"); | 27 | ms.write("world!"); |
17 | } | 28 | } |
29 | { | ||
30 | Bu::MyriadStream ms = mfs.open("/etc/hello", Bu::MyriadFs::Read ); | ||
31 | ms.write("world, again!"); | ||
32 | } | ||
18 | 33 | ||
34 | sio << "Reading files..." << sio.nl; | ||
19 | { | 35 | { |
20 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); | 36 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); |
21 | char buf[512]; | 37 | char buf[512]; |
22 | buf[ms.read( buf, 512 )] = '\0'; | 38 | buf[ms.read( buf, 512 )] = '\0'; |
23 | sio << "read: '" << buf << "'" << sio.nl; | 39 | sio << "read: '" << buf << "'" << sio.nl; |
24 | } | 40 | } |
41 | { | ||
42 | Bu::MyriadStream ms = mfs.open("/etc/hello", Bu::MyriadFs::Read ); | ||
43 | char buf[512]; | ||
44 | buf[ms.read( buf, 512 )] = '\0'; | ||
45 | sio << "read: '" << buf << "'" << sio.nl; | ||
46 | } | ||
25 | } | 47 | } |
26 | 48 | ||
diff --git a/src/tests/uuid.cpp b/src/tests/uuid.cpp index b6470fa..d2f67b1 100644 --- a/src/tests/uuid.cpp +++ b/src/tests/uuid.cpp | |||
@@ -15,6 +15,7 @@ int main() | |||
15 | Uuid i = Uuid::gen(); | 15 | Uuid i = Uuid::gen(); |
16 | 16 | ||
17 | sio << i.toString() << sio.nl; | 17 | sio << i.toString() << sio.nl; |
18 | sio << "Version: " << i.getVersion() << sio.nl; | ||
18 | 19 | ||
19 | return 0; | 20 | return 0; |
20 | } | 21 | } |
diff --git a/src/tools/myriadfs.cpp b/src/tools/myriadfs.cpp index 88db0c0..3956311 100644 --- a/src/tools/myriadfs.cpp +++ b/src/tools/myriadfs.cpp | |||
@@ -10,36 +10,156 @@ | |||
10 | #include <fuse.h> | 10 | #include <fuse.h> |
11 | 11 | ||
12 | #include <string.h> | 12 | #include <string.h> |
13 | #include <errno.h> | ||
14 | |||
15 | #include <bu/file.h> | ||
16 | #include <bu/myriadfs.h> | ||
17 | #include <bu/myriadstream.h> | ||
18 | #include <bu/hash.h> | ||
19 | |||
20 | Bu::File *pF = NULL; | ||
21 | Bu::MyriadFs *pFs = NULL; | ||
22 | |||
23 | typedef Bu::Hash<int64_t, Bu::MyriadStream> FileHash; | ||
24 | FileHash hOpenFiles; | ||
25 | int64_t iNextFileId = 0; | ||
13 | 26 | ||
14 | extern "C" { | 27 | extern "C" { |
15 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) | 28 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) |
16 | { | 29 | { |
17 | 30 | try | |
31 | { | ||
32 | printf("myriadfs_getattr: Statting file: %s\n", sPath ); | ||
33 | Bu::MyriadFs::Stat st; | ||
34 | pFs->stat( sPath, st ); | ||
35 | stbuf->st_ino = st.iNode; | ||
36 | stbuf->st_mode = st.uPerms; | ||
37 | stbuf->st_nlink = st.iLinks; | ||
38 | stbuf->st_uid = st.iUser; | ||
39 | stbuf->st_gid = st.iGroup; | ||
40 | stbuf->st_rdev = Bu::MyriadFs::devToSys( st.uDev ); | ||
41 | stbuf->st_size = st.iSize; | ||
42 | stbuf->st_blocks = 8; | ||
43 | stbuf->st_atime = st.iATime; | ||
44 | stbuf->st_mtime = st.iMTime; | ||
45 | stbuf->st_ctime = st.iCTime; | ||
46 | return 0; | ||
47 | } | ||
48 | catch(...) | ||
49 | { | ||
50 | return -ENOENT; | ||
51 | } | ||
18 | } | 52 | } |
19 | 53 | ||
20 | static int myriadfs_readdir( const char *sPath, void *buf, | 54 | static int myriadfs_readdir( const char *sPath, void *buf, |
21 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) | 55 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) |
22 | { | 56 | { |
57 | fprintf( stderr, "Reading dir...\n"); | ||
58 | Bu::MyriadFs::Dir lDir = pFs->readDir( sPath ); | ||
59 | filler( buf, ".", NULL, 0 ); | ||
60 | filler( buf, "..", NULL, 0 ); | ||
61 | for( Bu::MyriadFs::Dir::iterator i = lDir.begin(); i; i++ ) | ||
62 | { | ||
63 | fprintf( stderr, "Adding file: '%s'\n", (*i).sName.getStr() ); | ||
64 | filler( buf, (*i).sName.getStr(), NULL, 0 ); | ||
65 | } | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static int myriadfs_mkdir( const char *sPath, mode_t uMode ) | ||
71 | { | ||
72 | pFs->mkDir( sPath, uMode ); | ||
73 | return 0; | ||
23 | } | 74 | } |
24 | 75 | ||
25 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) | 76 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) |
26 | { | 77 | { |
78 | try | ||
79 | { | ||
80 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); | ||
81 | fi->fh = iNextFileId; | ||
82 | hOpenFiles.insert( iNextFileId++, ms ); | ||
83 | return 0; | ||
84 | } | ||
85 | catch(...) | ||
86 | { | ||
87 | return -EACCES; | ||
88 | } | ||
27 | } | 89 | } |
28 | 90 | ||
29 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, | 91 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, |
30 | off_t iOffset, struct fuse_file_info *fi ) | 92 | off_t iOffset, struct fuse_file_info *fi ) |
31 | { | 93 | { |
94 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | ||
95 | ms.setPos( iOffset ); | ||
96 | return ms.read( buf, iSize ); | ||
97 | } | ||
98 | |||
99 | static int myriadfs_write( const char *sPath, const char *buf, size_t iSize, | ||
100 | off_t iOffset, struct fuse_file_info *fi ) | ||
101 | { | ||
102 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | ||
103 | ms.setPos( iOffset ); | ||
104 | return ms.write( buf, iSize ); | ||
105 | } | ||
106 | |||
107 | static int myriadfs_create( const char *sPath, mode_t uPerms, | ||
108 | struct fuse_file_info *fi ) | ||
109 | { | ||
110 | try | ||
111 | { | ||
112 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); | ||
113 | fi->fh = iNextFileId; | ||
114 | hOpenFiles.insert( iNextFileId++, ms ); | ||
115 | return 0; | ||
116 | } | ||
117 | catch(...) | ||
118 | { | ||
119 | return -EACCES; | ||
120 | } | ||
121 | } | ||
122 | |||
123 | static int myriadfs_mknod( const char *sPath, mode_t uPerms, dev_t Dev ) | ||
124 | { | ||
125 | try | ||
126 | { | ||
127 | pFs->create( sPath, uPerms, Bu::MyriadFs::sysToDev( Dev ) ); | ||
128 | return 0; | ||
129 | } | ||
130 | catch(...) | ||
131 | { | ||
132 | return -EACCES; | ||
133 | } | ||
134 | } | ||
135 | |||
136 | static int myriadfs_release( const char *sPath, struct fuse_file_info *fi ) | ||
137 | { | ||
138 | hOpenFiles.erase( fi->fh ); | ||
139 | |||
140 | return 0; | ||
32 | } | 141 | } |
33 | 142 | ||
34 | static struct fuse_operations myriadfs_oper; | 143 | static struct fuse_operations myriadfs_oper; |
35 | 144 | ||
36 | int main( int argc, char *argv[] ) | 145 | int main( int argc, char *argv[] ) |
37 | { | 146 | { |
147 | pF = new Bu::File("store.myr", Bu::File::Read|Bu::File::Write|Bu::File::Create ); | ||
148 | pFs = new Bu::MyriadFs( *pF, 512 ); | ||
38 | memset( &myriadfs_oper, sizeof(myriadfs_oper), 0 ); | 149 | memset( &myriadfs_oper, sizeof(myriadfs_oper), 0 ); |
39 | myriadfs_oper.getattr = myriadfs_getattr; | 150 | myriadfs_oper.getattr = myriadfs_getattr; |
40 | myriadfs_oper.readdir = myriadfs_readdir; | 151 | myriadfs_oper.readdir = myriadfs_readdir; |
152 | myriadfs_oper.mkdir = myriadfs_mkdir; | ||
41 | myriadfs_oper.open = myriadfs_open; | 153 | myriadfs_oper.open = myriadfs_open; |
42 | myriadfs_oper.read = myriadfs_read; | 154 | myriadfs_oper.read = myriadfs_read; |
43 | return fuse_main( argc, argv, &myriadfs_oper, NULL ); | 155 | myriadfs_oper.write = myriadfs_write; |
156 | myriadfs_oper.create = myriadfs_create; | ||
157 | myriadfs_oper.mknod = myriadfs_mknod; | ||
158 | printf("Starting fuse_main.\n"); | ||
159 | int iRet = fuse_main( argc, argv, &myriadfs_oper, NULL ); | ||
160 | printf("Done with fuse_main.\n"); | ||
161 | delete pFs; | ||
162 | delete pF; | ||
163 | return iRet; | ||
44 | } | 164 | } |
45 | } | 165 | } |
diff --git a/src/uuid.cpp b/src/uuid.cpp index 69af5b4..d34a989 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp | |||
@@ -45,6 +45,16 @@ Bu::String Bu::Uuid::toString() | |||
45 | return mb.getString(); | 45 | return mb.getString(); |
46 | } | 46 | } |
47 | 47 | ||
48 | Bu::String Bu::Uuid::toUrn() | ||
49 | { | ||
50 | return "urn:uuid:" + toString(); | ||
51 | } | ||
52 | |||
53 | int Bu::Uuid::getVersion() | ||
54 | { | ||
55 | return (data[6]&((8|4|2|1)<<4))>>4; | ||
56 | } | ||
57 | |||
48 | #define msb( i ) (1<<(7-i)) | 58 | #define msb( i ) (1<<(7-i)) |
49 | 59 | ||
50 | void Bu::Uuid::clear() | 60 | void Bu::Uuid::clear() |
@@ -21,6 +21,9 @@ namespace Bu | |||
21 | 21 | ||
22 | Bu::String toRawString(); | 22 | Bu::String toRawString(); |
23 | Bu::String toString(); | 23 | Bu::String toString(); |
24 | Bu::String toUrn(); | ||
25 | |||
26 | int getVersion(); | ||
24 | 27 | ||
25 | static Uuid gen(); | 28 | static Uuid gen(); |
26 | static Uuid genV1(); | 29 | static Uuid genV1(); |