Home | History | Annotate | Download | only in disktest
      1 /*
      2 * Disktest
      3 * Copyright (c) International Business Machines Corp., 2001
      4 *
      5 *
      6 * This program is free software; you can redistribute it and/or modify
      7 * it under the terms of the GNU General Public License as published by
      8 * the Free Software Foundation; either version 2 of the License, or
      9 * (at your option) any later version.
     10 *
     11 * This program is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 * GNU General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU General Public License
     17 * along with this program; if not, write to the Free Software
     18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     19 *
     20 *  Please send e-mail to yardleyb (at) us.ibm.com if you have
     21 *  questions or comments.
     22 *
     23 *  Project Website:  TBD
     24 *
     25 * $Id: dump.c,v 1.7 2009/02/26 12:02:22 subrata_modak Exp $
     26 *
     27 */
     28 #include <stdio.h>		/* *printf() */
     29 #include <string.h>		/* memset(), strn***() */
     30 #include <ctype.h>		/* isprint() */
     31 #include <stdlib.h>		/* malloc(), free() */
     32 
     33 #include "defs.h"
     34 #include "io.h"
     35 #include "sfunc.h"
     36 #include "dump.h"
     37 
     38 int format_str(size_t iBytes, const char *ibuff, size_t ibuff_siz, char *obuff,
     39 	       size_t obuff_siz)
     40 {
     41 	unsigned int i;
     42 	char buff[10];
     43 	static size_t TotalBytes = 0;
     44 
     45 	if ((iBytes == 0) &&
     46 	    (ibuff == NULL) && (ibuff_siz == 0) &&
     47 	    (obuff == NULL) && (obuff_siz == 0)) {
     48 		TotalBytes = 0;
     49 		return 0;
     50 	}
     51 
     52 	if ((ibuff == NULL) || (obuff == NULL) || (iBytes < 1))
     53 		return -1;
     54 
     55 	memset(obuff, 0, obuff_siz);
     56 	sprintf(buff, "%08lX", (long)TotalBytes);
     57 	strncat(obuff, buff, (obuff_siz - 1) - strlen(obuff));
     58 	for (i = 0; i < iBytes; i++) {
     59 		if ((i % 4) == 0)
     60 			strncat(obuff, " ", (obuff_siz - 1) - strlen(obuff));
     61 		if ((i % 8) == 0)
     62 			strncat(obuff, " ", (obuff_siz - 1) - strlen(obuff));
     63 		sprintf(buff, "%02X ", *(ibuff + i));
     64 		strncat(obuff, buff, (obuff_siz - 1) - strlen(obuff));
     65 	}
     66 	for (; i < ibuff_siz; i++) {
     67 		if ((i % 4) == 0)
     68 			strncat(obuff, " ", (obuff_siz - 1) - strlen(obuff));
     69 		if ((i % 8) == 0)
     70 			strncat(obuff, " ", (obuff_siz - 1) - strlen(obuff));
     71 		strncat(obuff, "   ", (obuff_siz - 1) - strlen(obuff));
     72 	}
     73 	strncat(obuff, " ", (obuff_siz - 1) - strlen(obuff));
     74 	for (i = 0; i < iBytes; i++) {
     75 		sprintf(buff, "%c",
     76 			(isprint(*(ibuff + i))) ? *(ibuff + i) : '.');
     77 		strncat(obuff, buff, (obuff_siz - 1) - strlen(obuff));
     78 	}
     79 	TotalBytes += iBytes;
     80 	return 0;
     81 }
     82 
     83 int format_raw(size_t iBytes, const char *ibuff, char *obuff, size_t obuff_siz)
     84 {
     85 	unsigned int i;
     86 	char buff[10];
     87 	static size_t TotalBytes = 0;
     88 
     89 	if ((iBytes == 0) && (ibuff == NULL) &&
     90 	    (obuff == NULL) && (obuff_siz == 0)) {
     91 		TotalBytes = 0;
     92 		return 0;
     93 	}
     94 
     95 	if ((ibuff == NULL) || (obuff == NULL) || (iBytes < 1))
     96 		return -1;
     97 
     98 	memset(obuff, 0, obuff_siz);
     99 	sprintf(buff, "%08lX ", (long)TotalBytes);
    100 	strncat(obuff, buff, (obuff_siz - 1) - strlen(obuff));
    101 	for (i = 0; i < iBytes; i++) {
    102 		sprintf(buff, "%02X", *(ibuff + i));
    103 		strncat(obuff, buff, (obuff_siz - 1) - strlen(obuff));
    104 	}
    105 	TotalBytes += iBytes;
    106 	return 0;
    107 }
    108 
    109 int dump_data(FILE * stream, const char *buff, const size_t buff_siz,
    110 	      const size_t ofd_siz, const size_t offset, const int format)
    111 {
    112 	size_t TotalRemainingBytes, NumBytes, ibuff_siz, obuff_siz;
    113 	char *ibuff, *obuff, *buff_curr;
    114 
    115 	buff_curr = (char *)buff;
    116 	buff_curr += offset;
    117 	TotalRemainingBytes = buff_siz;
    118 	NumBytes = 0;
    119 	ibuff_siz = ofd_siz;
    120 	obuff_siz =
    121 	    12 + (3 * ibuff_siz) + (ibuff_siz / 4) + (ibuff_siz / 8) +
    122 	    ibuff_siz;
    123 	switch (format) {
    124 	case FMT_STR:
    125 		format_str(0, NULL, 0, NULL, 0);
    126 		break;
    127 	case FMT_RAW:
    128 		format_raw(0, NULL, NULL, 0);
    129 		break;
    130 	default:
    131 		return (-1);
    132 	}
    133 
    134 	if ((ibuff = (char *)ALLOC(ibuff_siz)) == NULL) {
    135 		fprintf(stderr, "Can't allocate ibuff\n");
    136 		return (-1);
    137 	}
    138 	if ((obuff = (char *)ALLOC(obuff_siz)) == NULL) {
    139 		FREE(ibuff);
    140 		fprintf(stderr, "Can't allocate obuff\n");
    141 		return (-1);
    142 	}
    143 
    144 	while (TotalRemainingBytes > 0) {
    145 		if (TotalRemainingBytes >= ibuff_siz) {
    146 			memcpy(ibuff, buff_curr, ibuff_siz);
    147 			TotalRemainingBytes -= ibuff_siz;
    148 			NumBytes = ibuff_siz;
    149 			buff_curr += NumBytes;
    150 		} else {
    151 			memcpy(ibuff, buff_curr, TotalRemainingBytes);
    152 			NumBytes = TotalRemainingBytes;
    153 			TotalRemainingBytes = 0;
    154 		}
    155 		switch (format) {
    156 		case FMT_STR:
    157 			format_str(NumBytes, ibuff, ibuff_siz, obuff,
    158 				   obuff_siz);
    159 			fprintf(stream, "%s\n", obuff);
    160 			break;
    161 		case FMT_RAW:
    162 			format_raw(NumBytes, ibuff, obuff, obuff_siz);
    163 			fprintf(stream, "%s\n", obuff);
    164 			break;
    165 		default:
    166 			FREE(ibuff);
    167 			FREE(obuff);
    168 			return (-1);
    169 		}
    170 	}
    171 	FREE(ibuff);
    172 	FREE(obuff);
    173 	return 0;
    174 }
    175 
    176 int do_dump(child_args_t * args)
    177 {
    178 	ssize_t NumBytes = 0;
    179 	OFF_T TargetLBA, TotalBytes = 0;
    180 	char *buff;
    181 	fd_t fd;
    182 
    183 	if ((buff = (char *)ALLOC(args->htrsiz * BLK_SIZE)) == NULL) {
    184 		fprintf(stderr, "Can't allocate buffer\n");
    185 		return (-1);
    186 	}
    187 
    188 	memset(buff, 0, args->htrsiz * BLK_SIZE);
    189 
    190 	fd = Open(args->device, args->flags | CLD_FLG_R);
    191 	if (INVALID_FD(fd)) {
    192 		pMsg(ERR, args, "could not open %s.\n", args->device);
    193 		pMsg(ERR, args, "%s: Error = %u\n", args->device,
    194 		     GETLASTERROR());
    195 		FREE(buff);
    196 		return (-1);
    197 	}
    198 
    199 	TargetLBA = Seek(fd, args->start_lba * BLK_SIZE);
    200 	if (TargetLBA != (args->start_lba * (OFF_T) BLK_SIZE)) {
    201 		pMsg(ERR, args, "Could not seek to start position.\n");
    202 		FREE(buff);
    203 		CLOSE(fd);
    204 		return (-1);
    205 	}
    206 
    207 	do {
    208 		NumBytes = Read(fd, buff, args->htrsiz * BLK_SIZE);
    209 		if ((NumBytes > args->htrsiz * BLK_SIZE) || (NumBytes < 0)) {
    210 			pMsg(ERR, args, "Failure reading %s\n", args->device);
    211 			pMsg(ERR, args, "Last Error was %lu\n", GETLASTERROR());
    212 			break;
    213 		}
    214 		dump_data(stdout, buff, NumBytes, 16, 0, FMT_STR);
    215 		TotalBytes += (OFF_T) NumBytes;
    216 	} while ((TotalBytes < (args->htrsiz * BLK_SIZE)) && (NumBytes > 0));
    217 
    218 	FREE(buff);
    219 	CLOSE(fd);
    220 
    221 	return 0;
    222 }
    223