github.com/wlattner/mlserver@v0.0.0-20141113171038-895f261d2bfd/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  }