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

Reply via email to