/*
                             RTSEND

 Function: Request for send operation.

 CopyRight 1995. Nicholas Poljakov all rights reserved.
*/


#include <stdio.h>
#include <rtsend.h>
#include <state1.h>
#include <rcb.h>
#include <tcb.h>
#include <lucb.h>
#include <psp.h>
#include <cma.h>
#include <string.h>
int sk_r_wt(void *);
int SendBlock(void *, void *);
int setrc(void *, void *);
int sendhsf(void *);
int sendhs(void *);
int sendbm(void *, void *);
int sendat(void *);
unsigned long rmfmh5(void *, void *);
int recwait(void *);
int rcvru(void *, void *);
int rcvhs(void *, void *, void *, void *);
int ralloc(void *, void *);
int psrm(int, void *, void *);
int ps_conv(int, void *);
int proterr(void *, unsigned long);
int preptrcv(void *, void *);
int post_rcb(void *);
struct repass *postopen(void *);
int phsrec(void *);
int pfmh5(void *);
int opndst(void *);
int obtsess(void *, unsigned char);
int Lrf_handler(void *);
int get_sess(void *, void *);
int get_attr(void *);
int fsm_error(unsigned char, void *);
int fsm_conv(unsigned char, unsigned char, void *);
int flush (void *);
int dcp(void *);
int dealloc(void *);
int crtp(void *);
int conv(void *);
int chkparm(void *, void *);
int check_end(unsigned int, void *);
struct rqb *call_appl(void *);
int buffmng(unsigned char, void *, void *, void *, unsigned, unsigned char, unsigned);
unsigned long attltck(void *);
unsigned long attacheck(void *);
char *cgetmem(int, int);
int sendhsf(void *);
int opndst(void *);
int alloc_rcb(void *, void *);
int allocate(void *);
int clsdst(void *);

rtsend(pptr)
struct rtsend *pptr;
  {
struct rcb *p_rcb;
struct tcb *p_tcb;
struct cma ar;
unsigned int type;
char *p;

int  fsm_conv();
int  fsm_error();
unsigned int *m;
char s;
char r;
int code;
int state;

#if OS_TYPE == 1
/*********  Trace facility **********/
unsigned int rtype;   /* type of record */
unsigned int pnum;    /* point number */
char pname[8];        /* name of module */
char *drec;       /* record for dump */
int  lenr;            /* record length */

rtype = INPROC;
strcpy(pname, "rtsend");
pnum = 1;
drec = pptr;
lenr = sizeof(struct rtsend);
gtf(rtype, pname, pnum, drec, lenr);
/***********************************/
#endif

     pptr -> prim_rc = OK;
     s = 'S';
     r = 'R';

     if (chkparm(pptr, &ar) == -1) {
        return(0);
     }
     p_rcb = ar.p_rcb;
     p_tcb = ar.p_tcb;

     /* Check if the RCB is into wait queue */
     if (sk_r_wt(p_rcb) == 0) {
        pptr -> prim_rc = INCOMPLETE;
        return (0);
     }

    /*   place the verb code into the RCB  */
    p_rcb ->verb_code = Request_to_send;
    p_rcb -> verb_ptr = pptr;

    if((state = fsm_conv(s,Request_to_send,p_rcb))== -1)
    {
        pptr -> prim_rc = PORT_ABENDED;
        return(0);
    }
    if(state == 1)
    {
        pptr -> prim_rc = PORT_ABENDED;
        return(0);
    }
     else
           {
               if (cdind(p_rcb) == 0) {
                /* CD not found in the input queue */
                    p = &((*p_rcb).first_out);
                    type = Request_to_send;
                    buffmng('A', NULL, p, p_rcb, 0, 0, type);
                    sendhs(p_rcb);
               }
           }
 end:
 return(0);
}
cdind(p_rcb)
struct rcb *p_rcb;
{
    /* Search for CD indicator in the input queue  */
}
