home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c004 / 3.ddi / NOVELL / CTAMSG.C next >
Encoding:
C/C++ Source or Header  |  1989-04-18  |  6.5 KB  |  299 lines

  1. /*
  2.  *    System Dependent Application Message Handling
  3.  *    Novell Advanced Netware 2.1
  4.  *
  5.  *    This program is the CONFIDENTIAL and PROPRIETARY property 
  6.  *    of FairCom(R) Corporation. Any unauthorized use, reproduction or
  7.  *    transfer of this program is strictly prohibited.
  8.  *
  9.  *      Copyright (c) 1987, 1988, 1989 FairCom Corporation
  10.  *    (Subject to limited distribution and
  11.  *     restricted disclosure only.)
  12.  *    *** ALL RIGHTS RESERVED ***
  13.  *
  14.  *    4006 West Broadway
  15.  *    Columbia, MO 65203
  16.  *
  17.  *
  18.  *    c-tree(R)    Version 4.3
  19.  *            Release C
  20.  *            February 7, 1989 17:30
  21.  *
  22.  */
  23.  
  24. #include "ctstdr.h"
  25. #include "ctoptn.h"
  26. #include "ctstrc.h"
  27. #include "cterrc.h"
  28. #include "ctcomm.h"
  29. #include "ctmssg.h"
  30. #include "ctaxit.h"
  31.  
  32. /* LTYPE is defined in ctmssg.h */
  33.  
  34. TEXT nodadr[6] = { '\0','\0','\0','\0','\0','\1'};
  35. TEXT netnum[4] = { '\0','\0','\0','\0' };
  36.  
  37. LOCAL TEXT   fnbuffer[256];
  38. LOCAL UCOUNT msgsiz,conid;
  39. LOCAL COUNT  necb;
  40. LOCAL TEXT  *savdat;
  41.  
  42. extern COUNT uerr_cod;
  43. extern TEXT  ct_buf[];
  44. extern UCOUNT cts_apxsiz;
  45. /* assumes that MAX_NAME (usually 64) << SECSIZ (usually 128) */
  46.  
  47. TEXT *mballc();
  48.  
  49. /* copies a file name, after modifying name to a fully specified form */
  50. COUNT fulnam(dp, tp,maxlen) 
  51. PFAST TEXT  *dp,*tp;
  52. COUNT            maxlen;
  53. {
  54.     if (ConvertNameToFullPath(tp,fnbuffer))
  55.         return(uerr_cod = ABDR_ERR);
  56.  
  57.     if (strlen(fnbuffer) > maxlen)
  58.         return(uerr_cod = AFLN_ERR);
  59.     strcpy(dp,fnbuffer);
  60.     return(NO_ERROR);
  61. }
  62.  
  63. COUNT SetUpRcvECB(n)
  64. COUNT          n;
  65. {
  66.     FAST ECB *ecbptr;
  67.     char *tp;
  68.     int i;
  69.  
  70.     for (i = 0, ecbptr = savecb; i < n; i++, ecbptr++) {
  71.         ecbptr->fragmentCount = 2;
  72.         ecbptr->socketNumber  = soknum;
  73.         ecbptr->ESRAddress[0] = 0;
  74.         ecbptr->ESRAddress[1] = 0;
  75.         SPXlisten(ecbptr);
  76.     }
  77.     return(NO_ERROR);
  78. }
  79.  
  80. VOID retecb(ecbptr)
  81. PFAST ECB  *ecbptr;
  82. {
  83.     ecbptr->fragmentCount   = 2;
  84.     ecbptr->fragmentDescriptor[1].size = DATA_SIZE;
  85.     SPXlisten(ecbptr);
  86. }
  87.  
  88. COUNT SetUpIntECB(n)
  89. COUNT          n;
  90. {
  91.     FAST ECB *ecbptr;
  92.     SPXHDR *spxptr;
  93.     int i;
  94.     char *tp;
  95.  
  96.     ecbptr = savecb + n;
  97.     ecbptr->fragmentCount = 1;
  98.     ecbptr->socketNumber  = soknum;
  99.     ecbptr->ESRAddress[0] = 0;
  100.     ecbptr->ESRAddress[1] = 0;
  101.     cpybuf(&spxptr,ecbptr->fragmentDescriptor[0].address,sizeof(char *));
  102.     for (i = 0; i < 10; i++)
  103.         spxptr->destinationNetwork[i] = '\0';
  104.     spxptr->length = REV_SPXHDR_SIZE;
  105.     spxptr->packetType = 5;
  106.     cpybuf(spxptr->destinationNetwork,netnum,4);
  107.     cpybuf(spxptr->destinationNode,nodadr,6);
  108.     spxptr->destinationSocket = soknum;
  109.     if (i = SPXestcon(0,1,&conid,ecbptr))
  110. #ifndef SPXDEBUG
  111.         return(-(uerr_cod = ARQS_ERR));
  112. #else
  113.         {
  114.         printf("\nCould not establish Connection %d\n",i);
  115.         return(-(uerr_cod = ARQS_ERR));
  116.         }
  117. #endif
  118.  
  119.     while (ecbptr->inUseFlag)
  120.         ;
  121.     if (ecbptr->completionCode)
  122. #ifndef SPXDEBUG
  123.         return(-(uerr_cod = ARQS_ERR));
  124. #else
  125.         {
  126.         printf("\nBad completion code at connection %d\n",
  127.             ecbptr->completionCode);
  128.         return(-(uerr_cod = ARQS_ERR));
  129.         }
  130. #endif
  131.  
  132.     /* ???? retecb(ecbptr); */
  133.     /* wait for dummy response 
  134. dummy_wait:
  135.     for (i = 0, ecbptr = savecb; i < 2 * n; i++, ecbptr++)
  136.         if (ecbptr->inUseFlag == 0)
  137.             break;
  138.     if (i >= 2 * n) goto dummy_wait;
  139.     if (ecbptr->completionCode) {
  140.         printf("\nFunny dummy response: %x  %d\n",
  141. ecbptr->completionCode & 0x00ff,ecbptr->fragmentCount);
  142.         return(-(uerr_cod = ARQS_ERR));
  143.     }
  144.     return(i);
  145.     *** end wait for dummy */
  146.     return(1);
  147. }
  148.  
  149. ECB *getECB(n)
  150. int n;
  151. {
  152.     int i;
  153.     SPXHDR *spxptr;
  154.     char *tp;
  155.     FAST ECB *ecbptr;
  156.     ECB      *savptr;
  157.  
  158.     necb = n;
  159.     if ((spxptr = (SPXHDR *) mballc(n,sizeof(SPXHDR)))
  160.         == NULL)
  161.         return(NULL);
  162.     if ((ecbptr = (ECB *) mballc(n,sizeof(ECB))) == NULL)
  163.         return(NULL);
  164.     if ((savdat = tp = mballc(1,DATA_SIZE * n)) == NULL)
  165.         return(NULL);
  166.     for (i = 0, savptr = ecbptr; i < n; i++,spxptr++,ecbptr++) {
  167.         IPXdatadr(spxptr,ecbptr->fragmentDescriptor[0].address);
  168.         ecbptr->fragmentDescriptor[0].size = SPXHDR_SIZE;
  169.         IPXdatadr(tp,ecbptr->fragmentDescriptor[1].address);
  170.         ecbptr->fragmentDescriptor[1].size = DATA_SIZE;
  171.         tp += DATA_SIZE;
  172.     }
  173.  
  174.     return(savptr);
  175. }
  176.  
  177. TEXT *getmids(apsize,pmsg)
  178. UCOUNT          apsize;
  179. MESSAGE            *pmsg;
  180. {
  181.     TEXT  *retval;
  182.     TEXT   majrev,minrev;
  183.     UCOUNT maxcon,avlcon;
  184.     COUNT  i;
  185.  
  186.     /* get server msg id */
  187.     uerr_cod = 0;
  188.     msgsiz     = cts_apxsiz = DATA_SIZE;
  189.  
  190.     if ((0x00ff & (xerr = SPXinit(&majrev,&minrev,&maxcon,&avlcon)))
  191.         == (0x00ff & SPX_NOT_INSTALLED))
  192.         uerr_cod = ASKY_ERR;
  193.     else if ((xerr = IPXopen(&soknum,0)) && (xerr & 0x00ff) != 0x00ff)
  194.         uerr_cod = ASID_ERR;
  195.     else if ((savecb = getECB(2)) == NULL)
  196.         uerr_cod = ASPC_ERR;
  197.     else if (SetUpRcvECB(1))
  198.         return(NULL);
  199.     else if ((i = SetUpIntECB(1)) < 0)
  200.         return(NULL);
  201.  
  202.     if (uerr_cod)
  203.         return(NULL);
  204.     set_abort_traps(CBRKmode,CERRmode);
  205.  
  206.     return(savdat + (i * DATA_SIZE));
  207. }
  208.  
  209. COUNT ridmids()
  210. {
  211.     SPXabort(conid);
  212.     IPXclose(soknum);
  213.     return(NO_ERROR);
  214. }
  215.  
  216. void far fdisconnect()
  217. {
  218.     disconnect();
  219. }
  220.  
  221. disconnect()
  222. {
  223.     STPUSR();
  224. }
  225.  
  226. COUNT ctrqst(msgadr,pmsg)
  227. PFAST TEXT  *msgadr;        /* ptr to message area        */
  228. MESSAGE           *pmsg;    /* ptr to message header     */
  229. {
  230.     int msglen,i;
  231.     FAST ECB *ecbptr;
  232.     SPXHDR *spxptr;
  233.  
  234.     i = (msgadr - savdat) / DATA_SIZE;
  235.     ecbptr = savecb + i;
  236.     if (ecbptr->inUseFlag) {
  237.         printf("\nUnexpected InUseFlag\n");
  238.         exit(2);
  239.     }
  240.  
  241.     cpybuf(&spxptr,ecbptr->fragmentDescriptor[0].address,sizeof(char *));
  242.  
  243.     /* copy message header */
  244.     cpybuf(msgadr,pmsg,sizeof(MESSAGE));
  245.     msglen = sizeof(MESSAGE) + pmsg->mdlen;
  246.  
  247. /*printf("\n### ctrqst mpntr=%ld",pmsg->mpntr);*/
  248.  
  249.     /* send message: ordinarily an interprocess comm call (e.g., q call) */
  250.     spxptr->dataStreamType = 0;
  251.     spxptr->connectionControl = 0x10;
  252.     ecbptr->fragmentCount = 2;
  253.     ecbptr->fragmentDescriptor[1].size = msglen;
  254.  
  255.     SPXsend(conid,ecbptr);
  256.     while (ecbptr->inUseFlag)
  257.         ;
  258.     if (ecbptr->completionCode)
  259. #ifndef SPXDEBUG
  260.         return(uerr_cod = ARQS_ERR);
  261. #else
  262.         {
  263.         printf("\nBad completion code on send %d\n",
  264.             ecbptr->completionCode);
  265.         return(uerr_cod = ARQS_ERR);
  266.         }
  267. #endif
  268.     else
  269.         retecb(ecbptr);
  270.  
  271.     return(NO_ERROR);
  272. }
  273.  
  274. COUNT ctrspn(msgadr,pmsg)
  275. PFAST TEXT **msgadr;
  276. MESSAGE                *pmsg;
  277. {
  278.     FAST COUNT i;
  279.     FAST ECB  *ecbptr;
  280.  
  281. wait_loop:
  282.     IPXrelq();
  283.     for (i = 0, ecbptr = savecb; i < necb; i++, ecbptr++)
  284.         if (ecbptr->inUseFlag == 0)
  285.             break;
  286.     if (i >= necb)
  287.         goto wait_loop;
  288.  
  289.     /* get response: interprocess comm call which leaves answer in apxmsg */
  290.     cpybuf(msgadr,ecbptr->fragmentDescriptor[1].address,sizeof(char *));
  291.  
  292.     /* copy message header */
  293.     cpybuf(pmsg,*msgadr,sizeof(MESSAGE));
  294.  
  295.     return(NO_ERROR);
  296. }
  297.  
  298. /* end of ctamsg.c */
  299.