|
|
1.1 ! root 1: /* dsapbind1.c - DSAP : Bind for Directory protocols DAP, DSP and QSP */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/net/RCS/dsapbind1.c,v 7.0 90/07/26 14:45:49 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/net/RCS/dsapbind1.c,v 7.0 90/07/26 14:45:49 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: dsapbind1.c,v $ ! 12: * Revision 7.0 90/07/26 14:45:49 mrose ! 13: * *** empty log message *** ! 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 "logger.h" ! 32: #include "quipu/dsap.h" ! 33: ! 34: extern OID acse_pci; ! 35: extern OID x500_da_ac; ! 36: extern OID x500_ds_ac; ! 37: extern OID quipu_ds_ac; ! 38: extern OID x500_da_as; ! 39: extern OID x500_ds_as; ! 40: extern OID quipu_ds_as; ! 41: extern struct PSAPctxlist * x500_da_pcdl; ! 42: extern struct PSAPctxlist * x500_ds_pcdl; ! 43: extern struct PSAPctxlist * quipu_ds_pcdl; ! 44: ! 45: extern LLog * log_dsap; ! 46: ! 47: ! 48: int DspAsynBindReqAux (callingtitle, calledtitle, callingaddr, ! 49: calledaddr, prequirements, srequirements, isn, settings, ! 50: sf, bindarg, qos, dc, di, async) ! 51: AEI callingtitle; ! 52: AEI calledtitle; ! 53: struct PSAPaddr * callingaddr; ! 54: struct PSAPaddr * calledaddr; ! 55: int prequirements; ! 56: int srequirements; ! 57: long isn; ! 58: int settings; ! 59: struct SSAPref * sf; ! 60: struct ds_bind_arg * bindarg; ! 61: struct QOStype * qos; ! 62: struct DSAPconnect * dc; ! 63: struct DSAPindication * di; ! 64: int async; ! 65: { ! 66: int result; ! 67: OID app_ctx; ! 68: struct PSAPctxlist * pcl; ! 69: OID def_ctx; ! 70: PE bindargpe; ! 71: struct RoNOTindication rni_s; ! 72: struct RoNOTindication * rni = &(rni_s); ! 73: struct AcSAPconnect * acc = &(dc->dc_connect); ! 74: ! 75: app_ctx = x500_ds_ac; ! 76: def_ctx = x500_ds_as; ! 77: ! 78: pcl = (struct PSAPctxlist *) smalloc(sizeof(struct PSAPctxlist)); ! 79: ! 80: (*pcl) = (*(x500_ds_pcdl)); /* struct copy */ ! 81: ! 82: if (encode_DAS_DirectoryBindArgument (&bindargpe, 1, 0, NULLCP, bindarg) != OK) ! 83: { ! 84: return (dsaplose (di, DA_ARG_ENC, NULLCP, "DSP BIND REQUEST")); ! 85: } ! 86: bindargpe->pe_context = DIR_SYSTEM_PC_ID; ! 87: ! 88: result = RoAsynBindRequest (app_ctx, callingtitle, calledtitle, ! 89: callingaddr, calledaddr, pcl, def_ctx, prequirements, ! 90: srequirements, isn, settings, sf, bindargpe, qos, ! 91: acc, rni, async); ! 92: ! 93: if (bindargpe != NULLPE) ! 94: pe_free (bindargpe); ! 95: free ((char *) pcl); ! 96: ! 97: if (result == NOTOK) ! 98: { ! 99: return (ronot2dsaplose (di, "DSP-BIND.REQUEST", rni)); ! 100: } ! 101: ! 102: dc->dc_sd = acc->acc_sd; ! 103: ! 104: if (((!async) && (result == OK)) || (async && (result == DONE))) ! 105: { ! 106: if (DBindDecode (acc, dc) != OK) ! 107: { ! 108: return (dsaplose (di, DA_RES_DEC, NULLCP, "DSP BIND REQUEST")); ! 109: } ! 110: } ! 111: ! 112: return (result); ! 113: } ! 114: ! 115: int DspAsynBindRequest (calledaddr, bindarg, qos_maxtime, dc, di, async) ! 116: struct PSAPaddr * calledaddr; ! 117: struct ds_bind_arg * bindarg; ! 118: int qos_maxtime; ! 119: struct DSAPconnect * dc; ! 120: struct DSAPindication * di; ! 121: int async; ! 122: { ! 123: struct SSAPref sf_s; ! 124: struct SSAPref * sf = &(sf_s); ! 125: struct QOStype qos; ! 126: ! 127: if ((sf = addr2ref (PLocalHostName ())) == NULL) ! 128: { ! 129: sf = &sf_s; ! 130: (void) bzero ((char *) sf, sizeof *sf); ! 131: } ! 132: ! 133: (void) bzero ((char *) &qos, sizeof qos); ! 134: qos.qos_sversion = NOTOK; /* Negotiate highest session */ ! 135: qos.qos_maxtime = qos_maxtime; ! 136: ! 137: return (DspAsynBindReqAux (NULLAEI, NULLAEI, NULLPA, calledaddr, ! 138: PR_MYREQUIRE, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, ! 139: bindarg, &qos, dc, di, async)); ! 140: } ! 141: ! 142: int QspAsynBindReqAux (callingtitle, calledtitle, callingaddr, ! 143: calledaddr, prequirements, srequirements, isn, settings, ! 144: sf, bindarg, qos, dc, di, async) ! 145: AEI callingtitle; ! 146: AEI calledtitle; ! 147: struct PSAPaddr * callingaddr; ! 148: struct PSAPaddr * calledaddr; ! 149: int prequirements; ! 150: int srequirements; ! 151: long isn; ! 152: int settings; ! 153: struct SSAPref * sf; ! 154: struct ds_bind_arg * bindarg; ! 155: struct QOStype * qos; ! 156: struct DSAPconnect * dc; ! 157: struct DSAPindication * di; ! 158: int async; ! 159: { ! 160: int result; ! 161: OID app_ctx; ! 162: struct PSAPctxlist * pcl; ! 163: OID def_ctx; ! 164: PE bindargpe; ! 165: struct RoNOTindication rni_s; ! 166: struct RoNOTindication * rni = &(rni_s); ! 167: struct AcSAPconnect * acc = &(dc->dc_connect); ! 168: ! 169: app_ctx = quipu_ds_ac; ! 170: def_ctx = quipu_ds_as; ! 171: ! 172: pcl = (struct PSAPctxlist *) smalloc(sizeof(struct PSAPctxlist)); ! 173: ! 174: (*pcl) = (*(quipu_ds_pcdl)); /* struct copy */ ! 175: ! 176: /* Encode Bind Argument */ ! 177: if (encode_DAS_DirectoryBindArgument (&bindargpe, 1, 0, NULLCP, bindarg) != OK) ! 178: { ! 179: return (dsaplose (di, DA_ARG_ENC, NULLCP, "QSP BIND REQUEST")); ! 180: } ! 181: bindargpe->pe_context = DIR_SYSTEM_PC_ID; ! 182: ! 183: result = RoAsynBindRequest (app_ctx, callingtitle, calledtitle, ! 184: callingaddr, calledaddr, pcl, def_ctx, prequirements, ! 185: srequirements, isn, settings, sf, bindargpe, ! 186: qos, acc, rni, async); ! 187: ! 188: if (bindargpe != NULLPE) ! 189: pe_free (bindargpe); ! 190: free ((char *) pcl); ! 191: ! 192: if (result == NOTOK) ! 193: { ! 194: /* Have an RoSAPindication, need to return DSAPindication */ ! 195: return (ronot2dsaplose (di, "QSP-BIND.REQUEST", rni)); ! 196: } ! 197: ! 198: dc->dc_sd = acc->acc_sd; ! 199: ! 200: if (((!async) && (result == OK)) || (async && (result == DONE))) ! 201: { ! 202: if (DBindDecode (acc, dc) != OK) ! 203: { ! 204: return (dsaplose (di, DA_RES_DEC, NULLCP, "QSP BIND REQUEST")); ! 205: } ! 206: } ! 207: ! 208: return (result); ! 209: } ! 210: ! 211: int QspAsynBindRequest (calledaddr, bindarg, qos_maxtime, dc, di, async) ! 212: struct PSAPaddr * calledaddr; ! 213: struct ds_bind_arg * bindarg; ! 214: int qos_maxtime; ! 215: struct DSAPconnect * dc; ! 216: struct DSAPindication * di; ! 217: int async; ! 218: { ! 219: struct SSAPref sf_s; ! 220: struct SSAPref * sf = &(sf_s); ! 221: struct QOStype qos; ! 222: ! 223: if ((sf = addr2ref (PLocalHostName ())) == NULL) ! 224: { ! 225: sf = &sf_s; ! 226: (void) bzero ((char *) sf, sizeof *sf); ! 227: } ! 228: ! 229: (void) bzero ((char *) &qos, sizeof qos); ! 230: qos.qos_sversion = NOTOK; /* Negotiate highest session */ ! 231: qos.qos_maxtime = qos_maxtime; ! 232: ! 233: /* ! 234: * The quipu system application context can assume that ! 235: * the remote DSA is a Quipu DSA and can take certain actions ! 236: * that are not generally available, such as refusing a ! 237: * connection release request. To do this, session negotiated ! 238: * release appears to be necessary, so SR_NEGOTIATED is ! 239: * is included in the session requirements here. ! 240: */ ! 241: ! 242: return (QspAsynBindReqAux (NULLAEI, NULLAEI, NULLPA, ! 243: calledaddr, PR_MYREQUIRE, ! 244: ROS_MYREQUIRE | SR_NEGOTIATED, SERIAL_NONE, 0, sf, ! 245: bindarg, &qos, dc, di, async)); ! 246: } ! 247: ! 248: int DspAsynBindRetry (sd, do_next_nsap, dc, di) ! 249: int sd; ! 250: int do_next_nsap; ! 251: struct DSAPconnect * dc; ! 252: struct DSAPindication * di; ! 253: { ! 254: int result; ! 255: struct RoNOTindication rni_s; ! 256: struct RoNOTindication * rni = &(rni_s); ! 257: struct AcSAPconnect * acc = &(dc->dc_connect); ! 258: ! 259: result = RoAsynBindRetry (sd, do_next_nsap, acc, rni); ! 260: ! 261: if (result == NOTOK) ! 262: { ! 263: return (ronot2dsaplose (di, "DAP-BIND.RETRY", rni)); ! 264: } ! 265: ! 266: if (result == DONE) ! 267: { ! 268: if (DBindDecode (acc, dc) != OK) ! 269: { ! 270: return (dsaplose (di, DA_RES_DEC, NULLCP, "DSP BIND RETRY")); ! 271: } ! 272: } ! 273: ! 274: return (result); ! 275: } ! 276: ! 277: int QspAsynBindRetry (sd, do_next_nsap, dc, di) ! 278: int sd; ! 279: int do_next_nsap; ! 280: struct DSAPconnect * dc; ! 281: struct DSAPindication * di; ! 282: { ! 283: int result; ! 284: struct RoNOTindication rni_s; ! 285: struct RoNOTindication * rni = &(rni_s); ! 286: struct AcSAPconnect * acc = &(dc->dc_connect); ! 287: ! 288: result = RoAsynBindRetry (sd, do_next_nsap, acc, rni); ! 289: ! 290: if (result == NOTOK) ! 291: { ! 292: return (ronot2dsaplose (di, "DAP-BIND.RETRY", rni)); ! 293: } ! 294: ! 295: if (result == DONE) ! 296: { ! 297: if (DBindDecode (acc, dc) != OK) ! 298: { ! 299: return (dsaplose (di, DA_RES_DEC, NULLCP, "QSP BIND RETRY")); ! 300: } ! 301: } ! 302: ! 303: return (result); ! 304: } ! 305: ! 306: int DBindDecode (acc, dc) ! 307: struct AcSAPconnect * acc; ! 308: struct DSAPconnect * dc; ! 309: { ! 310: struct ds_bind_arg * bind_res; ! 311: struct ds_bind_error * bind_err; ! 312: ! 313: switch(acc->acc_result) ! 314: { ! 315: case ACS_ACCEPT: ! 316: DLOG(log_dsap, LLOG_NOTICE, ("DBindDecode ACCEPT")); ! 317: bind_res = &(dc->dc_un.dc_bind_res); ! 318: if ((acc->acc_ninfo == 1) && (acc->acc_info[0] != NULLPE)) ! 319: { ! 320: if(decode_DAS_DirectoryBindResult(acc->acc_info[0], 1, NULLIP, NULLVP, bind_res) != OK) ! 321: { ! 322: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unable to parse DirectoryBindResult")); ! 323: dc->dc_result = DS_REJECT; ! 324: return (NOTOK); ! 325: } ! 326: dc->dc_result = DS_RESULT; ! 327: } ! 328: else ! 329: { ! 330: LLOG(log_dsap, LLOG_EXCEPTIONS, ("No DirectoryBindResult")); ! 331: dc->dc_result = DS_REJECT; ! 332: return (NOTOK); ! 333: } ! 334: break; ! 335: ! 336: case ACS_PERMANENT: ! 337: /* ! 338: * Get the DirectoryBindError ! 339: */ ! 340: DLOG(log_dsap, LLOG_NOTICE, ("DBindDecode PERMANENT")); ! 341: bind_err = &(dc->dc_un.dc_bind_err); ! 342: if ((acc->acc_ninfo == 1) && (acc->acc_info[0] != NULLPE)) ! 343: { ! 344: if(decode_DAS_DirectoryBindError(acc->acc_info[0], 1, NULLIP, NULLVP, bind_err) != OK) ! 345: { ! 346: LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unable to decode DirectoryBindError")); ! 347: dc->dc_result = DS_REJECT; ! 348: return (NOTOK); ! 349: } ! 350: dc->dc_result = DS_ERROR; ! 351: } ! 352: else ! 353: { ! 354: LLOG(log_dsap, LLOG_EXCEPTIONS, ("No DirectoryBindError")); ! 355: dc->dc_result = DS_REJECT; ! 356: return (NOTOK); ! 357: } ! 358: break; ! 359: ! 360: default: ! 361: DLOG(log_dsap, LLOG_NOTICE, ("DBindDecode OTHER")); ! 362: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Association rejected: [%s]", ! 363: AcErrString(acc->acc_result))); ! 364: dc->dc_result = DS_REJECT; ! 365: return (NOTOK); ! 366: ! 367: } /* switch acc->acc_result */ ! 368: ! 369: return(OK); ! 370: } ! 371:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.