libsparse: add Makefile
[project/make_ext4fs.git] / libsparse / img2simg.c
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #define _FILE_OFFSET_BITS 64
18 #define _LARGEFILE64_SOURCE 1
19
20 #include <fcntl.h>
21 #include <stdbool.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <sys/types.h>
28 #include <unistd.h>
29
30 #include <sparse/sparse.h>
31
32 #ifndef O_BINARY
33 #define O_BINARY 0
34 #endif
35
36 #if defined(__APPLE__) && defined(__MACH__)
37 #define lseek64 lseek
38 #define off64_t off_t
39 #endif
40
41 void usage()
42 {
43     fprintf(stderr, "Usage: img2simg <raw_image_file> <sparse_image_file> [<block_size>]\n");
44 }
45
46 int main(int argc, char *argv[])
47 {
48         int in;
49         int out;
50         int ret;
51         struct sparse_file *s;
52         unsigned int block_size = 4096;
53         off64_t len;
54
55         if (argc < 3 || argc > 4) {
56                 usage();
57                 exit(-1);
58         }
59
60         if (argc == 4) {
61                 block_size = atoi(argv[3]);
62         }
63
64         if (block_size < 1024 || block_size % 4 != 0) {
65                 usage();
66                 exit(-1);
67         }
68
69         if (strcmp(argv[1], "-") == 0) {
70                 in = STDIN_FILENO;
71         } else {
72                 in = open(argv[1], O_RDONLY | O_BINARY);
73                 if (in < 0) {
74                         fprintf(stderr, "Cannot open input file %s\n", argv[1]);
75                         exit(-1);
76                 }
77         }
78
79         if (strcmp(argv[2], "-") == 0) {
80                 out = STDOUT_FILENO;
81         } else {
82                 out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0664);
83                 if (out < 0) {
84                         fprintf(stderr, "Cannot open output file %s\n", argv[2]);
85                         exit(-1);
86                 }
87         }
88
89         len = lseek64(in, 0, SEEK_END);
90         lseek64(in, 0, SEEK_SET);
91
92         s = sparse_file_new(block_size, len);
93         if (!s) {
94                 fprintf(stderr, "Failed to create sparse file\n");
95                 exit(-1);
96         }
97
98         sparse_file_verbose(s);
99         ret = sparse_file_read(s, in, false, false);
100         if (ret) {
101                 fprintf(stderr, "Failed to read file\n");
102                 exit(-1);
103         }
104
105         ret = sparse_file_write(s, out, false, true, false);
106         if (ret) {
107                 fprintf(stderr, "Failed to write sparse file\n");
108                 exit(-1);
109         }
110
111         close(in);
112         close(out);
113
114         exit(0);
115 }