|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 3204 (0xc84)
Types: TextFile
Names: »tsapstate.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/tsap/tsapstate.c«
/* tsapstate.c - TPM: hack state */
#ifndef lint
static char *rcsid = "$Header: /f/osi/tsap/RCS/tsapstate.c,v 6.0 89/03/18 23:45:39 mrose Rel $";
#endif
/*
* $Header: /f/osi/tsap/RCS/tsapstate.c,v 6.0 89/03/18 23:45:39 mrose Rel $
*
*
* $Log: tsapstate.c,v $
* Revision 6.0 89/03/18 23:45:39 mrose
* Release 5.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
/* LINTLIBRARY */
#include <stdio.h>
#include <signal.h>
#include "tpkt.h"
/* \f
*/
int TSaveState (sd, vec, td)
int sd;
char **vec;
register struct TSAPdisconnect *td;
{
SBV smask;
register struct tsapblk *tb;
static char buffer[sizeof *tb * 2 + 1];
missingP (vec);
smask = sigioblock ();
tsapPsig (tb, sd);
if (tb -> tb_len > 0) {
(void) sigiomask (smask);
return tsaplose (td, DR_WAITING, NULLCP, NULLCP);
}
buffer[explode (buffer, (u_char *) tb, sizeof *tb)] = NULL;
*vec++ = buffer;
*vec = NULL;
tb -> tb_fd = NOTOK;
freetblk (tb);
(void) sigiomask (smask);
return OK;
}
/* \f
*/
int TRestoreState (buffer, ts, td)
char *buffer;
register struct TSAPstart *ts;
register struct TSAPdisconnect *td;
{
struct tsapblk tbs;
register struct tsapblk *tb;
missingP (buffer);
missingP (ts);
if ((tb = newtblk ()) == NULL)
return tsaplose (td, DR_CONGEST, NULLCP, "out of memory");
if (implode ((u_char *) &tbs, buffer, strlen (buffer)) != sizeof tbs) {
(void) tsaplose (td, DR_PARAMETER, NULLCP, "bad state vector");
goto out1;
}
if (findtblk (tbs.tb_fd)) {
(void) tsaplose (td, DR_PARAMETER, NULLCP, "transport descriptor active");
goto out1;
}
tb -> tb_fd = tbs.tb_fd;
tb -> tb_flags = tbs.tb_flags & (TB_CONN | TB_EXPD | TB_TP0 | TB_TP4);
tb -> tb_srcref = tbs.tb_srcref;
tb -> tb_dstref = tbs.tb_dstref;
tb -> tb_tsdusize = tbs.tb_tsdusize;
tb -> tb_initiating = tbs.tb_initiating; /* struct copy */
tb -> tb_responding = tbs.tb_responding; /* struct copy */
switch (tb -> tb_flags & (TB_TP0 | TB_TP4)) {
#ifdef TCP
case TB_TCP:
(void) TTService (tb);
break;
#endif
#ifdef X25
case TB_X25:
(void) XTService (tb);
break;
#endif
#ifdef BRIDGE_X25
case TB_BRG:
(void) BTService (tb);
break;
#endif
#ifdef CONS
case TB_CONS:
(void) nTService (tb);
break;
#endif
#ifdef TP4
case TB_TP4:
(void) tp4init (tb);
break;
#endif
default:
(void) tsaplose (td, DR_PARAMETER, NULLCP, "network type not set");
tb -> tb_fd = NOTOK;
goto out1;
}
bzero ((char *) ts, sizeof *ts);
ts -> ts_sd = tb -> tb_fd;
ts -> ts_calling = tb -> tb_initiating; /* struct copy */
ts -> ts_called = tb -> tb_responding; /* struct copy */
if (tb -> tb_flags & TB_EXPD)
ts -> ts_expedited = 1;
ts -> ts_tsdusize = tb -> tb_tsdusize;
ts -> ts_qos = tb -> tb_qos; /* struct copy */
return OK;
out1: ;
freetblk (tb);
return NOTOK;
}