Annotation of 43BSDReno/contrib/isode-beta/dsap/net/dapbind.c, revision 1.1

1.1     ! root        1: /* dapbind.c - Establish directory association */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/dsap/net/RCS/dapbind.c,v 7.0 90/07/26 14:45:20 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/dsap/net/RCS/dapbind.c,v 7.0 90/07/26 14:45:20 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dapbind.c,v $
        !            12:  * Revision 7.0  90/07/26  14:45:20  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 "quipu/util.h"
        !            31: #include "quipu/oid.h"
        !            32: #include "quipu/dap2.h"
        !            33: 
        !            34: extern  LLog    * log_dsap;
        !            35: extern  int       dsap_ad;           /* Association descriptor */
        !            36: extern  int       dsap_id;           /* Last id sent */
        !            37: extern  char    * dsa_address;  /* address of default dsa */
        !            38: struct PSAPaddr   dsa_bound;
        !            39: 
        !            40: 
        !            41: ds_bind (arg, error, result)
        !            42:     struct ds_bind_arg          *arg;
        !            43:     struct ds_bind_arg          *result;
        !            44:     struct ds_bind_error        *error;
        !            45: {
        !            46:        /* reverse compatability for bind */
        !            47:        arg->dba_auth_type = DBA_AUTH_SIMPLE;   
        !            48:        arg->dba_time1 = NULLCP;
        !            49:        arg->dba_time2 = NULLCP;
        !            50:        
        !            51:        return (secure_ds_bind (arg,error,result));
        !            52: }
        !            53: 
        !            54: secure_ds_bind (arg, error, result)
        !            55:     struct ds_bind_arg          *arg;
        !            56:     struct ds_bind_arg          *result;
        !            57:     struct ds_bind_error        *error;
        !            58: {
        !            59:     struct PSAPaddr             *addr;
        !            60: 
        !            61:     if ((addr = str2paddr (dsa_address)) == NULLPA)
        !            62:     {
        !            63:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("invalid name %s",dsa_address));
        !            64:        return (DS_ERROR_LOCAL);
        !            65:     }
        !            66: 
        !            67:     return(dap_bind(&(dsap_ad), arg, error, result, addr));
        !            68: }
        !            69: 
        !            70: dap_bind (ad, arg, error, result, addr)
        !            71:     int                                * ad;
        !            72:     struct ds_bind_arg          *arg;
        !            73:     struct ds_bind_arg          *result;
        !            74:     struct ds_bind_error        *error;
        !            75:     struct PSAPaddr             *addr;
        !            76: {
        !            77:     int                                  ret;
        !            78:     struct DAPconnect         dc_s;
        !            79:     struct DAPconnect         *dc = &dc_s;
        !            80:     struct DAPindication      di_s;
        !            81:     struct DAPindication      *di = &di_s;
        !            82: 
        !            83:     DLOG(log_dsap, LLOG_DEBUG, ("dap_bind: Address: %s", paddr2str(addr,NULLNA)));
        !            84: 
        !            85:     ret = DapAsynBindRequest ( addr, arg, dc, di, ROS_SYNC);
        !            86: 
        !            87:     if (ret == NOTOK)
        !            88:     {
        !            89:        LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapAsynBindRequest() failed"));
        !            90:        return (DS_ERROR_CONNECT);
        !            91:     }
        !            92: 
        !            93:     if (dc->dc_result == DC_RESULT)
        !            94:     {
        !            95: 
        !            96:         dsa_bound = dc->dc_connect.acc_connect.pc_responding;  /* struct copy */
        !            97: 
        !            98:         (*ad) = dc->dc_sd;
        !            99: 
        !           100:         *result = dc->dc_un.dc_bind_res; /* struct copy */
        !           101: 
        !           102:         DCFREE(dc);
        !           103:        return (DS_OK);
        !           104:     }
        !           105: 
        !           106:     if (dc->dc_result == DC_ERROR)
        !           107:     {
        !           108:        *error = dc->dc_un.dc_bind_err;
        !           109: 
        !           110:         DCFREE(dc);
        !           111:        return (DS_X500_ERROR);
        !           112:     }
        !           113: 
        !           114:     return (DS_ERROR_CONNECT);
        !           115: 
        !           116: }
        !           117: 
        !           118: /*    DAP-BIND.REQUEST */
        !           119: 
        !           120: /* ARGSUSED */
        !           121: 
        !           122: int      DapAsynBindReqAux (callingtitle, calledtitle, callingaddr,
        !           123:                calledaddr, prequirements, srequirements, isn, settings,
        !           124:                sf, bindarg, qos, dc, di, async)
        !           125: AEI                      callingtitle;
        !           126: AEI                      calledtitle;
        !           127: struct PSAPaddr                * callingaddr;
        !           128: struct PSAPaddr                * calledaddr;
        !           129: int                      prequirements;
        !           130: int                      srequirements;
        !           131: long                     isn;
        !           132: int                      settings;
        !           133: struct SSAPref         * sf;
        !           134: struct ds_bind_arg     * bindarg;
        !           135: struct QOStype         * qos;
        !           136: struct DAPconnect      * dc;
        !           137: struct DAPindication   * di;
        !           138: int                      async;
        !           139: {
        !           140:        int                       result;
        !           141:        OID                       app_ctx;
        !           142:        struct PSAPctxlist        pc_s;
        !           143:        struct PSAPctxlist      * pc = &(pc_s);
        !           144:        OID                       def_ctx;
        !           145:        PE                        bindargpe;
        !           146:        struct RoNOTindication    rni_s;
        !           147:        struct RoNOTindication  * rni = &(rni_s);
        !           148:        struct AcSAPconnect     * acc = &(dc->dc_connect);
        !           149:        OID                         acse_pci;
        !           150: 
        !           151:        /*
        !           152:        * Set application-context, presentation context definition list,
        !           153:        * and default-context.
        !           154:        */
        !           155: 
        !           156:        DLOG(log_dsap, LLOG_TRACE, ("DapAsynBindReqAux():"));
        !           157: 
        !           158:        if((acse_pci = oid_cpy(DIR_ACSE)) == NULLOID)
        !           159:        {
        !           160:             LLOG(log_dsap, LLOG_EXCEPTIONS, ("acse pci version 1 OID not found"));
        !           161:             return (NOTOK);
        !           162:         }
        !           163: 
        !           164:        app_ctx = oid_cpy (DIR_ACCESS_AC);
        !           165:        def_ctx = oid_cpy (DIR_ACCESS_AS);
        !           166: 
        !           167:        pc->pc_nctx = 2;
        !           168:        pc->pc_ctx[0].pc_id = DIR_ACCESS_PC_ID;
        !           169:        pc->pc_ctx[0].pc_asn = oid_cpy(def_ctx);
        !           170:        pc->pc_ctx[0].pc_atn = NULLOID;
        !           171:        pc->pc_ctx[1].pc_id = DIR_ACSE_PC_ID;
        !           172:        pc->pc_ctx[1].pc_asn = acse_pci;
        !           173:        pc->pc_ctx[1].pc_atn = NULLOID;
        !           174: 
        !           175: 
        !           176:        /* Encode Bind Argument */
        !           177:        if (encode_DAS_DirectoryBindArgument (&bindargpe, 1, 0, NULLCP, bindarg) != OK)
        !           178:        {
        !           179:                return (daplose (di, DA_ARG_ENC, NULLCP, "DAP BIND REQUEST"));
        !           180:        }
        !           181:        bindargpe->pe_context = DIR_ACCESS_PC_ID;
        !           182: 
        !           183:        result = RoAsynBindRequest (app_ctx, callingtitle, calledtitle,
        !           184:                        callingaddr, calledaddr, pc, def_ctx, prequirements,
        !           185:                        srequirements, isn, settings, sf, bindargpe, qos,
        !           186:                        acc, rni, async);
        !           187: 
        !           188:        if (bindargpe != NULLPE)
        !           189:                pe_free (bindargpe);
        !           190: 
        !           191:        if (result == NOTOK)
        !           192:        {
        !           193:                return (ronot2daplose (di, "DAP-BIND.REQUEST", rni));
        !           194:        }
        !           195: 
        !           196:         /* Set the connection identifier */
        !           197:        dc->dc_sd = acc->acc_sd;
        !           198: 
        !           199:        if (((!async) && (result == OK)) || (async && (result == DONE)))
        !           200:        {
        !           201:                /*
        !           202:                * Check the type of return and attempt to decode user data.
        !           203:                */
        !           204:                if (DapBindDecode (acc, dc) != OK)
        !           205:                {
        !           206:                        return (daplose (di, DA_RES_DEC, NULLCP, "DAP BIND REQUEST"));
        !           207:                }
        !           208:        }
        !           209: 
        !           210:        return (result);
        !           211: }
        !           212: 
        !           213: int      DapAsynBindRequest (calledaddr, bindarg, dc, di, async)
        !           214: struct PSAPaddr                * calledaddr;
        !           215: struct ds_bind_arg     * bindarg;
        !           216: struct DAPconnect      * dc;
        !           217: struct DAPindication   * di;
        !           218: int                      async;
        !           219: {
        !           220:        struct SSAPref            sf_s;
        !           221:        struct SSAPref          * sf = &(sf_s);
        !           222:        struct QOStype            qos;
        !           223: 
        !           224:        if ((sf = addr2ref (PLocalHostName ())) == NULL)
        !           225:        {
        !           226:                sf = &sf_s;
        !           227:                (void) bzero ((char *) sf, sizeof *sf);
        !           228:        }
        !           229: 
        !           230:        (void) bzero ((char *) &qos, sizeof qos);
        !           231:        qos.qos_sversion = NOTOK;       /* Negotiate highest session */
        !           232:        qos.qos_maxtime = NOTOK;        /* No time out specified */
        !           233: 
        !           234:        return (DapAsynBindReqAux (NULLAEI, NULLAEI, NULLPA, calledaddr,
        !           235:                        PR_MYREQUIRE, ROS_MYREQUIRE, SERIAL_NONE, 0, sf,
        !           236:                        bindarg, &qos, dc, di, async));
        !           237: }
        !           238: 
        !           239: int      DapAsynBindRetry (sd, do_next_nsap, dc, di)
        !           240: int                      sd;
        !           241: int                      do_next_nsap;
        !           242: struct DAPconnect      * dc;
        !           243: struct DAPindication   * di;
        !           244: {
        !           245:        int                       result;
        !           246:        struct RoNOTindication    rni_s;
        !           247:        struct RoNOTindication  * rni = &(rni_s);
        !           248:        struct AcSAPconnect     * acc = &(dc->dc_connect);
        !           249: 
        !           250:        result = RoAsynBindRetry (sd, do_next_nsap, acc, rni);
        !           251: 
        !           252:        if (result == NOTOK)
        !           253:        {
        !           254:                return (ronot2daplose (di, "DAP-BIND.RETRY", rni));
        !           255:        }
        !           256: 
        !           257:        if (result == DONE)
        !           258:        {
        !           259:                if (DapBindDecode (acc, dc) != OK)
        !           260:                {
        !           261:                        return (daplose (di, DA_RES_DEC, NULLCP, "DAP BIND RETRY"));
        !           262:                }
        !           263:        }
        !           264: 
        !           265:        return (result);
        !           266: }
        !           267: 
        !           268: int      DapBindDecode (acc, dc)
        !           269: struct AcSAPconnect    * acc;
        !           270: struct DAPconnect      * dc;
        !           271: {
        !           272:     struct ds_bind_arg  * bind_res;
        !           273:     struct ds_bind_error        * bind_err;
        !           274: 
        !           275:     switch(acc->acc_result)
        !           276:     {
        !           277:        case ACS_ACCEPT:
        !           278:            DLOG(log_dsap, LLOG_NOTICE, ("DapBindDecode ACCEPT"));
        !           279:            bind_res = &(dc->dc_un.dc_bind_res);
        !           280:            if ((acc->acc_ninfo == 1) && (acc->acc_info[0] != NULLPE))
        !           281:            {
        !           282:                if(decode_DAS_DirectoryBindResult(acc->acc_info[0], 1, NULLIP, NULLVP, bind_res) != OK)
        !           283:                {
        !           284:                    LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unable to parse DirectoryBindResult"));
        !           285:                    dc->dc_result = DC_REJECT;
        !           286:                    return (NOTOK);
        !           287:                }
        !           288:                dc->dc_result = DC_RESULT;
        !           289:            }
        !           290:            else
        !           291:            {
        !           292:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("No DirectoryBindResult"));
        !           293:                dc->dc_result = DC_REJECT;
        !           294:                return (NOTOK);
        !           295:            }
        !           296:            break;
        !           297: 
        !           298:        case ACS_PERMANENT:
        !           299:            /*
        !           300:            * Get the DirectoryBindError
        !           301:            */
        !           302:            DLOG(log_dsap, LLOG_NOTICE, ("DapBindDecode PERMANENT"));
        !           303:            bind_err = &(dc->dc_un.dc_bind_err);
        !           304:            if ((acc->acc_ninfo == 1) && (acc->acc_info[0] != NULLPE))
        !           305:            {
        !           306:                if(decode_DAS_DirectoryBindError(acc->acc_info[0], 1, NULLIP, NULLVP, bind_err) != OK)
        !           307:                {
        !           308:                    LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unable to decode DirectoryBindError"));
        !           309:                    dc->dc_result = DC_REJECT;
        !           310:                    return (NOTOK);
        !           311:                }
        !           312:                dc->dc_result = DC_ERROR;
        !           313:            }
        !           314:            else
        !           315:            {
        !           316:                LLOG(log_dsap, LLOG_EXCEPTIONS, ("No DirectoryBindError"));
        !           317:                dc->dc_result = DC_REJECT;
        !           318:                return (NOTOK);
        !           319:            }
        !           320:            break;
        !           321: 
        !           322:        default:
        !           323:            DLOG(log_dsap, LLOG_NOTICE, ("DapBindDecode OTHER"));
        !           324:            LLOG (log_dsap,LLOG_EXCEPTIONS,( "Association rejected: [%s]",
        !           325:              AcErrString(acc->acc_result)));
        !           326:            dc->dc_result = DC_REJECT;
        !           327:            return (NOTOK);
        !           328: 
        !           329:     } /* switch acc->acc_result */
        !           330: 
        !           331:     return(OK);
        !           332: }
        !           333: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.