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