home *** CD-ROM | disk | FTP | other *** search
- /*
- * System Dependent Application Message Handling
- * Novell Advanced Netware 2.1
- *
- * This program is the CONFIDENTIAL and PROPRIETARY property
- * of FairCom(R) Corporation. Any unauthorized use, reproduction or
- * transfer of this program is strictly prohibited.
- *
- * Copyright (c) 1987, 1988, 1989 FairCom Corporation
- * (Subject to limited distribution and
- * restricted disclosure only.)
- * *** ALL RIGHTS RESERVED ***
- *
- * 4006 West Broadway
- * Columbia, MO 65203
- *
- *
- * c-tree(R) Version 4.3
- * Release C
- * February 7, 1989 17:30
- *
- */
-
- #include "ctstdr.h"
- #include "ctoptn.h"
- #include "ctstrc.h"
- #include "cterrc.h"
- #include "ctcomm.h"
- #include "ctmssg.h"
- #include "ctaxit.h"
-
- /* LTYPE is defined in ctmssg.h */
-
- TEXT nodadr[6] = { '\0','\0','\0','\0','\0','\1'};
- TEXT netnum[4] = { '\0','\0','\0','\0' };
-
- LOCAL TEXT fnbuffer[256];
- LOCAL UCOUNT msgsiz,conid;
- LOCAL COUNT necb;
- LOCAL TEXT *savdat;
-
- extern COUNT uerr_cod;
- extern TEXT ct_buf[];
- extern UCOUNT cts_apxsiz;
- /* assumes that MAX_NAME (usually 64) << SECSIZ (usually 128) */
-
- TEXT *mballc();
-
- /* copies a file name, after modifying name to a fully specified form */
- COUNT fulnam(dp, tp,maxlen)
- PFAST TEXT *dp,*tp;
- COUNT maxlen;
- {
- if (ConvertNameToFullPath(tp,fnbuffer))
- return(uerr_cod = ABDR_ERR);
-
- if (strlen(fnbuffer) > maxlen)
- return(uerr_cod = AFLN_ERR);
- strcpy(dp,fnbuffer);
- return(NO_ERROR);
- }
-
- COUNT SetUpRcvECB(n)
- COUNT n;
- {
- FAST ECB *ecbptr;
- char *tp;
- int i;
-
- for (i = 0, ecbptr = savecb; i < n; i++, ecbptr++) {
- ecbptr->fragmentCount = 2;
- ecbptr->socketNumber = soknum;
- ecbptr->ESRAddress[0] = 0;
- ecbptr->ESRAddress[1] = 0;
- SPXlisten(ecbptr);
- }
- return(NO_ERROR);
- }
-
- VOID retecb(ecbptr)
- PFAST ECB *ecbptr;
- {
- ecbptr->fragmentCount = 2;
- ecbptr->fragmentDescriptor[1].size = DATA_SIZE;
- SPXlisten(ecbptr);
- }
-
- COUNT SetUpIntECB(n)
- COUNT n;
- {
- FAST ECB *ecbptr;
- SPXHDR *spxptr;
- int i;
- char *tp;
-
- ecbptr = savecb + n;
- ecbptr->fragmentCount = 1;
- ecbptr->socketNumber = soknum;
- ecbptr->ESRAddress[0] = 0;
- ecbptr->ESRAddress[1] = 0;
- cpybuf(&spxptr,ecbptr->fragmentDescriptor[0].address,sizeof(char *));
- for (i = 0; i < 10; i++)
- spxptr->destinationNetwork[i] = '\0';
- spxptr->length = REV_SPXHDR_SIZE;
- spxptr->packetType = 5;
- cpybuf(spxptr->destinationNetwork,netnum,4);
- cpybuf(spxptr->destinationNode,nodadr,6);
- spxptr->destinationSocket = soknum;
- if (i = SPXestcon(0,1,&conid,ecbptr))
- #ifndef SPXDEBUG
- return(-(uerr_cod = ARQS_ERR));
- #else
- {
- printf("\nCould not establish Connection %d\n",i);
- return(-(uerr_cod = ARQS_ERR));
- }
- #endif
-
- while (ecbptr->inUseFlag)
- ;
- if (ecbptr->completionCode)
- #ifndef SPXDEBUG
- return(-(uerr_cod = ARQS_ERR));
- #else
- {
- printf("\nBad completion code at connection %d\n",
- ecbptr->completionCode);
- return(-(uerr_cod = ARQS_ERR));
- }
- #endif
-
- /* ???? retecb(ecbptr); */
- /* wait for dummy response
- dummy_wait:
- for (i = 0, ecbptr = savecb; i < 2 * n; i++, ecbptr++)
- if (ecbptr->inUseFlag == 0)
- break;
- if (i >= 2 * n) goto dummy_wait;
- if (ecbptr->completionCode) {
- printf("\nFunny dummy response: %x %d\n",
- ecbptr->completionCode & 0x00ff,ecbptr->fragmentCount);
- return(-(uerr_cod = ARQS_ERR));
- }
- return(i);
- *** end wait for dummy */
- return(1);
- }
-
- ECB *getECB(n)
- int n;
- {
- int i;
- SPXHDR *spxptr;
- char *tp;
- FAST ECB *ecbptr;
- ECB *savptr;
-
- necb = n;
- if ((spxptr = (SPXHDR *) mballc(n,sizeof(SPXHDR)))
- == NULL)
- return(NULL);
- if ((ecbptr = (ECB *) mballc(n,sizeof(ECB))) == NULL)
- return(NULL);
- if ((savdat = tp = mballc(1,DATA_SIZE * n)) == NULL)
- return(NULL);
- for (i = 0, savptr = ecbptr; i < n; i++,spxptr++,ecbptr++) {
- IPXdatadr(spxptr,ecbptr->fragmentDescriptor[0].address);
- ecbptr->fragmentDescriptor[0].size = SPXHDR_SIZE;
- IPXdatadr(tp,ecbptr->fragmentDescriptor[1].address);
- ecbptr->fragmentDescriptor[1].size = DATA_SIZE;
- tp += DATA_SIZE;
- }
-
- return(savptr);
- }
-
- TEXT *getmids(apsize,pmsg)
- UCOUNT apsize;
- MESSAGE *pmsg;
- {
- TEXT *retval;
- TEXT majrev,minrev;
- UCOUNT maxcon,avlcon;
- COUNT i;
-
- /* get server msg id */
- uerr_cod = 0;
- msgsiz = cts_apxsiz = DATA_SIZE;
-
- if ((0x00ff & (xerr = SPXinit(&majrev,&minrev,&maxcon,&avlcon)))
- == (0x00ff & SPX_NOT_INSTALLED))
- uerr_cod = ASKY_ERR;
- else if ((xerr = IPXopen(&soknum,0)) && (xerr & 0x00ff) != 0x00ff)
- uerr_cod = ASID_ERR;
- else if ((savecb = getECB(2)) == NULL)
- uerr_cod = ASPC_ERR;
- else if (SetUpRcvECB(1))
- return(NULL);
- else if ((i = SetUpIntECB(1)) < 0)
- return(NULL);
-
- if (uerr_cod)
- return(NULL);
- set_abort_traps(CBRKmode,CERRmode);
-
- return(savdat + (i * DATA_SIZE));
- }
-
- COUNT ridmids()
- {
- SPXabort(conid);
- IPXclose(soknum);
- return(NO_ERROR);
- }
-
- void far fdisconnect()
- {
- disconnect();
- }
-
- disconnect()
- {
- STPUSR();
- }
-
- COUNT ctrqst(msgadr,pmsg)
- PFAST TEXT *msgadr; /* ptr to message area */
- MESSAGE *pmsg; /* ptr to message header */
- {
- int msglen,i;
- FAST ECB *ecbptr;
- SPXHDR *spxptr;
-
- i = (msgadr - savdat) / DATA_SIZE;
- ecbptr = savecb + i;
- if (ecbptr->inUseFlag) {
- printf("\nUnexpected InUseFlag\n");
- exit(2);
- }
-
- cpybuf(&spxptr,ecbptr->fragmentDescriptor[0].address,sizeof(char *));
-
- /* copy message header */
- cpybuf(msgadr,pmsg,sizeof(MESSAGE));
- msglen = sizeof(MESSAGE) + pmsg->mdlen;
-
- /*printf("\n### ctrqst mpntr=%ld",pmsg->mpntr);*/
-
- /* send message: ordinarily an interprocess comm call (e.g., q call) */
- spxptr->dataStreamType = 0;
- spxptr->connectionControl = 0x10;
- ecbptr->fragmentCount = 2;
- ecbptr->fragmentDescriptor[1].size = msglen;
-
- SPXsend(conid,ecbptr);
- while (ecbptr->inUseFlag)
- ;
- if (ecbptr->completionCode)
- #ifndef SPXDEBUG
- return(uerr_cod = ARQS_ERR);
- #else
- {
- printf("\nBad completion code on send %d\n",
- ecbptr->completionCode);
- return(uerr_cod = ARQS_ERR);
- }
- #endif
- else
- retecb(ecbptr);
-
- return(NO_ERROR);
- }
-
- COUNT ctrspn(msgadr,pmsg)
- PFAST TEXT **msgadr;
- MESSAGE *pmsg;
- {
- FAST COUNT i;
- FAST ECB *ecbptr;
-
- wait_loop:
- IPXrelq();
- for (i = 0, ecbptr = savecb; i < necb; i++, ecbptr++)
- if (ecbptr->inUseFlag == 0)
- break;
- if (i >= necb)
- goto wait_loop;
-
- /* get response: interprocess comm call which leaves answer in apxmsg */
- cpybuf(msgadr,ecbptr->fragmentDescriptor[1].address,sizeof(char *));
-
- /* copy message header */
- cpybuf(pmsg,*msgadr,sizeof(MESSAGE));
-
- return(NO_ERROR);
- }
-
- /* end of ctamsg.c */
-