home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 15 / 15.iso / s / s038 / 1.ddi / SUPP.LIF / DCSNDMSG.PLM < prev    next >
Encoding:
Text File  |  1992-07-06  |  4.0 KB  |  107 lines

  1. $title('dcsndmsg - send a data chain message to a known port')
  2. $compact
  3. /********************************************************************
  4.  *
  5.  *     MODULE NAME: dcsndmsg
  6.  *
  7.  *     DESCRIPTION: Send a data chain message.
  8.  *         
  9.  *********************************************************************/
  10.  
  11. dcsndmsg: DO;
  12.  
  13. $include(:rmx:inc/rmxplm.ext)
  14. $include(dcom.ext)
  15. $include (dcom.lit)
  16. $include(:rmx:inc/error.lit)
  17. $include(err.ext)
  18.  
  19. DECLARE            /* Literals */
  20.  
  21.        dc_el    LITERALLY 'STRUCTURE( /* data chain element */
  22.                                      b_size      WORD,    /* buffer size */
  23.                                      buf_offset  WORD,    /* buffer pointer */
  24.                                      buf_sel     SELECTOR,  
  25.                                      res         WORD)',  /* reserved */
  26.  
  27.     REMPORT     LITERALLY    '801H',     /* Port id of remote port */    
  28.     REMHOST     LITERALLY    '05',       /* Host id of remote host */
  29.     CONBUF      LITERALLY    '16',       /* size of a control buffer */
  30.     TSTPORT     LITERALLY    '801H',     /* well-known port */
  31.     MSIZE       LITERALLY    '46',       /* message size */
  32.     BUFSIZE     LITERALLY    '100',      /* buffer size */
  33.     NOEXCEPT    LITERALLY   '0',        /* no exception handling by system */
  34.     DCBUFSIZE   LITERALLY    '8';        /* data chain buffer size */
  35.  
  36.     DECLARE        /* Global vars */
  37.  
  38.         status      WORD,    
  39.         port_t      TOKEN,               /* Token for local port */
  40.         messock     socket,              /* socket to which message is sent */
  41.         msock       DWORD AT (@messock), /* dword alias for messock */
  42.         con_buf    (CONBUF) BYTE,           /* control buffer */
  43.         mess_size   WORD,                /* number of bytes in data message */
  44.         bpool       TOKEN,               /* buffer pool attached to port */
  45.         off_set      WORD,                /* buffer off_set where chain buffer starts */
  46.         sflags      WORD,                /* transmission flags */
  47.         dc_seg_size WORD,                /* segment size for data chain */
  48.         dc_seg_t    TOKEN,               /* token for data chain segment */
  49.         dc_ptr      POINTER,             /* pointer to data chain segment */
  50.         d_chain    based dc_ptr(1) dc_el,   /* data chain */ 
  51.         dc_idx      WORD,                /* data chain index */
  52.         trans_id    WORD;                /* transaction id */
  53.  
  54.     DECLARE
  55.  
  56.         dc_buf (BUFSIZE) BYTE INITIAL
  57.          (45,'This is a data chain message sent by server',0dh,0ah);
  58.                                                 
  59.             
  60.     CALL set$exception(NOEXCEPT);
  61.     port_t = get$dport(TSTPORT, @bpool, CHAIN, @status);
  62.     messock.host_id = REMHOST;
  63.     messock.port_id = REMPORT;
  64.  
  65.     /* create data chain with at least enough blocks for each message
  66.        buffer + a terminating block */
  67.        
  68.     mess_size = SIZE(dc_buf);
  69.     /* 
  70.      * Calculate the size of the segment that will contain the data chain.
  71.      * The message is divided into pieces whose size is DCBUFSIZE so the total
  72.      * number of elements in the data chain is mess_size/DCBUFSIZE + 2. 
  73.      * The additional 2 includes one possible piece of the message less than
  74.      * DCBUFSIZE and the terminating data chain element.
  75.      *
  76.      */     
  77.     dc_seg_size = (mess_size/DCBUFSIZE + 2)*(size(d_chain));
  78.     dc_seg_t = rq$create$segment(dc_seg_size, @status);
  79.     dc_ptr = build$ptr(dc_seg_t,0);
  80.  
  81.     /* Fill in the fields of the data blocks for each buffer containing
  82.        a part of the message */
  83.             
  84.     off_set = 0;
  85.     dc_idx = 0;
  86.     DO WHILE off_set < mess_size;
  87.         d_chain(dc_idx).b_size = DCBUFSIZE;
  88.         d_chain(dc_idx).buf_offset = LOW(OFFSET$OF(@dc_buf(off_set)));    
  89.         d_chain(dc_idx).buf_sel = SELECTOR$OF(@dc_buf(off_set));    
  90.         off_set = off_set + DCBUFSIZE;
  91.         dc_idx = dc_idx + 1;
  92.     END;                    
  93.     d_chain(dc_idx).b_size = 0;
  94.     d_chain(dc_idx).buf_offset = 0;
  95.     d_chain(dc_idx).buf_sel = SELECTOR$OF(NIL);
  96.     
  97.  
  98.     /* send data chain */    
  99.  
  100.     sflags = DATACHAIN OR SYNCHTRANS;
  101.     trans_id = rq$send(port_t,msock, @con_buf, @d_chain,
  102.                              mess_size, sflags, @status); 
  103.     CALL error$check(100, status);
  104.     CALL rq$exit$io$job(0,NIL,@status);
  105.  
  106. END dcsndmsg;                                        
  107.