306708ee |
1 | #include <stdlib.h> |
2 | #include <stdio.h> |
3 | #include <unistd.h> |
4 | #include <fcntl.h> |
5 | #include <errno.h> |
6 | |
7 | char buf[65536]; |
8 | |
9 | void findnulls(int fd, char *source, int squelch) |
10 | { |
11 | int i, ret, n, s, off; |
12 | |
13 | n = 0; |
14 | s = -1; |
15 | off = 0; |
16 | while(1) { |
17 | ret = read(fd, buf, sizeof(buf)); |
18 | if(ret < 0) { |
19 | if(source != NULL) |
20 | perror(source); |
21 | else |
22 | perror("read"); |
23 | return; |
24 | } |
25 | for(i = 0; i < ret; i++) { |
26 | if(buf[i] == 0) { |
27 | if(s == -1) |
28 | s = off + i; |
29 | n++; |
30 | } else { |
31 | if(n > 0) { |
32 | if(n > squelch) { |
33 | if(source == NULL) |
34 | printf("%i %i\n", s, n); |
35 | else |
36 | printf("%s: %i %i\n", source, s, n); |
37 | } |
38 | s = -1; |
39 | n = 0; |
40 | } |
41 | } |
42 | } |
43 | off += ret; |
44 | if(ret == 0) |
45 | break; |
46 | } |
47 | if(n > squelch) { |
48 | if(source == NULL) |
49 | printf("%i %i\n", s, n); |
50 | else |
51 | printf("%s: %i %i\n", source, s, n); |
52 | } |
53 | } |
54 | |
55 | int main(int argc, char **argv) |
56 | { |
57 | int i, c; |
58 | int squelch; |
59 | int fd; |
60 | |
61 | squelch = 1024; |
62 | while((c = getopt(argc, argv, "hs:")) >= 0) { |
63 | switch(c) { |
64 | case 's': |
65 | squelch = atoi(optarg); |
66 | break; |
67 | case 'h': |
68 | case '?': |
69 | case ':': |
70 | default: |
71 | fprintf(stderr, "usage: findnulls [-h] [-s squelch] [FILE...]\n"); |
72 | exit((c == 'h')?0:1); |
73 | } |
74 | } |
75 | if(optind < argc) { |
76 | for(i = optind; i < argc; i++) { |
77 | if((fd = open(argv[i], O_RDONLY)) < 0) { |
78 | perror(argv[i]); |
79 | continue; |
80 | } |
81 | findnulls(fd, argv[i], squelch); |
82 | close(fd); |
83 | } |
84 | } else { |
85 | findnulls(0, NULL, squelch); |
86 | } |
87 | return(0); |
88 | } |
89 | |
90 | /* |
91 | * Local Variables: |
92 | * compile-command: "gcc -Wall -g -o findnulls findnulls.c" |
93 | * End: |
94 | */ |