How to do alias to a C struct member?

dangbinghoo dangbinghoo at gmail.com
Mon Apr 22 11:04:49 UTC 2019


hi all,

as now we don't have the net/if.h binding, I need to do struct 
ifreq binding myself, here's my code:

----
struct ifreq {
	private union ifr_ifrn {
		byte[IFNAMSIZ] ifrn_name; /* if name, e.g. "en0" */	
	}
	
	private union ifr_ifru {
		sockaddr ifru_addr;
		sockaddr ifru_dstaddr;
		sockaddr ifru_broadaddr;
		sockaddr ifru_netmask;
		sockaddr ifru_hwaddr;
		short	ifru_flags;
		int	ifru_ivalue;
		int	ifru_mtu;
		ifmap ifru_map;
		byte[IFNAMSIZ] ifru_slave;	/* Just fits the size */
		byte[IFNAMSIZ] ifru_newname;
		byte * ifru_data;
	}
	
alias ifr_ifrn.ifrn_name	    ifr_name;	  /* interface name 	*/
alias ifr_ifru.ifru_hwaddr	    ifr_hwaddr;	  /* MAC address 		*/
alias ifr_ifru.ifru_addr	    ifr_addr;	  /* address		*/
alias ifr_ifru.ifru_dstaddr	    ifr_dstaddr;  /* other end of p-p 
lnk	*/
alias ifr_ifru.ifru_broadaddr	ifr_broadaddr;/* broadcast 
address	*/
alias ifr_ifru.ifru_netmask	    ifr_netmask;  /* interface net 
mask	*/
alias ifr_ifru.ifru_flags	    ifr_flags;	  /* flags		*/
alias ifr_ifru.ifru_ivalue	    ifr_metric;	  /* metric		*/
alias ifr_ifru.ifru_mtu	        ifr_mtu;      /* mtu			*/
alias ifr_ifru.ifru_map	        ifr_map;	  /* device map		*/
alias ifr_ifru.ifru_slave	    ifr_slave;	  /* slave device		*/
alias ifr_ifru.ifru_data	    ifr_data;	  /* for use by 
interface	*/
alias ifr_ifru.ifru_ivalue      ifr_ifindex;  /* interface index  
     */
alias ifr_ifru.ifru_ivalue	    ifr_bandwidth;/* link bandwidth	*/
alias ifr_ifru.ifru_ivalue	    ifr_qlen;	  /* queue length		*/
alias ifr_ifru.ifru_newname	    ifr_newname;  /* New name		*/
}
---

as show above we need to trun the C code

# define ifr_name	ifr_ifrn.ifrn_name	/* interface name 	*/

to D's alias, but when done the binding and trying to compiling 
this code:

---
	import core.sys.posix.sys.socket;
	import core.sys.posix.sys.ioctl;
	import core.sys.posix.arpa.inet;
	
	import core.stdc.string;
	import core.stdc.stdio;
	import core.sys.posix.stdio;
	import core.stdc.errno;
	import std.string;

......
                 ifreq ifr;

		strcpy(ifr.ifr_name, std.string.toStringz(if_name)); //line 172
		if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)
		{
			return;
		}
---

DMD compiler gives an error :
```
/test.d(172): Error: need this for ifrn_name of type byte[16]
./test.d(172): Error: function core.stdc.string.strcpy(return 
scope char* s1, scope const(char*) s2) is not callable using 
argument types (_error_, immutable(char)*)
./test.d(172):        cannot pass argument __error of type 
_error_ to parameter return scope char* s1
```

So, how to do alias for a C struct member?


thanks!

Binghoo Dang


More information about the Digitalmars-d-learn mailing list