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

📄 dlpi.c

📁 DHCP服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
{	dl_unbind_req_t	unbind_req;	struct strbuf ctl;	int flags;		unbind_req.dl_primitive = DL_UNBIND_REQ;		ctl.maxlen = 0;	ctl.len = sizeof (unbind_req);	ctl.buf = (char *)&unbind_req;		flags = 0;		return putmsg (fd, &ctl, (struct strbuf*)NULL, flags);}/* * dlpidetachreq - send a request to detach. */static int dlpidetachreq (fd)	int fd;{	dl_detach_req_t	detach_req;	struct strbuf ctl;	int flags;		detach_req.dl_primitive = DL_DETACH_REQ;		ctl.maxlen = 0;	ctl.len = sizeof (detach_req);	ctl.buf = (char *)&detach_req;		flags = 0;		return putmsg (fd, &ctl, (struct strbuf*)NULL, flags);}/* * dlpibindack - receive an ack to a dlbindreq. */static int dlpibindack (fd, bufp)	char *bufp;	int fd;{	union DL_primitives *dlp;	struct strbuf ctl;	int flags;		ctl.maxlen = DLPI_MAXDLBUF;	ctl.len = 0;	ctl.buf = bufp;	if (strgetmsg (fd, &ctl,		       (struct strbuf*)NULL, &flags, "dlpibindack") < 0) {		return -1;	}		dlp = (union DL_primitives *)ctl.buf;		if (!expected (DL_BIND_ACK, dlp, flags) < 0) {		return -1;	}		if (ctl.len < sizeof (dl_bind_ack_t)) {		/* Returned structure is too short */		return -1;	}	return 0;}/* * dlpiokack - general acknowledgement reception. */static int dlpiokack (fd, bufp)	char *bufp;	int fd;{	union DL_primitives *dlp;	struct strbuf ctl;	int flags;		ctl.maxlen = DLPI_MAXDLBUF;	ctl.len = 0;	ctl.buf = bufp;		if (strgetmsg (fd, &ctl,		       (struct strbuf*)NULL, &flags, "dlpiokack") < 0) {		return -1;	}		dlp = (union DL_primitives *)ctl.buf;		if (!expected (DL_OK_ACK, dlp, flags) < 0) {		return -1;	}		if (ctl.len < sizeof (dl_ok_ack_t)) {		/* Returned structure is too short */		return -1;	}		return 0;}/* * dlpiinfoack - receive an ack to a dlinforeq. */static int dlpiinfoack (fd, bufp)	char *bufp;	int fd;{	union DL_primitives *dlp;	struct strbuf ctl;	int flags;		ctl.maxlen = DLPI_MAXDLBUF;	ctl.len = 0;	ctl.buf = bufp;		if (strgetmsg (fd, &ctl, (struct strbuf *)NULL, &flags,		       "dlpiinfoack") < 0) {		return -1;	}		dlp = (union DL_primitives *) ctl.buf;		if (!expected (DL_INFO_ACK, dlp, flags) < 0) {		return -1;	}		if (ctl.len < sizeof (dl_info_ack_t)) {		/* Returned structure is too short */		return -1;	}		return 0;}/* * dlpiphysaddrack - receive an ack to a dlpiphysaddrreq. */int dlpiphysaddrack (fd, bufp)	char *bufp;	int fd;{	union DL_primitives *dlp;	struct strbuf ctl;	int flags;		ctl.maxlen = DLPI_MAXDLBUF;	ctl.len = 0;	ctl.buf = bufp;		if (strgetmsg (fd, &ctl, (struct strbuf *)NULL, &flags,		       "dlpiphysaddrack") < 0) {		return -1;	}	dlp = (union DL_primitives *)ctl.buf;		if (!expected (DL_PHYS_ADDR_ACK, dlp, flags) < 0) {		return -1;	}	if (ctl.len < sizeof (dl_phys_addr_ack_t)) {		/* Returned structure is too short */		return -1;	}		return 0;}int dlpiunitdatareq (fd, addr, addrlen, minpri, maxpri, dbuf, dbuflen)	int fd;	unsigned char *addr;	int addrlen;	unsigned long minpri;	unsigned long maxpri;	unsigned char *dbuf;	int dbuflen;{	long buf [DLPI_MAXDLBUF];	union DL_primitives *dlp;	struct strbuf ctl, data;		/* Set up the control information... */	dlp = (union DL_primitives *)buf;	dlp -> unitdata_req.dl_primitive = DL_UNITDATA_REQ;	dlp -> unitdata_req.dl_dest_addr_length = addrlen;	dlp -> unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t);	dlp -> unitdata_req.dl_priority.dl_min = minpri;	dlp -> unitdata_req.dl_priority.dl_max = maxpri;	/* Append the destination address */	memcpy ((char *)buf + dlp -> unitdata_req.dl_dest_addr_offset,		addr, addrlen);		ctl.maxlen = 0;	ctl.len = dlp -> unitdata_req.dl_dest_addr_offset + addrlen;	ctl.buf = (char *)buf;	data.maxlen = 0;	data.buf = (char *)dbuf;	data.len = dbuflen;	/* Send the packet down the wire... */	return putmsg (fd, &ctl, &data, 0);}static int dlpiunitdataind (fd, daddr, daddrlen,			    saddr, saddrlen, grpaddr, dbuf, dlen)	int fd;	unsigned char *daddr;	unsigned long *daddrlen;	unsigned char *saddr;	unsigned long *saddrlen;	unsigned long *grpaddr;	unsigned char *dbuf;	int dlen;{	long buf [DLPI_MAXDLBUF];	union DL_primitives *dlp;	struct strbuf ctl, data;	int flags = 0;	int result;	/* Set up the msg_buf structure... */	dlp = (union DL_primitives *)buf;	dlp -> unitdata_ind.dl_primitive = DL_UNITDATA_IND;	ctl.maxlen = DLPI_MAXDLBUF;	ctl.len = 0;	ctl.buf = (char *)buf;		data.maxlen = dlen;	data.len = 0;	data.buf = (char *)dbuf;		result = getmsg (fd, &ctl, &data, &flags);		if (result != 0) {		return -1;	}		if (ctl.len < sizeof (dl_unitdata_ind_t) ||	    dlp -> unitdata_ind.dl_primitive != DL_UNITDATA_IND) {		return -1;	}		if (data.len <= 0) {		return data.len;	}	/* Copy sender info */	if (saddr) {		memcpy (saddr,			(char *)buf + dlp -> unitdata_ind.dl_src_addr_offset,			dlp -> unitdata_ind.dl_src_addr_length);	}	if (saddrlen) {		*saddrlen = dlp -> unitdata_ind.dl_src_addr_length;	}	/* Copy destination info */	if (daddr) {		memcpy (daddr,			(char *)buf + dlp -> unitdata_ind.dl_dest_addr_offset,			dlp -> unitdata_ind.dl_dest_addr_length);	}	if (daddrlen) {		*daddrlen = dlp -> unitdata_ind.dl_dest_addr_length;	}		if (grpaddr) {		*grpaddr = dlp -> unitdata_ind.dl_group_address;	}		return data.len;}/* * expected - see if we got what we wanted. */static int expected (prim, dlp, msgflags)	unsigned long prim;	union DL_primitives *dlp;	int msgflags;{	if (msgflags != RS_HIPRI) {		/* Message was not M_PCPROTO */		return 0;	}	if (dlp -> dl_primitive != prim) {		/* Incorrect/unexpected return message */		return 0;	}		return 1;}/* * strgetmsg - get a message from a stream, with timeout. */static int strgetmsg (fd, ctlp, datap, flagsp, caller)	struct strbuf *ctlp, *datap;	char *caller;	int *flagsp;	int fd;{	int result;#ifdef USE_POLL	struct pollfd pfd;	int count;	time_t now;	time_t starttime;	int to_msec;#endif	#ifdef USE_POLL	pfd.fd = fd;	pfd.events = POLLPRI;	/* We're only interested in knowing				 * when we can receive the next high				 * priority message.				 */	pfd.revents = 0;	now = time (&starttime);	while (now <= starttime + DLPI_MAXWAIT) {		to_msec = ((starttime + DLPI_MAXWAIT) - now) * 1000;		count = poll (&pfd, 1, to_msec);				if (count == 0) {			/* log_fatal ("strgetmsg: timeout"); */			return -1;		} else if (count < 0) {			if (errno == EAGAIN || errno == EINTR) {				time (&now);				continue;			} else {				/* log_fatal ("poll: %m"); */				return -1;			}		} else {			break;		}	}#else  /* defined (USE_POLL) */	/*	 * Start timer.  Can't use select, since it might return true if there	 * were non High-Priority data available on the stream.	 */	(void) sigset (SIGALRM, sigalrm);		if (alarm (DLPI_MAXWAIT) < 0) {		/* log_fatal ("alarm: %m"); */		return -1;	}#endif /* !defined (USE_POLL) */	/*	 * Set flags argument and issue getmsg ().	 */	*flagsp = 0;	if ((result = getmsg (fd, ctlp, datap, flagsp)) < 0) {		return result;	}#ifndef USE_POLL	/*	 * Stop timer.	 */		if (alarm (0) < 0) {		/* log_fatal ("alarm: %m"); */		return -1;	}#endif	/*	 * Check for MOREDATA and/or MORECTL.	 */	if (result & (MORECTL|MOREDATA)) {		return -1;	}	/*	 * Check for at least sizeof (long) control data portion.	 */	if (ctlp -> len < sizeof (long)) {		return -1;	}	return 0;}#ifndef USE_POLL/* * sigalrm - handle alarms. */static void sigalrm (sig)	int sig;{	fprintf (stderr, "strgetmsg: timeout");	exit (1);}#endif /* !defined (USE_POLL) */int can_unicast_without_arp (ip)	struct interface_info *ip;{	return 1;}int can_receive_unicast_unconfigured (ip)	struct interface_info *ip;{	return 1;}int supports_multiple_interfaces (ip)	struct interface_info *ip;{	return 1;}void maybe_setup_fallback (){	isc_result_t status;	struct interface_info *fbi = (struct interface_info *)0;	if (setup_fallback (&fbi, MDL)) {		if_register_fallback (fbi);		status = omapi_register_io_object ((omapi_object_t *)fbi,						   if_readsocket, 0,						   fallback_discard, 0, 0);		if (status != ISC_R_SUCCESS)			log_fatal ("Can't register I/O handle for %s: %s",				   fbi -> name, isc_result_totext (status));		interface_dereference (&fbi, MDL);	}}#endif /* USE_DLPI */

⌨️ 快捷键说明

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