自主协议库编译通过
This commit is contained in:
231
mmslib/mvlu/c_fdir.c
Normal file
231
mmslib/mvlu/c_fdir.c
Normal file
@@ -0,0 +1,231 @@
|
||||
/************************************************************************/
|
||||
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||||
/************************************************************************/
|
||||
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||||
/* 1998 - 1998, All Rights Reserved */
|
||||
/* */
|
||||
/* MODULE NAME : c_fdir.c */
|
||||
/* PRODUCT(S) : MMSEASE-LITE */
|
||||
/* */
|
||||
/* MODULE DESCRIPTION : */
|
||||
/* */
|
||||
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||||
/* mvl_fdir */
|
||||
/* mvla_fdir */
|
||||
/* _mvl_process_fdir_conf */
|
||||
/* */
|
||||
/* WARNING: these functions were designed to be as easy as possible to */
|
||||
/* use for MOST applications. They will work for any system where */
|
||||
/* filenames can be represented as a single NULL terminated string. */
|
||||
/* They do NOT support filenames with multiple parts or which contain */
|
||||
/* If these features are needed, then the more complicated mpl_fdir */
|
||||
/* must be used directly. */
|
||||
/* */
|
||||
/* MODIFICATION LOG : */
|
||||
/* Date Who Rev Comments */
|
||||
/* -------- --- ------ ------------------------------------------- */
|
||||
/* 04/09/07 MDE 14 Enhanced filtered logging */
|
||||
/* 11/01/01 JRB 13 mvl_wait_req_done now returns ST_RET. */
|
||||
/* 09/21/01 JRB 12 Alloc global bufs only once at startup. */
|
||||
/* 03/07/01 JRB 11 Del LOCK on sync functs: caused deadlocks. */
|
||||
/* 03/08/00 JRB 10 Del #ifdef MVL_REQ_BUF_ENABLED: not used. */
|
||||
/* Del mvl_free_req_ctrl call. User must call. */
|
||||
/* Del invoke_id, numpend_req: see mvl_send_req.*/
|
||||
/* 01/21/00 MDE 09 Now use MEM_SMEM for dynamic memory */
|
||||
/* 01/21/00 MDE 08 Use '_mvl_get_req_buf' for MVL_REQ_BUF_EN.. */
|
||||
/* 11/19/99 NAV 07 Add #ifdef MVL_REQ_BUF_ENABLED */
|
||||
/* 10/26/99 NAV 06 Add maxpend_req support to aynsc functions */
|
||||
/* 09/13/99 MDE 05 Added SD_CONST modifiers */
|
||||
/* 11/17/98 MDE 04 Now use MVL_ERR_COMM_SERVE_ACTIVE error code */
|
||||
/* Use MVL_SYNC_REQ_INTERFACE */
|
||||
/* 11/16/98 MDE 03 Renamed internal functions (prefix '_') */
|
||||
/* 06/15/98 MDE 02 Changes to allow compile under C++ */
|
||||
/* 03/27/98 JRB 01 MMS-LITE V4.0 Release */
|
||||
/************************************************************************/
|
||||
|
||||
#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
|
||||
|
||||
/************************************************************************/
|
||||
/* mvl_fdir */
|
||||
/************************************************************************/
|
||||
|
||||
#if defined(MVL_SYNC_REQ_INTERFACE)
|
||||
|
||||
ST_RET mvl_fdir (
|
||||
MVL_NET_INFO *net_info,
|
||||
ST_CHAR *filename,
|
||||
ST_CHAR *ca_filename,
|
||||
MVL_REQ_PEND **req_out)
|
||||
{
|
||||
ST_RET rc;
|
||||
|
||||
if (_mvl_comm_serve_active == SD_TRUE)
|
||||
{
|
||||
MVL_LOG_NERR0 ("Error: mvl_comm_serv active");
|
||||
return (MVL_ERR_COMM_SERVE_ACTIVE);
|
||||
}
|
||||
|
||||
rc = mvla_fdir (net_info, filename, ca_filename, req_out);
|
||||
if (rc == SD_SUCCESS)
|
||||
rc = mvl_wait_req_done (*req_out);
|
||||
return (rc);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/************************************************************************/
|
||||
/* mvla_fdir */
|
||||
/************************************************************************/
|
||||
|
||||
ST_RET mvla_fdir (
|
||||
MVL_NET_INFO *net_info,
|
||||
ST_CHAR *filename,
|
||||
ST_CHAR *ca_filename,
|
||||
MVL_REQ_PEND **req_out)
|
||||
{
|
||||
ST_RET rc;
|
||||
MVL_REQ_PEND *req_pend;
|
||||
|
||||
*req_out = req_pend = _mvl_get_req_ctrl (net_info, MMSOP_FILE_DIR);
|
||||
if (!req_pend)
|
||||
return (MVL_ERR_REQ_CONTROL);
|
||||
req_pend->u.fdir.resp_info = NULL; /* Confirm funct must allocate */
|
||||
|
||||
S_LOCK_COMMON_RESOURCES ();
|
||||
rc = _mvla_send_fdir (net_info, filename, ca_filename, req_pend);
|
||||
S_UNLOCK_COMMON_RESOURCES ();
|
||||
return (rc);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* _mvla_send_fdir */
|
||||
/************************************************************************/
|
||||
/* Allocate FDIR_REQ_INFO with "one" FILE_NAME entry after it. */
|
||||
/* If need more than one FILE_NAME, must use "mpl_fdir". */
|
||||
#define FDIR_REQ_INFO_SIZE (sizeof (FDIR_REQ_INFO) + (2 * sizeof (FILE_NAME)))
|
||||
|
||||
ST_RET _mvla_send_fdir (MVL_NET_INFO *net_info,
|
||||
ST_CHAR *filename,
|
||||
ST_CHAR *ca_filename,
|
||||
MVL_REQ_PEND *req_pend)
|
||||
{
|
||||
ST_RET rc;
|
||||
FDIR_REQ_INFO *req_info;
|
||||
FILE_NAME *fname_idx;
|
||||
ST_CHAR fdir_req_info[FDIR_REQ_INFO_SIZE];
|
||||
|
||||
req_info = (FDIR_REQ_INFO *) fdir_req_info;
|
||||
if (filename)
|
||||
{
|
||||
req_info->filespec_pres = SD_TRUE;
|
||||
req_info->num_of_fs_fname = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
req_info->filespec_pres = SD_FALSE;
|
||||
req_info->num_of_fs_fname = 0;
|
||||
}
|
||||
|
||||
if (ca_filename)
|
||||
{
|
||||
req_info->cont_after_pres = SD_TRUE;
|
||||
req_info->num_of_ca_fname = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
req_info->cont_after_pres = SD_FALSE;
|
||||
req_info->num_of_ca_fname = 0;
|
||||
}
|
||||
|
||||
/* Point to first FILE_NAME structure. */
|
||||
fname_idx = (FILE_NAME *)(req_info + 1);
|
||||
|
||||
if (filename)
|
||||
{
|
||||
fname_idx->fn_len = strlen (filename);
|
||||
fname_idx->fname = filename;
|
||||
fname_idx++; /* point to next */
|
||||
}
|
||||
|
||||
if (ca_filename)
|
||||
{
|
||||
fname_idx->fn_len = strlen (ca_filename);
|
||||
fname_idx->fname = ca_filename;
|
||||
fname_idx++; /* point to next */
|
||||
}
|
||||
|
||||
/* Build a fdir request */
|
||||
rc = mpl_fdir (req_info);
|
||||
if (rc == SD_SUCCESS)
|
||||
mpl_req_log (req_pend, req_info);
|
||||
|
||||
rc = _mvl_send_req (net_info, req_pend, rc);
|
||||
return (rc);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* _mvl_process_fdir_conf */
|
||||
/************************************************************************/
|
||||
|
||||
ST_VOID _mvl_process_fdir_conf (MVL_REQ_PEND *req_pend)
|
||||
{
|
||||
FDIR_DIR_ENT *dir_ent;
|
||||
MVL_DIR_ENT *mvl_dir_ent;
|
||||
MVL_FDIR_RESP_INFO *mvl_resp_info;
|
||||
FDIR_RESP_INFO *resp_info;
|
||||
ST_INT j;
|
||||
ST_INT info_size;
|
||||
|
||||
resp_info = (FDIR_RESP_INFO *) req_pend->event->u.mms.dec_rslt.data_ptr;
|
||||
|
||||
/* Allocate and fill in "req_pend->u.fdir.resp_info". */
|
||||
/* CRITICAL: mvl_free_req_ctrl () must free it. */
|
||||
info_size = sizeof (MVL_FDIR_RESP_INFO) +
|
||||
resp_info->num_dir_ent * sizeof(MVL_DIR_ENT);
|
||||
req_pend->u.fdir.resp_info =
|
||||
(MVL_FDIR_RESP_INFO *) M_MALLOC (MSMEM_GEN, info_size);
|
||||
|
||||
mvl_resp_info = req_pend->u.fdir.resp_info; /* Local ptr to it. */
|
||||
mvl_resp_info->num_dir_ent = resp_info->num_dir_ent;
|
||||
mvl_resp_info->more_follows = resp_info->more_follows;
|
||||
mvl_resp_info->dir_ent = (MVL_DIR_ENT *) (mvl_resp_info + 1);
|
||||
if (resp_info->num_dir_ent)
|
||||
{
|
||||
dir_ent = (FDIR_DIR_ENT *)(resp_info + 1); /* point to first entry */
|
||||
mvl_dir_ent = mvl_resp_info->dir_ent; /* point to first entry */
|
||||
for (j = 0; j < resp_info->num_dir_ent; j++, mvl_dir_ent++)
|
||||
{
|
||||
mvl_dir_ent->fsize = dir_ent->fsize;
|
||||
mvl_dir_ent->mtimpres = dir_ent->mtimpres;
|
||||
mvl_dir_ent->mtime = dir_ent->mtime;
|
||||
|
||||
if (_mvl_concat_filename (mvl_dir_ent->filename, dir_ent->num_of_fname,
|
||||
(FILE_NAME *)(dir_ent + 1), sizeof (mvl_dir_ent->filename)))
|
||||
{
|
||||
MVL_LOG_ERR0 ("Error: FileDirectory.Conf: can't process filename");
|
||||
req_pend->result = SD_FAILURE;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Point to next dir entry. */
|
||||
dir_ent = (FDIR_DIR_ENT *) ((ST_CHAR *)dir_ent + sizeof (FDIR_DIR_ENT)
|
||||
+ dir_ent->num_of_fname * sizeof (FILE_NAME));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user