⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 在Linux内核从2.4升级到2.6时需要升级的软件包
💻 C
字号:
/* *   Copyright (c) International Business Machines Corp., 2000-2002 * *   This program is free software;  you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY;  without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See *   the GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program;  if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *//* *   COMPONENT_NAME: jfs_fscklog (formerly xchkdmp) * *      The jfs_fscklog tool provides 2 basic functions - fsck.jfs *      service log extraction and display.  The code here displays *      the extracted log. * *//* *       Define the following to avoid including *       a bunch of unnecessary header files */#define _JFS_XCHKDMP#include <config.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include "fscklog.h"#include "fsck_message.h"#include "jfs_fscklog.h"extern char *MsgText[];extern struct fscklog_record fscklog_record;extern struct fscklog_record *local_recptr;extern char file_name[128];FILE *infp;/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * input:  fsck service log I/O buffer * output: fsck extracted service log I/O buffer * */char xchklog_buffer[XCHKLOG_BUFSIZE];/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * * For message processing * *    values are assigned by the main jfs_fscklog routine */extern char *msgprms[10];extern short msgprmidx[10];/* VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV * * The following are internal to this file * */void dump_service_log(void);int xchkdmp_final_processing(void);int xchkdmp_fscklog_fill_buffer(void);int open_infile(void);/***************************************************************************** * NAME: xchkdmp * * FUNCTION: Entry point for displaying aggregate fsck.jfs service log * * PARAMETERS: *           local_recptr - fscklog record * * RETURNS: *      success: 0 *      failure: something else */int xchkdmp(struct fscklog_record *local_recptr){	int rc = 0;	/*	 * Initialize the fscklog control block	 */	local_recptr->infile_buf_length = XCHKLOG_BUFSIZE;	local_recptr->infile_buf_ptr = xchklog_buffer;	local_recptr->highest_msg_num =	    fsck_highest_msgid_defined + JFSCHKLOG_FIRSTMSGNUM;	rc = open_infile();	if (rc == 0) {		/* we have a buffer and the device is open */		dump_service_log();	}	if (rc == 0) {		/* no errors yet */		rc = xchkdmp_final_processing();	} else {		/* something already went wrong */		xchkdmp_final_processing();	}	return (rc);}/*************************************************************************** * NAME: dump_service_log * * FUNCTION: * * PARAMETERS:  none * * NOTES:  o  The first read from the input file is done when the *            file is opened.  (This is done so that the eyecatcher *            can be read to verify that the input file is actually *            an extracted JFS fsck service log.) * * RETURNS: *      success: 0 *      failure: something else */void dump_service_log(){	char *msg_txt;	int dsl_rc = 0;	char *log_entry;	int log_entry_pos;	int bytes_left;	struct chklog_entry_hdr *hdptr;	local_recptr->fscklog_last_read = 0;	while ((!local_recptr->fscklog_last_read) && (dsl_rc == 0)) {		local_recptr->this_buffer_last_message = 0;		while ((!local_recptr->this_buffer_last_message)		       && (dsl_rc == 0)) {			hdptr = (struct chklog_entry_hdr *)			    (local_recptr->infile_buf_ptr +			     local_recptr->infile_buf_data_len);			if (hdptr->entry_length == 0) {				/* no more entries in this buffer */				local_recptr->this_buffer_last_message = -1;			} else {				/* this entry_length != 0 */				log_entry = (char *) hdptr;				log_entry_pos =				    sizeof (struct chklog_entry_hdr);				/*				 * Each FSCKLOG_BUFSIZE boundary starts a new				 * log record.  Otherwise, we depend on a valid				 * entry_length to locate the next message.				 */				bytes_left = local_recptr->infile_buf_length -				    local_recptr->infile_buf_data_len;				if ((bytes_left < 0) ||				    (hdptr->entry_length < 0) ||				    (hdptr->entry_length > bytes_left)) {					/* this isn't a valid log record length */					send_msg(fsck_CHKLOGINVALRCD);					local_recptr->this_buffer_last_message =					    -1;				} else {					/* the record looks ok */					msg_txt = &log_entry[log_entry_pos];					printf(msg_txt);					/*					 * set up for the next record					 */					local_recptr->infile_buf_data_len +=					    hdptr->entry_length;					if (local_recptr->infile_buf_data_len >=					    local_recptr->infile_buf_length) {						local_recptr->						    this_buffer_last_message =						    -1;					}				}			}		}		/*		 * read some more from the input file		 */		if ((!local_recptr->fscklog_last_read)		    && (dsl_rc == 0)) {			dsl_rc = xchkdmp_fscklog_fill_buffer();		}	}	return;}/*************************************************************************** * NAME: xchkdmp_final_processing * * FUNCTION:  If processing read/write, replicate the superblock and the *            aggregate inode structures (i.e., the Aggregate Inode Map *            and the Aggregate Inode Table). * *            Notify the user about various things. * * PARAMETERS:  none * * RETURNS: *      success: 0 *      failure: something else */int xchkdmp_final_processing(){	int pf_rc = 0;	/*	 * Close the input file	 */	if (local_recptr->infile_is_open) {		pf_rc = fclose(infp);	}	return (pf_rc);}/**************************************************************************** * NAME: xchkdmp_fscklog_fill_buffer * * FUNCTION:  If the current fsck session has write access to the aggregate, *            and if the in-aggregate fsck log is not full, write the *            contents of the current fscklog buffer into the in-aggregate *            fsck log. * * PARAMETERS:  none * * NOTES:  o Unlike most _put_ routines in this module, fscklog_put_buffer *           actually writes to the device.  This is done because the fsck *           log contains information which provides crucial serviceability *           should the fsck session be interrupted. * *         o Errors here are recorded in the control page of the fsck *           in-aggregate workspace but never affect other fsck processing. * * RETURNS: *      success: 0 *      failure: something else */int xchkdmp_fscklog_fill_buffer(){	int flfb_rc = 0;	unsigned bytes_read = 0;	bytes_read = fread((void *) local_recptr->infile_buf_ptr,			   sizeof (char), XCHKLOG_BUFSIZE, infp);	if (bytes_read != XCHKLOG_BUFSIZE) {		if (feof(infp)) {			local_recptr->fscklog_last_read = -1;		}	}	/*	 * We want to reset the buffer no matter what.	 * It is useful to keep going because the next section may be	 * readable.	 */	local_recptr->infile_buf_data_len = 0;	return (flfb_rc);}/***************************************************************************** * NAME: open_infile * * FUNCTION:  Open the input file. * * PARAMETERS:  none * * RETURNS: *      success: 0 *      failure: something else */int open_infile(){	int openif_rc = 0;	unsigned bytes_read = 0;	int eyecatcher_incorrect = 0;	if (!local_recptr->file_name_specified) {		/* no input file name specified */		if (local_recptr->which_log == NEWLOG) {			memcpy((void *) file_name, (void *) default_logfile_new,			       default_logfile_name_len);		} else {			memcpy((void *) file_name, (void *) default_logfile_old,			       default_logfile_name_len);		}	}	infp = fopen(file_name, "r");	if (infp == NULL) {		/* input file open failed */		openif_rc = XCHKDMP_CANTOPENINFILE;		send_msg(fsck_XCHKDMPOPNFAIL, file_name);	} else {		/* input file is open */		local_recptr->infile_is_open = -1;	}	if (local_recptr->infile_is_open) {		/*		 * read in the first buffer of data		 */		bytes_read = fread((void *) local_recptr->infile_buf_ptr,				   sizeof (char), XCHKLOG_BUFSIZE, infp);		if (bytes_read != XCHKLOG_BUFSIZE) {			/* there should be at least this much */			openif_rc = XCHKDMP_MTORBADREAD;			send_msg(fsck_XCHKDMPMTORBADREAD);		} else {			/* read was successful */			eyecatcher_incorrect =			    memcmp((void *) local_recptr->infile_buf_ptr,				   (void *) jfs_chklog_eyecatcher, 16);			if (eyecatcher_incorrect) {				/* incorrect 1st 16 chars */				openif_rc = XCHKDMP_BADFORMAT;				send_msg(fsck_XCHKDMPBADFORMAT);			} else {				local_recptr->infile_buf_data_len = 16;			}		}	}	return (openif_rc);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -