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