1/* $FreeBSD$ */
2
3/*-
4 * Copyright (c) 2011 Hans Petter Selasky. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/*
29 * Disclaimer: This utility and format is subject to change and not a
30 * committed interface.
31 */
32
33#include <stdio.h>
34#include <stdint.h>
35#include <stdlib.h>
36#include <string.h>
37#include <err.h>
38#include <sysexits.h>
39#include <unistd.h>
40
41#include "bus_autoconf.h"
42#include "bus_sections.h"
43#include "bus_load_file.h"
44#include "bus_usb.h"
45
46static void
47usage(void)
48{
49	fprintf(stderr,
50	    "bus_autoconf - devd config file generator\n"
51	    "	-i <structure_type,module.ko>\n"
52	    "	-F <format_file>\n"
53	    "	-h show usage\n"
54	);
55	exit(EX_USAGE);
56}
57
58int
59main(int argc, char **argv)
60{
61	const char *params = "i:F:h";
62	char *fname;
63	char *section;
64	char *module;
65	char *postfix;
66	uint8_t *ptr;
67	uint32_t len;
68	int c;
69	int any_opt = 0;
70
71	while ((c = getopt(argc, argv, params)) != -1) {
72		switch (c) {
73		case 'i':
74			fname = optarg;
75			load_file(fname, &ptr, &len);
76
77			module = strchr(fname, ',');
78			if (module == NULL) {
79				errx(EX_USAGE, "Invalid input "
80				    "file name '%s'", fname);
81			}
82			/* split module and section */
83			*module++ = 0;
84
85			/* remove postfix */
86			postfix = strchr(module, '.');
87			if (postfix)
88				*postfix = 0;
89
90			/* get section name */
91			section = fname;
92
93			/* check section type */
94			if (strncmp(section, "usb_", 4) == 0)
95				usb_import_entries(section, module, ptr, len);
96			else
97				errx(EX_USAGE, "Invalid section '%s'", section);
98
99			free(ptr);
100
101			any_opt = 1;
102			break;
103
104		case 'F':
105			fname = optarg;
106			load_file(fname, &ptr, &len);
107			format_parse_entries(ptr, len);
108			free(ptr);
109
110			any_opt = 1;
111			break;
112
113		default:
114			usage();
115			break;
116		}
117	}
118
119	if (any_opt == 0)
120		usage();
121
122	usb_dump_entries();
123
124	return (0);
125}
126