Skip to content

Commit

Permalink
Auto merge of #3393 - Brijeshkrishna:main, r=JohnTitor
Browse files Browse the repository at this point in the history
feat: Added ifconf struct

Adding ifconf struct

As per defined in C

```c
struct ifconf
  {
    int	ifc_len;			/* Size of buffer.  */
    union
      {
	__caddr_t ifcu_buf;
	struct ifreq *ifcu_req;
      } ifc_ifcu;
  };
```
  • Loading branch information
bors committed Nov 1, 2023
2 parents a1ad825 + 66c4a5e commit d1c72e8
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
2 changes: 2 additions & 0 deletions libc-test/build.rs
Expand Up @@ -4086,6 +4086,8 @@ fn test_linux(target: &str) {
(struct_ == "sockaddr_vm" && field == "svm_zero") ||
// the `ifr_ifru` field is an anonymous union
(struct_ == "ifreq" && field == "ifr_ifru") ||
// the `ifc_ifcu` field is an anonymous union
(struct_ == "ifconf" && field == "ifc_ifcu") ||
// glibc uses a single array `uregs` instead of individual fields.
(struct_ == "user_regs" && arm)
});
Expand Down
1 change: 1 addition & 0 deletions libc-test/semver/linux.txt
Expand Up @@ -3248,6 +3248,7 @@ if_freenameindex
if_nameindex
ifaddrs
ifreq
ifconf
in6_ifreq
in6_pktinfo
in6_rtmsg
Expand Down
34 changes: 34 additions & 0 deletions src/unix/linux_like/linux/mod.rs
Expand Up @@ -792,6 +792,23 @@ s_no_extra_traits! {
pub ifr_ifru: ::sockaddr,
}

#[cfg(libc_union)]
pub union __c_anonymous_ifc_ifcu {
pub ifcu_buf: *mut ::c_char,
pub ifcu_req: *mut ::ifreq,
}

/* Structure used in SIOCGIFCONF request. Used to retrieve interface
configuration for machine (useful for programs which must know all
networks accessible). */
pub struct ifconf {
pub ifc_len: ::c_int, /* Size of buffer. */
#[cfg(libc_union)]
pub ifc_ifcu: __c_anonymous_ifc_ifcu,
#[cfg(not(libc_union))]
pub ifc_ifcu: *mut ::ifreq,
}

pub struct hwtstamp_config {
pub flags: ::c_int,
pub tx_type: ::c_int,
Expand Down Expand Up @@ -1229,6 +1246,23 @@ cfg_if! {
}
}

#[cfg(libc_union)]
impl ::fmt::Debug for __c_anonymous_ifc_ifcu {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("ifr_ifru")
.field("ifcu_buf", unsafe { &self.ifcu_buf })
.field("ifcu_req", unsafe { &self.ifcu_req })
.finish()
}
}
impl ::fmt::Debug for ifconf {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("ifconf")
.field("ifc_len", &self.ifc_len)
.field("ifc_ifcu", &self.ifc_ifcu)
.finish()
}
}
impl ::fmt::Debug for hwtstamp_config {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("hwtstamp_config")
Expand Down

0 comments on commit d1c72e8

Please sign in to comment.