src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

node.go (2323B)


      1 // Copyright 2016 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 (
      8 	"sync"
      9 )
     10 
     11 var (
     12 	nodeMu sync.Mutex
     13 	ifname string  // name of interface being used
     14 	nodeID [6]byte // hardware for version 1 UUIDs
     15 	zeroID [6]byte // nodeID with only 0's
     16 )
     17 
     18 // NodeInterface returns the name of the interface from which the NodeID was
     19 // derived.  The interface "user" is returned if the NodeID was set by
     20 // SetNodeID.
     21 func NodeInterface() string {
     22 	defer nodeMu.Unlock()
     23 	nodeMu.Lock()
     24 	return ifname
     25 }
     26 
     27 // SetNodeInterface selects the hardware address to be used for Version 1 UUIDs.
     28 // If name is "" then the first usable interface found will be used or a random
     29 // Node ID will be generated.  If a named interface cannot be found then false
     30 // is returned.
     31 //
     32 // SetNodeInterface never fails when name is "".
     33 func SetNodeInterface(name string) bool {
     34 	defer nodeMu.Unlock()
     35 	nodeMu.Lock()
     36 	return setNodeInterface(name)
     37 }
     38 
     39 func setNodeInterface(name string) bool {
     40 	iname, addr := getHardwareInterface(name) // null implementation for js
     41 	if iname != "" && addr != nil {
     42 		ifname = iname
     43 		copy(nodeID[:], addr)
     44 		return true
     45 	}
     46 
     47 	// We found no interfaces with a valid hardware address.  If name
     48 	// does not specify a specific interface generate a random Node ID
     49 	// (section 4.1.6)
     50 	if name == "" {
     51 		ifname = "random"
     52 		randomBits(nodeID[:])
     53 		return true
     54 	}
     55 	return false
     56 }
     57 
     58 // NodeID returns a slice of a copy of the current Node ID, setting the Node ID
     59 // if not already set.
     60 func NodeID() []byte {
     61 	defer nodeMu.Unlock()
     62 	nodeMu.Lock()
     63 	if nodeID == zeroID {
     64 		setNodeInterface("")
     65 	}
     66 	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 len(id) < 6 {
     75 		return false
     76 	}
     77 	defer nodeMu.Unlock()
     78 	nodeMu.Lock()
     79 	copy(nodeID[:], id)
     80 	ifname = "user"
     81 	return true
     82 }
     83 
     84 // NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is
     85 // not valid.  The NodeID is only well defined for version 1 and 2 UUIDs.
     86 func (uuid UUID) NodeID() []byte {
     87 	var node [6]byte
     88 	copy(node[:], uuid[10:])
     89 	return node[:]
     90 }