2017-01-05 5 views
5

मैं जंग से ioctl पर कॉल करना चाहता हूं। मुझे पता है कि मुझे the nix crate का उपयोग करना चाहिए, लेकिन वास्तव में कैसे? दस्तावेज़ीकरण से यह स्पष्ट नहीं है।निक्स के ioctl का उपयोग कैसे करें?

मैं इस सी है:

int tun_open(char *devname) 
{ 
    struct ifreq ifr; 
    int fd, err; 

    if ((fd = open("/dev/net/tun", O_RDWR)) == -1) { 
     perror("open /dev/net/tun");exit(1); 
    } 
    memset(&ifr, 0, sizeof(ifr)); 
    ifr.ifr_flags = IFF_TUN; 
    strncpy(ifr.ifr_name, devname, IFNAMSIZ); 

    /* ioctl will use if_name as the name of TUN 
    * interface to open: "tun0", etc. */ 
    if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) == -1) { 
    perror("ioctl TUNSETIFF");close(fd);exit(1); 
    } 
    //.......... 

मुझे लगता है कि nix टोकरा का उपयोग कर एक ही बात करना होगा कैसे? निक्स क्रेट में TUN* स्थिरांक नहीं हैं और यह स्पष्ट नहीं है कि ioctl मैक्रो का उपयोग कैसे करें।

+0

यह एक [XY समस्या] की तरह लगता है (http://meta.stackexchange.com/questions/66377/what-is -the-xy-problem) मेरे लिए: विशिष्ट ioctl उपयोग केस के बारे में पूछने के बजाय आप पूछ रहे हैं कि 'nix' crate का उपयोग कैसे करें। फिर भी, यह उल्लेखनीय है कि एक समान ioctl उपयोग केस http://hermanradtke.com/2016/03/17/unions-rust-ffi.html पर कवर किया गया प्रतीत होता है। – ArtemGr

+0

@ArtemGr ओपी ने सी कोड का एक छोटा और सरल स्निपेट प्रदान किया और पूछा कि जंग में बराबर कैसे करें। एक एक्सवाई समस्या वास्तव में कितनी है? – user4815162342

उत्तर

6

rust-spidev में कुछ उदाहरण उपयोग है। मैं इसे आपके कोड पर लागू करने का प्रयास करूंगा।

TUNSETIFF है defined के रूप में:

#define TUNSETIFF  _IOW('T', 202, int) 

जंग में इस होगा कि nix का उपयोग कर:

:

const TUN_IOC_MAGIC: u8 = 'T' as u8; 
const TUN_IOC_SET_IFF: u8 = 202; 
ioctl!(write tun_set_iff with TUN_IOC_MAGIC, TUN_IOC_SET_IFF; u32); 

ऊपर मैक्रो समारोह है, जो आपको इस तरह कॉल कर सकते हैं परिभाषित करेगा

let err = unsafe { tun_set_iff(fd, ifr) }; // assuming ifr is an u32 
+0

वे "निक्स" में क्यों परिभाषित नहीं हैं? जंग-स्पाइडव को "निक्स" के साथ क्या करना है? – Jodooomi

+3

@ जोडोउमी यहां जंग-स्पाइडेव केवल यह प्रदर्शित करने के लिए कार्य करता है कि निक्स के 'ioctl!' मैक्रो का सही तरीके से उपयोग कैसे करें। चूंकि 'ioctl' खुला-अंत और स्वाभाविक रूप से असुरक्षित है, इसलिए एक ही परिभाषा प्रदान करना असंभव है जो सभी मामलों के लिए काम करेगा। इसके बजाए, 'nix'' ioctl' 'मैक्रो को एक * सहायक * के रूप में प्रदान करता है जो उन कार्यों को परिभाषित करने के लिए प्रदान करता है जो' ioctl' के विशेष उपयोगों के लिए एक सुरक्षित (या कम से कम सुविधाजनक) इंटरफ़ेस प्रदान करते हैं। – user4815162342

+0

ठीक है, लेकिन जंग-स्पाइडव के लेखक को पता है कि उन स्थिरांक क्या हैं? वे कहाँ मिल सकते हैं? – Jodooomi

संबंधित मुद्दे