⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 543.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    */ <br>

    if (ioctl(p->fd, I_PUSH, "bufmod") != 0) { <br>

        sprintf(ebuf, "I_PUSH bufmod: %s", pcap_strerror(errno)); <br>

        goto bad; <br>

    } <br>

    } <br>

    /* <br>

    ** Now that the bufmod is pushed lets configure it. <br>

    ** <br>

    ** There is a bug in bufmod(7). When dealing with messages of <br>

    ** less than snaplen size it strips data from the beginning not <br>

    ** the end. <br>

    ** <br>

    ** This bug is supposed to be fixed in 5.3.2. Also, there is a <br>

    ** patch available. Ask for bugid 1149065. <br>

    */ <br>

    ss = snaplen; <br>

#ifdef SOLARIS <br>

    release = getrelease(&osmajor, &osminor, &osmicro); <br>

    if (osmajor == 5 && (osminor <= 2 || (osminor == 3 && osmicro < 2)) && <br>

        getenv("BUFMOD_FIXED") == NULL) { <br>

        fprintf(stderr, <br>

        "WARNING: bufmod is broken in SunOS %s; ignoring snaplen.\n", <br>

            release); <br>

        ss = 0; <br>

    } <br>

#endif <br>

    if (ss > 0 && <br>



        strioctl(p->fd, SBIOCSSNAP, sizeof(u_long), (char *)&ss) != 0) { <br>

        sprintf(ebuf, "SBIOCSSNAP: %s", pcap_strerror(errno)); <br>

        goto bad; <br>

    } <br>

    /* <br>

    ** Set up the bufmod flags <br>

    */ <br>

    if (strioctl(p->fd, SBIOCGFLAGS, sizeof(u_long), (char *)&flag) < 0) { <br>

        sprintf(ebuf, "SBIOCGFLAGS: %s", pcap_strerror(errno)); <br>

        goto bad; <br>

    } <br>

    flag |= SB_NO_DROPS; <br>

    if (strioctl(p->fd, SBIOCSFLAGS, sizeof(u_long), (char *)&flag) != 0) { <br>

        sprintf(ebuf, "SBIOCSFLAGS: %s", pcap_strerror(errno)); <br>

        goto bad; <br>

    } <br>

    /* more nfswatch */ <br>

    /* <br>

    * Set the read timeout. <br>

    */ <br>

    timeout.tv_sec = 1; <br>

    timeout.tv_usec = 0; <br>



    si.ic_cmd = SBIOCSTIME; <br>

    si.ic_timout = INFTIM; <br>

    si.ic_len = sizeof(timeout); <br>

    si.ic_dp = (char *) &timeout; <br>

    if (ioctl(p->fd, I_STR, (char *) &si) < 0) { <br>

        sprintf(ebuf, "ioctl: I_STR SBIOCSTIME"); <br>

        goto bad; <br>

    } <br>

    /* <br>

    * Set the chunk size. <br>

    */ <br>

    chunksz = MAXDLBUF * sizeof(long); <br>

    si.ic_cmd = SBIOCSCHUNK; <br>

    si.ic_len = sizeof(chunksz); <br>

    si.ic_dp = (char *) &chunksz; <br>

    if (ioctl(p->fd, I_STR, (char *) &si) < 0) { <br>

        sprintf(ebuf, "ioctl: I_STR SBIOCSCHUNK"); <br>

        goto bad; <br>

    } <br>

    /* end nfswatch */ <br>

    /* <br>

    ** As the last operation flush the read side. <br>



    */ <br>

    if (ioctl(p->fd, I_FLUSH, FLUSHR) != 0) { <br>

        sprintf(ebuf, "FLUSHR: %s", pcap_strerror(errno)); <br>

        goto bad; <br>

    } <br>

    /* <br>

    ** Just support ethernets for now <br>

    */ <br>

    p->linktype = DLT_EN10MB; <br>

    /* Allocate data buffer */ <br>

    p->bufsize = MAXDLBUF * sizeof(long); <br>

    p->buffer = (u_char *)malloc(p->bufsize); <br>

    return (p); <br>

bad: <br>

    free(p); <br>

    return (NULL); <br>

} <br>

int <br>

pcap_setfilter(pcap_t *p, struct bpf_program *fp) <br>

{ <br>

    p->fcode = *fp; <br>

    return (0); <br>



} <br>

static int <br>

send_request(int fd, char *ptr, int len, char *what, char *ebuf) <br>

{ <br>

    struct    strbuf    ctl; <br>

    int    flags; <br>

    ctl.maxlen = 0; <br>

    ctl.len = len; <br>

    ctl.buf = ptr; <br>

    flags = 0; <br>

    if (putmsg(fd, &ctl, (struct strbuf *) NULL, flags) < 0) { <br>

        sprintf(ebuf, "putmsg \"%s\"failed: %s", <br>

            what, pcap_strerror(errno)); <br>

        return (-1); <br>

    } <br>

    return (0); <br>

} <br>

static int <br>

dlattachreq(int fd, u_long ppa, char *ebuf) <br>

{ <br>

    dl_attach_req_t    req; <br>

    req.dl_primitive = DL_ATTACH_REQ; <br>



    req.dl_ppa = ppa; <br>

    return (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf)); <br>

} <br>

