/* Copyright (c) 1994 Laishev Ruslan R. All Right reserved !!! */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SESS_TYPE char sess_type [3] #define SESS_MODE char sess_mode [2] #define SESS_NUMBER char sess_number [4] #define INPUT_SEQ_NUMBER char input_seq_number [6] #define OUTPUT_SEQ_NUMBER char output_seq_number [6] #define FS1 1 #define FS5 3 char PAI_OS [] = "#PAXXXXXXXXXXCOPNFINIO"; char PAI_OS_R [] = "#PAXXXXXXXXXXCOPN"; struct PAI_OS_R_ { SESS_TYPE; SESS_MODE; SESS_NUMBER; INPUT_SEQ_NUMBER; OUTPUT_SEQ_NUMBER; } PAI_OS_R_; char PAI_CS [] = "#STXXXXXXXXXXCCLS"; struct PAI_PKT { char sig [3]; SESS_NUMBER; OUTPUT_SEQ_NUMBER; char type [4]; } *PAI_PKT_P; int PAI_Main (int MSG_BUF_S) { char *MSG_BUF, *MSG_BUF_P; short MSG_BUF_L; $DESCRIPTOR(MBX_dsc_inp,"MLA1$MFSERV"); $DESCRIPTOR(MBX_dsc_out,"MFSERV$MLA1"); int MBX_hnd_inp, MBX_hnd_out; int status; FILE *fmsg, *fidx; struct io_status_block { short int cnd, cnt; int dev; } iosb; fputs( "Opening *.MSG & *.IDX file's\n", stdout); if ( NULL == (fmsg = fopen("PAITEST.MSG","wb")) ) { perror("Open PAITEST.MSG"); sys$exit(0); } if ( NULL == (fidx = fopen("PAITEST.IDX","wb")) ) { perror("Open PAITEST.IDX"); sys$exit(0); } /* Create permanent mailbox's for input & output message's */ fputs( "Opening MLA1$MFSERV & MFSERV1 mailboxe's\n", stdout); if (SS$_NORMAL != (status = sys$crembx(1, &MBX_hnd_inp,0,0,0,0,&MBX_dsc_inp, 0)) ) sys$exit (status); if (SS$_NORMAL != (status = sys$crembx(1, &MBX_hnd_out,0,0,0,0,&MBX_dsc_out, 0)) ) sys$exit (status); /* Marked for death - starring : Steven Sigal */ sys$delmbx(MBX_hnd_inp); sys$delmbx(MBX_hnd_out); /* Allocate area of memory for I/O buffer */ if (NULL == (MSG_BUF = (char *)malloc (MSG_BUF_S)) ) { perror ("Allocation I/O buffer"); exit (0); } /* Opening ST400/PAI Session for input/output message's 1. Send PAI_OPEN_SESSION */ fputs( "Send ACK to open ST400/PAI Session for input/output message's\n", stdout); status = SS$_NOREADER; while ( status != SS$_NORMAL ) { status = sys$qiow ( 0, MBX_hnd_inp, IO$_WRITEVBLK|IO$M_READERCHECK|IO$M_NORSWAIT, &iosb, 0,0, PAI_OS, sizeof(PAI_OS), 0,0,0,0); if ( iosb.cnd == SS$_NOREADER ) sys$exit ( SS$_NOREADER ); } /* 2. Reading PAI_OPEN_SESSION_REPLY & validate it */ fputs( "Waiting reply to open ST400/PAI Session for input/output message's\n", stdout); status = SS$_NOWRITER; while (status != SS$_NORMAL ) { status = sys$qiow ( 0, MBX_hnd_inp, IO$_READVBLK|IO$M_WRITERCHECK, &iosb, 0,0, MSG_BUF, MSG_BUF_S, 0,0,0,0); if ( iosb.cnd == SS$_NOWRITER ) sys$exit ( SS$_NOWRITER ); if ( !strncmp (MSG_BUF,PAI_OS_R,sizeof(PAI_OS_R)-1) ) break; } memcpy((void *) &PAI_OS_R_, MSG_BUF + sizeof(PAI_OS_R)-1, sizeof (PAI_OS_R_)); fputs( "Receive OK to open ST400/PAI Session for input/output message's\n", stdout); fprintf(stdout, "Session Type - %3.3s\n"\ "Session Mode - %2.2s\n"\ "Session Number - %4.4s\n"\ "Input Seq Number - %6.6s\n"\ "Ouput Seq Number - %6.6s\n", &PAI_OS_R_.sess_type,&PAI_OS_R_.sess_mode, &PAI_OS_R_.sess_number, &PAI_OS_R_.input_seq_number,&PAI_OS_R_.output_seq_number); /* Loop of reading message form mailbox (MFSERV$MLA1) */ while ( 1 ) { status = SS$_NOWRITER; while ( status != SS$_NORMAL ) { status = sys$qiow ( 0, MBX_hnd_out, IO$_READVBLK|IO$M_WRITERCHECK, &iosb, 0,0, MSG_BUF, MSG_BUF_S, 0,0,0,0); if ( iosb.cnd == SS$_NOWRITER ) sys$exit ( SS$_NOWRITER ); } MSG_BUF_L = iosb.cnt; PAI_PKT_P = (struct PAI_PKT *) MSG_BUF; if ( !memcmp(PAI_PKT_P->type,"MMSG",4) || !memcmp(PAI_PKT_P->type,"MRPL",4) ) { if (NULL!=(MSG_BUF_P=(char *) memchr(MSG_BUF,FS5,MSG_BUF_L)) ) { fprintf(stdout,"%17.17s\n",MSG_BUF); fwrite (MSG_BUF,sizeof(PAI_PKT),1,fidx); fwrite (MSG_BUF+sizeof(PAI_PKT), MSG_BUF_P - MSG_BUF,1,fmsg); memcpy (PAI_PKT_P->type,"RCVD",4); fprintf(stdout,"%17.17s\n",MSG_BUF); status = sys$qiow ( 0, MBX_hnd_out, IO$_WRITEVBLK|IO$M_READERCHECK|IO$M_NORSWAIT, &iosb, 0,0, PAI_PKT_P, sizeof(PAI_PKT)-1, 0,0,0,0); } } else { if ( !memcmp(MSG_BUF,PAI_CS,sizeof(PAI_CS)-1) ) { break; } } } fputs( "Receive ACK to close ST400/PAI Session for input/output message's\n", stdout); fclose(fmsg); fclose(fidx); free ((void *) MSG_BUF); return 0; } int PAI_Info (void) { union buff { char trnl_name [64]; int info; } buff; int status; short ret_l; struct item_list { unsigned short buff_l, item_c; char *buff_p; short *buff_l_p; unsigned term; } item_list = { sizeof(buff.trnl_name), LNM$_STRING, buff.trnl_name,&ret_l,0}; $DESCRIPTOR(tbl_name,"LNM$SYSTEM_TABLE"); $DESCRIPTOR(log_name,"MLA1$MFSERV"); $DESCRIPTOR(mbx_name,"MBAXXXXXXX:"); /* Check translation logical name MLA1$MFSERV in system logical name table. */ status = -1; while (status != SS$_NORMAL) { status = sys$trnlnm (0,&tbl_name,&log_name,0,&item_list); if (status != SS$_NORMAL) sleep (300); } sleep (10); /* Check device : mailbox or not. */ mbx_name.dsc$w_length = ret_l; memcpy(mbx_name.dsc$a_pointer,buff.trnl_name,ret_l); item_list.item_c = DVI$_DEVCHAR; status = sys$getdvi (0,0,&mbx_name,&item_list,0,0,0,0); /* If device is mailbox get default buffer size */ if ( buff.info & DEV$M_MBX ) { item_list.item_c = DVI$_DEVBUFSIZ; status = sys$getdvi (0,0,&mbx_name,&item_list,0,0,0,0); return buff.info; } /* Return errorr signal */ return -1; } void main (void) { int MBX_b_sz; fputs( "Copyright (c) 1994 Laishev Ruslan R. All Right reserved !!!\n", stdout); while ( 1 ) { if ( 0 < (MBX_b_sz = PAI_Info()) ) { PAI_Main (MBX_b_sz); } } }