📄 543.htm
字号:
*/ <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 + -