xfstests: eliminate warnings under dmapi/src/suite1/cmd (3)
[xfstests-dev.git] / dmapi / src / suite1 / cmd / rwt.c
1 /*
2  * Copyright (c) 2000-2001 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include <sys/types.h>
20 #include <sys/stat.h>
21
22 #include <errno.h>
23 #include <fcntl.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <strings.h>
27 #include <unistd.h>
28
29 #include <string.h>
30
31 /*---------------------------------------------------------------------------
32
33 Test program used to test DMAPI by issuing read, write, and trunc calls to a
34 file.  The command line is:
35
36         rwt [-r|-w|-t] [-o offset] [-l length] pathname
37
38 where:
39 -r
40         indicates that a read should be done (the default if none specified)
41 -w
42         indiates that a write should be done
43 -t
44         indicates that a truncate should be done, in which case the -l
45         parameter is ignored.
46 -o offset
47         offset at which to begin the read, write or truncate (default is 0).
48 -l length
49         the length in bytes to read or write (default is 1).
50 pathname
51         the file to be used by the test.
52
53 ----------------------------------------------------------------------------*/
54
55 #ifndef linux
56 extern  char    *sys_errlist[];
57 #endif
58 extern  int     optind;
59 extern  char    *optarg;
60
61
62 char    *Progname;
63
64
65 static void
66 usage(void)
67 {
68         fprintf(stderr, "usage:\t%s [-r|-w|-t] [-o offset] [-l length] "
69                 "pathname\n", Progname);
70         exit(1);
71 }
72
73
74 int
75 main(
76         int     argc, 
77         char    **argv)
78 {
79         char            *pathname = NULL;
80         off_t           offset = 0;
81         size_t          length = 1;
82         u_char          ch = 'X';
83         void            *bufp = NULL;
84         off_t           seek_off;
85         int             rflag = 0;
86         int             wflag = 0;
87         int             tflag = 0;
88         int             fd;
89         ssize_t         rc;
90         int             opt;
91
92         Progname = strrchr(argv[0], '/');
93         if (Progname) {
94                 Progname++;
95         } else {
96                 Progname = argv[0];
97         }
98
99         /* Crack and validate the command line options. */
100
101         while ((opt = getopt(argc, argv, "rwto:l:")) != EOF) {
102                 switch (opt) {
103                 case 'r':
104                         rflag++;
105                         break;
106                 case 'w':
107                         wflag++;
108                         break;
109                 case 't':
110                         tflag++;
111                         break;
112                 case 'o':
113                         offset = atol(optarg);
114                         break;
115                 case 'l':
116                         length = atol(optarg);
117                         break;
118                 case '?':
119                         usage();
120                 }
121         }
122         if (optind + 1 != argc)
123                 usage();
124         if (rflag + wflag + tflag > 1)
125                 usage();
126         pathname = argv[optind];
127
128         if ((fd = open(pathname, O_RDWR)) < 0) {
129                 fprintf(stderr, "open of %s failed, %s\n", pathname,
130                         strerror(errno));
131                 exit(1);
132         }
133         if (length > 0) {
134                 if ((bufp = malloc(length)) == NULL) {
135                         fprintf(stderr, "malloc of %zd bytes failed\n", length);
136                         exit(1);
137                 }
138                 if (wflag)
139                         memset(bufp, ch, length);
140         }
141
142         if (!tflag) {
143                 if ((seek_off = lseek(fd, offset, SEEK_SET)) < 0) {
144                         fprintf(stderr, "seek failed, %s\n", strerror(errno));
145                         exit(1);
146                 }
147                 if (seek_off != offset) {
148                         fprintf(stderr,
149                                 "seeked to offset %lld, actually "
150                                 "arrived at %lld\n",
151                                 (long long) offset, (long long) seek_off);
152                         exit(1);
153                 }
154         }
155
156         if (wflag) {
157                 if ((rc = write(fd, bufp, length)) < 0) {
158                         fprintf(stderr, "write failed, %s\n", strerror(errno));
159                         exit(1);
160                 }
161                 if (rc != length) {
162                         fprintf(stderr, "expected to write %zd bytes, actually "
163                                 "wrote %zd bytes\n", length, rc);
164                         exit(1);
165                 }
166         } else if (tflag) {
167                 if (ftruncate(fd, offset) != 0) {
168                         fprintf(stderr, "truncate failed, %s\n",
169                                 strerror(errno));
170                         exit(1);
171                 }
172         } else {
173                 if ((rc = read(fd, bufp, length)) < 0) {
174                         fprintf(stderr, "read failed, %s\n", strerror(errno));
175                         exit(1);
176                 }
177                 if (rc != length) {
178                         fprintf(stderr, "expected to read %zd bytes, actually "
179                                 "read %zd bytes\n", length, rc);
180                         exit(1);
181                 }
182         }
183         exit(0);
184 }