467 lines
16 KiB
C
467 lines
16 KiB
C
/************************************************************************/
|
||
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
/************************************************************************/
|
||
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
/* 1998 - 1999, All Rights Reserved */
|
||
/* */
|
||
/* MODULE NAME : s_obtfi.c */
|
||
/* PRODUCT(S) : MMSEASE-LITE */
|
||
/* */
|
||
/* MODULE DESCRIPTION : */
|
||
/* */
|
||
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||
/* _mvl_process_obtfile_ind */
|
||
/* mplas_obtfile_resp */
|
||
/* */
|
||
/* MODIFICATION LOG : */
|
||
/* Date Who Rev Comments */
|
||
/* -------- --- ------ ------------------------------------------- */
|
||
/* 11/12/07 MDE 10 Use _mvl_getpath for temp file path */
|
||
/* 04/09/07 MDE 09 Enhanced filtered logging */
|
||
/* 10/17/06 MDE 08 Added mvlas_obtfile_resp_ex */
|
||
/* 01/30/06 GLB 07 Integrated porting changes for VMS */
|
||
/* 02/04/03 MDE 06 Now use _mvl_tmpnam */
|
||
/* 09/21/01 JRB 05 Alloc global bufs only once at startup. */
|
||
/* 04/14/00 EJV 04 Added check for more error conditions in */
|
||
/* u_fopen_done and u_fread_done */
|
||
/* 03/21/00 JRB 03 Send err resp if tmpnam or fopen fails. */
|
||
/* 01/21/00 MDE 02 Now use MEM_SMEM for dynamic memory */
|
||
/* 10/15/99 GLB 01 Created to add Obtain File function */
|
||
/************************************************************************/
|
||
|
||
#include "glbtypes.h"
|
||
#include "sysincs.h"
|
||
#include "glbsem.h"
|
||
|
||
#include "mmsdefs.h"
|
||
#include "mms_pvmd.h"
|
||
#include "mvl_defs.h"
|
||
#include "mvl_log.h"
|
||
|
||
#include <stdio.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
|
||
|
||
typedef struct filecopyinfo
|
||
{
|
||
ST_CHAR tempfilename[MVL_MAX_TMPNAM_LEN+1];
|
||
ST_CHAR destfilename[MAX_FILE_NAME+1];
|
||
MVL_IND_PEND *indCtrl;
|
||
FILE *fp;
|
||
ST_INT32 frsmid;
|
||
ST_UINT32 fsize;
|
||
ST_UINT32 fileSizeLimit;
|
||
} MVL_OBTFILE_STATE;
|
||
|
||
MVL_REQ_PEND *send_file_open (MVL_NET_INFO *NetInfo, ST_CHAR *src);
|
||
MVL_REQ_PEND *send_file_read (MVL_NET_INFO *NetInfo,
|
||
MVL_OBTFILE_STATE *u_file_info);
|
||
MVL_REQ_PEND *send_file_close (MVL_NET_INFO *NetInfo,
|
||
MVL_OBTFILE_STATE *u_file_info);
|
||
ST_VOID u_fopen_done (MVL_REQ_PEND *req);
|
||
ST_VOID u_fread_done( MVL_REQ_PEND *req);
|
||
ST_VOID u_fclose_done( MVL_REQ_PEND *req);
|
||
|
||
|
||
/************************************************************************/
|
||
/************************************************************************/
|
||
/* _mvl_process_obtfile_ind */
|
||
/* An Obtain File request has been sent and */
|
||
/* An Obtain File indication was received, so process it and respond */
|
||
/************************************************************************/
|
||
|
||
ST_VOID _mvl_process_obtfile_ind (MVL_IND_PEND *indCtrl)
|
||
{
|
||
OBTFILE_REQ_INFO *req_info;
|
||
MVLAS_OBTFILE_CTRL *obtfile;
|
||
FILE_NAME *fname_idx;
|
||
|
||
|
||
req_info = (OBTFILE_REQ_INFO *) indCtrl->event->u.mms.dec_rslt.data_ptr;
|
||
fname_idx = (FILE_NAME *)(req_info + 1);
|
||
|
||
obtfile = &indCtrl->u.obtfile;
|
||
|
||
if (_mvl_concat_filename (obtfile->srcfilename, req_info->num_of_src_fname,
|
||
fname_idx, sizeof (obtfile->srcfilename)))
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: _mvl_process_obtfile_ind failed (_mvl_concat_filename(srcfilename) failed)");
|
||
_mplas_err_resp (indCtrl,11,3); /* 3 = File name syntax error */
|
||
return;
|
||
}
|
||
|
||
if (_mvl_concat_filename (obtfile->destfilename, req_info->num_of_dest_fname,
|
||
(FILE_NAME *)(fname_idx + req_info->num_of_src_fname),
|
||
sizeof (obtfile->destfilename)))
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: _mvl_process_obtfile_ind failed (_mvl_concat_filename(destfilename) failed)");
|
||
_mplas_err_resp (indCtrl,11,3); /* 3 = File name syntax error */
|
||
return;
|
||
}
|
||
|
||
u_mvl_obtfile_ind (indCtrl);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* mvlas_obtfile_resp */
|
||
/* Open a temp file to copy into and save the destination file name */
|
||
/************************************************************************/
|
||
|
||
ST_VOID mvlas_obtfile_resp (MVL_IND_PEND *indCtrl)
|
||
{
|
||
mvlas_obtfile_resp_ex (indCtrl, 0);
|
||
}
|
||
|
||
extern int mms_filename_conv(char *mms_name,char *sys_name);
|
||
ST_VOID mvlas_obtfile_resp_ex (MVL_IND_PEND *indCtrl, ST_UINT32 fileSizeLimit)
|
||
{
|
||
MVL_OBTFILE_STATE *obtfile_state;
|
||
MVL_REQ_PEND *req;
|
||
MVLAS_OBTFILE_CTRL *obtfile;
|
||
int ret;
|
||
ST_CHAR tmpfile_path[MVL_MAX_TMPFILE_PATH];
|
||
ST_CHAR destfilename[MVL_MAX_TMPFILE_PATH];
|
||
|
||
obtfile = &indCtrl->u.obtfile;
|
||
|
||
obtfile_state = (MVL_OBTFILE_STATE *) M_CALLOC (MSMEM_GEN, 1, sizeof (MVL_OBTFILE_STATE));
|
||
/* save destination name for rename */
|
||
|
||
/*<2A>ļ<EFBFBD><C4BC><EFBFBD>ӳ<EFBFBD><D3B3>*/
|
||
ret = mms_filename_conv(obtfile->destfilename,destfilename);
|
||
if(!ret) printf("<EFBFBD>ļ<EFBFBD>%sӳ<73><D3B3>ʧ<EFBFBD><CAA7>...\n\r",obtfile->destfilename);
|
||
strcpy(obtfile->destfilename,destfilename);
|
||
|
||
/*renxiaobao <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||
tmpfile_path[0] = 0;
|
||
if(obtfile->destfilename[0]!='/') strcpy (tmpfile_path, "/");
|
||
strcat (tmpfile_path, obtfile->destfilename);
|
||
strcpy(obtfile->destfilename,tmpfile_path);*/
|
||
|
||
strncpy (obtfile_state->destfilename, obtfile->destfilename, MAX_FILE_NAME+1);
|
||
|
||
obtfile_state->indCtrl = indCtrl;
|
||
/* 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 the file open request. */
|
||
|
||
_mvl_getpath (destfilename, tmpfile_path);
|
||
|
||
if (_mvl_tmpnam (obtfile_state->tempfilename, tmpfile_path) != SD_SUCCESS ||
|
||
(obtfile_state->fp = fopen(obtfile_state->tempfilename, "wb")) == NULL ||
|
||
(req = send_file_open (indCtrl->event->net_info,obtfile->srcfilename)) == NULL)
|
||
{
|
||
if ( obtfile_state->fp )
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: mvlas_obtfile_resp failed (fopen failed)");
|
||
fclose (obtfile_state->fp); /* close temporary file */
|
||
remove (obtfile_state->tempfilename); /* get rid of temporary file */
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR1 ("ObtFile: mvlas_obtfile_resp failed (invalid tmpnam (%s) or send_file_open failed)",
|
||
obtfile_state->tempfilename);
|
||
}
|
||
_mplas_err_resp (indCtrl,11,0); /* 0 = other */
|
||
}
|
||
else
|
||
{
|
||
req->v = obtfile_state;
|
||
obtfile_state->fileSizeLimit = fileSizeLimit;
|
||
}
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* send_file_open */
|
||
/* Send a file open request to open 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);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* 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*/
|
||
/************************************************************************/
|
||
|
||
ST_VOID u_fopen_done( MVL_REQ_PEND *req)
|
||
{
|
||
ST_RET ret;
|
||
MVL_REQ_PEND *freadreq= NULL;
|
||
MVL_OBTFILE_STATE *obtfile_state;
|
||
FOPEN_RESP_INFO *resp_info;
|
||
#if 0
|
||
ERR_INFO *err_ptr;
|
||
REJECT_RESP_INFO *rej_ptr;
|
||
#endif
|
||
|
||
obtfile_state = (MVL_OBTFILE_STATE *) req->v;
|
||
ret = req->result;
|
||
if (ret == SD_SUCCESS)
|
||
{
|
||
resp_info = req->u.fopen.resp_info;
|
||
if (obtfile_state->fileSizeLimit > 0 &&
|
||
(resp_info->ent.fsize > obtfile_state->fileSizeLimit))
|
||
{
|
||
MVL_LOG_NERR2 ("ObtFile error: file size %ld exceeds limit %ld",
|
||
resp_info->ent.fsize, obtfile_state->fileSizeLimit);
|
||
ret = SD_FAILURE;
|
||
}
|
||
else
|
||
{
|
||
|
||
obtfile_state ->frsmid = resp_info->frsmid;
|
||
obtfile_state ->fsize = resp_info->ent.fsize;
|
||
if ((freadreq = send_file_read (req->net_info, obtfile_state)) != NULL)
|
||
{
|
||
freadreq->v = obtfile_state;
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fopen_done failed (send_file_read failed)");
|
||
ret = SD_FAILURE;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fopen_done failed (mvla_fopen failed)");
|
||
}
|
||
if ( ret != SD_SUCCESS )
|
||
{ /* file open failed */
|
||
#if 0
|
||
if (req->result==MVL_ERR_CNF_REJ_ERR)
|
||
{
|
||
rej_ptr = (REJECT_RESP_INFO *) req->event->u.mms.dec_rslt.data_ptr;
|
||
printf ("\n MMS REJECT");
|
||
printf ("\n detected_here = %d",req->u.reject.resp_info->detected_here);
|
||
printf ("\n invoke_known = %d",req->u.reject.resp_info->invoke_known);
|
||
printf ("\n invoke = %d",req->u.reject.resp_info->invoke);
|
||
printf ("\n pdu_type = %d",req->u.reject.resp_info->pdu_type);
|
||
printf ("\n rej_class = %d",req->u.reject.resp_info->rej_class);
|
||
printf ("\n rej_code = %d",req->u.reject.resp_info->rej_code);
|
||
}
|
||
if (req->result==MVL_ERR_CNF_ERR_OK)
|
||
{
|
||
err_ptr = (ERR_INFO *) req->event->u.mms.dec_rslt.data_ptr;
|
||
printf ("\n MMS ERROR RESPONSE");
|
||
printf ("\n class = %d, code = %d", req->u.error.resp_info->eclass,
|
||
req->u.error.resp_info->code);
|
||
|
||
}
|
||
#endif
|
||
fclose (obtfile_state->fp); /* close temporary file */
|
||
remove (obtfile_state->tempfilename); /* get rid of temporary file */
|
||
if (req->net_info->conn_active == SD_TRUE)
|
||
_mplas_err_resp (obtfile_state->indCtrl,11,0); /* 0 = other */
|
||
M_FREE (MSMEM_GEN, obtfile_state);
|
||
}
|
||
mvl_free_req_ctrl (req);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* send_file_read */
|
||
/* Send a file read request to obtain a block of the file data */
|
||
/************************************************************************/
|
||
|
||
MVL_REQ_PEND *send_file_read (MVL_NET_INFO *NetInfo,
|
||
MVL_OBTFILE_STATE *obtfile_state)
|
||
{
|
||
MVL_REQ_PEND *req= NULL;
|
||
|
||
FREAD_REQ_INFO fread_req;
|
||
|
||
fread_req.frsmid = obtfile_state->frsmid;
|
||
if ((mvla_fread (NetInfo, &fread_req, &req)) == SD_SUCCESS)
|
||
{
|
||
req->u_req_done = u_fread_done;
|
||
}
|
||
|
||
return (req);
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* u_fread_done */
|
||
/* Confirm the file read response sent to indicate a read request */
|
||
/************************************************************************/
|
||
|
||
ST_VOID u_fread_done( MVL_REQ_PEND *req)
|
||
{
|
||
ST_RET ret;
|
||
MVL_REQ_PEND *freadreq= NULL;
|
||
MVL_REQ_PEND *fclosereq= NULL;
|
||
MVL_OBTFILE_STATE *obtfile_state;
|
||
FREAD_RESP_INFO *resp_info;
|
||
|
||
obtfile_state = (MVL_OBTFILE_STATE *) req->v;
|
||
|
||
ret = req->result;
|
||
if (ret == SD_SUCCESS)
|
||
{
|
||
resp_info = req->u.fread.resp_info;
|
||
|
||
if ( fwrite (resp_info->filedata, sizeof(ST_CHAR), resp_info->fd_len, obtfile_state->fp)
|
||
== (unsigned) resp_info->fd_len )
|
||
{
|
||
if ( resp_info->more_follows == SD_TRUE)
|
||
{
|
||
if ((freadreq = send_file_read (req->net_info, obtfile_state)) != NULL)
|
||
{
|
||
freadreq->v = obtfile_state; /* if more file data request to read another block */
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fread_done failed (send_file_read failed)");
|
||
ret = SD_FAILURE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ((fclosereq = send_file_close (req->net_info, obtfile_state)) != NULL)
|
||
{
|
||
fclosereq->v = obtfile_state; /* no more file data so send a file close request */
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fread_done failed (send_file_close failed)");
|
||
ret = SD_FAILURE;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* write failed */
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fread_done failed (fwrite failed)");
|
||
ret = SD_FAILURE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fread_done failed (mvla_fread failed)");
|
||
}
|
||
|
||
if (ret != SD_SUCCESS )
|
||
{ /* read failed so close and remove temp file */
|
||
fclose (obtfile_state->fp);
|
||
remove (obtfile_state->tempfilename); /* may fail if file nonexistent */
|
||
if (req->net_info->conn_active == SD_TRUE)
|
||
_mplas_err_resp (obtfile_state->indCtrl,11,0); /* 0 = Other */
|
||
M_FREE (MSMEM_GEN, obtfile_state);
|
||
}
|
||
|
||
mvl_free_req_ctrl (req);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* send_file_close */
|
||
/* No more data to read from file so send a request to close the file */
|
||
/************************************************************************/
|
||
|
||
MVL_REQ_PEND *send_file_close (MVL_NET_INFO *NetInfo,
|
||
MVL_OBTFILE_STATE *obtfile_state)
|
||
{
|
||
MVL_REQ_PEND *req= NULL;
|
||
FCLOSE_REQ_INFO fclose_req;
|
||
|
||
fclose_req.frsmid = obtfile_state->frsmid;
|
||
if ((mvla_fclose (NetInfo, &fclose_req, &req)) == SD_SUCCESS)
|
||
{
|
||
req->u_req_done = u_fclose_done;
|
||
}
|
||
|
||
return (req);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* u_fclose_done */
|
||
/* Confirm file closed response */
|
||
/************************************************************************/
|
||
int obtfile_call_back(MVL_IND_PEND *indCtrl);
|
||
ST_VOID u_fclose_done( MVL_REQ_PEND *req)
|
||
{
|
||
int ret;
|
||
MVL_OBTFILE_STATE *obtfile_state;
|
||
|
||
obtfile_state = (MVL_OBTFILE_STATE *) req->v;
|
||
|
||
if (req->result == SD_SUCCESS) /* close succeeded */
|
||
{
|
||
|
||
/* always close transferred file, rename and remove temp file */
|
||
fclose (obtfile_state->fp); /* close temp file */
|
||
remove (obtfile_state->destfilename); /* may fail if file nonexistent */
|
||
|
||
/* 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 (obtfile_state->tempfilename, obtfile_state->destfilename))
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fclose_done failed (rename failed)");
|
||
printf("ObtFile error: %s-%s)",obtfile_state->tempfilename, obtfile_state->destfilename);
|
||
remove (obtfile_state->tempfilename); /* cleanup useless file */
|
||
_mplas_err_resp (obtfile_state->indCtrl, 11, 0); /* 0 = other file error */
|
||
}
|
||
else /* send an obtainfile response */
|
||
{
|
||
ret = obtfile_call_back (obtfile_state->indCtrl);
|
||
if(ret==0) mplas_obtfile_resp (obtfile_state->indCtrl);
|
||
else _mplas_err_resp (obtfile_state->indCtrl, 11, 0);
|
||
/* mplas_obtfile_resp (obtfile_state->indCtrl); */
|
||
}
|
||
|
||
}
|
||
else /* close failed */
|
||
{
|
||
MVL_LOG_ERR0 ("ObtFile error: u_fclose_done failed (mvla_fclose failed)");
|
||
|
||
/* always close transferred file, rename and remove temp file */
|
||
fclose (obtfile_state->fp); /* close temp file */
|
||
|
||
remove (obtfile_state->tempfilename); /* cleanup useless file */
|
||
/* but don't send an obtainfile response */
|
||
|
||
if (req->net_info->conn_active == SD_TRUE)
|
||
_mplas_err_resp (obtfile_state->indCtrl,11,0); /* 0 = other */
|
||
}
|
||
|
||
M_FREE (MSMEM_GEN, obtfile_state);
|
||
mvl_free_req_ctrl (req);
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* mplas_obtfile_resp */
|
||
/* Send a response to confirm the obtain file request that prompted the */
|
||
/* reading of file data */
|
||
/************************************************************************/
|
||
ST_VOID mplas_obtfile_resp (MVL_IND_PEND *indCtrl)
|
||
{
|
||
ST_RET rc;
|
||
|
||
/* Build an Obtain File Response with Null to confirm */
|
||
rc = mpl_obtfile_resp (indCtrl->event->u.mms.dec_rslt.id);
|
||
if (rc == SD_SUCCESS)
|
||
mpl_resp_log (indCtrl, NULL);
|
||
|
||
_mvl_send_resp_i (indCtrl, rc);
|
||
|
||
|
||
}
|
||
|