|
|
1.1 ! root 1: /* ssapresync2.c - SPM: respond to resyncs */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssapresync2.c,v 7.0 89/11/23 22:25:42 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/ssap/RCS/ssapresync2.c,v 7.0 89/11/23 22:25:42 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: ssapresync2.c,v $ ! 12: * Revision 7.0 89/11/23 22:25:42 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include <signal.h> ! 32: #include "spkt.h" ! 33: ! 34: /* S-RESYNCHRONIZE.RESPONSE */ ! 35: ! 36: int SReSyncResponse (sd, ssn, settings, data, cc, si) ! 37: int sd; ! 38: int settings; ! 39: long ssn; ! 40: char *data; ! 41: int cc; ! 42: struct SSAPindication *si; ! 43: { ! 44: SBV smask; ! 45: int result; ! 46: register struct ssapblk *sb; ! 47: ! 48: missingP (si); ! 49: ! 50: smask = sigioblock (); ! 51: ! 52: ssapRsig (sb, sd); ! 53: toomuchP (sb, data, cc, SN_SIZE, "resync"); ! 54: ! 55: result = SReSyncResponseAux (sb, ssn, settings, data, cc, si); ! 56: ! 57: (void) sigiomask (smask); ! 58: ! 59: return result; ! 60: } ! 61: ! 62: /* */ ! 63: ! 64: static int SReSyncResponseAux (sb, ssn, settings, data, cc, si) ! 65: register struct ssapblk *sb; ! 66: long ssn; ! 67: int settings; ! 68: char *data; ! 69: int cc; ! 70: register struct SSAPindication *si; ! 71: { ! 72: int result; ! 73: ! 74: if (!(sb -> sb_requirements & SR_RESYNC)) ! 75: return ssaplose (si, SC_OPERATION, NULLCP, ! 76: "resynchronize service unavailable"); ! 77: if (!(sb -> sb_flags & SB_RA)) ! 78: return ssaplose (si, SC_OPERATION, NULLCP, ! 79: "no resync in progress"); ! 80: ! 81: switch (sb -> sb_rs) { ! 82: case SYNC_RESTART: ! 83: ssn = sb -> sb_rsn; ! 84: break; ! 85: ! 86: case SYNC_ABANDON: ! 87: ssn = sb -> sb_V_A; ! 88: break; ! 89: ! 90: case SYNC_SET: ! 91: break; ! 92: } ! 93: ! 94: #define dotoken(requires,shift,bit,type) \ ! 95: { \ ! 96: if (sb -> sb_requirements & requires) \ ! 97: switch (sb -> sb_rsettings & (ST_MASK << shift)) { \ ! 98: dotoken1 (requires,shift,bit,type); \ ! 99: \ ! 100: dotoken2 (requires,shift,bit,type); \ ! 101: } \ ! 102: } ! 103: #define dotoken1(requires,shift,bit,type) \ ! 104: case ST_CALL_VALUE << shift: \ ! 105: switch (settings & (ST_MASK << shift)) { \ ! 106: case ST_INIT_VALUE << shift: \ ! 107: settings &= ~(ST_MASK << shift); \ ! 108: settings |= ST_INIT_VALUE << shift; \ ! 109: break; \ ! 110: \ ! 111: case ST_RESP_VALUE << shift: \ ! 112: settings &= ~(ST_MASK << shift); \ ! 113: settings |= ST_RESP_VALUE << shift; \ ! 114: break; \ ! 115: \ ! 116: default: \ ! 117: return ssaplose (si, SC_PARAMETER, NULLCP, \ ! 118: "improper choice of %s token setting", type); \ ! 119: } \ ! 120: break; ! 121: #define dotoken2(requires,shift,bit,type) \ ! 122: default: \ ! 123: if ((sb -> sb_rsettings & (ST_MASK << shift)) \ ! 124: != (settings & (ST_MASK << shift))) \ ! 125: return ssaplose (si, SC_OPERATION, NULLCP, \ ! 126: "setting of %s token is not your choice"); \ ! 127: break; ! 128: dotokens (); ! 129: #undef dotoken ! 130: #undef dotoken1 ! 131: #undef dotoken2 ! 132: ! 133: if ((result = SWriteRequestAux (sb, SPDU_RA, data, cc, 0, ssn, ! 134: settings, NULLSD, NULLSD, NULLSR, si)) == NOTOK) ! 135: freesblk (sb); ! 136: else { ! 137: sb -> sb_flags &= ~SB_RA; ! 138: sb -> sb_V_A = sb -> sb_V_M = ssn; ! 139: if (sb -> sb_rs != SYNC_RESTART) ! 140: sb -> sb_V_R = 0; ! 141: ! 142: #define dotoken(requires,shift,bit,type) \ ! 143: { \ ! 144: if (sb -> sb_requirements & requires) \ ! 145: switch (settings & (ST_MASK << shift)) { \ ! 146: case ST_INIT_VALUE << shift: \ ! 147: if (sb -> sb_flags & SB_INIT) \ ! 148: sb -> sb_owned |= bit; \ ! 149: else \ ! 150: sb -> sb_owned &= ~bit; \ ! 151: break; \ ! 152: \ ! 153: case ST_RESP_VALUE << shift: \ ! 154: if (!(sb -> sb_flags & SB_INIT)) \ ! 155: sb -> sb_owned |= bit; \ ! 156: else \ ! 157: sb -> sb_owned &= ~bit; \ ! 158: break; \ ! 159: } \ ! 160: } ! 161: dotokens (); ! 162: #undef dotoken ! 163: } ! 164: ! 165: return result; ! 166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.