Files
microser/mmslib/mvlu/c_fget.c

461 lines
16 KiB
C
Raw Normal View History

2026-06-15 15:48:16 +08:00
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 2000 - 2000, All Rights Reserved */
/* */
/* MODULE NAME : c_fget.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* mvla_fget */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 03/03/08 JRB 09 Add static on "u_f*" functions. */
/* Chk fget_cnf_ptr before using. */
/* 11/12/07 MDE 08 Use _mvl_getpath for temp file path */
/* 01/30/06 GLB 07 Integrated porting changes for VMS */
/* 03/01/04 MDE 06 Free request for fget (file open) error */
/* 06/17/03 MDE 05 Now use _mvl_tmpnam */
/* 02/17/03 JRB 04 Del unused includes. */
/* 07/18/02 JRB 03 Del unused var. */
/* 03/25/02 MDE 02 Moved error/reject elements outside union */
/* 06/22/00 GLB 01 Created to do an asynchronous File Get. */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "glbsem.h"
#include "mmsdefs.h"
#include "mms_pvmd.h"
#include "mvl_defs.h"
#include "mvl_log.h"
/************************************************************************/
/* For debug version, use a static pointer to avoid duplication of */
/* __FILE__ strings. */
/************************************************************************/
#ifdef DEBUG_SISCO
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
#endif
static MVL_REQ_PEND *send_file_open (MVL_NET_INFO *NetInfo, ST_CHAR *src);
static MVL_REQ_PEND *send_file_read (MVL_NET_INFO *NetInfo,
MVL_FGET_REQ_INFO *u_file_info);
static MVL_REQ_PEND *send_file_close (MVL_NET_INFO *NetInfo,
MVL_FGET_REQ_INFO *u_file_info);
static ST_VOID u_fopen_done (MVL_REQ_PEND *req);
static ST_VOID u_fread_done (MVL_REQ_PEND *req);
static ST_VOID u_fclose_done (MVL_REQ_PEND *req);
/************************************************************************/
/* mvla_fget */
/* Perform an asynchronous file copy */
/************************************************************************/
ST_RET mvla_fget (
MVL_NET_INFO *net_info,
ST_CHAR *srcfilename,
ST_CHAR *destfilename,
MVL_FGET_REQ_INFO *fget_req_info)
{
MVL_REQ_PEND *req_out;
ST_CHAR tmpfile_path[MVL_MAX_TMPFILE_PATH];
/* save destination name for rename */
if (strlen (destfilename) <= MAX_FILE_NAME)
{
strcpy (fget_req_info->destfilename, destfilename);
}
else
{
MVL_LOG_NERR0 ("ERROR: mvla_fget: destination filename save failed ");
return (SD_FAILURE);
}
/* save source name for returning copy status */
if (strlen (srcfilename) <= MAX_FILE_NAME)
{
strcpy (fget_req_info->srcfilename, srcfilename);
}
else
{
MVL_LOG_NERR0 ("ERROR: mvla_fget: source filename save failed ");
return (SD_FAILURE);
}
/* Create a temporary file name to copy into. This prevents partially */
/* transferred files from hanging around and being accidently used */
/* Open the created temporary file. Send a file open request for the */
/* source file specified. */
_mvl_getpath (destfilename, tmpfile_path);
if (_mvl_tmpnam (fget_req_info->tempfilename, tmpfile_path) != SD_SUCCESS ||
(fget_req_info->fp = fopen(fget_req_info->tempfilename, "wb")) == NULL ||
(req_out = send_file_open (net_info, srcfilename)) == NULL)
{
if (fget_req_info->fp )
{
MVL_LOG_NERR1 ("ERROR: mvla_fget: fopen (%s) failed ",
fget_req_info->srcfilename);
if (fclose (fget_req_info->fp)!=0) /* close temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: fclose of temp file (%s) failed ",
fget_req_info->tempfilename);
}
if (remove (fget_req_info->tempfilename)!=0) /* get rid of temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: remove of temp file (%s) failed ",
fget_req_info->tempfilename);
}
}
else
{ /* no temp file created */
MVL_LOG_NERR0 ("ERROR: mvla_fget: temp file creation failed ");
}
return(SD_FAILURE);
}
else
{
req_out->v = fget_req_info;
return (SD_SUCCESS);
}
} /* mvla_fget */
/************************************************************************/
/* send_file_open */
/* Send a file open request to open source file on the other side */
/************************************************************************/
MVL_REQ_PEND *send_file_open (MVL_NET_INFO *NetInfo, ST_CHAR *src)
{
MVL_REQ_PEND *req= NULL;
if ((mvla_fopen(NetInfo, src, 0, &req)) == SD_SUCCESS)
{
req->u_req_done = u_fopen_done;
}
return (req);
} /* send_file_open */
/************************************************************************/
/* u_fopen_done */
/* It was indicated that a file open request was made */
/* Confirm file open response that was received as a result of a request*/
/************************************************************************/
static ST_VOID u_fopen_done( MVL_REQ_PEND *req)
{
ST_RET ret;
MVL_REQ_PEND *freadreq= NULL;
MVL_FGET_REQ_INFO *fget_req_info;
FOPEN_RESP_INFO *resp_info;
ERR_INFO *err_ptr;
REJECT_RESP_INFO *rej_ptr;
fget_req_info = (MVL_FGET_REQ_INFO *) req->v;
ret = req->result;
if (ret == SD_SUCCESS) /* open of source file succeeded */
{
resp_info = req->u.fopen.resp_info;
fget_req_info ->frsmid = resp_info->frsmid;
fget_req_info ->fsize = resp_info->ent.fsize;
if ((freadreq = send_file_read (req->net_info, fget_req_info)) != NULL)
{
freadreq->v = fget_req_info;
}
else
{
MVL_LOG_NERR1 ("ERROR: u_fopen_done: send_file_read (%s) failed ",
fget_req_info->srcfilename);
ret = SD_FAILURE;
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
}
} /* file open succeeded */
else
{ /* file open failed */
MVL_LOG_NERR1 ("ERROR: u_fopen_done: mvla_fopen (%s) failed ",
fget_req_info->srcfilename);
if (req->result==MVL_ERR_CNF_REJ_ERR)
{
rej_ptr = (REJECT_RESP_INFO *) req->event->u.mms.dec_rslt.data_ptr;
MVLU_LOG_FLOW3 ("MMS REJECT \n detected_here = %d \n invoke_known = %d invoke = %d",
req->reject_info->detected_here,
req->reject_info->invoke_known,
req->reject_info->invoke);
MVLU_LOG_CFLOW3 ("pdu_type = %d \n rej_class = %d \n rej_code = %d",
req->reject_info->pdu_type,
req->reject_info->rej_class,
req->reject_info->rej_code);
}
if (req->result==MVL_ERR_CNF_ERR_OK)
{
err_ptr = (ERR_INFO *) req->event->u.mms.dec_rslt.data_ptr;
MVLU_LOG_FLOW2 ("MMS ERROR RESPONSE \n class = %d, code = %d",
req->error_info->eclass,
req->error_info->code);
}
if (fclose (fget_req_info->fp)!=0) /* close temporary file */
{
MVL_LOG_ERR1 ("ERROR: u_fopen_done: fclose of temp file (%s) failed ",
fget_req_info->tempfilename);
}
if (remove (fget_req_info->tempfilename)!=0) /* get rid of temporary file */
MVL_LOG_ERR1 ("ERROR: u_fopen_done: remove of temp file (%s) failed ",
fget_req_info->tempfilename);
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
} /* file open failed */
mvl_free_req_ctrl (req);
} /* u_fopen_done */
/************************************************************************/
/* send_file_read */
/* Send a file read request to copy a block of the source file data */
/************************************************************************/
MVL_REQ_PEND *send_file_read (MVL_NET_INFO *NetInfo,
MVL_FGET_REQ_INFO *fget_req_info)
{
MVL_REQ_PEND *req= NULL;
FREAD_REQ_INFO fread_req;
fread_req.frsmid = fget_req_info->frsmid;
if ((mvla_fread (NetInfo, &fread_req, &req)) == SD_SUCCESS)
{
req->u_req_done = u_fread_done;
}
return (req);
} /* send_file_read */
/************************************************************************/
/* u_fread_done */
/* Confirm the file read response sent to indicate a read request */
/************************************************************************/
static ST_VOID u_fread_done( MVL_REQ_PEND *req)
{
ST_RET ret;
MVL_REQ_PEND *freadreq= NULL;
MVL_REQ_PEND *fclosereq= NULL;
MVL_FGET_REQ_INFO *fget_req_info;
FREAD_RESP_INFO *resp_info;
fget_req_info = (MVL_FGET_REQ_INFO *) req->v;
ret = req->result;
if (ret == SD_SUCCESS) /* read succeeded */
{
resp_info = req->u.fread.resp_info;
if ( fwrite (resp_info->filedata, sizeof(ST_CHAR), resp_info->fd_len, fget_req_info->fp)
== (unsigned) resp_info->fd_len )
{
if ( resp_info->more_follows == SD_TRUE)
{
if ((freadreq = send_file_read (req->net_info, fget_req_info)) != NULL)
{
freadreq->v = fget_req_info; /* if more file data request to read another block */
}
else
{ /* read failed */
MVL_LOG_NERR1 ("ERROR: u_fread_done: send_file_read (%s) failed ",
fget_req_info->srcfilename);
ret = SD_FAILURE;
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
}
} /* more file data to be copied */
else
{ /* no more file data to be copied */
if ((fclosereq = send_file_close (req->net_info, fget_req_info)) != NULL)
{
fclosereq->v = fget_req_info; /* no more file data so send a file close request */
}
else
{
MVL_LOG_NERR1 ("ERROR: u_fread_done: send_file_close (%s) failed ",
fget_req_info->srcfilename);
ret = SD_FAILURE;
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
}
}
} /* writing data to temp file succeeded */
else
{ /* write failed */
MVL_LOG_NERR0 ("ERROR: u_fread_done: fwrite failed ");
ret = SD_FAILURE;
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
} /* write failed */
} /* read of data in source file succeeded */
else
{ /* read failed so close and remove temp file */
MVL_LOG_NERR1 ("ERROR: u_fread_done: mvla_fread (%s) failed ",
fget_req_info->srcfilename);
if (fclose (fget_req_info->fp)!=0) /* close temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: fclose of temp file (%s) failed ",
fget_req_info->tempfilename);
}
if (remove (fget_req_info->tempfilename)!=0) /* get rid of temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: remove of temp file (%s) failed ",
fget_req_info->tempfilename);
}
/* stop copy file process and report error to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
} /* read failed */
mvl_free_req_ctrl (req);
} /* u_fread_done */
/************************************************************************/
/* send_file_close */
/* No more data to read from the source file so send a request to close */
/* the source file */
/************************************************************************/
MVL_REQ_PEND *send_file_close (MVL_NET_INFO *NetInfo,
MVL_FGET_REQ_INFO *fget_req_info)
{
MVL_REQ_PEND *req= NULL;
FCLOSE_REQ_INFO fclose_req;
fclose_req.frsmid = fget_req_info->frsmid;
if ((mvla_fclose (NetInfo, &fclose_req, &req)) == SD_SUCCESS)
{
req->u_req_done = u_fclose_done;
}
return (req);
} /* send_file_close */
/************************************************************************/
/* u_fclose_done */
/* Confirm source file closed response */
/************************************************************************/
static ST_VOID u_fclose_done( MVL_REQ_PEND *req)
{
ST_RET ret;
MVL_FGET_REQ_INFO *fget_req_info;
fget_req_info = (MVL_FGET_REQ_INFO *) req->v;
ret = req->result;
if (ret == SD_SUCCESS) /* close of source file succeeded */
{
if (fclose (fget_req_info->fp)!=0) /* close the temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: fclose of temp file (%s) failed ",
fget_req_info->tempfilename);
}
/* Remove dest file so temp file can be renamed to it. */
/* NOTE: remove may fail if file did not already exist. */
remove (fget_req_info->destfilename);
/* rename the temporary file to become the requested destination file */
/* use the ANSI rename function if available on your OS */
/* otherwise use other function appropriate for your system */
if (rename (fget_req_info->tempfilename, fget_req_info->destfilename))
{
MVL_LOG_ERR1 ("ERROR: u_fclose_done: rename (%s) failed ",
fget_req_info->tempfilename);
if (remove (fget_req_info->tempfilename)!=0) /* cleanup useless file */
{
MVL_LOG_ERR1 ("ERROR: u_fclose_done: remove (%s) failed ",
fget_req_info->tempfilename);
}
ret = SD_FAILURE;
}
else
{
}
} /* close succeeded */
else
{ /* close failed */
MVL_LOG_NERR1 ("ERROR: u_fclose_done: mvla_fclose (%s) failed ",
fget_req_info->srcfilename);
if (fclose (fget_req_info->fp)!=0) /* close temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: fclose of temp file (%s) failed ",
fget_req_info->tempfilename);
}
if (remove (fget_req_info->tempfilename)!=0) /* get rid of temporary file */
{
MVL_LOG_ERR1 ("ERROR: mvla_fget: remove of temp file (%s) failed ",
fget_req_info->tempfilename);
}
}
/* copy file process complete so report done and status to user */
fget_req_info->fget_done = SD_TRUE;
fget_req_info->fget_error = ret;
if (fget_req_info->fget_cnf_ptr)
(*fget_req_info->fget_cnf_ptr)(fget_req_info);
mvl_free_req_ctrl (req);
} /* end u_fclose_done */