github.com/misfo/deis@v1.0.1-0.20141111224634-e0eee0392b8a/deisctl/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/node.go (about) 1 // Copyright 2011 Google Inc. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package uuid 6 7 import "net" 8 9 var ( 10 interfaces []net.Interface // cached list of interfaces 11 ifname string // name of interface being used 12 nodeID []byte // hardware for version 1 UUIDs 13 ) 14 15 // NodeInterface returns the name of the interface from which the NodeID was 16 // derived. The interface "user" is returned if the NodeID was set by 17 // SetNodeID. 18 func NodeInterface() string { 19 return ifname 20 } 21 22 // SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. 23 // If name is "" then the first usable interface found will be used or a random 24 // Node ID will be generated. If a named interface cannot be found then false 25 // is returned. 26 // 27 // SetNodeInterface never fails when name is "". 28 func SetNodeInterface(name string) bool { 29 if interfaces == nil { 30 var err error 31 interfaces, err = net.Interfaces() 32 if err != nil && name != "" { 33 return false 34 } 35 } 36 37 for _, ifs := range interfaces { 38 if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { 39 if setNodeID(ifs.HardwareAddr) { 40 ifname = ifs.Name 41 return true 42 } 43 } 44 } 45 46 // We found no interfaces with a valid hardware address. If name 47 // does not specify a specific interface generate a random Node ID 48 // (section 4.1.6) 49 if name == "" { 50 if nodeID == nil { 51 nodeID = make([]byte, 6) 52 } 53 randomBits(nodeID) 54 return true 55 } 56 return false 57 } 58 59 // NodeID returns a slice of a copy of the current Node ID, setting the Node ID 60 // if not already set. 61 func NodeID() []byte { 62 if nodeID == nil { 63 SetNodeInterface("") 64 } 65 nid := make([]byte, 6) 66 copy(nid, nodeID) 67 return nid 68 } 69 70 // SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes 71 // of id are used. If id is less than 6 bytes then false is returned and the 72 // Node ID is not set. 73 func SetNodeID(id []byte) bool { 74 if setNodeID(id) { 75 ifname = "user" 76 return true 77 } 78 return false 79 } 80 81 func setNodeID(id []byte) bool { 82 if len(id) < 6 { 83 return false 84 } 85 if nodeID == nil { 86 nodeID = make([]byte, 6) 87 } 88 copy(nodeID, id) 89 return true 90 } 91 92 // NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is 93 // not valid. The NodeID is only well defined for version 1 and 2 UUIDs. 94 func (uuid UUID) NodeID() []byte { 95 if len(uuid) != 16 { 96 return nil 97 } 98 node := make([]byte, 6) 99 copy(node, uuid[10:]) 100 return node 101 }