fpeek.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. //extern char *optarg;
  10. int g_start_pos = 0;
  11. int g_end_pos = -1;
  12. int g_modulus = 16;
  13. char *g_fn = NULL;
  14. int g_verbose_flag = 0;
  15. int g_cononical_flag = 0;
  16. void print_usage_and_exit(void)
  17. {
  18. printf("simple utility to look at raw data of files\n");
  19. printf("usage:\n");
  20. printf(" -f fn filename\n");
  21. printf(" [-s start] start byte (default start)\n");
  22. printf(" [-e end] end byte (default end)\n");
  23. printf(" [-m mod] newline every 'mod' entries (default 16)\n");
  24. printf(" [-C] 'cononical' view. Print printable ascii next alongsize value\n");
  25. printf(" [-h] help\n");
  26. printf(" [-v] verbose flag\n");
  27. exit(0);
  28. }
  29. int main(int argc, char **argv)
  30. {
  31. int i, k;
  32. int fd = -1;
  33. struct stat st;
  34. int r;
  35. int read_end = -1;
  36. char buf[16] = {0};
  37. int c;
  38. while ((c = getopt(argc, argv, "hvs:e:m:f:C")) != -1)
  39. switch (c)
  40. {
  41. case 'f': g_fn = strdup(optarg); break;
  42. case 'C': g_cononical_flag = 1; break;
  43. case 'h': print_usage_and_exit(); exit(0); break;
  44. case 'v': g_verbose_flag = 1; break;
  45. case 's': g_start_pos = atoi(optarg); break;
  46. case 'e': g_end_pos = atoi(optarg); break;
  47. case 'm': g_modulus = atoi(optarg); break;
  48. default: print_usage_and_exit(); exit(0); break;
  49. }
  50. if ( !g_fn )
  51. {
  52. printf("provide filename\n");
  53. print_usage_and_exit();
  54. }
  55. if ((g_start_pos < 0) ||
  56. (g_modulus < 1) )
  57. {
  58. printf("start byte must be non-negative and modulus must be greater than 0\n");
  59. print_usage_and_exit();
  60. }
  61. r = stat( g_fn, &st );
  62. if (r < 0)
  63. {
  64. perror(g_fn);
  65. exit(-1);
  66. }
  67. fd = open( g_fn, O_RDONLY );
  68. if (fd < 0)
  69. {
  70. perror(g_fn);
  71. exit(-1);
  72. }
  73. read_end = st.st_size;
  74. if ( (g_end_pos >= 0) && (g_end_pos < st.st_size) )
  75. read_end = g_end_pos+1;
  76. if (g_start_pos>0)
  77. lseek( fd, g_start_pos, SEEK_SET );
  78. printf("start %i end %i\n", g_start_pos, read_end);
  79. printf("#output in hex\n");
  80. for (k=0, i=g_start_pos; i < read_end ; i++, k++)
  81. {
  82. if ((k % g_modulus)==0)
  83. {
  84. if (k>0)
  85. printf("\n");
  86. if (g_cononical_flag)
  87. {
  88. printf("[%4x]", i);
  89. }
  90. }
  91. r = read( fd, buf, 1 );
  92. if (r < 0)
  93. {
  94. perror("read error");
  95. exit(-1);
  96. }
  97. printf(" %02x", buf[0] );
  98. if (g_cononical_flag)
  99. {
  100. printf(" %c ", isprint(buf[0]) ? buf[0] : '.' );
  101. }
  102. }
  103. close(fd);
  104. printf("\n");
  105. return 0;
  106. }