156 lines
4.8 KiB
C
156 lines
4.8 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2009, 2011 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 "gtm_fcntl.h"
|
|
#include "gtm_stat.h"
|
|
#include "gtm_unistd.h"
|
|
#include "gtm_permissions.h"
|
|
#include "gtm_string.h"
|
|
#include "gtm_stdio.h"
|
|
#include "gtm_stdlib.h"
|
|
#include "gtm_tempnam.h"
|
|
#include "gtm_time.h"
|
|
|
|
#include "gdsroot.h"
|
|
#include "gdskill.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsblk.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "gtmio.h"
|
|
#include "util.h"
|
|
#include "eintr_wrappers.h"
|
|
#include "db_snapshot.h"
|
|
|
|
static void ss_print_blk_details(block_id, blk_hdr_ptr_t);
|
|
|
|
static void ss_print_fil_hdr(snapshot_filhdr_ptr_t);
|
|
|
|
void ss_anal_shdw_file(char *filename, int flen)
|
|
{
|
|
int shdw_fd, bitmap_size, shadow_vbn, word, bit, num, tot_blks;
|
|
int status, db_blk_size;
|
|
off_t blk_offset;
|
|
snapshot_filhdr_t ss_filhdr;
|
|
blk_hdr_ptr_t bp = NULL;
|
|
block_id blkno;
|
|
unsigned int *bitmap_buffer = NULL;
|
|
|
|
error_def(ERR_SSPREMATEOF);
|
|
error_def(ERR_SSFILOPERR);
|
|
OPENFILE(filename, O_RDONLY, shdw_fd);
|
|
if (FD_INVALID == shdw_fd)
|
|
{
|
|
status = errno;
|
|
gtm_putmsg(VARLSTCNT(7) ERR_SSFILOPERR, 4, LEN_AND_LIT("open"), flen, filename, status);
|
|
}
|
|
LSEEKREAD(shdw_fd, 0, ((sm_uc_ptr_t)&ss_filhdr), SNAPSHOT_HDR_SIZE, status);
|
|
if (0 != status)
|
|
{
|
|
if (-1 != status)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(7) ERR_SSFILOPERR, 4, LEN_AND_LIT("read"), flen, filename, status);
|
|
return;
|
|
} else
|
|
{
|
|
util_out_print("!/Premature EOF with !AD", TRUE, flen, filename);
|
|
return;
|
|
}
|
|
}
|
|
bitmap_size = (int)(ss_filhdr.ss_info.ss_shmsize - SNAPSHOT_HDR_SIZE);
|
|
if (0 >= bitmap_size)
|
|
{
|
|
util_out_print("!/Incorrect snapshot file format", TRUE);
|
|
return;
|
|
}
|
|
ss_print_fil_hdr(&ss_filhdr);
|
|
bitmap_buffer = (unsigned int *)malloc(bitmap_size);
|
|
memset(bitmap_buffer, 0, bitmap_size);
|
|
LSEEKREAD(shdw_fd, SNAPSHOT_HDR_SIZE, (sm_uc_ptr_t)(bitmap_buffer), bitmap_size, status);
|
|
if (0 != status)
|
|
{
|
|
if (-1 != status)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(7) ERR_SSFILOPERR, 4, LEN_AND_LIT("read"), flen, filename, status);
|
|
return;
|
|
} else
|
|
{
|
|
util_out_print("!/Premature EOF with !AD", TRUE, flen, filename);
|
|
return;
|
|
}
|
|
}
|
|
tot_blks = ss_filhdr.ss_info.total_blks;
|
|
shadow_vbn = ss_filhdr.ss_info.shadow_vbn;
|
|
db_blk_size = ss_filhdr.ss_info.db_blk_size;
|
|
assert(bitmap_size >= (tot_blks + 8 - 1) / 8);
|
|
bp = malloc(db_blk_size);
|
|
for (blkno = 0; blkno <= tot_blks; blkno++)
|
|
{
|
|
if (0 == blkno % BLKS_PER_WORD)
|
|
{
|
|
word = blkno / BLKS_PER_WORD;
|
|
num = bitmap_buffer[word];
|
|
}
|
|
bit = blkno % BLKS_PER_WORD;
|
|
if (num & (1 << bit))
|
|
{
|
|
blk_offset = ((DISK_BLOCK_SIZE * (off_t)(shadow_vbn - 1)) + ((off_t)(blkno) * db_blk_size));
|
|
LSEEKREAD(shdw_fd, blk_offset, bp, db_blk_size, status);
|
|
if (0 != status)
|
|
{
|
|
if (-1 != status)
|
|
{
|
|
gtm_putmsg(VARLSTCNT(7) ERR_SSFILOPERR, 4, LEN_AND_LIT("read"), flen, filename, status);
|
|
return;
|
|
} else
|
|
{
|
|
gtm_putmsg(VARLSTCNT(7) ERR_SSPREMATEOF, 5, blkno, db_blk_size, blk_offset, flen, filename);
|
|
return;
|
|
}
|
|
}
|
|
ss_print_blk_details(blkno, bp);
|
|
}
|
|
}
|
|
if (NULL != bitmap_buffer)
|
|
free(bitmap_buffer);
|
|
if (NULL != bp)
|
|
free(bp);
|
|
return;
|
|
}
|
|
|
|
static void ss_print_fil_hdr(snapshot_filhdr_ptr_t ss_filhdr_ptr)
|
|
{
|
|
util_out_print("----------------------------------------", TRUE);
|
|
util_out_print("Snapshot Initiator PID :!UL", TRUE, ss_filhdr_ptr->ss_info.ss_pid);
|
|
util_out_print("Snapshot TN :0x!16@XQ", TRUE, &ss_filhdr_ptr->ss_info.snapshot_tn);
|
|
util_out_print("DB Block Size :!UL", TRUE, ss_filhdr_ptr->ss_info.db_blk_size);
|
|
util_out_print("Free Blocks :!UL", TRUE, ss_filhdr_ptr->ss_info.free_blks);
|
|
util_out_print("Total Blocks :!UL", TRUE, ss_filhdr_ptr->ss_info.total_blks);
|
|
util_out_print("Shadow File :!AD", TRUE, ss_filhdr_ptr->shadow_file_len, ss_filhdr_ptr->ss_info.shadow_file);
|
|
util_out_print("Shadow Start VBN :!UL", TRUE, ss_filhdr_ptr->ss_info.shadow_vbn);
|
|
util_out_print("Shadow Shared Mem Size :!UL", TRUE, ss_filhdr_ptr->ss_info.ss_shmsize);
|
|
util_out_print("----------------------------------------", TRUE);
|
|
return;
|
|
}
|
|
static void ss_print_blk_details(block_id blk, blk_hdr_ptr_t bp)
|
|
{
|
|
util_out_print("--------------------------", TRUE);
|
|
util_out_print("Block Number : !UL", TRUE, blk);
|
|
util_out_print("Block TN : 0x!16@XQ", TRUE, &bp->tn);
|
|
util_out_print("Block Level : !UL", TRUE, bp->levl);
|
|
util_out_print("Block Size : !UL", TRUE, bp->bsiz);
|
|
util_out_print("--------------------------", TRUE);
|
|
return;
|
|
}
|