e253fd8fe293eaa3e9e7968d7bee0ea0ab477d4b
[xfstests-dev.git] / dmapi / src / common / cmd / write_invis.c
1 /*
2  * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3  * 
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  * 
8  * This program is distributed in the hope that it would be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * 
12  * Further, this software is distributed without any warranty that it is
13  * free of the rightful claim of any third person regarding infringement
14  * or the like.  Any license provided herein, whether implied or
15  * otherwise, applies only to this software file.  Patent licenses, if
16  * any, provided herein do not apply to combinations of this program with
17  * other software, or any other product whatsoever.
18  * 
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write the Free Software Foundation, Inc., 59
21  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22  * 
23  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24  * Mountain View, CA  94043, or:
25  * 
26  * http://www.sgi.com 
27  * 
28  * For further information regarding this notice, see: 
29  * 
30  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31  */
32
33 #include <lib/hsm.h>
34
35 #include <string.h>
36 #include <malloc.h>
37 #include <getopt.h>
38
39 /*---------------------------------------------------------------------------
40
41 Test program used to test the DMAPI function dm_write_invis().  The
42 command line is:
43
44         write_invis [-c char] [-o offset] [-l length] [-s sid] pathname
45
46 where:
47 'char' is the character to use as a repeated pattern ('X' is the default),
48 'offset' is the offset of the start of the write (0 is the default),
49 'length' is the length of the write in bytes (1 is the default),
50 'sid' is the session ID whose events you you are interested in.
51 'pathname' is the name of the file to be written.
52
53 DM_WRITE_SYNC is is not supported.
54
55 ----------------------------------------------------------------------------*/
56
57 #ifndef linux
58 extern  char    *sys_errlist[];
59 #endif
60 extern  int     optind;
61 extern  char    *optarg;
62
63
64 char    *Progname;
65
66
67 static void
68 usage(void)
69 {
70         fprintf(stderr, "usage:\t%s [-c char] [-o offset] [-l length] "
71                 "[-s sid] pathname\n", Progname);
72         exit(1);
73 }
74
75
76 int
77 main(
78         int     argc, 
79         char    **argv)
80 {
81         dm_sessid_t     sid = DM_NO_SESSION;
82         char            *pathname = NULL;
83         dm_off_t        offset = 0;
84         dm_size_t       length = 1;
85         u_char          ch = 'X';
86         void            *bufp = NULL;
87         void            *hanp;
88         size_t          hlen;
89         dm_ssize_t      rc;
90         char            *name;
91         int             opt;
92
93         if (Progname = strrchr(argv[0], '/')) {
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, "c:o:l:s:")) != EOF) {
102                 switch (opt) {
103                 case 'c':
104                         ch = *optarg;
105                         break;
106                 case 'o':
107                         offset = atol(optarg);
108                         break;
109                 case 'l':
110                         length = atol(optarg);
111                         break;
112                 case 's':
113                         sid = atol(optarg);
114                         break;
115                 case '?':
116                         usage();
117                 }
118         }
119         if (optind + 1 != argc)
120                 usage();
121         pathname = argv[optind];
122
123         if (dm_init_service(&name) == -1)  {
124                 fprintf(stderr, "Can't initialize the DMAPI\n");
125                 exit(1);
126         }
127         if (sid == DM_NO_SESSION)
128                 find_test_session(&sid);
129
130         /* Get the file's handle. */
131
132         if (dm_path_to_handle(pathname, &hanp, &hlen)) {
133                 fprintf(stderr, "can't get handle for file %s\n", pathname);
134                 exit(1);
135         }
136
137         if (length > 0) {
138                 /* In case it is a realtime file, align the buffer on a
139                    sufficiently big boundary.
140                 */
141                 if ((bufp = memalign(4096, length)) == NULL) {
142                         fprintf(stderr, "malloc of %llu bytes failed\n", length);
143                         exit(1);
144                 }
145                 memset(bufp, ch, length);
146         }
147
148         rc = dm_write_invis(sid, hanp, hlen, DM_NO_TOKEN, 0, offset, length, bufp);
149
150         if (rc < 0) {
151                 fprintf(stderr, "dm_write_invis failed, %s\n", strerror(errno));
152                 exit(1);
153         } else if (rc != length) {
154                 fprintf(stderr, "expected to write %lld bytes, actually "
155                         "wrote %lld\n", length, rc);
156                 exit(1);
157         }
158         dm_handle_free(hanp, hlen);
159         exit(0);
160 }