1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 1996-2003 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "%Z%%M% %I% %E% SMI"
28
29 #include <locale.h>
30 #include <sys/types.h>
31 #include <sys/param.h>
32 #include <stdio.h>
33 #include <dirent.h>
34 #include <sys/acl.h>
35 #include <sys/fs/cachefs_fs.h>
36 #include <sys/fs/cachefs_dlog.h>
37 #include <sys/fs/cachefs_ioctl.h>
38 #include <errno.h>
39 #include <string.h>
40
41 extern int verbose;
42
43 /*
44 * Function used by -d option to display pathname
45 */
46 int
prtfn(char * pathnam,char * fnam,DIR * dirp,int depth)47 prtfn(char *pathnam, char *fnam, DIR *dirp, int depth)
48 {
49 printf("%s\n", pathnam);
50 return (0);
51 }
52
53 /*
54 * Function used by -p option to pack pathname
55 */
56 int
packfn(char * pathnam,char * fnam,DIR * dirp,int depth)57 packfn(char *pathnam, char *fnam, DIR *dirp, int depth)
58 {
59 cachefsio_pack_t pack;
60 int xx;
61 int len;
62
63 #ifdef DEBUG
64 printf("packfn: pathnam = %s", pathnam);
65 fflush(stdout);
66 if (fnam != NULL) {
67 printf(" fnam = %s\n", fnam);
68 } else {
69 printf("\n");
70 }
71 printf("packfn: dirp = %x depth = %d\n", dirp, depth);
72 fflush(stdout);
73 #endif /* DEBUG */
74 if (fnam != NULL) {
75 len = strlen(fnam);
76 if (len >= sizeof (pack.p_name)) {
77 fprintf(stderr, gettext(
78 "cachefspack: file name too long - %s\n"),
79 pathnam);
80 return (-1);
81 }
82 #ifdef DEBUG
83 printf("packfn: len = %d\n", len);
84 fflush(stdout);
85 #endif /* DEBUG */
86 while (fnam[len-1] == '/') {
87 len--;
88 }
89 strncpy(pack.p_name, fnam, len);
90 } else {
91 len = 0;
92 }
93 pack.p_name[len] = '\0';
94 pack.p_status = 0;
95 #ifdef DEBUG
96 printf("packfn: pack.p_name = %s pack.p_status = %x\n",
97 pack.p_name, pack.p_status);
98 fflush(stdout);
99 #endif /* DEBUG */
100
101 xx = ioctl(dirp->dd_fd, CACHEFSIO_PACK, &pack);
102 #ifdef DEBUG
103 printf("packfn: xx = %x errno = %d\n", xx, errno);
104 fflush(stdout);
105 #endif /* DEBUG */
106 if (xx) {
107 if (errno == ENOTTY) {
108 return (0);
109 }
110 if (errno == ENOSYS) {
111 return (0);
112 }
113 fprintf(stderr, gettext("cachefspack: %s - "), pathnam);
114 perror(gettext("can't pack file"));
115 return (-1);
116 }
117 return (0);
118 }
119
120 /*
121 * Function used by -p option to unpack pathname
122 */
123 int
unpackfn(char * pathnam,char * fnam,DIR * dirp,int depth)124 unpackfn(char *pathnam, char *fnam, DIR *dirp, int depth)
125 {
126 cachefsio_pack_t pack;
127 int xx;
128 int len;
129
130 #ifdef DEBUG
131 printf("unpackfn: pathnam = %s ", pathnam);
132 if (fnam != NULL) {
133 printf(" fnam = %s\n", fnam);
134 } else {
135 printf("\n");
136 }
137 printf("unpackfn: dirp = %x depth = %d\n", dirp, depth);
138 fflush(stdout);
139 #endif /* DEBUG */
140 if (fnam != NULL) {
141 len = strlen(fnam);
142 if (len >= sizeof (pack.p_name)) {
143 fprintf(stderr, gettext(
144 "cachefspack: file name too long - %s\n"), pathnam);
145 return (-1);
146 }
147 while (fnam[len-1] == '/') {
148 len--;
149 }
150 strncpy(pack.p_name, fnam, len);
151 } else {
152 len = 0;
153 }
154 pack.p_name[len] = '\0';
155 pack.p_status = 0;
156 #ifdef DEBUG
157 printf("unpackfn: pack.p_name = %s pack.p_status = %x\n",
158 pack.p_name, pack.p_status);
159 fflush(stdout);
160 #endif /* DEBUG */
161
162 xx = ioctl(dirp->dd_fd, CACHEFSIO_UNPACK, &pack);
163 #ifdef DEBUG
164 printf("unpackfn: pack.p_name = %s pack.p_status = %x\n",
165 pack.p_name, pack.p_status);
166 fflush(stdout);
167 #endif /* DEBUG */
168 if (xx) {
169 if (errno == ENOTTY) {
170 return (0);
171 }
172 if (errno == ENOSYS) {
173 return (0);
174 }
175 fprintf(stderr, gettext("cachefspack: %s - "), pathnam);
176 perror(gettext("can't unpack file"));
177 return (-1);
178 }
179 return (0);
180 }
181
182 /*
183 * Function used by -i option to print status of pathname
184 */
185 int
inquirefn(char * pathnam,char * fnam,DIR * dirp,int depth)186 inquirefn(char *pathnam, char *fnam, DIR *dirp, int depth)
187 {
188 cachefsio_pack_t pack;
189 int xx;
190 int len;
191
192 #ifdef DEBUG
193 printf("inquirefn: pathnam = %s ", pathnam);
194 if (fnam != NULL) {
195 printf("fnam = %s\n", fnam);
196 } else {
197 printf("\n");
198 }
199 printf("inquirefn: dirp = %x depth = %d\n", dirp, depth);
200 fflush(stdout);
201 #endif /* DEBUG */
202 if (fnam != NULL) {
203 len = strlen(fnam);
204 if (len >= sizeof (pack.p_name)) {
205 fprintf(stderr,
206 gettext("cachefspack: file name too long - %s\n"),
207 pathnam);
208 return (-1);
209 }
210 while (fnam[len-1] == '/') {
211 len--;
212 }
213 strncpy(pack.p_name, fnam, len);
214 } else {
215 len = 0;
216 }
217 pack.p_name[len] = '\0';
218 pack.p_status = 0;
219 #ifdef DEBUG
220 printf("inquirefn: pack.p_name = %s pack.p_status = %x\n",
221 pack.p_name, pack.p_status);
222 fflush(stdout);
223 #endif /* DEBUG */
224
225 xx = ioctl(dirp->dd_fd, CACHEFSIO_PACKINFO, &pack);
226 #ifdef DEBUG
227 printf("inquirefn: xx = %x errno = %d\n", xx, errno);
228 fflush(stdout);
229 #endif /* DEBUG */
230 if (xx) {
231 if ((errno == ENOTTY) || (errno == ENOSYS)) {
232 #ifdef CFS_MSG
233 fprintf(stderr, gettext("cachefspack: "));
234 fprintf(stderr,
235 gettext("%s - is not in a cacheFS file system\n"),
236 pathnam);
237 #endif /* CFS_MSG */
238 return (-1);
239 }
240 fprintf(stderr, gettext("cachefspack: %s - "), pathnam);
241 perror(gettext("can't get info"));
242 return (-2);
243 }
244
245 printf(gettext("cachefspack: file %s "), pathnam);
246 printf(gettext("marked packed %s, packed %s\n"),
247 (pack.p_status & CACHEFS_PACKED_FILE) ? "YES" : "NO",
248 (pack.p_status & CACHEFS_PACKED_DATA) ? "YES" : "NO");
249 if (verbose) {
250 printf(gettext(" nocache %s\n"),
251 (pack.p_status & CACHEFS_PACKED_NOCACHE) ?
252 "YES" : "NO");
253 }
254 return (0);
255 }
256