1*17049c45SAxel Dörfler // lsindex - for Haiku 2*17049c45SAxel Dörfler // 3*17049c45SAxel Dörfler // authors, in order of contribution: 4*17049c45SAxel Dörfler // jonas.sundstrom@kirilla.com 5*17049c45SAxel Dörfler // revol@free.fr 6*17049c45SAxel Dörfler // axeld@pinc-software.de 7*17049c45SAxel Dörfler // 8*17049c45SAxel Dörfler 9*17049c45SAxel Dörfler #include <TypeConstants.h> 10*17049c45SAxel Dörfler #include <fs_info.h> 11*17049c45SAxel Dörfler #include <fs_index.h> 12*17049c45SAxel Dörfler 13*17049c45SAxel Dörfler #include <stdio.h> 14*17049c45SAxel Dörfler #include <string.h> 15*17049c45SAxel Dörfler #include <errno.h> 16*17049c45SAxel Dörfler 17*17049c45SAxel Dörfler 18*17049c45SAxel Dörfler static void 19*17049c45SAxel Dörfler print_help(void) 20*17049c45SAxel Dörfler { 21*17049c45SAxel Dörfler fprintf (stderr, 22*17049c45SAxel Dörfler "Usage: lsindex [--help | -v | --verbose | --mkindex | -l | --long] [volume path]\n" 23*17049c45SAxel Dörfler " -l --long\t outputs long listing\n" 24*17049c45SAxel Dörfler " -v --verbose\t gives index type, dates and owner\n" 25*17049c45SAxel Dörfler " --mkindex\t outputs mkindex commands to recreate all the indices\n" 26*17049c45SAxel Dörfler " --help\t prints out this text\n\n" 27*17049c45SAxel Dörfler " If no volume is specified, the volume of the current directory is assumed.\n"); 28*17049c45SAxel Dörfler } 29*17049c45SAxel Dörfler 30*17049c45SAxel Dörfler 31*17049c45SAxel Dörfler static const char * 32*17049c45SAxel Dörfler print_index_type(const index_info &info, bool mkindexOutput) 33*17049c45SAxel Dörfler { 34*17049c45SAxel Dörfler static char buffer[30]; 35*17049c45SAxel Dörfler 36*17049c45SAxel Dörfler switch (info.type) { 37*17049c45SAxel Dörfler case B_INT32_TYPE: 38*17049c45SAxel Dörfler return mkindexOutput ? "int" : "Int-32"; 39*17049c45SAxel Dörfler case B_INT64_TYPE: 40*17049c45SAxel Dörfler return mkindexOutput ? "llong" : "Int-64"; 41*17049c45SAxel Dörfler case B_STRING_TYPE: 42*17049c45SAxel Dörfler return mkindexOutput ? "string" : "Text"; 43*17049c45SAxel Dörfler case B_FLOAT_TYPE: 44*17049c45SAxel Dörfler return mkindexOutput ? "float" : "Float"; 45*17049c45SAxel Dörfler case B_DOUBLE_TYPE: 46*17049c45SAxel Dörfler return mkindexOutput ? "double" : "Double"; 47*17049c45SAxel Dörfler 48*17049c45SAxel Dörfler default: 49*17049c45SAxel Dörfler sprintf(buffer, mkindexOutput ? "0x%08lx" : "Unknown type (0x%x)", info.type); 50*17049c45SAxel Dörfler return buffer; 51*17049c45SAxel Dörfler } 52*17049c45SAxel Dörfler } 53*17049c45SAxel Dörfler 54*17049c45SAxel Dörfler 55*17049c45SAxel Dörfler static const char * 56*17049c45SAxel Dörfler type_string(type_code type) 57*17049c45SAxel Dörfler { 58*17049c45SAxel Dörfler // all types from <TypeConstants.h> listed for completeness, 59*17049c45SAxel Dörfler // even though they don't all apply to attribute indices 60*17049c45SAxel Dörfler 61*17049c45SAxel Dörfler #define RETURN_TYPE(x) case x: return #x 62*17049c45SAxel Dörfler 63*17049c45SAxel Dörfler switch (type) { 64*17049c45SAxel Dörfler RETURN_TYPE(B_ANY_TYPE); 65*17049c45SAxel Dörfler RETURN_TYPE(B_BOOL_TYPE); 66*17049c45SAxel Dörfler RETURN_TYPE(B_CHAR_TYPE); 67*17049c45SAxel Dörfler RETURN_TYPE(B_COLOR_8_BIT_TYPE); 68*17049c45SAxel Dörfler RETURN_TYPE(B_DOUBLE_TYPE); 69*17049c45SAxel Dörfler RETURN_TYPE(B_FLOAT_TYPE); 70*17049c45SAxel Dörfler RETURN_TYPE(B_GRAYSCALE_8_BIT_TYPE); 71*17049c45SAxel Dörfler RETURN_TYPE(B_INT64_TYPE); 72*17049c45SAxel Dörfler RETURN_TYPE(B_INT32_TYPE); 73*17049c45SAxel Dörfler RETURN_TYPE(B_INT16_TYPE); 74*17049c45SAxel Dörfler RETURN_TYPE(B_INT8_TYPE); 75*17049c45SAxel Dörfler RETURN_TYPE(B_MESSAGE_TYPE); 76*17049c45SAxel Dörfler RETURN_TYPE(B_MESSENGER_TYPE); 77*17049c45SAxel Dörfler RETURN_TYPE(B_MIME_TYPE); 78*17049c45SAxel Dörfler RETURN_TYPE(B_MONOCHROME_1_BIT_TYPE); 79*17049c45SAxel Dörfler RETURN_TYPE(B_OBJECT_TYPE); 80*17049c45SAxel Dörfler RETURN_TYPE(B_OFF_T_TYPE); 81*17049c45SAxel Dörfler RETURN_TYPE(B_PATTERN_TYPE); 82*17049c45SAxel Dörfler RETURN_TYPE(B_POINTER_TYPE); 83*17049c45SAxel Dörfler RETURN_TYPE(B_POINT_TYPE); 84*17049c45SAxel Dörfler RETURN_TYPE(B_RAW_TYPE); 85*17049c45SAxel Dörfler RETURN_TYPE(B_RECT_TYPE); 86*17049c45SAxel Dörfler RETURN_TYPE(B_REF_TYPE); 87*17049c45SAxel Dörfler RETURN_TYPE(B_RGB_32_BIT_TYPE); 88*17049c45SAxel Dörfler RETURN_TYPE(B_RGB_COLOR_TYPE); 89*17049c45SAxel Dörfler RETURN_TYPE(B_SIZE_T_TYPE); 90*17049c45SAxel Dörfler RETURN_TYPE(B_SSIZE_T_TYPE); 91*17049c45SAxel Dörfler RETURN_TYPE(B_STRING_TYPE); 92*17049c45SAxel Dörfler RETURN_TYPE(B_TIME_TYPE); 93*17049c45SAxel Dörfler RETURN_TYPE(B_UINT64_TYPE); 94*17049c45SAxel Dörfler RETURN_TYPE(B_UINT32_TYPE); 95*17049c45SAxel Dörfler RETURN_TYPE(B_UINT16_TYPE); 96*17049c45SAxel Dörfler RETURN_TYPE(B_UINT8_TYPE); 97*17049c45SAxel Dörfler RETURN_TYPE(B_MEDIA_PARAMETER_TYPE); 98*17049c45SAxel Dörfler RETURN_TYPE(B_MEDIA_PARAMETER_WEB_TYPE); 99*17049c45SAxel Dörfler RETURN_TYPE(B_MEDIA_PARAMETER_GROUP_TYPE); 100*17049c45SAxel Dörfler RETURN_TYPE(B_ASCII_TYPE); 101*17049c45SAxel Dörfler 102*17049c45SAxel Dörfler default: 103*17049c45SAxel Dörfler return NULL; 104*17049c45SAxel Dörfler } 105*17049c45SAxel Dörfler #undef RETURN_TYPE 106*17049c45SAxel Dörfler } 107*17049c45SAxel Dörfler 108*17049c45SAxel Dörfler 109*17049c45SAxel Dörfler static void 110*17049c45SAxel Dörfler print_index_long_stat(const index_info &info, char *name) 111*17049c45SAxel Dörfler { 112*17049c45SAxel Dörfler char modified[30]; 113*17049c45SAxel Dörfler strftime(modified, 30, "%m/%d/%Y %I:%M %p", localtime(&info.modification_time)); 114*17049c45SAxel Dörfler printf("%16s %s %8Ld %s\n", print_index_type(info, false), modified, info.size, name); 115*17049c45SAxel Dörfler } 116*17049c45SAxel Dörfler 117*17049c45SAxel Dörfler 118*17049c45SAxel Dörfler static void 119*17049c45SAxel Dörfler print_index_verbose_stat(const index_info &info, char *name) 120*17049c45SAxel Dörfler { 121*17049c45SAxel Dörfler printf("%-18s\t", name); 122*17049c45SAxel Dörfler 123*17049c45SAxel Dörfler // Type 124*17049c45SAxel Dörfler const char *typeString = type_string(info.type); 125*17049c45SAxel Dörfler if (typeString != NULL) 126*17049c45SAxel Dörfler printf("%-10s\t", typeString); 127*17049c45SAxel Dörfler else 128*17049c45SAxel Dörfler printf("%ld\t", info.type); 129*17049c45SAxel Dörfler 130*17049c45SAxel Dörfler // Size 131*17049c45SAxel Dörfler printf("%10Ld ", info.size); 132*17049c45SAxel Dörfler 133*17049c45SAxel Dörfler // Created 134*17049c45SAxel Dörfler char string[30]; 135*17049c45SAxel Dörfler strftime(string, sizeof(string), "%Y-%m-%d %H:%M", localtime(&info.creation_time)); 136*17049c45SAxel Dörfler printf("%s ", string); 137*17049c45SAxel Dörfler 138*17049c45SAxel Dörfler // Modified 139*17049c45SAxel Dörfler strftime(string, sizeof(string), "%Y-%m-%d %H:%M", localtime(&info.modification_time)); 140*17049c45SAxel Dörfler printf("%s", string); 141*17049c45SAxel Dörfler 142*17049c45SAxel Dörfler // User 143*17049c45SAxel Dörfler printf("%5d", info.uid); 144*17049c45SAxel Dörfler 145*17049c45SAxel Dörfler // Group 146*17049c45SAxel Dörfler printf("%5d\n", info.gid); 147*17049c45SAxel Dörfler } 148*17049c45SAxel Dörfler 149*17049c45SAxel Dörfler 150*17049c45SAxel Dörfler int 151*17049c45SAxel Dörfler main(int32 argc, char **argv) 152*17049c45SAxel Dörfler { 153*17049c45SAxel Dörfler dev_t device = dev_for_path("."); 154*17049c45SAxel Dörfler DIR *indices = NULL; 155*17049c45SAxel Dörfler bool verbose = false; 156*17049c45SAxel Dörfler bool longListing = false; 157*17049c45SAxel Dörfler bool mkindexOutput = false; /* mkindex-ready output */ 158*17049c45SAxel Dörfler 159*17049c45SAxel Dörfler for (int i = 1; i < argc; i++) { 160*17049c45SAxel Dörfler if (argv[i][0] == '-') { 161*17049c45SAxel Dörfler if (!strcmp(argv[i], "--help")) { 162*17049c45SAxel Dörfler print_help(); 163*17049c45SAxel Dörfler return 0; 164*17049c45SAxel Dörfler } else if (!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v")) 165*17049c45SAxel Dörfler verbose = true; 166*17049c45SAxel Dörfler else if (!strcmp(argv[i], "--long") || !strcmp(argv[i], "-l")) 167*17049c45SAxel Dörfler longListing = true; 168*17049c45SAxel Dörfler else if (!strcmp(argv[i], "--mkindex")) 169*17049c45SAxel Dörfler mkindexOutput = true; 170*17049c45SAxel Dörfler else { 171*17049c45SAxel Dörfler fprintf(stderr, "%s: option %s is not understood (use --help for help)\n", argv[0], argv[i]); 172*17049c45SAxel Dörfler return -1; 173*17049c45SAxel Dörfler } 174*17049c45SAxel Dörfler } else { 175*17049c45SAxel Dörfler device = dev_for_path(argv[i]); 176*17049c45SAxel Dörfler if (device < 0) { 177*17049c45SAxel Dörfler fprintf(stderr, "%s: can't get information about volume: %s\n", argv[0], argv[i]); 178*17049c45SAxel Dörfler return -1; 179*17049c45SAxel Dörfler } 180*17049c45SAxel Dörfler } 181*17049c45SAxel Dörfler } 182*17049c45SAxel Dörfler 183*17049c45SAxel Dörfler indices = fs_open_index_dir(device); 184*17049c45SAxel Dörfler if (indices == NULL) { 185*17049c45SAxel Dörfler fprintf(stderr, "%s: can't open index dir of device %ld\n", argv[0], device); 186*17049c45SAxel Dörfler return -1; 187*17049c45SAxel Dörfler } 188*17049c45SAxel Dörfler 189*17049c45SAxel Dörfler if (verbose) { 190*17049c45SAxel Dörfler printf(" Name Type Size Created Modified User Group\n"); 191*17049c45SAxel Dörfler printf("********************************************************\n"); 192*17049c45SAxel Dörfler } 193*17049c45SAxel Dörfler 194*17049c45SAxel Dörfler while (1) { 195*17049c45SAxel Dörfler dirent *index = fs_read_index_dir(indices); 196*17049c45SAxel Dörfler if (index == NULL) { 197*17049c45SAxel Dörfler if (errno != B_ENTRY_NOT_FOUND && errno != B_OK) { 198*17049c45SAxel Dörfler printf("%s: fs_read_index_dir: (%d) %s\n", argv[0], errno, strerror(errno)); 199*17049c45SAxel Dörfler return errno; 200*17049c45SAxel Dörfler } 201*17049c45SAxel Dörfler break; 202*17049c45SAxel Dörfler } 203*17049c45SAxel Dörfler 204*17049c45SAxel Dörfler if (verbose || longListing || mkindexOutput) { 205*17049c45SAxel Dörfler index_info info; 206*17049c45SAxel Dörfler 207*17049c45SAxel Dörfler if (fs_stat_index(device, index->d_name, &info) != B_OK) { 208*17049c45SAxel Dörfler printf("%s: fs_stat_index(): (%d) %s\n", argv[0], errno, strerror(errno)); 209*17049c45SAxel Dörfler return errno; 210*17049c45SAxel Dörfler } 211*17049c45SAxel Dörfler 212*17049c45SAxel Dörfler if (verbose) 213*17049c45SAxel Dörfler print_index_verbose_stat(info, index->d_name); 214*17049c45SAxel Dörfler else if (longListing) 215*17049c45SAxel Dörfler print_index_long_stat(info, index->d_name); 216*17049c45SAxel Dörfler else /* mkindexOutput */ 217*17049c45SAxel Dörfler printf("mkindex -t %s '%s'\n", print_index_type(info, true), index->d_name); 218*17049c45SAxel Dörfler } else 219*17049c45SAxel Dörfler printf("%s\n", index->d_name); 220*17049c45SAxel Dörfler } 221*17049c45SAxel Dörfler 222*17049c45SAxel Dörfler fs_close_index_dir(indices); 223*17049c45SAxel Dörfler return 0; 224*17049c45SAxel Dörfler } 225*17049c45SAxel Dörfler 226