merge irix dmapi test changes
[xfstests-dev.git] / dmapi / src / suite1 / cmd / handle_to_path.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 <errno.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37
38 #include <lib/dmport.h>
39
40 #include <getopt.h>
41 #ifdef linux
42 #include <xfs/handle.h>
43 #endif
44
45 /*---------------------------------------------------------------------------
46
47 Test program used to test the DMAPI function dm_handle_to_path().  The
48 command line is:
49
50         handle_to_path [-b buflen] dirpath objpath
51
52 There are two parameters.  The first is the pathname of a directory,
53 and the second is the pathname of a file, directory, or symbolic link
54 within that directory.  The second parameter can also be the same as
55 the first if you want to specify "." (this is how EMASS uses it).
56 Pathnames can either be relative or full.
57
58 buflen is the size of the buffer to use in the call.
59
60 This program will return the full pathname of the object which is the
61 second parameter using the dm_handle_to_path() function.
62
63 The program should work successfully for files, directories, and
64 symbolic links, and does not have to work for any other type of
65 object.  It doesn't have to work across mount points.  There shouldn't
66 be any "/." crud on the end of the returned pathname either.
67
68 ----------------------------------------------------------------------------*/
69
70 extern  int     optind;
71 extern  char    *optarg;
72
73
74 char    *Progname;
75
76
77 static void
78 usage(void)
79 {
80         fprintf(stderr, "usage:\t%s [-b buflen] dirpath objpath\n", Progname);
81         exit(1);
82 }
83
84
85 int
86 main(
87         int             argc,
88         char            **argv)
89 {
90         char            *dirpath;
91         char            *objpath;
92         void            *hanp1, *hanp2, *hanp1a;
93         size_t          hlen1, hlen2, hlen1a;
94         void            *pathbufp;
95         size_t          buflen = 1024;
96         size_t          rlenp;
97         char            *name;
98         int             opt;
99
100         if (Progname = strrchr(argv[0], '/')) {
101                 Progname++;
102         } else {
103                 Progname = argv[0];
104         }
105
106         /* Crack and validate the command line options. */
107
108         while ((opt = getopt(argc, argv, "b:")) != EOF) {
109                 switch (opt) {
110                 case 'b':
111                         buflen = atol(optarg);
112                         break;
113                 case '?':
114                         usage();
115                 }
116         }
117         if (optind + 2 != argc)
118                 usage();
119         dirpath = argv[optind++];
120         objpath = argv[optind];
121
122         if (dm_init_service(&name)) {
123                 fprintf(stderr, "Can't inititalize the DMAPI\n");
124                 return(1);
125         }
126
127         if (dm_path_to_handle(dirpath, &hanp1, &hlen1)) {
128                 fprintf(stderr, "dm_path_to_handle failed for %s, (%d) %s\n",
129                         dirpath, errno, strerror(errno));
130                 return(1);
131         }
132         if (path_to_handle(dirpath, &hanp1a, &hlen1a)) {
133                 fprintf(stderr, "path_to_handle failed for %s, (%d) %s\n",
134                         dirpath, errno, strerror(errno));
135                 return(1);
136         }
137         if(hlen1 != hlen1a){
138                 fprintf(stderr, "dm_path_to_handle != path_to_handle, %d != %d\n",
139                         hlen1, hlen1a);
140         }
141         if( memcmp(hanp1, hanp1a, hlen1) != 0 ){
142                 fprintf(stderr, "dm_path_to_handle != path_to_handle, handles differ\n");
143         }
144         if (dm_path_to_handle(objpath, &hanp2, &hlen2)) {
145                 fprintf(stderr, "dm_path_to_handle failed for %s, (%d) %s\n",
146                         objpath, errno, strerror(errno));
147                 return(1);
148         }
149
150         if ((pathbufp = malloc(buflen == 0 ? 1 : buflen)) == NULL) {
151                 fprintf(stderr, "malloc failed\n");
152                 return(1);
153         }
154
155         if (dm_handle_to_path(hanp1, hlen1, hanp2, hlen2,
156             buflen, pathbufp, &rlenp)) {
157                 if (errno == E2BIG) {
158                         fprintf(stderr, "dm_handle_to_path buffer too small, "
159                                 "should be %d bytes\n", rlenp);
160                 } else {
161                         fprintf(stderr, "dm_handle_to_path failed, (%d) %s\n",
162                                 errno, strerror(errno));
163                 }
164                 return(1);
165         }
166         fprintf(stderr, "rlenp is %d, pathbufp is %s\n", rlenp, (char*)pathbufp);
167         if (strlen(pathbufp) + 1 != rlenp) {
168                 fprintf(stderr, "rlenp is %d, should be %d\n", rlenp,
169                         strlen(pathbufp) + 1);
170                 return(1);
171         }
172         exit(0);
173 }