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

📄 sppclose.c

📁 早期freebsd实现
💻 C
字号:
/* * Routines for closing an SPP connection *//* $Log:	sppclose.c,v $ * Revision 2.0  85/11/21  07:22:21  jqj * 4.3BSD standard release *  * Revision 1.3  85/03/11  16:37:50  jqj * *** empty log message *** *  * Revision 1.3  85/03/11  16:37:50  jqj * Public alpha-test version, released 11 March 1985 *  * Revision 1.2  85/01/27  07:37:52  jqj * finished but undebugged version *  */#ifndef lintstatic char rcsid[] = "$Header: sppclose.c,v 2.0 85/11/21 07:22:21 jqj Exp $";#endif/* #include <stdio.h> */#include <sys/types.h>		/* for ns.h */#include <sys/socket.h>#include <sys/time.h>#include <netns/ns.h>		/* for misc. constants */#include <netns/sp.h>		/* for spphdr */#include "courier.h"#ifndef SPPMAXDATA#define SPPMAXDATA 534#endif#ifndef TRUE#define TRUE (1)#define FALSE (0)#define NULL ((char*)0)#endifintsppclose(s)/* try to close an SPP connection by sending an END packet. *//* return TRUE on normal close, FALSE on abnormal close */	int s;{	int fdmask;	static struct timeval timeout = {15,0};	struct {		struct sphdr hdr;		char data[SPPMAXDATA];	} packbuf;		/* streamtype=254, EOM=FALSE, Attn=FALSE */	packbuf.hdr.sp_dt = SPPSST_END;	packbuf.hdr.sp_cc = 0;	fdmask = 1<<s;	if (write(s, &packbuf, sizeof(packbuf.hdr)) >= 0	    && select(s+1,&fdmask,(int*)NULL,(int*)NULL,&timeout) > 0	    && read(s,(char*)&packbuf,sizeof(packbuf)) > 0) {		if (packbuf.hdr.sp_dt == SPPSST_ENDREPLY) {			/* normal close */			/* SetSPPoptions(s, SPPSST_ENDREPLY, 0, 0);				/* streamtype=255, EOM=FALSE, Attn=FALSE */			packbuf.hdr.sp_dt = SPPSST_ENDREPLY;			packbuf.hdr.sp_cc = 0;			if (write(s, &packbuf, sizeof(packbuf.hdr)) >= 0			    && shutdown(s,0) >= 0) {				/* don't read any more, but */				/*  try to get ENDREPLY out */				(void) close(s);				return(TRUE);			}			/* fall out of if to abnormal close */		}		else if (packbuf.hdr.sp_dt == SPPSST_END) {			/* simultaneous close */			return(sppclosereply(s));		}		/* else must have been a data packet -- abnormal close */		/* fall through */	}	/* timer expired, data packet arrived, or write failed */	(void) shutdown(s,2);		/* throw away all data */	(void) close(s);	return(FALSE);}intsppclosereply(s)/* handle receipt of a packet of type END, by closing down the SPP * connection.  Returns TRUE on normal close, FALSE otherwise. */	int s;		/* spp socket */{	int fdmask;	static struct timeval timeout = {10,0};	struct {		struct sphdr hdr;		char data[SPPMAXDATA];	} packbuf;	fdmask = 1<<s;	/* SetSPPoptions(s, SPPSST_ENDREPLY, 0, 0);		/* streamtype=255, EOM=FALSE, Attn=FALSE */	packbuf.hdr.sp_dt = SPPSST_ENDREPLY;	packbuf.hdr.sp_cc = 0;	if (write(s, &packbuf, sizeof(packbuf.hdr))	    && select(s+1, &fdmask, (int*)NULL, (int*)NULL, &timeout) > 0	    && read(s, (char*)&packbuf, sizeof(packbuf)) > 0	    && shutdown(s,2) == 0) {		close(s);		return(packbuf.hdr.sp_dt == SPPSST_ENDREPLY);	}	/* write failed, timeout expired, or error occured */	(void) shutdown(s,2);	/* throw away any data */	(void) close(s);	return(FALSE);}

⌨️ 快捷键说明

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