merge irix dmapi test changes
[xfstests-dev.git] / dmapi / src / common / cmd / read_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 <ctype.h>
34
35 #include <lib/hsm.h>
36
37 #include <string.h>
38 #include <malloc.h>
39 #include <unistd.h>
40
41 /*---------------------------------------------------------------------------
42
43 Test program used to test the DMAPI function dm_read_invis().  The
44 command line is:
45
46         read_invis [-o offset] [-l length] [-s sid] pathname
47
48 where:
49 'offset' is the offset of the start of the write (0 is the default),
50 'length' is the length of the write in bytes (1 is the default),
51 'sid' is the session ID whose events you you are interested in.
52 'pathname' is the name of the file to be written.
53
54 ----------------------------------------------------------------------------*/
55
56 #ifndef linux
57 extern  char    *sys_errlist[];
58 #endif
59 extern  int     optind;
60 extern  char    *optarg;
61
62
63 char    *Progname;
64
65
66 static void
67 usage(void)
68 {
69         fprintf(stderr, "usage:\t%s [-o offset] [-l length] "
70                 "[-s sid] pathname\n", Progname);
71         exit(1);
72 }
73
74
75 int
76 main(
77         int     argc, 
78         char    **argv)
79 {
80         dm_sessid_t     sid = DM_NO_SESSION;
81         char            *pathname = NULL;
82         dm_off_t        offset = 0;
83         dm_size_t       length = 1;
84         char            *bufp = NULL;
85         void            *hanp;
86         size_t          hlen;
87         dm_ssize_t      rc;
88         char            *name;
89         int             opt;
90         int             i;
91
92         if (Progname = strrchr(argv[0], '/')) {
93                 Progname++;
94         } else {
95                 Progname = argv[0];
96         }
97
98         /* Crack and validate the command line options. */
99
100         while ((opt = getopt(argc, argv, "o:l:s:")) != EOF) {
101                 switch (opt) {
102                 case 'o':
103                         offset = atol(optarg);
104                         break;
105                 case 'l':
106                         length = atol(optarg);
107                         break;
108                 case 's':
109                         sid = atol(optarg);
110                         break;
111                 case '?':
112                         usage();
113                 }
114         }
115         if (optind + 1 != argc)
116                 usage();
117         pathname = argv[optind];
118
119         if (dm_init_service(&name) == -1)  {
120                 fprintf(stderr, "Can't inititalize the DMAPI\n");
121                 exit(1);
122         }
123         if (sid == DM_NO_SESSION)
124                 find_test_session(&sid);
125
126         /* Get the file's handle. */
127
128         if (dm_path_to_handle(pathname, &hanp, &hlen)) {
129                 fprintf(stderr, "can't get handle for file %s\n", pathname);
130                 exit(1);
131         }
132
133         if (length > 0) {
134                 /* In case it is a realtime file, align the buffer on a
135                    sufficiently big boundary.
136                 */
137                 if ((bufp = memalign(4096, length)) == NULL) {
138                         fprintf(stderr, "malloc of %llu bytes failed\n", length);
139                         exit(1);
140                 }
141                 memset(bufp, '\0', length);
142         }
143
144         rc = dm_read_invis(sid, hanp, hlen, DM_NO_TOKEN, offset, length, bufp);
145
146         if (rc < 0) {
147                 fprintf(stderr, "dm_read_invis failed, %s\n", strerror(errno));
148                 exit(1);
149         } else if (rc != length) {
150                 fprintf(stderr, "expected to read %lld bytes, actually "
151                         "read %lld\n", length, rc);
152                 exit(1);
153         }
154         for (i = 0; i < rc; i++) {
155                 if (isprint(bufp[i])) {
156                         fprintf(stdout, "%c", bufp[i]);
157                 } else {
158                         fprintf(stdout, "\\%03d", bufp[i]);
159                 }
160         }
161         dm_handle_free(hanp, hlen);
162         exit(0);
163 }