src/t_dir_offset2: Add an option to find file by name
[xfstests-dev.git] / src / devzero.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2003 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6
7 #include "global.h"
8
9 int
10 main(int argc, char **argv)
11 {
12         off_t           offset = 0;
13         int             blksize = 4096;
14         long long       maxblks = -1;   /* no limit */
15         long long       nblks = 0;
16         int             value = 0;
17         int             sts = 0;
18         int             fd;
19         char            *z;
20         char            *path;
21         int             oflags = O_WRONLY;
22
23         char    *progname;
24
25         if (strrchr(argv[0],'/'))
26                 progname = strrchr(argv[0],'/')+1;
27         else
28                 progname = argv[0];
29
30         while ((fd = getopt(argc, argv, "b:n:o:v:ct")) != EOF) {
31                 switch (fd) {
32                 case 'b':
33                         blksize = atoi(optarg) * 512;
34                         break;
35                 case 'n':
36                         maxblks = atoll(optarg);
37                         break;
38                 case 'o':
39                         offset = atoll(optarg);
40                         break;
41                 case 'v':
42                         value = atoi(optarg);
43                         break;
44                 case 'c':
45                         oflags |= O_CREAT;
46                         break;
47                 case 't':
48                         oflags |= O_TRUNC;
49                         break;
50                 default:
51                         sts++;
52                 }
53         }
54         if (sts || argc - optind != 1) {
55                 fprintf(stderr,
56                         "Usage: %s [-b N*512] [-n N] [-o off] [-v val] "
57                                 " [-c] [-t] <dev/file>\n",
58                         progname);
59                 fprintf(stderr,"      -c: create -t: truncate\n");
60                 exit(1);
61         }
62
63         path = argv[optind];
64
65         if ((fd = open(path, oflags, 0600)) < 0) {
66                 fprintf(stderr,
67                         "error opening \"%s\": %s\n",
68                         path, strerror(errno));
69                 exit(1);
70         }
71         if ((lseek64(fd, offset, SEEK_SET)) < 0) {
72                 fprintf(stderr, "%s: error seeking to offset %llu "
73                                         "on \"%s\": %s\n",
74                         progname, (unsigned long long)offset, path, strerror(errno));
75                 exit(1);
76         }
77
78         if ((z = memalign(getpagesize(), blksize)) == NULL) {
79                 fprintf(stderr, "%s: can't memalign %u bytes: %s\n",
80                         progname, blksize, strerror(errno));
81                 exit(1);
82         }
83         memset(z, value, blksize);
84         errno = 0;
85         for (;;) {
86                 if (nblks++ == maxblks)
87                         break;
88                 if ((sts = write(fd, z, blksize)) < blksize) {
89                         if (errno == ENOSPC || sts >= 0)
90                                 break;
91                         fprintf(stderr, "%s: write failed: %s\n",
92                                 progname, strerror(errno));
93                         break;
94                 }
95         }
96         printf("Wrote %.2fKb (value 0x%x)\n",
97                 (double) ((--nblks) * blksize) / 1024, value);
98         free(z);
99         return 0;
100 }