xref: /haiku/src/bin/lsindex.cpp (revision 17049c451a91f427aec94b944b75876b611103e7)
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