/* Copyright (c) 1994 Laishev Ruslan R. All Right reserved !!! */ #include #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_MSG [] = "PAI_ROOT:SWIFT.MSG"; char PAI_INC [] = "PAI_ROOT:SWIFT.INC"; char PAI_OS [] = "#PAXXXXXXXXXXCOPNFINOU"; 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; void PAI_Write (char *MSG_BUF,int MSG_BUF_L) { FILE *fmsg; FILE *finc; while (1) { if ( NULL != (fmsg = fopen(PAI_MSG,"a+b")) ) break; perror("Open MSG file"); sleep(10); } while (1) { if ( NULL != (finc = fopen(PAI_INC,"a+b")) ) break; perror("Open INC file"); sleep(10); } if ( !fwrite (MSG_BUF,MSG_BUF_L,1,fmsg) ) { perror("Write MSG file"); exit(-1); } if ( !fwrite (MSG_BUF,MSG_BUF_L,1,finc) ) { perror("Write INC file"); exit(-1); } fclose (fmsg); fclose (finc); } 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; unsigned long tm; struct io_status_block { short int cnd, cnt; int dev; } iosb; /* Create permanent mailbox's for input & output message's */ time(&tm); fprintf(stdout, "%s,Opening MLA1$MFSERV & MFSERV1 mailboxe's\n", ctime(&tm)); fflush(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"); fflush(stderr); exit (0); } /* Opening ST400/PAI Session for output message's 1. Send PAI_OPEN_SESSION */ time(&tm); fprintf(stdout, "%s,Send Open_ST400/PAI_Session for output message's\n", ctime(&tm)); fflush(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 */ time(&tm); fprintf(stdout, "%s,Waiting reply Open_ST400/PAI_Session for output message's\n", ctime(&tm)); fflush(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_)); time(&tm); fprintf(stdout, "%s,Received OK to Open_ST400/PAI_Session for output message's\n", ctime(&tm)); fprintf(stdout, "Session Type - %3.3s\n"\ "Session Mode - %2.2s\n"\ "Session Number - %4.4s\n"\ "Input Seq Number - %6.6s\n"\ "Output 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); fflush(stdout); /* 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)) ) { time(&tm); fprintf(stdout,"%s,%17.17s %d bytes\n", ctime(&tm),MSG_BUF, MSG_BUF_P - MSG_BUF - sizeof(PAI_PKT) + 1 ); PAI_Write (MSG_BUF+sizeof(PAI_PKT), MSG_BUF_P - MSG_BUF - sizeof(PAI_PKT) + 1 ); memcpy (PAI_PKT_P->type,"RCVD",4); time(&tm); fprintf(stdout,"%s,%17.17s\n", ctime(&tm),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), 0,0,0,0); fflush(stdout); } } else { if ( !memcmp(MSG_BUF,PAI_CS,sizeof(PAI_CS)-1) ) { break; } } } time(&tm); fprintf(stdout, "%s,Received Close_ST400/PAI_Session for output message's\n", ctime(&tm)); fflush(stdout); 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); /* Get mailbox_device default_buffer_size */ mbx_name.dsc$w_length = ret_l; memcpy(mbx_name.dsc$a_pointer,buff.trnl_name,ret_l); item_list.item_c = DVI$_DEVBUFSIZ; status = sys$getdvi (0,0,&mbx_name,&item_list,0,0,0,0); if (status == SS$_NORMAL) 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); fputs( "ST400/PAI Message's Receiver v1.0\n", stdout); fflush(stdout); while ( 1 ) { if ( 0 < (MBX_b_sz = PAI_Info()) ) { PAI_Main (MBX_b_sz); } } }