From 6192e9a17b52b95d307fc80268f854d8e886005c Mon Sep 17 00:00:00 2001 From: Rohan Prinja Date: Thu, 16 Jul 2015 19:19:29 +0530 Subject: [PATCH] guix/build/syscalls.scm, tests/syscalls.scm: un-export make-ifaddrs, and add a convenience macro to filter out non-useful interfaces --- guix/build/syscalls.scm | 17 +++++++++++------ tests/syscalls.scm | 19 ++++++------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index a50a9bf..0cda091 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -56,7 +56,7 @@ interface-address-broadcast-addr interface-address-netmask-addr - make-ifaddrs + remove-if-netmask-null IFF_UP IFF_BROADCAST @@ -534,11 +534,6 @@ unsigned-int ifa-flags field" (inet-ntop family address) #f)))) -;; Note: address fields in 'struct getifaddrs' are pointers to -;; 'struct sockaddr'. In 'interface-address-broadcast-addr' we are -;; implicitly typecasting this 'sockaddr' pointer to a -;; 'sockaddr_in' pointer. - ;; Note: getifaddrs returns multiple interfaces with the same ;; e.g. on my system I see multiple "eth0"s. The difference is ;; that for one of the eth0's, the family of the address @@ -552,6 +547,16 @@ sockaddr' from an record type." (bv (pointer->bytevector addr %sizeof-struct-sockaddr))) (bytevector->sockaddr bv))) +;; Note: address fields in 'struct getifaddrs' are pointers to +;; 'struct sockaddr'. In 'extract-address-field' we are +;; implicitly typecasting this 'sockaddr' pointer to a +;; 'sockaddr_in' pointer. + +;; Utility macro to remove all ifaces from the output IFACES of +;; (getifaddrs) that have a null-pointer in the 'netmask' field. +(define-syntax-rule (remove-if-netmask-null ifaces) + (remove (compose null-pointer? interface-address-netmask) ifaces)) + ;; Given an record IFACE, return its ;; address field as a sockaddr if it exists, otherwise return #f. (define (interface-address-address iface) diff --git a/tests/syscalls.scm b/tests/syscalls.scm index 3665575..87c58ea 100644 --- a/tests/syscalls.scm +++ b/tests/syscalls.scm @@ -232,10 +232,9 @@ For example, (4 2 2 2 2 1 3 3) => (4 2 1 3)." (let* ((is-eth-iface? (lambda (i) (string-prefix? "eth" (interface-address-name i)))) - (ifaddrs (getifaddrs)) + (ifaddrs (remove-if-netmask-null (getifaddrs))) (eth-ifaces (filter is-eth-iface? ifaddrs)) - (getifaddrs-tmp (map interface-address-address eth-ifaces)) - (getifaddrs-result (remove not getifaddrs-tmp)) + (getifaddrs-result (map interface-address-address eth-ifaces)) (ifconfig-result (ifconfig-extract-addr-of "eth" 'address))) (member ifconfig-result getifaddrs-result))) @@ -243,10 +242,9 @@ For example, (4 2 2 2 2 1 3 3) => (4 2 1 3)." (let* ((is-eth-iface? (lambda (i) (string-prefix? "eth" (interface-address-name i)))) - (ifaddrs (getifaddrs)) + (ifaddrs (remove-if-netmask-null (getifaddrs))) (eth-ifaces (filter is-eth-iface? ifaddrs)) - (getifaddrs-tmp (map interface-address-broadcast-addr eth-ifaces)) - (getifaddrs-result (remove not getifaddrs-tmp)) + (getifaddrs-result (map interface-address-broadcast-addr eth-ifaces)) (ifconfig-result (ifconfig-extract-addr-of "eth" 'broadcast))) (member ifconfig-result getifaddrs-result))) @@ -254,14 +252,9 @@ For example, (4 2 2 2 2 1 3 3) => (4 2 1 3)." (let* ((is-eth-iface? (lambda (i) (string-prefix? "eth" (interface-address-name i)))) - (ifaddrs (getifaddrs)) + (ifaddrs (remove-if-netmask-null (getifaddrs))) (eth-ifaces (filter is-eth-iface? ifaddrs)) - (getifaddrs-tmp (remove (lambda (i) - (null-pointer? - (interface-address-netmask i))) - eth-ifaces)) - (getifaddrs-tmp (map interface-address-netmask-addr getifaddrs-tmp)) - (getifaddrs-result (remove not getifaddrs-tmp)) + (getifaddrs-result (map interface-address-netmask-addr eth-ifaces)) (ifconfig-result (ifconfig-extract-addr-of "eth" 'netmask))) (member ifconfig-result getifaddrs-result))) -- 1.9.1