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