summaryrefslogtreecommitdiffstats
path: root/payloads/bayou/util/pbuilder/show.c
blob: f06fb958120bea29f2844580324d2cd403724346 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * This file is part of the bayou project.
 *
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdio.h>
#include "liblar.h"
#include "pbuilder.h"

void show_subchain(struct bpt_config *cfg, char *fptr, int index)
{
	int i;
	char *ptr = fptr + sizeof(struct bpt_config);

	for (i = 0; i < cfg->entries; i++) {
		struct bpt_pentry *entry = (struct bpt_pentry *)ptr;

		if (entry->parent == index)
			printf("      +  %.64s\n",
			       ptr + sizeof(struct bpt_pentry));

		ptr += (sizeof(struct bpt_pentry) + entry->nlen);
	}
}

int show_payloads(struct bpt_config *cfg, char *fptr)
{
	int i;
	char *ptr = fptr + sizeof(struct bpt_config);

	for (i = 0; i < cfg->entries; i++) {
		struct bpt_pentry *entry = (struct bpt_pentry *)ptr;

		if (entry->parent != 0) {
			ptr += (sizeof(struct bpt_pentry) + entry->nlen);
			continue;
		}

		printf("  ");

		if (entry->flags & BPT_FLAG_DEFAULT)
			printf("D");
		else
			printf(" ");

		if (entry->flags & BPT_FLAG_NOSHOW)
			printf("N");
		else
			printf(" ");

		switch (entry->type) {
		case BPT_TYPE_CHOOSER:
			printf("  MENU ");
			break;
		case BPT_TYPE_CHAIN:
			printf("  CHAIN");
			break;
		}

		if (entry->title[0] != 0)
			printf("  %.64s\n", entry->title);
		else
			printf("  - no title -\n");

		if (entry->type == BPT_TYPE_CHOOSER)
			printf("            %.60s\n",
			       ptr + sizeof(struct bpt_pentry));
		else
			show_subchain(cfg, fptr, entry->index);

		ptr += (sizeof(struct bpt_pentry) + entry->nlen);
	}

	return 0;
}

int pbuilder_show_lar(const char *input)
{
	int ret = -1;
	struct LAR *lar;
	struct bpt_config *cfg;
	struct LARFile *lfile;

	lar = LAR_Open(input);

	if (lar == NULL) {
		warn("E: Couldn't open LAR %s\n", input);
		return -1;
	}

	lfile = LAR_MapFile(lar, "bayou_payload_table");

	if (lfile == NULL) {
		warn("E: Couldn't find the bayou payload table. Nothing to do.\n");
		goto err;
	}

	cfg = (struct bpt_config *)lfile->buffer;

	if (cfg->id != BPT_ID) {
		warn("E: BPT ID does not match\n");
		goto err;
	}

	printf("Bayou Payload Configuration\n");
	printf("Timeout = %d seconds\n", cfg->timeout);

	printf("Payload List:\n");
	show_payloads(cfg, lfile->buffer);
	ret = 0;

err:
	LAR_CloseFile(lfile);
	LAR_Close(lar);

	return ret;
}