-
Notifications
You must be signed in to change notification settings - Fork 3
/
sca_read.c
135 lines (117 loc) · 2.64 KB
/
sca_read.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* Copyright (c) 1997-2007 Erez Zadok <ezk@cs.stonybrook.edu>
* Copyright (c) 2001-2007 Stony Brook University
*
* For specific licensing information, see the COPYING file distributed with
* this package, or get one from
* ftp://ftp.filesystems.org/pub/fistgen/COPYING.
*
* This Copyright notice must be kept intact and distributed with all
* fistgen sources INCLUDING sources generated by fistgen.
*/
/*
* File: fistgen/templates/Linux-2.6/sca_read.c
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include "sca_aux.h"
#include "sca_code.h" /* replace with your definitions of en/decode _page */
int
decode_file(char *name)
{
char idx[MAXPATHLEN];
int srcfd;
struct fistfs_header hdr;
int i, len;
unsigned char *out;
if (name == NULL)
return(-1);
if ((srcfd = open(name, O_RDONLY)) < 0)
return(-1);
sprintf(idx, "%s.idx", name);
if ((read_idx(idx, &hdr)) < 0)
return(-1); /* read the header */
for (i = 0; i < hdr.num_pages; i++) {
if ((get_page(srcfd, &hdr, i, &out, &len)) < 0) {
fprintf(stderr, "get_page returns error!\n");
return(-1);
}
if (len > chunksize) {
fprintf(stderr, "***decode returned %d bytes\n", len);
}
write(1, out, len);
free(out);
}
if (do_fast_tails) { /* See if there unencoded data at the end */
/* This get_page will return 0 if there is no unencoded tail */
if ((get_page(srcfd, &hdr, i, &out, &len)) < 0) {
fprintf(stderr,"get_page returns error!\n");
return(-1);
}
write(1, out, len);
free(out);
}
return(0);
}
void
usage(const char *progname)
{
fprintf(stderr,
"Usage: %s [-c chunksize] [-d] [-f] file1 [file2 file3 ...]\n",
progname);
}
int
main(int argc, char **argv)
{
int i, rc, cnt = 0;
int debug = 0;
char *name;
if (argc < 2) {
usage(argv[0]);
exit(1);
}
while ((i = getopt(argc, argv, "c:df")) != EOF) {
switch (i) {
case 'c':
chunksize = atoi(optarg);
if (chunksize < 0) {
fprintf(stderr, "Please use a positive chunk size\n");
exit(1);
}
break;
case 'f':
do_fast_tails = 1;
break;
case 'd':
debug = 1;
break;
default:
usage(argv[0]);
exit(1);
}
}
for (i = optind; i < argc; i++) {
name = strdup(argv[i]);
if ((rc = decode_file(argv[i])) < 0) {
fprintf(stderr, "\tError decoding %s (%d)\n", argv[i], rc);
cnt++;
}
free(name);
}
if (debug) {
fprintf(stderr,"encodes: %d\n", encode_counter);
fprintf(stderr,"decodes: %d\n", decode_counter);
fprintf(stderr,"writes: %d\n", write_counter);
}
exit(cnt);
}
/*
* Local variables:
* c-basic-offset: 4
* End:
*/