ntp_osi.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,625 行 · 第 1/3 页

C
1,625
字号
char *addr;struct RoSAPindication *roi;{	int	    sd;	struct SSAPref sfs;	register struct SSAPref *sf;	register struct PSAPaddr *pa, *pa2;	struct AcSAPconnect accs;	register struct AcSAPconnect   *acc = &accs;	struct AcSAPindication  acis;	register struct AcSAPindication *aci = &acis;	register struct AcSAPabort   *aca = &aci -> aci_abort;	OID	    ctx,		pci;	PE	pep[1];	struct PSAPctxlist pcs;	register struct PSAPctxlist *pc = &pcs;	struct intf *ap;	int	acount;	int	result;	if (peer -> src.type != AF_OSI)		return NOTOK;	ap = getintf (&acount);	ap->addr = peer->src;	ap->fd = -1;	ap->name = "OSI";	peer-> sock = acount;	pa = &ap -> addr.psap_ad;	TRACE (2, ("Making connection to %s", paddr2str (pa, NULLNA)));	if ((pa2 = str2paddr (addr)) == NULLPA) {		advise (LLOG_EXCEPTIONS, NULLCP, "Can't translate %s", addr);                return NOTOK;        }	pep[0] = build_bind_arg (pa2, peer);	if ((ctx = ode2oid (mycontext)) == NULLOID) {		advise (LLOG_EXCEPTIONS, NULLCP,			"%s: unknown object descriptor", mycontext);		return NOTOK;	}	if ((ctx = oid_cpy (ctx)) == NULLOID) {		advise (LLOG_EXCEPTIONS, "memory", "out of");		return NOTOK;	}	if ((pci = ode2oid (mypci)) == NULLOID) {		advise (LLOG_EXCEPTIONS, NULLCP,			"%s: unknown object descriptor", mypci);		return NOTOK;	}	if ((pci = oid_cpy (pci)) == NULLOID) {		advise (LLOG_EXCEPTIONS, "memory", "out of");		return NOTOK;	}	pc -> pc_nctx = 1;	pc -> pc_ctx[0].pc_id = 1;	pc -> pc_ctx[0].pc_asn = pci;	pc -> pc_ctx[0].pc_atn = NULLOID;	if ((sf = addr2ref (PLocalHostName ())) == NULL) {		sf = &sfs;		(void) bzero ((char *) sf, sizeof *sf);	}	result = AcAsynAssocRequest (ctx, NULLAEI, NULLAEI, pa2, pa,				     pc, NULLOID,				     0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf,				     pep, 1, NULLQOS,				     acc, aci, 1);	pe_free (pep[0]);	switch (result) {	    case NOTOK:		acs_advise (aca, "A-ASSOCIATE.REQUEST");		ap -> flags = 0;		return result;	    case CONNECTING_1:	    case CONNECTING_2:		ap -> fd = sd = acc -> acc_sd;		ap -> flags |= INTF_PENDING;		FD_SET (sd, &globwmask);		if (sd >= selfds)			selfds = sd + 1;		ACCFREE (acc);		return result;	    case DONE:		if (acc -> acc_result != ACS_ACCEPT)			return handle_reject (acc, ap);		return check_accept (acc, ap, peer);	    default:		advise (LLOG_EXCEPTIONS, NULLCP, "Unknown response (%d)",			result);		break;	}	return NOTOK;}static int check_accept (acc, ap, peer)struct AcSAPconnect *acc;struct intf *ap;struct ntp_peer *peer;{	struct RoSAPindication rois;	struct RoSAPindication *roi = &rois;	struct RoSAPpreject *rop = &roi -> roi_preject;	int	sd;	int	version, mode;	struct type_NTP_BindResult *bindres;	if (acc -> acc_ninfo > 0) {		PLOG (pgm_log, print_NTP_BindResult, acc -> acc_info[0],		      "NTP.BindResult", 1);		if (decode_NTP_BindResult (acc -> acc_info[0], 1,					   NULLIP, NULLVP,					   &bindres) == NOTOK) {			advise (LLOG_EXCEPTIONS,  NULLCP,				"decode bindresult failed [%s]", PY_pepy);			terminate (ap, roi);			return NOTOK;		}		version = bindres -> version;		mode = bindres -> mode -> parm;		free_NTP_BindResult (bindres);	}	else {		version = 1;		mode = int_NTP_BindMode_normal;	}					   	sd = acc -> acc_sd;			ACCFREE (acc);	if (RoSetService (sd, RoPService, roi) == NOTOK) {		ros_advise (rop, "set RO/PS fails");		terminate (ap, roi);		ap -> flags = 0;		return NOTOK;	}	FD_SET (sd, &globmask);	if (sd >= selfds)		selfds = sd + 1;	peer -> flags |= PEER_FL_CONNECTED;	peer -> vers = version;	peer -> mode = mode;	ap -> fd = sd;	ap->flags = INTF_VALID;	TRACE (1,  ("CONNECTED to %s on %d if %d",		    paddr2str (&peer->src.psap_ad, NULLNA),		    sd, peer->sock));	return DONE;}/* ARGSUSED */static PE build_bind_arg (psap, peer)struct PSAPaddr *psap;struct ntp_peer *peer;{	struct type_NTP_BindArgument *bindarg;	char	*str;	PE	pe;	bindarg = (struct type_NTP_BindArgument *)		calloc (1, sizeof *bindarg);	str = _paddr2str (psap, NULLNA, -1);	bindarg -> psap = str2qb (str, strlen(str), 1);	bindarg -> version =		pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,			  PE_PRIM_BITS);	(void) bit_on (bindarg -> version,		bit_NTP_version_version__1);	(void) bit_on (bindarg -> version,		bit_NTP_version_version__2);	bindarg -> mode = (struct type_NTP_BindMode *)		calloc (1, sizeof *bindarg-> mode);	bindarg -> mode -> parm =		int_NTP_BindMode_normal;	if (encode_NTP_BindArgument (&pe, 1, 0, NULLCP,				     bindarg) == NOTOK) {		pe = NULLPE;		advise (LLOG_EXCEPTIONS, NULLCP,			"encode Bindargument failed [%s]", PY_pepy);	}	else	{		pe -> pe_context = 3;		PLOG (pgm_log, print_NTP_BindArgument, pe,		      "NTP.BindArgument", 0);	}	free_NTP_BindArgument (bindarg);	return pe;}	static int acsap_retry (peer, roi)struct ntp_peer *peer;struct RoSAPindication *roi;{	struct AcSAPconnect accs;        register struct AcSAPconnect   *acc = &accs;        struct AcSAPindication  acis;        register struct AcSAPindication *aci = &acis;        register struct AcSAPabort *aca = &aci -> aci_abort;	int	result;	struct intf *ap;	TRACE (2, ("retry request on %s", paddr (&peer->src)));	ap = &addrs[peer->sock];	switch (result = AcAsynRetryRequest (ap -> fd, acc, aci)) {	    case CONNECTING_1:	    case CONNECTING_2:		return result;	    case NOTOK:		acs_advise (aca, "A-ASSOCIATE.REQUEST");		ap -> flags = 0;		return NOTOK;	    case DONE:		if (acc -> acc_result != ACS_ACCEPT)			return handle_reject (acc, ap);		return check_accept (acc, ap, peer);	    default:		advise (LLOG_EXCEPTIONS, NULLCP,			"Bad response from retry %d", result);		terminate (ap, roi);		break;	}	return NOTOK;}static int handle_reject (acc, ap)struct AcSAPconnect *acc;struct intf *ap;{	if (acc -> acc_ninfo > 0) {		struct type_NTP_BindError *binderr;		char	*cp = NULLCP;		PLOG (pgm_log, print_NTP_BindError, acc -> acc_info[0],		      "NTP.BindError", 1);		if (decode_NTP_BindError (acc -> acc_info[0], 1,					  NULLIP, NULLVP,					  &binderr) != NOTOK) {			if (binderr -> supplementary)				cp = qb2str (binderr -> supplementary);			switch (binderr -> reason) {			    case int_NTP_reason_refused:				advise (LLOG_EXCEPTIONS,					"connection refused: %s",					cp ? cp : "");				break;			    case int_NTP_reason_validation:				advise (LLOG_EXCEPTIONS,					"validation failure: %s",					cp ? cp : "");				break;			    case int_NTP_reason_version:				advise (LLOG_EXCEPTIONS,					"version mismatch: %s",					cp ? cp : "");				break;			    case int_NTP_reason_badarg:				advise (LLOG_EXCEPTIONS,					"bad connect argument: %s",					cp ? cp : "");				break;			    case int_NTP_reason_congested:				advise (LLOG_EXCEPTIONS,					"congested: %s",					cp ? cp : "");				break;			    default:				advise (LLOG_EXCEPTIONS, NULLCP,					"Unknown reason (%d) %s",					binderr -> reason,					cp ? cp : "");				break;			}			free_NTP_BindError (binderr);		}		else			advise (LLOG_EXCEPTIONS, NULLCP,				"decode bind error failed [%s]", PY_pepy);	}	else		advise (LLOG_EXCEPTIONS, NULLCP,			"Connection failed: %s",			AcErrString (acc -> acc_result));	ACCFREE (acc);	ap -> flags = 0;	return NOTOK;}void    ros_advise (rop, event)register struct RoSAPpreject *rop;char   *event;{	char    buffer[BUFSIZ];	if (rop -> rop_cc > 0)		(void) sprintf (buffer, "[%s] %*.*s",				RoErrString (rop -> rop_reason),				rop -> rop_cc, rop -> rop_cc, rop -> rop_data);	else		(void) sprintf (buffer, "[%s]",				RoErrString (rop -> rop_reason));	advise (LLOG_EXCEPTIONS, NULLCP, "%s: %s", event, buffer);}void    acs_advise (aca, event)register struct AcSAPabort *aca;char   *event;{	char    buffer[BUFSIZ];	if (aca -> aca_cc > 0)		(void) sprintf (buffer, "[%s] %*.*s",				AcErrString (aca -> aca_reason),				aca -> aca_cc, aca -> aca_cc, aca -> aca_data);	else		(void) sprintf (buffer, "[%s]",				AcErrString (aca -> aca_reason));	advise (LLOG_EXCEPTIONS, NULLCP, "%s: %s (source %d)", event, buffer,                aca -> aca_source);}static doubleul2_fixed_to_double(t)struct type_NTP_TimeStamp *t;{	double a, b;#ifdef	GENERIC_UNS_BUG	register int i;	i = t->fraction;	a = (long)((i >> 1) & 0x7fffffff);	a *= 2.0;	if (i & 1)		a += 1.0;	a = a / (4.294967296e9);	/* shift dec point over by 32 bits */	i = t->integer;	b = (long)((i >> 1) & 0x7fffffff);	b *= 2.0;	if (i & 1)		b += 1.0;#else	/* GENERIC_UNS_BUG */	a = (unsigned long) t->fraction;#ifdef	VAX_COMPILER_FLT_BUG	if (a < 0.0) a += 4.294967296e9;#endif	a = a / (4.294967296e9);/* shift dec point over by 32 bits */	b = (unsigned long) t->integer;#ifdef	VAX_COMPILER_FLT_BUG	if (b < 0.0) b += 4.294967296e9;#endif#endif	/* GENERIC_UNS_BUG */	return (a + b);}static doubleul_fixed_to_doublep(t)	struct l_fixedpt *t;{	double a, b;#ifdef	GENERIC_UNS_BUG	register int i;	i = t->fraction;	a = (long)((i >> 1) & 0x7fffffff);	a *= 2.0;	if (i & 1)		a += 1.0;	a = a / (4.294967296e9);	/* shift dec point over by 32 bits */	i = t->int_part;	b = (long)((i >> 1) & 0x7fffffff);	b *= 2.0;	if (i & 1)		b += 1.0;#else	/* GENERIC_UNS_BUG */	a = (unsigned long) t->fraction;#ifdef	VAX_COMPILER_FLT_BUG	if (a < 0.0) a += 4.294967296e9;#endif	a = a / (4.294967296e9);/* shift dec point over by 32 bits */	b = (unsigned long) t->int_part;#ifdef	VAX_COMPILER_FLT_BUG	if (b < 0.0) b += 4.294967296e9;#endif#endif	/* GENERIC_UNS_BUG */	return (a + b);}#ifdef	SUN_FLT_BUGstatic voidtstamp_osi (stampp, tvp)struct l_fixedpt *stampp;struct timeval *tvp;{	int tt;	double dd;	stampp->int_part = JAN_1970 + tvp->tv_sec;	dd = (float) tvp->tv_usec / 1000000.0;	tt = dd * 2147483648.0;	stampp->fraction = tt << 1;}#elsestatic voidtstamp_osi (stampp, tvp)	struct l_fixedpt *stampp;	struct timeval *tvp;{	stampp->int_part = JAN_1970 + tvp->tv_sec;	stampp->fraction = (float) tvp->tv_usec * 4294.967295;}#endifstruct type_NTP_ClockIdentifier *cli_refid (refid)Refid refid;{	struct type_NTP_ClockIdentifier *rid;	char	*cp;	rid = (struct type_NTP_ClockIdentifier *) malloc (sizeof *rid);	switch (refid.rid_type) {	    case 0:		free ((char *)rid);		return NULL;	    case RID_STRING:		rid -> offset = type_NTP_ClockIdentifier_referenceClock;		rid -> un.referenceClock = str2qb (refid.rid_string,						   strlen(refid.rid_string),						   1);		break;	    case RID_INET:		rid -> offset = type_NTP_ClockIdentifier_inetaddr;		cp = ntoa((struct sockaddr_in *)&refid.rid_inet);		rid -> un.inetaddr = str2qb(cp, strlen(cp), 1);		break;	    case RID_PSAP:		rid -> offset = type_NTP_ClockIdentifier_psapaddr;		cp = paddr2str (&refid.rid_psap, NULLNA);		rid -> un.inetaddr = str2qb (cp, strlen (cp), 1);		break;	}	return rid;}struct type_NTP_ClockInfo *peer2clock (peer)struct ntp_peer *peer;{	struct type_NTP_ClockInfo *ci;	char	*cp;	ci = (struct type_NTP_ClockInfo *) calloc (1, sizeof *ci);	if (peer -> sock < 0)		cp = "none";	else		cp = paddr (&addrs[peer->sock].addr);	ci -> localAddress = str2qb (cp, strlen (cp), 1);	cp = paddr (&peer -> src);	ci -> remoteAddress = str2qb (cp, strlen (cp), 1);	ci -> flags = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS);#define setflbit(x,y) if (peer -> flags & (x)) (void) bit_on (ci -> flags, (y))	setflbit (PEER_FL_CONFIG, bit_NTP_flags_configured);	setflbit (PEER_FL_AUTHENABLE, bit_NTP_flags_authentable);	setflbit (PEER_FL_SANE, bit_NTP_flags_sane);	setflbit (PEER_FL_CANDIDATE, bit_NTP_flags_candidate);	setflbit (PEER_FL_SYNC, bit_NTP_flags_sync);	setflbit (PEER_FL_BCAST, bit_NTP_flags_broadcast);	setflbit (PEER_FL_REFCLOCK, bit_NTP_flags_referenceClock);	setflbit (PEER_FL_SELECTED, bit_NTP_flags_selected);	setflbit (PEER_FL_SNOOZE, bit_NTP_flags_inactive);	if (sys.peer == peer)		(void) bit_on (ci -> flags, bit_NTP_flags_selected);#undef setflbit	ci -> packetsSent = peer -> pkt_sent;	ci -> packetsReceived = peer -> pkt_rcvd;	ci -> packetsDropped = peer -> pkt_dropped;	ci -> timer = peer -> timer;	ci -> leap = (struct type_NTP_Leap *) calloc (1, sizeof *ci -> leap);	ci -> leap -> parm = peer -> leap;	ci -> stratum = peer -> stratum;	ci -> ppoll = peer -> ppoll;	ci -> hpoll = peer -> hpoll;	ci -> precision = peer -> precision;	ci -> reachability = peer -> reach & NTP_WINDOW_SHIFT_MASK;	ci -> estdisp = peer -> estdisp * 1000.0;	ci -> estdelay = peer -> estdelay * 1000.0;	ci -> estoffset = peer -> estoffset * 1000.0;	ci -> reference = cli_refid (peer -> refid);	ci -> reftime = sstamp (&peer -> reftime);	ci -> filters = NULL;	return ci;}/* ARGSUSED */int query_func (sd, ryo, rox, in, roi)int     sd;struct RyOperation *ryo;struct RoSAPinvoke *rox;caddr_t in;struct RoSAPindication *roi;{	struct type_NTP_ClockInfoList *clbase, *cl;	struct ntp_peer *peer;	clbase = cl = NULL;	for (peer = peer_list.head; peer != NULL; peer = peer -> next) {		if (clbase == NULL)			clbase = cl = (struct type_NTP_ClockInfoList *)				calloc (1, sizeof *cl);		else {			cl -> next = (struct type_NTP_ClockInfoList *)				calloc (1, sizeof *cl);			cl = cl -> next;		}		cl -> ClockInfo = peer2clock (peer);	}	if (RyDsResult (sd, rox -> rox_id, (caddr_t) clbase,			ROS_NOPRIO, roi) == NOTOK)		ros_advise (&roi -> roi_preject, "RyDsResult failed");	free_NTP_ClockInfoList (clbase);	return OK;}

⌨️ 快捷键说明

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