xref: /haiku/src/bin/listimage.c (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright (c) 2001-2014 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Daniel Reinhold, danielre@users.sf.net
7  *		John Scipione, jscipione@gmail.com
8  */
9 
10 /*!	Lists image info for all currently running teams. */
11 
12 
13 #include <ctype.h>
14 #include <image.h>
15 #include <inttypes.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 
20 #include <OS.h>
21 
22 
23 static status_t
24 list_images_for_team_by_id(team_id id)
25 {
26 	image_info imageInfo;
27 	int32 cookie = 0;
28 	team_info teamInfo;
29 	char* header;
30 	char* format;
31 	int i;
32 	status_t result = get_team_info(id, &teamInfo);
33 	if (id != 1 && result < B_OK)
34 		return result;
35 
36 	i = asprintf(&header, "   ID   %*s   %*s  Seq#      Init# Name",
37 		sizeof(uintptr_t) * 2, "Text", sizeof(uintptr_t) * 2, "Data");
38 	if (i == -1)
39 		return B_NO_MEMORY;
40 
41 	i = asprintf(&format, "%%5" B_PRId32 " 0x%%0%" B_PRIu32 PRIxPTR
42 		" 0x%%0%" B_PRIu32 PRIxPTR "  %%4" B_PRId32 " %%10" B_PRIu32 " %%s\n",
43 		sizeof(uintptr_t) * 2, sizeof(uintptr_t) * 2);
44 	if (i == -1) {
45 		free(header);
46 		return B_NO_MEMORY;
47 	}
48 
49 	if (id == 1)
50 		printf("\nKERNEL TEAM:\n");
51 	else
52 		printf("\nTEAM %4" B_PRId32 " (%s):\n", id, teamInfo.args);
53 
54 	puts(header);
55 	for (i = 0; i < 80; i++)
56 		putchar('-');
57 
58 	printf("\n");
59 	while ((result = get_next_image_info(id, &cookie, &imageInfo)) == B_OK) {
60 		printf(format, imageInfo.id, imageInfo.text, imageInfo.data,
61 			imageInfo.sequence, imageInfo.init_order, imageInfo.name);
62 	}
63 
64 	free(header);
65 	free(format);
66 
67 	if (result != B_ENTRY_NOT_FOUND && result != EINVAL) {
68 		printf("get images failed: %s\n", strerror(result));
69 		return result;
70 	}
71 
72 	return B_OK;
73 }
74 
75 
76 static void
77 list_images_for_team(const char* arg)
78 {
79 	int32 cookie = 0;
80 	team_info info;
81 	status_t result;
82 
83 	if (atoi(arg) > 0 && list_images_for_team_by_id(atoi(arg)) == B_OK)
84 		return;
85 
86 	/* search for the team by name */
87 
88 	while (get_next_team_info(&cookie, &info) >= B_OK) {
89 		if (strstr(info.args, arg)) {
90 			result = list_images_for_team_by_id(info.team);
91 			if (result != B_OK) {
92 				printf("\nCould not retrieve information about team %"
93 					B_PRId32 ": %s\n", info.team, strerror(result));
94 			}
95 		}
96 	}
97 }
98 
99 
100 int
101 main(int argc, char** argv)
102 {
103 	int32 cookie = 0;
104 	team_info info;
105 	status_t result;
106 
107 	if (argc == 1) {
108 		/* list for all teams */
109 		while (get_next_team_info(&cookie, &info) >= B_OK) {
110 			result = list_images_for_team_by_id(info.team);
111 			if (result != B_OK) {
112 				printf("\nCould not retrieve information about team %"
113 					B_PRId32 ": %s\n", info.team, strerror(result));
114 			}
115 		}
116 	} else {
117 		/* list for each team_id on the command line */
118 		while (--argc > 0 && ++argv != NULL)
119 			list_images_for_team(*argv);
120 	}
121 
122 	return 0;
123 }
124