...

Source file src/github.com/google/uuid/node.go

Documentation: github.com/google/uuid

     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  }
    91  

View as plain text