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