Blame vendor/github.com/google/uuid/node.go

Packit Service 4d2de5
// Copyright 2016 Google Inc.  All rights reserved.
Packit Service 4d2de5
// Use of this source code is governed by a BSD-style
Packit Service 4d2de5
// license that can be found in the LICENSE file.
Packit Service 4d2de5
Packit Service 4d2de5
package uuid
Packit Service 4d2de5
Packit Service 4d2de5
import (
Packit Service 4d2de5
	"sync"
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
var (
Packit Service 4d2de5
	nodeMu sync.Mutex
Packit Service 4d2de5
	ifname string  // name of interface being used
Packit Service 4d2de5
	nodeID [6]byte // hardware for version 1 UUIDs
Packit Service 4d2de5
	zeroID [6]byte // nodeID with only 0's
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
// NodeInterface returns the name of the interface from which the NodeID was
Packit Service 4d2de5
// derived.  The interface "user" is returned if the NodeID was set by
Packit Service 4d2de5
// SetNodeID.
Packit Service 4d2de5
func NodeInterface() string {
Packit Service 4d2de5
	defer nodeMu.Unlock()
Packit Service 4d2de5
	nodeMu.Lock()
Packit Service 4d2de5
	return ifname
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs.
Packit Service 4d2de5
// If name is "" then the first usable interface found will be used or a random
Packit Service 4d2de5
// Node ID will be generated.  If a named interface cannot be found then false
Packit Service 4d2de5
// is returned.
Packit Service 4d2de5
//
Packit Service 4d2de5
// SetNodeInterface never fails when name is "".
Packit Service 4d2de5
func SetNodeInterface(name string) bool {
Packit Service 4d2de5
	defer nodeMu.Unlock()
Packit Service 4d2de5
	nodeMu.Lock()
Packit Service 4d2de5
	return setNodeInterface(name)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func setNodeInterface(name string) bool {
Packit Service 4d2de5
	iname, addr := getHardwareInterface(name) // null implementation for js
Packit Service 4d2de5
	if iname != "" && addr != nil {
Packit Service 4d2de5
		ifname = iname
Packit Service 4d2de5
		copy(nodeID[:], addr)
Packit Service 4d2de5
		return true
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	// We found no interfaces with a valid hardware address.  If name
Packit Service 4d2de5
	// does not specify a specific interface generate a random Node ID
Packit Service 4d2de5
	// (section 4.1.6)
Packit Service 4d2de5
	if name == "" {
Packit Service 4d2de5
		ifname = "random"
Packit Service 4d2de5
		randomBits(nodeID[:])
Packit Service 4d2de5
		return true
Packit Service 4d2de5
	}
Packit Service 4d2de5
	return false
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// NodeID returns a slice of a copy of the current Node ID, setting the Node ID
Packit Service 4d2de5
// if not already set.
Packit Service 4d2de5
func NodeID() []byte {
Packit Service 4d2de5
	defer nodeMu.Unlock()
Packit Service 4d2de5
	nodeMu.Lock()
Packit Service 4d2de5
	if nodeID == zeroID {
Packit Service 4d2de5
		setNodeInterface("")
Packit Service 4d2de5
	}
Packit Service 4d2de5
	nid := nodeID
Packit Service 4d2de5
	return nid[:]
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// SetNodeID sets the Node ID to be used for Version 1 UUIDs.  The first 6 bytes
Packit Service 4d2de5
// of id are used.  If id is less than 6 bytes then false is returned and the
Packit Service 4d2de5
// Node ID is not set.
Packit Service 4d2de5
func SetNodeID(id []byte) bool {
Packit Service 4d2de5
	if len(id) < 6 {
Packit Service 4d2de5
		return false
Packit Service 4d2de5
	}
Packit Service 4d2de5
	defer nodeMu.Unlock()
Packit Service 4d2de5
	nodeMu.Lock()
Packit Service 4d2de5
	copy(nodeID[:], id)
Packit Service 4d2de5
	ifname = "user"
Packit Service 4d2de5
	return true
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is
Packit Service 4d2de5
// not valid.  The NodeID is only well defined for version 1 and 2 UUIDs.
Packit Service 4d2de5
func (uuid UUID) NodeID() []byte {
Packit Service 4d2de5
	var node [6]byte
Packit Service 4d2de5
	copy(node[:], uuid[10:])
Packit Service 4d2de5
	return node[:]
Packit Service 4d2de5
}