/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <fcntl.h> #include <libgen.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #if defined(__linux__) #include <linux/fs.h> #elif defined(__APPLE__) && defined(__MACH__) #include <sys/disk.h> #endif #ifndef USE_MINGW /* O_BINARY is windows-specific flag */ #define O_BINARY 0 #endif static void usage(char *path) { fprintf(stderr, "%s -l <len>\n", basename(path)); fprintf(stderr, " <filename>\n"); } int main(int argc, char **argv) { int opt; const char *filename = NULL; int fd; int exitcode; long long len; while ((opt = getopt(argc, argv, "l:")) != -1) { switch (opt) { case 'l': len = atoll(optarg); break; default: /* '?' */ usage(argv[0]); exit(EXIT_FAILURE); } } if (optind >= argc) { fprintf(stderr, "Expected filename after options\n"); usage(argv[0]); exit(EXIT_FAILURE); } filename = argv[optind++]; if (optind < argc) { fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); usage(argv[0]); exit(EXIT_FAILURE); } if (strcmp(filename, "-")) { fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); if (fd < 0) { perror("open"); return EXIT_FAILURE; } } else { fd = STDOUT_FILENO; } exitcode = make_f2fs_sparse_fd(fd, len, NULL, NULL); close(fd); if (exitcode && strcmp(filename, "-")) unlink(filename); return exitcode; }