xref: /freebsd-src/sys/contrib/openzfs/tests/zfs-tests/cmd/truncate_test.c (revision 716fd348e01c5f2ba125f878a634a753436c2994)
1*716fd348SMartin Matuska /*
2*716fd348SMartin Matuska  * This file and its contents are supplied under the terms of the
3*716fd348SMartin Matuska  * Common Development and Distribution License ("CDDL"), version 1.0.
4*716fd348SMartin Matuska  * You may only use this file in accordance with the terms of version
5*716fd348SMartin Matuska  * 1.0 of the CDDL.
6*716fd348SMartin Matuska  *
7*716fd348SMartin Matuska  * A full copy of the text of the CDDL should have accompanied this
8*716fd348SMartin Matuska  * source.  A copy of the CDDL is also available via the Internet at
9*716fd348SMartin Matuska  * http://www.illumos.org/license/CDDL.
10*716fd348SMartin Matuska  */
11*716fd348SMartin Matuska 
12*716fd348SMartin Matuska /*
13*716fd348SMartin Matuska  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
14*716fd348SMartin Matuska  * Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
15*716fd348SMartin Matuska  */
16*716fd348SMartin Matuska 
17*716fd348SMartin Matuska #include <fcntl.h>
18*716fd348SMartin Matuska #include <sys/stat.h>
19*716fd348SMartin Matuska #include <sys/types.h>
20*716fd348SMartin Matuska #include <unistd.h>
21*716fd348SMartin Matuska #include <errno.h>
22*716fd348SMartin Matuska #include <stdio.h>
23*716fd348SMartin Matuska #include <stdlib.h>
24*716fd348SMartin Matuska 
25*716fd348SMartin Matuska #define	FSIZE	256*1024*1024
26*716fd348SMartin Matuska 
27*716fd348SMartin Matuska static long	fsize = FSIZE;
28*716fd348SMartin Matuska static int	errflag = 0;
29*716fd348SMartin Matuska static char	*filename = NULL;
30*716fd348SMartin Matuska static int	ftruncflag = 0;
31*716fd348SMartin Matuska 
32*716fd348SMartin Matuska static void parse_options(int argc, char *argv[]);
33*716fd348SMartin Matuska 
34*716fd348SMartin Matuska static void
usage(char * execname)35*716fd348SMartin Matuska usage(char *execname)
36*716fd348SMartin Matuska {
37*716fd348SMartin Matuska 	(void) fprintf(stderr,
38*716fd348SMartin Matuska 	    "usage: %s [-s filesize] [-f] /path/to/file\n", execname);
39*716fd348SMartin Matuska 	(void) exit(1);
40*716fd348SMartin Matuska }
41*716fd348SMartin Matuska 
42*716fd348SMartin Matuska int
main(int argc,char * argv[])43*716fd348SMartin Matuska main(int argc, char *argv[])
44*716fd348SMartin Matuska {
45*716fd348SMartin Matuska 	int fd;
46*716fd348SMartin Matuska 
47*716fd348SMartin Matuska 	parse_options(argc, argv);
48*716fd348SMartin Matuska 
49*716fd348SMartin Matuska 	if (ftruncflag) {
50*716fd348SMartin Matuska 		fd = open(filename, O_RDWR|O_CREAT, 0666);
51*716fd348SMartin Matuska 		if (fd < 0) {
52*716fd348SMartin Matuska 			perror("open");
53*716fd348SMartin Matuska 			return (1);
54*716fd348SMartin Matuska 		}
55*716fd348SMartin Matuska 		if (ftruncate(fd, fsize) < 0) {
56*716fd348SMartin Matuska 			perror("ftruncate");
57*716fd348SMartin Matuska 			return (1);
58*716fd348SMartin Matuska 		}
59*716fd348SMartin Matuska 		if (close(fd)) {
60*716fd348SMartin Matuska 			perror("close");
61*716fd348SMartin Matuska 			return (1);
62*716fd348SMartin Matuska 		}
63*716fd348SMartin Matuska 	} else {
64*716fd348SMartin Matuska 		if (truncate(filename, fsize) < 0) {
65*716fd348SMartin Matuska 			perror("truncate");
66*716fd348SMartin Matuska 			return (1);
67*716fd348SMartin Matuska 		}
68*716fd348SMartin Matuska 	}
69*716fd348SMartin Matuska 	return (0);
70*716fd348SMartin Matuska }
71*716fd348SMartin Matuska 
72*716fd348SMartin Matuska static void
parse_options(int argc,char * argv[])73*716fd348SMartin Matuska parse_options(int argc, char *argv[])
74*716fd348SMartin Matuska {
75*716fd348SMartin Matuska 	int c;
76*716fd348SMartin Matuska 	extern char *optarg;
77*716fd348SMartin Matuska 	extern int optind, optopt;
78*716fd348SMartin Matuska 
79*716fd348SMartin Matuska 	while ((c = getopt(argc, argv, "s:f")) != -1) {
80*716fd348SMartin Matuska 		switch (c) {
81*716fd348SMartin Matuska 			case 's':
82*716fd348SMartin Matuska 				fsize = atoi(optarg);
83*716fd348SMartin Matuska 				break;
84*716fd348SMartin Matuska 			case 'f':
85*716fd348SMartin Matuska 				ftruncflag++;
86*716fd348SMartin Matuska 				break;
87*716fd348SMartin Matuska 			case ':':
88*716fd348SMartin Matuska 				(void) fprintf(stderr,
89*716fd348SMartin Matuska 				    "Option -%c requires an operand\n", optopt);
90*716fd348SMartin Matuska 				errflag++;
91*716fd348SMartin Matuska 				break;
92*716fd348SMartin Matuska 		}
93*716fd348SMartin Matuska 		if (errflag) {
94*716fd348SMartin Matuska 			(void) usage(argv[0]);
95*716fd348SMartin Matuska 		}
96*716fd348SMartin Matuska 	}
97*716fd348SMartin Matuska 
98*716fd348SMartin Matuska 	if (argc <= optind) {
99*716fd348SMartin Matuska 		(void) fprintf(stderr, "No filename specified\n");
100*716fd348SMartin Matuska 		usage(argv[0]);
101*716fd348SMartin Matuska 	}
102*716fd348SMartin Matuska 	filename = argv[optind];
103*716fd348SMartin Matuska }
104