461 lines
16 KiB
C
461 lines
16 KiB
C
|
|
/************************************************************************/
|
||
|
|
/* 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 */
|
||
|
|
|
||
|
|
|