[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference pamsrc::decmessageq

Title:NAS Message Queuing Bus
Notice:KITS/DOC, see 4.*; Entering QARs, see 9.1; Register in 10
Moderator:PAMSRC::MARCUSEN
Created:Wed Feb 27 1991
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:2898
Total number of notes:12363

2834.0. "pams_put_msg too fast,DMQ crash." by BEJVC::JACKWU () Wed Apr 02 1997 10:50

    Hi sjz,
    
    I am a DMQ new comer.  I have the following applications.
    
       2 VAX/VMS with DMQ at HQ  <====> 30 remote PC with DMQ clients.
    
       The network connection is X.25 (low speed; 9600bps).
       The protocol is TCP/IP (VAX: UCX;   PC: Pathworks).
    
       There are 30 queues which are used to send data from HQ to remote.
       There is  1  queues which is  used to send data from remote to HQ.
    
    At the HQ, if sending data to 1 Queue too fast (compared to X.25 low
    speed
    delivery), the parm_put_msg() will return "queue is full". This is OK.
    Because X.25 low speed delivery, the real queues which was sent to DMQ
    has not been delivered to the remote PC.
    
    But at the HQ, if sending data to multiple Queues too fast, the 
    para_put_msg() will return "unexpected error". Then the DMQ at the
    VAX/VMS
    will not work normally. We have to shutdown and restart the DMQ.
    
    I donnot know why.
    
    The followings are my sending program. Please take some time to look 
    my program. Please check if I have a wrong call or wromg parameters.
    
    Thanks and Regards.
    
    jackwu & tesscui from NSIS.
    
    /******************************************************************/ 
    /* standard "C" and system definition files */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    /* VMS definition files */
    
    #include <starlet.h>
    #include <ssdef.h>
    #include <stsdef.h>
    #include <descrip.h>
    #include <lib$routines.h>
    #include <libdef.h>
    #include <rmsdef.h>
    #include <fscndef.h>
    
    /* DECmessageQ definition files */
    
    #include "p_entry.h"
    #include "p_proces.h"
    #include "p_group.h"
    #include "p_typecl.h"
    #include "p_return.h"
    #include "p_symbol.h"
    #include "p_struct.h"
    
    #define CLASS_S 1
    #define CLASS_D 2
    #define DTYPE_T 14
    					     
    
    /* Declare variables, pointers and arrays */
    
    char	LogMsg[1024];
    char	LogFileName[255];
    char	Full_LogFileName[255];
    
    /* subroutines */
    
    short	attach_queue()                  /* start of attach_queue */
    {
    	long int        attach_mode;
    	long int        q_type;
    	long int        dmq_status;
    	q_address       my_primary_queue;
    	char            queue_name[32] = "";
    	long int        queue_name_length;
    
    	attach_mode = PSYM_ATTACH_TEMPORARY;
    	q_type = PSYM_ATTACH_PQ;                     /* primary queue */
    
    	dmq_status = pams_attach_q ( &attach_mode,
    				     &my_primary_queue,
    				     &q_type,
    				     queue_name,        /* null name */
    				     &queue_name_length,/* not needed */
    				     0,0,0,0,0 );
    	
    	if ( dmq_status != PAMS__SUCCESS ) 
    		return(APP_FAIL);
    	else                               
    		return (APP_OK);
    } /* end of attach_queue */
    
    
    short	put_message(branch_code, class, type, msg_area)    /* start
    of put message */
    short   int     class, type;
    char	*branch_code;
    char	*msg_area;
    {
    	long    int     dmq_status;
    
    	char            queue_name[32] = "";
    	long    int     queue_name_length;  
    	long    int     wait_mode;
    	long    int     req_id;
    	q_address       target;
    
    	long    int     timeout;
    	char            priority;
    	char            delivery;
    	short   int     msg_size;
    	char            uma;
    	struct  PSB     put_psb;
    
    
    	/* use PCCONNECT_BBB as queue name, here BBB is branch code */
    	
    	sprintf(queue_name,"PCCONNECT_%s",branch_code);
    	queue_name_length = strlen(queue_name);
    	wait_mode = PSYM_WF_RESP;
    	req_id = 1;
    
    	dmq_status = pams_locate_q(     queue_name,
    					&queue_name_length,
    					&target,
    					&wait_mode,
    					&req_id,
    					(long   int *) 0,
    					(long   int *) 0,
    					(long   int *) 0,
    					(char *) 0
    				);
    /*				
    printf("queue=%s	locate_q ret=%d	", branch_code, dmq_status);
    */
    	if (dmq_status == PAMS__NOOBJECT)
    		return(APP_BAD_BRANCH_CODE);
    	else if (dmq_status != PAMS__SUCCESS)
    		return(APP_DMQ_LOCATEQ_FAIL);
    
    	priority        = 0;
    	delivery        = PDEL_MODE_WF_SAF;
    	msg_size        = strlen (msg_area);
    	timeout         = 500;                          /* 50 seconds */
    	uma             = PDEL_UMA_DISCL;
    
    	dmq_status = pams_put_msg (     msg_area,
    					&priority,
    					&target,
    					&class,
    					&type,
    					&delivery,
    					&msg_size,
    					&timeout,
    					&put_psb,
    					&uma,
    					(q_address *) 0,
    					(char *) 0,
    					(char *) 0,
    					(char *) 0
    				  );
    /*
    printf("put_message ret=%d psb.status=%d\n", dmq_status,
    put_psb.del_psb_status);
    */	if ((dmq_status == PAMS__SUCCESS) &&
    			(  put_psb.del_psb_status == PAMS__SUCCESS
    			|| put_psb.del_psb_status == PAMS__ENQUEUED
    			|| put_psb.del_psb_status == PAMS__STORED
    			|| put_psb.del_psb_status == PAMS__NO_UMA) )
    		return (APP_OK);
    	else if ((dmq_status == PAMS__SUCCESS) &&
    			(  put_psb.del_psb_status == PAMS__DQF_DEVICE_FAIL
    			|| put_psb.del_psb_status == PAMS__NO_DQF
    			|| put_psb.del_psb_status == PAMS__DISC_FAILED
    			|| put_psb.del_psb_status == PAMS__DISCL_FAILED) )
    		return(APP_DMQ_DQF_FAIL);
    	else if (dmq_status == PAMS__SUCCESS &&
    			put_psb.del_psb_status == PAMS__DQF_FULL)
    		return(APP_DMQ_DQF_FULL);
    	else
    		return(APP_DMQ_PUTMSG_FAIL);
    
    } /* end of put message */
    
    
    short	send_file(branch_code, msg_type, full_send_file_name,
    send_file_name)
    char	*branch_code;
    short	msg_type;
    char    *full_send_file_name;
    char	*send_file_name;                                         
    {
    	short	ret_status = 0;
    
    	char    msg_area[BUF_SIZE+1];
    	char	msg_header[100];
    	char	sendfilebuffer[BUF_SIZE-100];
    	short	sendfilebuffer_len;
    
    	char    CRLF[3] = "";
    	short	int	dmq_msg_type, dmq_msg_class;
    	short	mutilple_buffer_id;
    	short	no;     /* number ID;   0:force close file; 1,2,...: No.ID
    */
    
    	char	tmp_file_name[255];
    	char	sys_command[255];
    
    	CRLF[0] = 13;                   /* carriage return */
    	CRLF[1] = 10;                   /* line feed */
    	CRLF[2] = 0;
    
    	/* send to branch pc connect */
    	/* put message */
    
    	sleep(60);
    
    	sprintf(tmp_file_name, "EXE$PCCONNECT:%s", send_file_name);
    	sprintf(sys_command, "copy %s %s", full_send_file_name,
    tmp_file_name);
    	system(sys_command); 
    
    	sendfilebuffer_len = BUF_SIZE-100;
    	switch(msg_type) {
    		case MSG_TYPE_SWIFT_FM_HQ:  /* swift frame flag */
    			sprintf(msg_header, "%s%s%d", send_file_name, CRLF,
    0);
    			dmq_msg_class = MSG_CLASS_SWIFT;
    			dmq_msg_type = 	MSG_TYPE_SWIFT_FM_HQ;
    			break;
    		case MSG_TYPE_ACK_FM_HQ:    /* ack frame flag */
    			sprintf(msg_header, "%s%s%d", send_file_name, CRLF,
    0);
    			dmq_msg_class = MSG_CLASS_SWIFT;
    			dmq_msg_type = 	MSG_TYPE_ACK_FM_HQ;
    			break;
    		case MSG_TYPE_OTHER_FM_HQ:  /* free-format frame flag */
    			dmq_msg_class = MSG_CLASS_OTHER;
    			dmq_msg_type = 	MSG_TYPE_OTHER_FM_HQ;
    			sprintf(msg_header, "%s", send_file_name);
    			break;
    		default:
    			break;
    	}
    
    	no = 1;                 /* Normal file read ID starting from 1,2...
    */
    	mutilple_buffer_id = 1;
    	while(mutilple_buffer_id > 0) {
    		sendfilebuffer_len = BUF_SIZE - 100;
    		mutilple_buffer_id = ReadFile(no, tmp_file_name,
    sendfilebuffer,
    				&sendfilebuffer_len);
    		if (mutilple_buffer_id == 0) {
    			ret_status = APP_READ_FILE_ERROR;
    			break;
    		} 
    
    		sprintf(msg_area, "%d%s%s%s%s", mutilple_buffer_id, CRLF,
    				msg_header, CRLF, sendfilebuffer);
    
    		ret_status = put_message(branch_code, dmq_msg_class, 
    				dmq_msg_type, msg_area);
    		if (ret_status != APP_OK) {
    			if (mutilple_buffer_id > 0) /* force to close file
    */
    				ReadFile(0, tmp_file_name, sendfilebuffer,
    						&sendfilebuffer_len);
    			break; 
    		}
    		no ++;
    	}
    
    	sprintf(sys_command, "del %s;*", tmp_file_name);
    	system(sys_command); 
    
    	return(ret_status);
    
    } /* end of send file */
    
    short	confirm_branch_login(branch_code, ip_address)
    char	*branch_code;
    char	*ip_address;
    {
    	char	sys_command[255];
    
    	long int        attach_mode;
    	long int        q_type;
    	long int        dmq_status;
    	q_address       my_primary_queue;
    	char            queue_name[32] = "";
    	long int        queue_name_length;
    
    /*
    	sprintf(sys_command, "ucx ping %s", ip_address);
    	if (system(sys_command) != 51019923) */   /* ip is not connect */
    /*		return(APP_FAIL);    */
    
    	attach_mode = PSYM_ATTACH_BY_NAME;
    /*	q_type = PSYM_ATTACH_PQ;              */          /* primary queue
    */
    	q_type = PSYM_ATTACH_PQ;
    	sprintf(queue_name, "PCCONNECT_%s", branch_code);
    	queue_name_length = strlen(queue_name);
    
    	dmq_status = pams_attach_q ( &attach_mode,
    				     &my_primary_queue,
    				     &q_type,
    				     queue_name,
    				     &queue_name_length,
    				     0,0,0,0,0 );
    	if ( dmq_status == PAMS__DECLARED    /* queue has attached by
    branch */
    	   	|| dmq_status == PAMS__BADDECLARE  ) { 
    		return(APP_OK);
    	} else if ( dmq_status == PAMS__SUCCESS ) {    
    		dmq_status = pams_detach_q (&my_primary_queue, 
    						(char *) 0,
    						(char *) 0);
    		return(APP_FAIL);
    	} else
    		return(APP_FAIL);
    }
    
    short	send_format_file_to_branch(msg_type)
    short	msg_type;
    {       
    	short	i,ret_status;
    
    	FILE	*fp_branch, *fp_file;
    	char	buffer[255];
    
    	char	sys_command[255];
    
    	char	OK_flag[3];
    	char	branch_code[4];
    	char	branch_in_dir[255];
    	char	branch_out_dir[255];
    	char	suffix[6];
    
    	char	send_file_dir[255];
    	char	backup_file_dir[255];
    
    	char	send_file_name[255];
    	char	full_send_file_name[255];
    	char	full_backup_file_name[255];
    
    	if ((fp_branch = fopen("EXE$PCCONNECT:BRANCH.DEF", "r")) == NULL) {
    		sprintf(LogMsg, "\n%-20s Can not read branch defination
    file: EXE$PCCONNECT: BRANCH.DEF\n",
    			today);
    		WriteFile("a", Full_LogFileName, LogMsg);
    		return( APP_FAIL );
    	}
    
    	while(fgets(buffer, 255, fp_branch) != NULL) {
    
    		if(buffer[0] == '#' || strncmp(buffer, "/*", 2) == 0)
    continue;
    
    		sscanf(buffer, "%s%s%s%s", OK_flag, branch_code, 
    				branch_in_dir, branch_out_dir);
    		OK_flag[1] = 0;
    		branch_code[0] = toupper(branch_code[0]);
    		branch_code[1] = toupper(branch_code[1]);
    		branch_code[2] = toupper(branch_code[2]);
    		branch_code[3] = 0;
    
    		if (OK_flag[0] != '1') continue;
    
    		if (msg_type == MSG_TYPE_SWIFT_FM_HQ) {
    			strcpy(send_file_dir, branch_out_dir);
    			strcpy(backup_file_dir, DIR_SWIFT_TX_BACKUP);
    			strcpy(suffix, "aui"); 
    		} else if (msg_type == MSG_TYPE_ACK_FM_HQ) {
    			strcpy(send_file_dir, DIR_ACK_FILE);
    			strcpy(backup_file_dir, DIR_ACK_BACKUP); 
    			strcpy(suffix, "ack"); 
    		} else if (msg_type == MSG_TYPE_OTHER_FM_HQ) {
    			strcpy(send_file_dir, DIR_OTHER_TX);
    			strcpy(backup_file_dir, DIR_OTHER_TX_BACKUP); 
    			strcpy(suffix, "*"); 
    		} else {
    			break;
    		}
    
    		system("del file.list;*");
    		sprintf(sys_command, "dir/col=1/output=file.list %s%s*.%s", 
    				send_file_dir, branch_code, suffix);
    
    		if (system(sys_command) != 1)  /* no file found */
    			continue;
    
    /*			
    		if (confirm_branch_login(branch_code, ip_address) !=
    APP_OK) {
    			if (strcmp(branch_code, "SSS") == 0)
    				continue;
    			
    			sprintf(LogMsg, "\n%-20s Branch %s is not login\n",
    					today, branch_code);
    			WriteFile("a", Full_LogFileName, LogMsg);
    			continue;
    		}
    */
    
    		if ((fp_file = fopen("file.list", "r")) == NULL) continue;
    
    		while(fgets(buffer, 255, fp_file) != NULL) {
    
    			if(strncmp(buffer, "Directory", 9) == 0) continue;
    			if(strncmp(buffer, "Total", 5) == 0) continue;
    			if (Instr(buffer, branch_code) < 0) continue;
    
    			i = Instr(buffer, ";");
    			if (i < 0) continue;
    			else buffer[i] = 0;
    				
    			strcpy(send_file_name, buffer);
    			sprintf(full_send_file_name, "%s%s", send_file_dir,
    					send_file_name);
    			sprintf(full_backup_file_name, "%s%s",
    					backup_file_dir, send_file_name);
    
     			ret_status = send_file(branch_code, msg_type, 
    					full_send_file_name,
    send_file_name);
    	
    			get_systemtime();
    
    			switch (ret_status) {
    			case	APP_OK: 
    				sprintf(LogMsg, "\n%-20s SUCCESSFUL:File %s
    to branch %s\n", 
    					today, send_file_name,
    branch_code);
    				WriteFile("a", Full_LogFileName, LogMsg);
    				RenameFile(full_send_file_name, 
    						full_backup_file_name);
    				break;
    
    			case	APP_BAD_BRANCH_CODE:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s branch queue not
    found\n",
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    				
    			case	APP_DMQ_LOCATEQ_FAIL:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s Unexpected error
    return from pams_locate_q\n", 
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    
    			case	APP_DMQ_PUTMSG_FAIL:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s Unexpected error
    return from pams_put_message\n", 
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    
    			case	APP_DMQ_DQF_FULL:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s Branch queue is
    full\n", 
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    
    			case	APP_DMQ_DQF_FAIL:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s No DQF buffer for
    this queue or DQF buffer is error\n", 
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    
    			default:
    				sprintf(LogMsg, "\n%-20s ERROR:File %s to
    branch %s\n", 
    					today, send_file_name,
    branch_code);
    				sprintf(LogMsg, "%s%20s Unexpected error
    return\n",
    					LogMsg, " ");
    				WriteFile("a", Full_LogFileName, LogMsg);
    				break;
    			}
    			if (ret_status != APP_OK)
    				break;
    		}
    		fclose(fp_file);
    	}
    	fclose(fp_branch);
    
    	return(ret_status);
    }
    
    main()
    {
    	short   ret_status;
    
    	get_systemtime();
    
    	strcpy(LogFileName, "TX");
    	strncat(LogFileName, today, 8);
    	LogFileName[10] = 0;
    	strcat(LogFileName, ".log");
    	sprintf(Full_LogFileName, "%s%s", DIR_LOG_FILE, LogFileName);
    	
    	sprintf(LogMsg, "\n\nFrom X.400 to PCConnect - Sending program is
    starting\n\n");
    	if (WriteFile("a+", Full_LogFileName, LogMsg) != 0) {
    		printf("Open log file %s error, Exit !!!\n",
    Full_LogFileName);
    		printf("Plese find the reason of %s open error ,then
    re-run\n",Full_LogFileName);
    		exit (0);
    	}
    	printf("\n\nFrom X.400 to PCConnect - Sending program is
    starting\n\n");
    
    	/* In order to send message, we have to attach a temp queue */
    	/* attach queue */
    	if ( attach_queue() != APP_OK ) {
    		sprintf(LogMsg, "%-20s Attach queue error when sending from
    VAX to PC\n%20sPerhaps DMQ problems, re-run this program after DMQ is
    OK.", today," ");
    		writefile("a", Full_LogFileName, LogMsg);
    		exit(APP_FAIL);
    	}
    
    	while (1) {
    		get_systemtime();
    		/* Change LogFileName at 24:00 */
    		if (strncmp(LogFileName+2, today, 8) != 0) {
    
    			strcpy(LogFileName, "TX");
    			strncat(LogFileName, today, 8);
    			LogFileName[10] = 0;
    			strcat(LogFileName, ".log");
    			sprintf(Full_LogFileName, "%s%s", DIR_LOG_FILE, 
    					LogFileName);
    
    			sprintf(LogMsg, "\n\nFrom X.400 to PCConnect -
    Sending program is starting\n\n");
    			if (WriteFile("a+", Full_LogFileName, LogMsg) != 0)
    {
    				printf("Open log file %s error.\n", 
    						Full_LogFileName);
    				/* exit (APP_FAIL); change on Mar.28,1997
    */
    			}
    		}
    
                    /* send swift message from HQ to branchQ */
    		ret_status =
    send_format_file_to_branch(MSG_TYPE_SWIFT_FM_HQ);
    		sleep(60);   
    
                    /* send swift ACKmessage from HQ to branchQ */
    		ret_status =
    send_format_file_to_branch(MSG_TYPE_ACK_FM_HQ);
    		sleep(60);      
    
                    /* send FreeFormatFile from HQ to branchQ */
    		ret_status =
    send_format_file_to_branch(MSG_TYPE_OTHER_FM_HQ);
    	}
    
    	/* detach queue     not goto here*/
    	pams_exit(); /* DMQ lib call */
    } /* end of main */
    
    /******************************************************************/ 
    /* standard "C" and system definition files. 
     */
    /* standard "C" and system definition files */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    /* VMS definition files */
    
    #include <starlet.h>
    #include <ssdef.h>
    #include <stsdef.h>
    #include <descrip.h>
    #include <lib$routines.h>
    #include <libdef.h>
    #include <rmsdef.h>
    #include <fscndef.h>
    
    /* DECmessageQ definition files */
    
    #include "p_entry.h"
    #include "p_proces.h"
    #include "p_group.h"
    #include "p_typecl.h"
    #include "p_return.h"
    #include "p_symbol.h"
    #include "p_struct.h"
    
    /* FAB defines */
    /*
    #include <fabdef.h>
    */
    #include <fab.h>
    
    /*
    */
    
    short   addJNLrecord(flag, branch)
    short   flag;
    struct  BRANCH  branch;
    {
    	short   status = 0;
    	char    filename[255];
    	char    buffer[1024];
    	char    mode[4];
    
    	char    month[3];
    	char    day[3];
    
    	FILE    *fp;
    
    	/* JNL record format is:
    	 * F BBB BBBnnnn.XXX nnnn mmm mm mmm mm-dd-yy hh:mm:ss
    	 * 012345678901234567890123456789012345678901234567890  total 51
    	 *
    	 * where:       F               as flag, 0=send, 1=receive
    	 *              BBB             as branch code
    	 *              BBBnnlnn.XXX    as file name
    	 *              nnnn            as file sequence number
    	 *              mmm             as start message sequence number
    	 *              mm              as number of messages
    	 *              mmm             as end message sequence number
    	 *              mm-dd-yy        as date
    	 *              hh:mm:ss        as time
    	 */     
    
    	strncpy(month, today, 2);
    	month[2] = 0;
    	strncpy(day, today+3, 2);
    	day[2] = 0;
    
    	sprintf(filename, "%sBRANCH%2s%2s.JNL", DIR_JNL_FILE, month, day);
    	sprintf(buffer, "%d %3s %11s %04d %03d %02d %03d %17s\n",
    			flag, 
    			branch.code, 
    			branch.filename,
    			branch.newfileno,
    			branch.startmsgno,
    			branch.msgnumber,
    			branch.endmsgno,
    			today);
    
    	WriteFile("a+", filename, buffer);
    	return(status);
    }
    
    
    void    get_systemtime()
    {
    	char    month[12][5] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN",
    				"JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
    	char    buffer[20];
    
    	short   i;
    	short   day;
    	short   year;
    	
    	char    time[23] ;
    	
    	$DESCRIPTOR( time_des , time ) ;
    
    	lib$date_time( &time_des ) ;
    
    	/* time format is DD-MMM-YYYY HH:MM:SS */
    	strncpy(buffer, time , 2);
    	buffer[2] =  0;
    	day = atoi(buffer);
    
    	strncpy(buffer, time+3, 3);
    	buffer[3] = 0;
    	i = 0;
    	while((i<13) && (strcmp(buffer, month[i])!=0))
    		i++;
    	i++;
    
    	strncpy(buffer, time+9, 2);
    	buffer[2] = 0;
    	year = atoi(buffer);
    
    	strncpy(buffer, time+12, 8);
    	buffer[8] = 0;
    
    	/* today format is : MM-DD-YY HH:MM:SS */
    	sprintf(today, "%02d-%02d-%02d %s", i, day, year, buffer);      
    	
    	return ;
    }
    
    short   GetBranchInformation(branch)
    struct  BRANCH  *branch;
    {
    	short   i=0;    
    	short   status = 0;
    
    	while( (i<BranchNumber) && 
    			(strcmp(STANDbranch[i].code, branch->code)!=0) ) 
    		i++;
    
    	if (i > 499) {
    		branch->no = 500;
    		branch->newfileno = -1;
    		branch->startmsgno = -1;
    		branch->msgnumber = 0;
    		branch->endmsgno = -1;
    		strcpy(branch->filename, "");
    		strcpy(branch->date, "");
    		strcpy(branch->time, "");
    		return(-1);
    	}
    
    	if (strcmp(STANDbranch[i].code, branch->code)!=0) {
    		STANDbranch[i].no = i;
    		STANDbranch[i].newfileno = -1;
    		STANDbranch[i].startmsgno = -1;
    		STANDbranch[i].msgnumber = 0;
    		STANDbranch[i].endmsgno = -1;
    		strcpy(STANDbranch[i].code, branch->code);
    		strcpy(STANDbranch[i].filename, "");
    		strcpy(STANDbranch[i].date, "");
    		strcpy(STANDbranch[i].time, "");
    		BranchNumber ++;
    	}
    
    	branch->no = STANDbranch[i].no;
    	branch->newfileno = STANDbranch[i].newfileno;
    	branch->startmsgno = STANDbranch[i].startmsgno;
    	branch->msgnumber = 0;
    	branch->endmsgno = STANDbranch[i].startmsgno;
    	strcpy(branch->filename, "");
    	strcpy(branch->date, "");
    	strcpy(branch->time, "");
    
    	return(status);
    }
    
    short   GenModelFile(modelfilename, expect, current, 
    		sourcefilename, targetfilename)
    char    *modelfilename;
    char    *expect;
    char    *current;
    char    *sourcefilename;
    char    *targetfilename;
    {
    	short   status = -1;
    
    	char    tailbuffer[1000];
    	char    buffer[BUF_SIZE+1];
    	short   buf_len = BUF_SIZE;
    
    	short   i, no, mutilple_buffer_id;
    	short   location;
    
    	if (ReadFile(1, modelfilename, buffer, &buf_len) == 0)
    		sprintf(buffer, "******** %s *******", modelfilename);
    
    	location = Instr(buffer, "BBB");
    	if (location>0)  {
    		for (i=0;i<strlen(expect);i++)
    			buffer[i+location] = expect[i];
    		location = Instr(buffer, "BBB");
    		if (location > 0) {
    			for (i=0;i<strlen(expect);i++)
    				buffer[i+location] = current[i];
    		}
    	}
    
    	location = Instr(buffer, "*/");
    	if (location>0)
    		strcpy(tailbuffer,buffer+location+2);
    	else
    		strcpy(tailbuffer,"\0");
    
    	location = Instr(buffer, "/*");
    	if (location > 0)
    		buffer[location] = '\0'; 
    	
    	WriteFile("w", targetfilename, buffer);
    
    	no = 1;
    	mutilple_buffer_id = 1;
    	while(mutilple_buffer_id > 0) {
    		buf_len = BUF_SIZE;
    		mutilple_buffer_id = ReadFile(no, sourcefilename, buffer,
    				&buf_len);
    		if (mutilple_buffer_id == 0)
    			return(-1);
    		no ++;
    		WriteFile("a", targetfilename, buffer);
    	}
    
    	WriteFile("a", targetfilename, tailbuffer);     
    	PrintFile(targetfilename);
    
    	return(0);
    }
    
    short   GetTrailerMessage(branchinfo, filename)
    struct  BRANCH  *branchinfo;
    char    *filename;      
    {
    	short   no, mutilple_buffer_id, buf_len;
    	char    buffer[BUF_SIZE+1];
    
    	short   loc;
    	short   ret_status=0;
    	char    trailerbegin[10];
    	char    str[50];
    
    	get_systemtime();
    
    	branchinfo->msgnumber = 1;
    	branchinfo->endmsgno = branchinfo->startmsgno;
    
    	strncpy(branchinfo->date, today ,8);
    	branchinfo->date[8] = 0;
    
    	strncpy(branchinfo->time, today + 9 ,8);
    	branchinfo->time[8] = 0;
    	
    	strcpy(trailerbegin, "END/");
    	/* trailer format is: 
    	 * END/aaaaaa/bbbb/yy-mm-dd/hh:mm:ss
    	   012345678901234567890123456789012
    	*/
    
    	no = 1;
    	mutilple_buffer_id = 1;
    	while(mutilple_buffer_id > 0) {
    		buf_len = BUF_SIZE;
    		mutilple_buffer_id = ReadFile(no, filename, buffer,
    				&buf_len);
    		if (mutilple_buffer_id == 0)
    			return(-1);
    		no ++;
    	
    		if ((loc=Instr(buffer, trailerbegin)) > 0) {
    			loc += 4;       /* skip "END/" */
    			strncpy(str, buffer+loc,6);
    			str[6] = 0;
    			branchinfo->msgnumber = atoi(str);
    			if (branchinfo->msgnumber <= 0) {
    				branchinfo->msgnumber = 0;
    				branchinfo->endmsgno =
    branchinfo->startmsgno;
    			} else {
    				branchinfo->endmsgno =
    branchinfo->startmsgno+branchinfo->msgnumber-1;
    			}
    
    			loc += 12;      /* skip "aaaaaa/bbbb/" */
    			strncpy(branchinfo->date, buffer+loc,8);
    			branchinfo->date[8] = 0;
    
    			loc += 9;       /* skip "yy-mm-dd/" */
    			strncpy(branchinfo->time, buffer+loc,8);
    			branchinfo->time[8] = 0;
    	
    			mutilple_buffer_id = ReadFile(0, filename, buffer,
    					&buf_len);
    			break;
    		}
    	}
    	
    	return( ret_status );
    }
    
    short   init_information(filename)
    char    *filename;
    {
    	
    	char    code[20];
    	char    buffer[200];
    
    	long    newfileno;
    	long    startmsgno;
    
    	FILE    *fp;
    	short   i = 0;
    	short   new_day;
    
    	BranchNumber = 0;
    
    	for(i=0;i<500;i++) {
    		STANDbranch[i].no = i;
    		STANDbranch[i].newfileno = -1;
    		STANDbranch[i].startmsgno = -1;
    		STANDbranch[i].msgnumber = 0;
    		STANDbranch[i].endmsgno = -1;
    		strcpy(STANDbranch[i].code, "");
    		strcpy(STANDbranch[i].filename, "");
    		strcpy(STANDbranch[i].date, "");
    		strcpy(STANDbranch[i].time, "");
    	}
    
    	get_systemtime();
    
    	new_day = 0;
    	if ((fp = fopen (filename, "r")) != NULL )
    	{
    						/* read contents from file
    */
    		while ( fgets(buffer, 200, fp) != NULL ) {
    			if(buffer[0] == 0)
    				continue;
    
    			if (buffer[0] == '#') {
    /*                              sscanf(buffer+1, "%s", code);
    				if (strncmp(today,code, strlen(code)) != 0)
    					new_day = 1;
    */                              continue;
    			}
    				
    
    			sscanf(buffer, "%s%d%d", code, &newfileno,
    &startmsgno);
    
    			for (i=0; i<strlen(code); i++)
    				code[i] = toupper(code[i]);
    			strcpy(STANDbranch[BranchNumber].code, code);
    
    			STANDbranch[BranchNumber].newfileno =
    (short)newfileno;
    
    			STANDbranch[BranchNumber].startmsgno =
    (short)startmsgno;
    
    			if (BranchNumber < 499)
    				BranchNumber ++;
    			else
    				break;
    		}
    		fclose (fp);
    	};
    
    
    	return(0);
    }
    
    
    short   Instr(s_string, t_string)
    char    *s_string;
    char    *t_string;
    {
    	short   location = 0;
    	short   t_len;
    	short   s_len;
    	char    buffer[6400];
    
    	t_len = strlen(t_string);
    	s_len = strlen(s_string);
    
    	location = 0;
    	strcpy(buffer, s_string);
    	
    	if (s_len < t_len)
    		return(-1);
    
    	while((location <= (s_len-t_len)) && 
    			(strncmp(buffer, t_string, t_len) != 0) ) {
    		location ++;
    		strcpy(buffer, s_string+location);
    	}
    	
    	if (strncmp(s_string+location, t_string, t_len) != 0)
    		return(-1);
    	else
    		return(location);       
    }
    
    short   PrintFile(print_filename)
    char    *print_filename;
    {
    	char    print_command[50];
    
    	sprintf(print_command, "print/queue=PCC$PRINTQUEUE %s",
    print_filename);
    /*      system(print_command);   */    
    
    	return(0);
    }
    
    short   ReadFile(short no, char *filename, char *buffer, short
    *buf_len)
    /*********************************************************/
    /* short no:   0:force close file;    1,2,...: Normal.ID */
    /* input:      no,  filename                             */
    /*             buf_len = BUF_SIZE - 100 = 4900           */
    /* output:     buffer                                    */
    /* return:  0: force to close file/unnormal return       */
    /*         -2: only 1 buffer is enough for the message   */
    /*         -1: this buffer is the end of the message     */
    /*         +1: sequence number ID                        */
    /*         +2: sequence number ID                        */
    /*********************************************************/
    {
    	static  FILE    *fp;
    	static  char    linebuffer[255];
    	short   len;
    		 
    	if (no == 0) {       /* force close file; unnormal return */
    		fclose(fp);
    		return(0);
    	}
    
    	buffer[0] = 0;
    	if (no == 1) {      /* no=1: start to read a file */
    		if ((fp = fopen(filename, "r")) == NULL) {
    			printf("Cannot open file %s at
    ReadFile()\n",filename);
    			return(0);
    		}
    		linebuffer[0] = 0;
    	} else {            /* if no > 2: 2,3,4,5.... */
    		strcpy(buffer, linebuffer);
    	}
    
    	len = strlen(buffer);           
    	while(fgets(linebuffer, 200, fp) != NULL) {
    		len += strlen(linebuffer);
    		if (len < *buf_len) {
    			if (buffer[0] == 0)
    				strcpy(buffer, linebuffer);
    			else
    				strcat(buffer, linebuffer);
    		} else {
    			*buf_len = len;
    			return(no);
    		}
    	}
    	fclose(fp);
    	if (no == 1)  /* only 1 buffer is enough for the file */
    		return(-2);
    	else          /* this buffer is the end of the file */
    		return(-1);
    }
    
    short   RenameFile(Source_file, Target_file)
    char    *Source_file;
    char    *Target_file;
    {
    	short   status=0;
    	short   len;
    	char    copy_command[200];
    	char    delete_command[200];
    
    	len = strlen(Target_file);
    	
    	sprintf(copy_command, "copy/pro=w:r  %s %s", Source_file,
    Target_file);
    	sprintf(delete_command, "delete %s;*", Source_file);
    
    	if (len == 0)
    		system(delete_command);
    	else if ( system(copy_command) )
    		system (delete_command);
    
    	return(0);
    }
    
    
    short   update_information(filename, current)
    char    *filename;
    struct  BRANCH  current;
    {
    	short status = 0;
    
    	char    buffer[225];
    	char    pur_command[200];
    
    	FILE    *fp;
    	short   i = 0;
    	short   no;
    
    	i = current.no;
    
    	if (current.newfileno >= 0) {
    		STANDbranch[i].newfileno = current.newfileno+1;
    		no = STANDbranch[i].newfileno/10000;
    		STANDbranch[i].newfileno -= no*10000;
    	} else
    		STANDbranch[i].newfileno = current.newfileno;
     
    	if (current.endmsgno >= 0) {
    		STANDbranch[i].startmsgno = current.endmsgno+1;
    		no = STANDbranch[i].startmsgno/1000;
    		STANDbranch[i].startmsgno -= no*1000;
    	} else
    		STANDbranch[i].startmsgno = current.endmsgno;
    
    	STANDbranch[i].endmsgno = STANDbranch[i].startmsgno;
    	STANDbranch[i].msgnumber = 0;
    	
    	if ((fp = fopen (filename, "w")) != NULL ) {
    		sprintf(buffer, "# %s\n", today);
    		fputs(buffer, fp );
    		
    		for(i=0;i<BranchNumber;i++) {
    			sprintf(buffer, "%s %d %d\n",STANDbranch[i].code,
    					STANDbranch[i].newfileno,
    					STANDbranch[i].startmsgno);
    			fputs(buffer, fp );
    		}
    		fclose (fp);
    		sprintf(pur_command, "pur %s",filename);
    		system(pur_command);
    	};
    
    	return(0);
    }
    
    short   WriteFile(open_mode, filename, buffer)
    char    *open_mode;
    char    *filename;
    char    *buffer;
    {
    	short   status = -1;
    	FILE    *fp;
    	char    command[200];
    
    	if ((fp = fopen (filename, open_mode)) != NULL ) {  
    						/* write contents in file
    */
    		if ( fputs (buffer, fp ) != EOF )
    			status = 0;
    
    		fclose(fp);
    	}
    	
    	if ((open_mode[0] == 'w') || (strcmp(open_mode, "a+") == 0)) {
    		sprintf(command, "set file/pro=(s:rwed,o:rwed,g:re,w:r)
    %s", 
    				filename);
    		system (command);
    	}
    
    	if (status == 0) {
    		sprintf(command, "pur %s", filename);
    		system(command);
    	}
    
    	return(status);
    }
    
    short   WriteSWIFTFile(mode, filename, buffer)
    char    *mode;
    char    *filename;
    char    *buffer;
    {
    	short   status = -1;
    	FILE    *fp;
    	char    command[200];
    
    	if ((mode[0] == 'w') || (mode[0] == 'W')) {
    		sprintf(command, "creat/fdl=%s %s", UDF,filename);
    		system (command);
    /*              sprintf(command, "set file/pro=(s:rwed,o:rwed,g:re,w:r)
    %s", 
    				filename);
    		system (command);
    */      }
    
    	if ((fp = fopen (filename, "a", "fab$b_rfm = FAB$C_UDF")) != NULL )
    {  
    						/* write contents in file
    */
    		if ( fputs (buffer, fp ) != EOF )
    			status = 0;
    		fclose(fp);
    	}
    
    	if (status == 0) {
    		sprintf(command, "pur %s", filename);
    		system(command);
    	}
    
    	return(status);
    }
    
    /******************************************************************/ 
    #include "p_struct.h"
    /******************************************************************/ 
    #define	DIR_SWIFT_RX		"MSG$FM_PC:"
    #define DIR_SWIFT_TX		"MSG$TO_PC:"
    #define DIR_SWIFT_TX_BACKUP	"MSG$BACKUP:"
    #define	DIR_ACK_FILE		"ACK$TO_PC:"
    #define DIR_ACK_BACKUP		"ACK$BACKUP:"
    #define DIR_OTHER_TX		"OTHER$TO_PC:"
    #define DIR_OTHER_TX_BACKUP	"OTHER$BACKUP:"
    #define DIR_OTHER_RX		"OTHER$FM_PC:"
    #define DIR_LOG_FILE		"MSG$LOG:"
    #define DIR_ERR_FILE		"MSG$ERR:"
    #define DIR_TMP_FILE		"MSG$TMP:"
    #define DIR_STOP_FILE		"MSG$STOP:"
    #define DIR_JNL_FILE		"MSG$JOURNAL:"
    
    #define	STOP_FILE	"EXE$PCCONNECT:stop.txt"
    #define	ACK_FILE	"EXE$PCCONNECT:ack.txt"
    #define BRANCHINFO_SEND	"EXE$PCCONNECT:branch.snd"
    #define	BRANCHINFO_RECV	"EXE$PCCONNECT:branch.rev"
    #define UDF		"EXE$PCCONNECT:undefine_format.fdl"
    
    #define	ACK_SUFFIX	"ACK"
    #define STOP_SUFFIX	"STOP"
    
    #define SEND_FLAG	0
    #define RECV_FLAG	1
    
    #define MSG_CLASS_SWIFT		400
    #define MSG_TYPE_SWIFT_TO_HQ	401
    #define MSG_TYPE_SWIFT_FM_HQ	402
    #define MSG_TYPE_ACK_FM_HQ	403
    
    #define MSG_CLASS_OTHER		500
    #define MSG_TYPE_OTHER_TO_HQ	501
    #define MSG_TYPE_OTHER_FM_HQ	502
    
    #define MSG_CLASS_TRANS		600
    #define MSG_TYPE_TRANS_TO_HQ	601
    #define MSG_TYPE_TRANS_FM_HQ	602
      
    #define	BUF_SIZE	5000
    
    #define APP_OK			0
    #define	APP_FAIL		-1
    #define	APP_READ_FILE_ERROR	-2
    #define	APP_WRITE_FILE_ERROR	-3
    #define	APP_BAD_BRANCH_CODE	-11
    #define APP_DMQ_LOCATEQ_FAIL	-12
    #define APP_DMQ_PUTMSG_FAIL	-13
    #define APP_DMQ_DQF_FULL	-14
    #define APP_DMQ_DQF_FAIL	-15
    
    short	BranchNumber;
    
    typedef	struct	BRANCH
    	{
    		short	no;
    		char	code[5];
    		char	filename[50];
    		short	newfileno;
    		short	startmsgno;
    		short	msgnumber;
    		short 	endmsgno;
    		char	date[20];
    		char	time[20];
    	};
    
    struct	BRANCH	STANDbranch[500];
    
    
    struct	BRANCH	Current;
    struct	BRANCH	Expect;
    
    char	today[20];
    
    /*	
    short	addJNLrecord(short, struct BRANCH);
    */
    void	get_systemtime();
    short	WriteFile(char *,char *,char *);
    short	WriteSWIFTFile(char *, char *, char *);
    short	GetBranchInformation(struct BRANCH *);
    short	GenModelFile(char *, char *, char *, char *, char *);
    short	RenameFile(char *,char *);
    short	init_information(char *);
    short	update_information(char *, struct BRANCH);
    short	PrintFile(char *);
    short	Instr(char *, char *);
    short	ReadFile(short, char *, char *,short *);
    
T.RTitleUserPersonal
Name
DateLines
2834.1need more info...KLOVIA::MICHELSENBEA/DEC MessageQ EngineeringWed Apr 02 1997 22:495
      We need to see the exact error codes plus the EVL log file to get a
    idea of what is going on.
    
    
    Marty