Skip to content

Commit def91f6

Browse files
committed
feat: added support of local v6 IP address
1 parent 5ad92bf commit def91f6

File tree

5 files changed

+36
-21
lines changed

5 files changed

+36
-21
lines changed

Modules/Net/main.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public struct Network_Usage: Codable {
7272
var bandwidth: Bandwidth = Bandwidth()
7373
var total: Bandwidth = Bandwidth()
7474

75-
var laddr: String? = nil // local ip
75+
var laddr: Network_addr = Network_addr() // local ip
7676
var raddr: Network_addr = Network_addr() // remote ip
7777

7878
var interface: Network_interface? = nil
@@ -84,7 +84,7 @@ public struct Network_Usage: Codable {
8484
mutating func reset() {
8585
self.bandwidth = Bandwidth()
8686

87-
self.laddr = nil
87+
self.laddr = Network_addr()
8888
self.raddr = Network_addr()
8989

9090
self.interface = nil
@@ -254,7 +254,9 @@ public class Network: Module {
254254
case "public": replacement = value.raddr.v4 ?? value.raddr.v6 ?? "-"
255255
case "publicV4": replacement = value.raddr.v4 ?? "-"
256256
case "publicV6": replacement = value.raddr.v6 ?? "-"
257-
case "private": replacement = value.laddr ?? "-"
257+
case "private": replacement = value.laddr.v4 ?? value.laddr.v6 ?? "-"
258+
case "privateV4": replacement = value.laddr.v4 ?? "-"
259+
case "privateV6": replacement = value.laddr.v6 ?? "-"
258260
default: return
259261
}
260262
case "$interface":

Modules/Net/notifications.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,13 @@ class Notifications: NotificationsWrapper {
8787
self.interfaceInit = true
8888
}
8989
if !self.localIPInit {
90-
self.localIP = value.laddr
91-
self.localIPInit = true
90+
if let v4 = value.raddr.v4 {
91+
self.localIP = v4
92+
self.localIPInit = true
93+
} else if let v6 = value.raddr.v6 {
94+
self.localIP = v6
95+
self.localIPInit = true
96+
}
9297
}
9398
if !self.publicIPInit {
9499
if let v4 = value.raddr.v4 {
@@ -112,10 +117,10 @@ class Notifications: NotificationsWrapper {
112117
}
113118

114119
if self.localIPState {
115-
if value.laddr != self.localIP {
120+
if value.laddr.v4 ?? value.laddr.v6 != self.localIP {
116121
self.newNotification(id: self.localID, title: localizedString("Local IP changed"), subtitle: nil)
117122
}
118-
self.localIP = value.laddr
123+
self.localIP = value.laddr.v4 ?? value.laddr.v6
119124
}
120125

121126
if self.publicIPState {

Modules/Net/portal.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,14 @@ public class Portal: PortalWrapper {
135135
}
136136
}
137137

138-
if self.localIPField?.stringValue != value.laddr {
139-
self.localIPField?.stringValue = value.laddr ?? localizedString("Unknown")
138+
var privateIP = localizedString("Unknown")
139+
if let v4 = value.laddr.v4, !v4.isEmpty {
140+
privateIP = v4
141+
} else if let v6 = value.laddr.v6, !v6.isEmpty {
142+
privateIP = v6
143+
}
144+
if self.localIPField?.stringValue != privateIP {
145+
self.localIPField?.stringValue = privateIP
140146
}
141147
})
142148
}

Modules/Net/readers.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,14 @@ internal class UsageReader: Reader<Network_Usage>, CWEventDelegate {
229229
var pointer = interfaceAddresses
230230
while pointer != nil {
231231
defer { pointer = pointer?.pointee.ifa_next }
232+
guard let pointer = pointer else { break }
232233

233-
if String(cString: pointer!.pointee.ifa_name) != self.interfaceID {
234+
if String(cString: pointer.pointee.ifa_name) != self.interfaceID {
234235
continue
235236
}
237+
self.getLocalIP(pointer)
236238

237-
if let ip = getLocalIP(pointer!), self.usage.laddr != ip {
238-
self.usage.laddr = ip
239-
}
240-
241-
if let info = getBytesInfo(pointer!) {
239+
if let info = self.getBytesInfo(pointer) {
242240
totalUpload += info.upload
243241
totalDownload += info.download
244242
}
@@ -402,17 +400,19 @@ internal class UsageReader: Reader<Network_Usage>, CWEventDelegate {
402400
}
403401
}
404402

405-
private func getLocalIP(_ pointer: UnsafeMutablePointer<ifaddrs>) -> String? {
403+
private func getLocalIP(_ pointer: UnsafeMutablePointer<ifaddrs>) {
406404
var addr = pointer.pointee.ifa_addr.pointee
407-
408-
guard addr.sa_family == UInt8(AF_INET) else {
409-
return nil
410-
}
405+
guard addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) else { return}
411406

412407
var ip = [CChar](repeating: 0, count: Int(NI_MAXHOST))
413408
getnameinfo(&addr, socklen_t(addr.sa_len), &ip, socklen_t(ip.count), nil, socklen_t(0), NI_NUMERICHOST)
414409

415-
return String(cString: ip)
410+
let ipStr = String(cString: ip)
411+
if addr.sa_family == UInt8(AF_INET) && !ipStr.isEmpty {
412+
self.usage.laddr.v4 = ipStr
413+
} else if addr.sa_family == UInt8(AF_INET6) && !ipStr.isEmpty {
414+
self.usage.laddr.v6 = ipStr
415+
}
416416
}
417417

418418
private func getPublicIP() {

Modules/Net/settings.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ You can use a combination of any of the variables. There is only one limitation:
2727
<li><b>$addr.publicV4</b>: <small>Public IPv4 address.</small></li>
2828
<li><b>$addr.publicV6</b>: <small>Public IPv6 address.</small></li>
2929
<li><b>$addr.private</b>: <small>Private/local IP address.</small></li>
30+
<li><b>$addr.privateV4</b>: <small>Private/local IPv4 address.</small></li>
31+
<li><b>$addr.privateV6</b>: <small>Private/local IPv6 address.</small></li>
3032
<li><b>$interface.displayName</b>: <small>Network interface name.</small></li>
3133
<li><b>$interface.BSDName</b>: <small>BSD name of the network interface.</small></li>
3234
<li><b>$interface.address</b>: <small>MAC address of the network interface.</small></li>

0 commit comments

Comments
 (0)