1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Copyright (c) 2012 by Delphix. All rights reserved. 29 */ 30 31 /* 32 * Copyright (c) 2018, Joyent, Inc. 33 */ 34 35 #include "../file_common.h" 36 37 /* 38 * Create a file with assigned size and then free the specified 39 * section of the file 40 */ 41 42 static void usage(char *progname); 43 44 static void 45 usage(char *progname) 46 { 47 (void) fprintf(stderr, 48 "usage: %s [-l filesize] [-s start-offset]" 49 "[-n section-len] filename\n", progname); 50 exit(1); 51 } 52 53 int 54 main(int argc, char *argv[]) 55 { 56 char *filename = NULL; 57 char *buf; 58 size_t filesize = 0; 59 off_t start_off = 0; 60 off_t off_len = 0; 61 int fd, ch; 62 struct flock fl; 63 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; 64 65 while ((ch = getopt(argc, argv, "l:s:n:")) != EOF) { 66 switch (ch) { 67 case 'l': 68 filesize = atoll(optarg); 69 break; 70 case 's': 71 start_off = atoll(optarg); 72 break; 73 case 'n': 74 off_len = atoll(optarg); 75 break; 76 default: 77 usage(argv[0]); 78 break; 79 } 80 } 81 82 if (optind == argc - 1) 83 filename = argv[optind]; 84 else 85 usage(argv[0]); 86 87 buf = (char *)malloc(filesize); 88 89 if ((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, mode)) < 0) { 90 perror("open"); 91 free(buf); 92 return (1); 93 } 94 if (write(fd, buf, filesize) < filesize) { 95 perror("write"); 96 free(buf); 97 return (1); 98 } 99 fl.l_whence = SEEK_SET; 100 fl.l_start = start_off; 101 fl.l_len = off_len; 102 if (fcntl(fd, F_FREESP, &fl) != 0) { 103 perror("fcntl"); 104 free(buf); 105 return (1); 106 } 107 108 free(buf); 109 return (0); 110 } 111