dump.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:6k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*
  2.  * File dump.c - dump a file/device both in hex and in ASCII.
  3.    Written by Eric Youngdale (1993).
  4.    Copyright 1993 Yggdrasil Computing, Incorporated
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  16. static char rcsid[] ="$Id: dump.c,v 1.3 1999/03/02 03:41:36 eric Exp $";
  17. #include "../config.h"
  18. #include <stdxlib.h>
  19. #include <unixstd.h>
  20. #include <strdefs.h>
  21. #include <stdio.h>
  22. #include <standard.h>
  23. #ifdef HAVE_TERMIOS_H
  24. #include <termios.h>
  25. #include <sys/ioctl.h>
  26. #else
  27. #include <termio.h>
  28. #endif
  29. #include <signal.h>
  30. FILE * infile;
  31. int file_addr;
  32. unsigned char buffer[256];
  33. unsigned char search[64];
  34. #define PAGE 256
  35. #ifdef HAVE_TERMIOS_H
  36. struct termios savetty;
  37. struct termios newtty;
  38. #else
  39. struct termio savetty;
  40. struct termio newtty;
  41. #endif
  42. void reset_tty __PR((void));
  43. void set_tty __PR((void));
  44. void onsusp __PR((int sig));
  45. void crsr2 __PR((int row, int col));
  46. void showblock __PR((int flag));
  47. int getbyte __PR((void));
  48. void usage __PR((int excode));
  49. int main __PR((int argc, char *argv[]));
  50. void
  51. reset_tty(){
  52. #ifdef HAVE_TERMIOS_H
  53.   if(tcsetattr(0, TCSANOW, &savetty) == -1)
  54. #else
  55.   if(ioctl(0, TCSETAF, &savetty)==-1)
  56. #endif
  57.     {
  58. #ifdef USE_LIBSCHILY
  59.       comerr("Cannot put tty into normal moden");
  60. #else
  61.       printf("Cannot put tty into normal moden");
  62.       exit(1);
  63. #endif
  64.     }
  65. }
  66. void
  67. set_tty()
  68. {
  69. #ifdef HAVE_TERMIOS_H
  70.   if(tcsetattr(0, TCSANOW, &newtty) == -1)
  71. #else
  72.   if(ioctl(0, TCSETAF, &newtty)==-1)
  73. #endif
  74.     {
  75. #ifdef USE_LIBSCHILY
  76.       comerr("Cannot put tty into raw moden");
  77. #else
  78.       printf("Cannot put tty into raw moden");
  79.       exit(1);
  80. #endif
  81.     }
  82. }
  83. /* Come here when we get a suspend signal from the terminal */
  84. void
  85. onsusp(sig)
  86. int sig;
  87. {
  88. #ifdef SIGTTOU
  89.     /* ignore SIGTTOU so we don't get stopped if csh grabs the tty */
  90.     signal(SIGTTOU, SIG_IGN);
  91. #endif
  92.     reset_tty ();
  93.     fflush (stdout);
  94. #ifdef SIGTTOU
  95.     signal(SIGTTOU, SIG_DFL);
  96.     /* Send the TSTP signal to suspend our process group */
  97.     signal(SIGTSTP, SIG_DFL);
  98. /*    sigsetmask(0);*/
  99.     kill (0, SIGTSTP);
  100.     /* Pause for station break */
  101.     /* We're back */
  102.     signal (SIGTSTP, onsusp);
  103. #endif
  104.     set_tty ();
  105. }
  106. void
  107. crsr2(row, col)
  108. int row;
  109. int col;
  110. {
  111.   printf("33[%d;%dH",row,col);
  112. }
  113. void
  114. showblock(flag)
  115. int flag;
  116. {
  117.   unsigned int k;
  118.   int i, j;
  119.   lseek(fileno(infile), file_addr, 0);
  120.   read(fileno(infile), buffer, sizeof(buffer));
  121.   if(flag) {
  122.     for(i=0;i<16;i++){
  123.       crsr2(i+3,1);
  124.       printf("%8.8x ",file_addr+(i<<4));
  125.       for(j=15;j>=0;j--){
  126. printf("%2.2x",buffer[(i<<4)+j]);
  127. if(!(j & 0x3)) printf(" ");
  128.       };
  129.       for(j=0;j< 16;j++){
  130. k = buffer[(i << 4) + j];
  131. if(k >= ' ' && k < 0x80) printf("%c",k);
  132. else printf(".");
  133.       };
  134.     }
  135.   };
  136.   crsr2(20,1);
  137.   printf(" Zone, zone offset: %6x %4.4x  ",file_addr>>11, file_addr & 0x7ff);
  138.   fflush(stdout);
  139. }
  140. int
  141. getbyte()
  142. {
  143.   char c1;
  144.   c1 = buffer[file_addr & (PAGE-1)];
  145.   file_addr++;
  146.   if ((file_addr & (PAGE-1)) == 0) showblock(0);
  147.   return c1;
  148. }
  149. void
  150. usage(excode)
  151. int excode;
  152. {
  153. errmsgno(EX_BAD, "Usage: %s [options] imagen",
  154.                 get_progname());
  155. error("Options:n");
  156. exit(excode);
  157. }
  158. int
  159. main(argc, argv)
  160. int argc;
  161. char *argv[];
  162. {
  163.   char c;
  164.   int i,j;
  165. save_args(argc, argv);
  166.   if(argc < 2)
  167. usage(EX_BAD);
  168.   infile = fopen(argv[1],"rb");
  169.   if (infile == NULL) {
  170. #ifdef USE_LIBSCHILY
  171. comerr("Cannot open '%s'.n", argv[1]);
  172. #else
  173. printf("Cannot open '%s'.n", argv[1]);
  174. exit(1);
  175. #endif
  176.   }
  177.   for(i=0;i<30;i++) printf("n");
  178.   file_addr = 0;
  179. /* Now setup the keyboard for single character input. */
  180. #ifdef HAVE_TERMIOS_H
  181.   if(tcgetattr(0, &savetty) == -1)
  182. #else
  183. if(ioctl(0, TCGETA, &savetty) == -1)
  184. #endif
  185.   {
  186. #ifdef USE_LIBSCHILY
  187.     comerr("Stdin must be a ttyn");
  188. #else
  189.     printf("Stdin must be a ttyn");
  190.     exit(1);
  191. #endif
  192.   }
  193. newtty=savetty;
  194. newtty.c_lflag&=~ICANON;
  195. newtty.c_lflag&=~ECHO;
  196. newtty.c_cc[VMIN]=1;
  197.    set_tty();
  198. #ifdef SIGTSTP
  199. signal(SIGTSTP, onsusp);
  200. #endif
  201.   do{
  202.     if(file_addr < 0) file_addr = 0;
  203.     showblock(1);
  204.     read (0, &c, 1);
  205.     if (c == 'a') file_addr -= PAGE;
  206.     if (c == 'b') file_addr += PAGE;
  207.     if (c == 'g') {
  208.       crsr2(20,1);
  209.       printf("Enter new starting block (in hex):");
  210.       scanf("%x",&file_addr);
  211.       file_addr = file_addr << 11;
  212.       crsr2(20,1);
  213.       printf("                                     ");
  214.     };
  215.     if (c == 'f') {
  216.       crsr2(20,1);
  217.       printf("Enter new search string:");
  218.       fgets((char *)search,sizeof(search),stdin);
  219.       while(search[strlen((char *)search)-1] == 'n') search[strlen((char *)search)-1] = 0;
  220.       crsr2(20,1);
  221.       printf("                                     ");
  222.     };
  223.     if (c == '+') {
  224.       while(1==1){
  225. while(1==1){
  226.   c = getbyte();
  227.   if (c == search[0]) break;
  228. };
  229. for (j=1;j<strlen((char *)search);j++) 
  230.   if(search[j] != getbyte()) break;
  231. if(j==strlen((char *)search)) break;
  232.       };
  233.       file_addr &= ~(PAGE-1);
  234.       showblock(1);
  235.     };
  236.     if (c == 'q') break;
  237.   } while(1==1);
  238.   reset_tty();
  239.   fclose(infile);
  240.   return (0);
  241. }