xref: /minix3/minix/commands/minix-service/print.c (revision c58da9fbc35f86051ff0a75e6dd91e937d83cfff)
1*c58da9fbSDavid van Moolenbroek 
2*c58da9fbSDavid van Moolenbroek #include <stdarg.h>
3*c58da9fbSDavid van Moolenbroek #include <assert.h>
4*c58da9fbSDavid van Moolenbroek #include <stdlib.h>
5*c58da9fbSDavid van Moolenbroek #include <stdio.h>
6*c58da9fbSDavid van Moolenbroek #include <string.h>
7*c58da9fbSDavid van Moolenbroek #include <errno.h>
8*c58da9fbSDavid van Moolenbroek #include <pwd.h>
9*c58da9fbSDavid van Moolenbroek #include <unistd.h>
10*c58da9fbSDavid van Moolenbroek #include <limits.h>
11*c58da9fbSDavid van Moolenbroek #include <lib.h>
12*c58da9fbSDavid van Moolenbroek #include <minix/config.h>
13*c58da9fbSDavid van Moolenbroek #include <minix/com.h>
14*c58da9fbSDavid van Moolenbroek #include <minix/const.h>
15*c58da9fbSDavid van Moolenbroek #include <minix/type.h>
16*c58da9fbSDavid van Moolenbroek #include <minix/ipc.h>
17*c58da9fbSDavid van Moolenbroek #include <minix/rs.h>
18*c58da9fbSDavid van Moolenbroek #include <minix/syslib.h>
19*c58da9fbSDavid van Moolenbroek #include <minix/bitmap.h>
20*c58da9fbSDavid van Moolenbroek #include <paths.h>
21*c58da9fbSDavid van Moolenbroek #include <minix/sef.h>
22*c58da9fbSDavid van Moolenbroek #include <minix/dmap.h>
23*c58da9fbSDavid van Moolenbroek #include <sys/types.h>
24*c58da9fbSDavid van Moolenbroek #include <sys/stat.h>
25*c58da9fbSDavid van Moolenbroek #include <configfile.h>
26*c58da9fbSDavid van Moolenbroek 
27*c58da9fbSDavid van Moolenbroek #include <machine/archtypes.h>
28*c58da9fbSDavid van Moolenbroek #include <minix/timers.h>
29*c58da9fbSDavid van Moolenbroek #include <err.h>
30*c58da9fbSDavid van Moolenbroek 
31*c58da9fbSDavid van Moolenbroek #include "config.h"
32*c58da9fbSDavid van Moolenbroek #include "proto.h"
33*c58da9fbSDavid van Moolenbroek #include "parse.h"
34*c58da9fbSDavid van Moolenbroek 
35*c58da9fbSDavid van Moolenbroek #define MAXDEPTH 10
36*c58da9fbSDavid van Moolenbroek 
37*c58da9fbSDavid van Moolenbroek static struct {
38*c58da9fbSDavid van Moolenbroek 	const char *field, *str;
39*c58da9fbSDavid van Moolenbroek } configstack[MAXDEPTH];
40*c58da9fbSDavid van Moolenbroek 
41*c58da9fbSDavid van Moolenbroek int depth = 0;
42*c58da9fbSDavid van Moolenbroek 
printstack(void)43*c58da9fbSDavid van Moolenbroek void printstack(void)
44*c58da9fbSDavid van Moolenbroek {
45*c58da9fbSDavid van Moolenbroek 	int i;
46*c58da9fbSDavid van Moolenbroek 	for(i = 0; i < depth; i++)
47*c58da9fbSDavid van Moolenbroek 		printf("%s %s,", configstack[i].field,
48*c58da9fbSDavid van Moolenbroek 			configstack[i].str);
49*c58da9fbSDavid van Moolenbroek }
50*c58da9fbSDavid van Moolenbroek 
print(const char * field,const char * str)51*c58da9fbSDavid van Moolenbroek void print(const char *field, const char *str)
52*c58da9fbSDavid van Moolenbroek {
53*c58da9fbSDavid van Moolenbroek 	printstack();
54*c58da9fbSDavid van Moolenbroek 	printf("%s %s\n", field, str);
55*c58da9fbSDavid van Moolenbroek }
56*c58da9fbSDavid van Moolenbroek 
push(const char * field,const char * str)57*c58da9fbSDavid van Moolenbroek void push(const char *field, const char *str)
58*c58da9fbSDavid van Moolenbroek {
59*c58da9fbSDavid van Moolenbroek 	assert(depth < MAXDEPTH);
60*c58da9fbSDavid van Moolenbroek 	configstack[depth].field = field;
61*c58da9fbSDavid van Moolenbroek 	configstack[depth].str = str;
62*c58da9fbSDavid van Moolenbroek 	depth++;
63*c58da9fbSDavid van Moolenbroek 	printstack();
64*c58da9fbSDavid van Moolenbroek 	printf("\n");
65*c58da9fbSDavid van Moolenbroek }
66*c58da9fbSDavid van Moolenbroek 
main(int argc,char ** argv)67*c58da9fbSDavid van Moolenbroek int main(int argc, char **argv)
68*c58da9fbSDavid van Moolenbroek {
69*c58da9fbSDavid van Moolenbroek 	struct rs_config config;
70*c58da9fbSDavid van Moolenbroek 	const char *label;
71*c58da9fbSDavid van Moolenbroek 	uint16_t sub_vid, sub_did;
72*c58da9fbSDavid van Moolenbroek         int id;
73*c58da9fbSDavid van Moolenbroek 
74*c58da9fbSDavid van Moolenbroek 	if(argc != 2) {
75*c58da9fbSDavid van Moolenbroek 		fprintf(stderr, "usage: %s <config>\n", argv[0]);
76*c58da9fbSDavid van Moolenbroek 		return 1;
77*c58da9fbSDavid van Moolenbroek 	}
78*c58da9fbSDavid van Moolenbroek 
79*c58da9fbSDavid van Moolenbroek 	memset(&config, 0, sizeof(config));
80*c58da9fbSDavid van Moolenbroek 	if(!(label = parse_config(NULL, 1, argv[1], &config)))
81*c58da9fbSDavid van Moolenbroek 		errx(1, "parse_config failed");
82*c58da9fbSDavid van Moolenbroek 
83*c58da9fbSDavid van Moolenbroek 	push(KW_SERVICE, label);
84*c58da9fbSDavid van Moolenbroek 	if(config.type) push(KW_TYPE, config.type);
85*c58da9fbSDavid van Moolenbroek 
86*c58da9fbSDavid van Moolenbroek 	if(config.descr) push(KW_DESCR, config.descr);
87*c58da9fbSDavid van Moolenbroek 	if(config.rs_start.rss_nr_pci_id > 0) {
88*c58da9fbSDavid van Moolenbroek 		printstack();
89*c58da9fbSDavid van Moolenbroek 		printf("%s %s ", KW_PCI, KW_DEVICE);
90*c58da9fbSDavid van Moolenbroek 		for(id = 0; id < config.rs_start.rss_nr_pci_id; id++) {
91*c58da9fbSDavid van Moolenbroek 			sub_vid = config.rs_start.rss_pci_id[id].sub_vid;
92*c58da9fbSDavid van Moolenbroek 			sub_did = config.rs_start.rss_pci_id[id].sub_did;
93*c58da9fbSDavid van Moolenbroek 			/*
94*c58da9fbSDavid van Moolenbroek 			 * The PCI driver interprets each of these two fields
95*c58da9fbSDavid van Moolenbroek 			 * individually, so we must print them even if just one
96*c58da9fbSDavid van Moolenbroek 			 * of them is set.  Correct matching of just one of
97*c58da9fbSDavid van Moolenbroek 			 * the fields may be hard to do from a script though,
98*c58da9fbSDavid van Moolenbroek 			 * so driver writers are advised to specify either both
99*c58da9fbSDavid van Moolenbroek 			 * or neither of these two fields.
100*c58da9fbSDavid van Moolenbroek 			 */
101*c58da9fbSDavid van Moolenbroek 			if (sub_vid != NO_SUB_VID || sub_did != NO_SUB_DID)
102*c58da9fbSDavid van Moolenbroek 				printf("%04X:%04X/%04X:%04X ",
103*c58da9fbSDavid van Moolenbroek 					config.rs_start.rss_pci_id[id].vid,
104*c58da9fbSDavid van Moolenbroek 					config.rs_start.rss_pci_id[id].did,
105*c58da9fbSDavid van Moolenbroek 					sub_vid, sub_did);
106*c58da9fbSDavid van Moolenbroek 			else
107*c58da9fbSDavid van Moolenbroek 				printf("%04X:%04X ",
108*c58da9fbSDavid van Moolenbroek 					config.rs_start.rss_pci_id[id].vid,
109*c58da9fbSDavid van Moolenbroek 					config.rs_start.rss_pci_id[id].did);
110*c58da9fbSDavid van Moolenbroek 		}
111*c58da9fbSDavid van Moolenbroek 		printf("\n");
112*c58da9fbSDavid van Moolenbroek 	}
113*c58da9fbSDavid van Moolenbroek }
114*c58da9fbSDavid van Moolenbroek 
115