18e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall/* 28e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * Copyright (C) 2014 The Android Open Source Project 38e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * 48e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License"); 58e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * you may not use this file except in compliance with the License. 68e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * You may obtain a copy of the License at 78e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * 88e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * http://www.apache.org/licenses/LICENSE-2.0 98e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * 108e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * Unless required by applicable law or agreed to in writing, software 118e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS, 128e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * See the License for the specific language governing permissions and 148e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall * limitations under the License. 158e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall */ 168e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 178e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <fcntl.h> 188e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <libgen.h> 198e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <stdio.h> 208e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <stdlib.h> 21879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <string.h> 22879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <unistd.h> 238e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 248e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#if defined(__linux__) 258e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <linux/fs.h> 268e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#elif defined(__APPLE__) && defined(__MACH__) 278e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#include <sys/disk.h> 288e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#endif 298e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 30879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include "make_f2fs.h" 31879785074ca93e13896ce364a45eb5cc17081c4aDan Albert 328e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#ifndef USE_MINGW /* O_BINARY is windows-specific flag */ 338e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#define O_BINARY 0 348e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall#endif 358e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 368e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrallstatic void usage(char *path) 378e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall{ 388e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fprintf(stderr, "%s -l <len>\n", basename(path)); 398e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fprintf(stderr, " <filename>\n"); 408e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall} 418e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 428e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrallint main(int argc, char **argv) 438e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall{ 448e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall int opt; 458e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall const char *filename = NULL; 468e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall int fd; 478e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall int exitcode; 488e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall long long len; 498e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall while ((opt = getopt(argc, argv, "l:")) != -1) { 508e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall switch (opt) { 518e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall case 'l': 528e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall len = atoll(optarg); 538e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall break; 548e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall default: /* '?' */ 558e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall usage(argv[0]); 568e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall exit(EXIT_FAILURE); 578e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 588e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 598e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 608e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 618e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall if (optind >= argc) { 628e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fprintf(stderr, "Expected filename after options\n"); 638e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall usage(argv[0]); 648e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall exit(EXIT_FAILURE); 658e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 668e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 678e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall filename = argv[optind++]; 688e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 698e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall if (optind < argc) { 708e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); 718e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall usage(argv[0]); 728e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall exit(EXIT_FAILURE); 738e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 748e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 758e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall if (strcmp(filename, "-")) { 768e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); 778e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall if (fd < 0) { 788e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall perror("open"); 798e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall return EXIT_FAILURE; 808e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 818e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } else { 828e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall fd = STDOUT_FILENO; 838e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall } 848e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 858e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall exitcode = make_f2fs_sparse_fd(fd, len, NULL, NULL); 868e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall 878e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall close(fd); 888e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall if (exitcode && strcmp(filename, "-")) 898e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall unlink(filename); 908e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall return exitcode; 918e9cdda6fcb6a84cffbcc1ab44a7ecec402a9424JP Abgrall} 92