static int <br>

dlpromisconreq(int fd, u_long level, char *ebuf) <br>

{ <br>

    dl_promiscon_req_t req; <br>

    req.dl_primitive = DL_PROMISCON_REQ; <br>

    req.dl_level = level; <br>

    return (send_request(fd, (char *)&req, sizeof(req), "promiscon", ebuf)); <br>

  <br>

} <br>

static int <br>

dlokack(int fd, char *bufp, char *ebuf) <br>

{ <br>

    union    DL_primitives    *dlp; <br>

    struct    strbuf    ctl; <br>

    int    flags; <br>

    ctl.maxlen = MAXDLBUF; <br>

    ctl.len = 0; <br>

    ctl.buf = bufp; <br>

    flags = 0; <br>

    flags = 0; <br>

    if (getmsg(fd, &ctl, (struct strbuf*)NULL, &flags) < 0) { <br>

        sprintf(ebuf, "getmsg: %s", pcap_strerror(errno)); <br>

        return (-1); <br>

    } <br>

    dlp = (union DL_primitives *) ctl.buf; <br>

    if (dlp->dl_primitive != DL_OK_ACK) { <br>

        sprintf(ebuf, "dlokack unexpected primitive %d", <br>

            dlp->dl_primitive); <br>

        return (-1); <br>

    } <br>

    if (ctl.len != sizeof(dl_ok_ack_t)) { <br>

        sprintf(ebuf, "dlokack incorrect size returned"); <br>

        return (-1); <br>

    } <br>

    return (0); <br>

} <br>

static int <br>

strioctl(int fd, int cmd, int len, char *dp) <br>

{ <br>

    struct strioctl str; <br>

    int rc; <br>

    str.ic_cmd = cmd; <br>



    str.ic_timout = -1; <br>

    str.ic_len = len; <br>

    str.ic_dp = dp; <br>

    rc = ioctl(fd, I_STR, &str); <br>

    if (rc < 0) <br>

        return (rc); <br>

    else <br>

        return (str.ic_len); <br>

} <br>

#ifdef SOLARIS <br>

static char * <br>

getrelease(long *majorp, long *minorp, long *microp) <br>

{ <br>

    char *cp; <br>

    static char buf[32]; <br>

    *majorp = 0; <br>

    *minorp = 0; <br>

    *microp = 0; <br>

    if (sysinfo(SI_RELEASE, buf, sizeof(buf)) < 0) <br>

        return ("?"); <br>

    cp = buf; <br>

    if (!isdigit(*cp)) <br>



        return (buf); <br>

    *majorp = strtol(cp, &cp, 10); <br>

    if (*cp++ != '.') <br>

        return (buf); <br>

    *minorp =  strtol(cp, &cp, 10); <br>

    if (*cp++ != '.') <br>

        return (buf); <br>

    *microp =  strtol(cp, &cp, 10); <br>

    return (buf); <br>

} <br>

#endif <br>

/* <br>

* dlbindreq - send a request to bind. <br>

*/ <br>

static void <br>

dlbindreq(int fd, u_long sap, u_long max_conind, u_long service_mode, <br>

    u_long conn_mgmt, u_long xidtest) <br>

{ <br>

    dl_bind_req_t bind_req; <br>

    struct strbuf ctl; <br>

    int flags; <br>

    bind_req.dl_primitive = DL_BIND_REQ; <br>



    bind_req.dl_sap = sap; <br>

    bind_req.dl_max_conind = max_conind; <br>

    bind_req.dl_service_mode = service_mode; <br>

    bind_req.dl_conn_mgmt = conn_mgmt; <br>

#ifdef DL_PROMISC_PHYS <br>

    /* <br>

     * DLPI 2.0 only? <br>

     */ <br>

    bind_req.dl_xidtest_flg = xidtest; <br>

#endif <br>

    ctl.maxlen = 0; <br>

    ctl.len = sizeof (bind_req); <br>

    ctl.buf = (char *) &bind_req; <br>

    flags = 0; <br>

    if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) { <br>

        perror("putmsg"); <br>

        exit(1); <br>

    } <br>

} <br>

/* <br>

* dlbindack - receive an ack to a dlbindreq. <br>

*/ <br>



static int <br>

dlbindack(int fd, char *bufp) <br>

{ <br>

    union DL_primitives *dlp; <br>

    struct strbuf ctl; <br>

    int flags = 0; <br>

    ctl.maxlen = MAXDLBUF; <br>

    ctl.len = 0; <br>

    ctl.buf = bufp; <br>

    if (getmsg(fd, &ctl, (struct strbuf*)NULL, &flags) < 0) <br>

        return(-1); <br>

    dlp = (union DL_primitives *) ctl.buf; <br>

    if (dlp->dl_primitive != DL_BIND_ACK) <br>

        return(-1); <br>

    if (flags != RS_HIPRI) <br>

        return(-1); <br>

    if (ctl.len < sizeof (dl_bind_ack_t)) <br>

        return(-1); <br>

    return(0); <br>

} <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="516.htm">上一层</a>][<a href="544.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -