96 lines
2.5 KiB
C
96 lines
2.5 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001, 2009 Fidelity Information Services, Inc *
|
||
|
* *
|
||
|
* This source code contains the intellectual property *
|
||
|
* of its copyright holder(s), and is made available *
|
||
|
* under a license. If you do not know the terms of *
|
||
|
* the license, please stop and do not read further. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
|
||
|
#include "errno.h"
|
||
|
#include "eintr_wrappers.h"
|
||
|
|
||
|
#include "gtm_string.h"
|
||
|
#include "gtm_stat.h"
|
||
|
#include "gtm_unistd.h"
|
||
|
#include "gdsroot.h"
|
||
|
#include "gdsbt.h"
|
||
|
#include "parse_file.h"
|
||
|
#include "gtm_file_stat.h"
|
||
|
#include "gtmmsg.h"
|
||
|
|
||
|
#define DOT '.'
|
||
|
|
||
|
/* Checks the status of a file.
|
||
|
* Output Parameter
|
||
|
* uint4 *status : error number
|
||
|
* Returns:
|
||
|
* FILE_NOT_FOUND: if file is not presnt
|
||
|
* FILE_PRESENT: if file is present
|
||
|
* FILE_READONLY|FILE_PRESENT: if file is readonly
|
||
|
* FILE_STAT_ERROR: if error happens during this module.
|
||
|
* Side Effect: Except for FILE_STAT_ERROR passed "ret" will have file name with full path.
|
||
|
*/
|
||
|
int gtm_file_stat(mstr *file, mstr *def, mstr *ret, boolean_t check_prv, uint4 *status)
|
||
|
{
|
||
|
int stat_res;
|
||
|
struct stat stat_buf;
|
||
|
char fbuff[MAX_FBUFF + 1];
|
||
|
parse_blk pblk;
|
||
|
mstr tmp_str, *tmpfile;
|
||
|
boolean_t file_not_found = FALSE;
|
||
|
|
||
|
tmpfile = &tmp_str;
|
||
|
if (NULL != def)
|
||
|
{
|
||
|
memset(&pblk, 0, SIZEOF(pblk));
|
||
|
pblk.buffer = fbuff;
|
||
|
pblk.buff_size = MAX_FBUFF;
|
||
|
pblk.fop = (F_SYNTAXO | F_PARNODE);
|
||
|
memcpy(fbuff, file->addr, file->len);
|
||
|
*(fbuff + file->len) = '\0';
|
||
|
if (NULL != def)
|
||
|
{
|
||
|
pblk.def1_buf = def->addr;
|
||
|
pblk.def1_size = def->len;
|
||
|
}
|
||
|
*status = parse_file(file, &pblk);
|
||
|
if (!(*status & 1))
|
||
|
file_not_found = TRUE;
|
||
|
pblk.buffer[pblk.b_esl] = 0;
|
||
|
tmpfile->addr = pblk.buffer;
|
||
|
tmpfile->len = pblk.b_esl;
|
||
|
} else
|
||
|
{
|
||
|
tmpfile = file;
|
||
|
tmpfile->addr[tmpfile->len] = 0;
|
||
|
}
|
||
|
if (!file_not_found)
|
||
|
{
|
||
|
STAT_FILE((char *)tmpfile->addr, &stat_buf, stat_res);
|
||
|
if (0 != stat_res)
|
||
|
{
|
||
|
*status = errno;
|
||
|
if (ENOENT == errno)
|
||
|
file_not_found = TRUE;
|
||
|
else
|
||
|
return FILE_STAT_ERROR;
|
||
|
}
|
||
|
}
|
||
|
if (NULL != ret)
|
||
|
/* We asume ret->addr has MAX_FN_LEN bytes allocated */
|
||
|
if (!get_full_path((char *)tmpfile->addr, tmpfile->len, ret->addr, (unsigned int *) &ret->len, MAX_FN_LEN, status))
|
||
|
return FILE_STAT_ERROR;
|
||
|
if (file_not_found)
|
||
|
return FILE_NOT_FOUND;
|
||
|
/* Now we know file is present */
|
||
|
if (check_prv && 0 != ACCESS((char *)tmpfile->addr, W_OK))
|
||
|
return (FILE_PRESENT | FILE_READONLY);
|
||
|
else
|
||
|
return FILE_PRESENT;
|
||
|
}
|