]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
uapi: allow preventing creation of new peers when updating
authorJason A. Donenfeld <Jason@zx2c4.com>
Sat, 28 Sep 2019 18:12:46 +0000 (20:12 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 4 Oct 2019 09:41:02 +0000 (11:41 +0200)
This enables race-free updates for wg-dynamic and similar tools.

Suggested-by: Thomas Gschwantner <tharre3@gmail.com>
device/uapi.go

index efa757be4396551efedbf311ed440d848df5e0b7..999eeb5a02862906eade2e1b44a3eb32cdac2d93 100644 (file)
@@ -113,6 +113,7 @@ func (device *Device) IpcSetOperation(socket *bufio.Reader) *IPCError {
        var peer *Peer
 
        dummy := false
+       createdNewPeer := false
        deviceConfig := true
 
        for scanner.Scan() {
@@ -237,7 +238,8 @@ func (device *Device) IpcSetOperation(socket *bufio.Reader) *IPCError {
                                        peer = device.LookupPeer(publicKey)
                                }
 
-                               if peer == nil {
+                               createdNewPeer = peer == nil
+                               if createdNewPeer {
                                        peer, err = device.NewPeer(publicKey)
                                        if err != nil {
                                                logError.Println("Failed to create new peer:", err)
@@ -251,6 +253,20 @@ func (device *Device) IpcSetOperation(socket *bufio.Reader) *IPCError {
                                        }
                                }
 
+                       case "update_only":
+
+                               // allow disabling of creation
+
+                               if value != "true" {
+                                       logError.Println("Failed to set update only, invalid value:", value)
+                                       return &IPCError{ipc.IpcErrorInvalid}
+                               }
+                               if createdNewPeer && !dummy {
+                                       device.RemovePeer(peer.handshake.remoteStatic)
+                                       peer = &Peer{}
+                                       dummy = true
+                               }
+
                        case "remove":
 
                                // remove currently selected peer from device