xref: /freebsd/usr.sbin/crunch/crunchgen/crunched_main.c (revision b0f558df9f4edc9b1002af8f49855ade1dc6cbbd)
1de566360SJordan K. Hubbard /*
2de566360SJordan K. Hubbard  * Copyright (c) 1994 University of Maryland
3de566360SJordan K. Hubbard  * All Rights Reserved.
4de566360SJordan K. Hubbard  *
5de566360SJordan K. Hubbard  * Permission to use, copy, modify, distribute, and sell this software and its
6de566360SJordan K. Hubbard  * documentation for any purpose is hereby granted without fee, provided that
7de566360SJordan K. Hubbard  * the above copyright notice appear in all copies and that both that
8de566360SJordan K. Hubbard  * copyright notice and this permission notice appear in supporting
9de566360SJordan K. Hubbard  * documentation, and that the name of U.M. not be used in advertising or
10de566360SJordan K. Hubbard  * publicity pertaining to distribution of the software without specific,
11de566360SJordan K. Hubbard  * written prior permission.  U.M. makes no representations about the
12de566360SJordan K. Hubbard  * suitability of this software for any purpose.  It is provided "as is"
13de566360SJordan K. Hubbard  * without express or implied warranty.
14de566360SJordan K. Hubbard  *
15de566360SJordan K. Hubbard  * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
16de566360SJordan K. Hubbard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
17de566360SJordan K. Hubbard  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18de566360SJordan K. Hubbard  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
19de566360SJordan K. Hubbard  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
20de566360SJordan K. Hubbard  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21de566360SJordan K. Hubbard  *
22de566360SJordan K. Hubbard  * Author: James da Silva, Systems Design and Analysis Group
23de566360SJordan K. Hubbard  *			   Computer Science Department
24de566360SJordan K. Hubbard  *			   University of Maryland at College Park
25de566360SJordan K. Hubbard  */
26de566360SJordan K. Hubbard /*
27de566360SJordan K. Hubbard  * crunched_main.c - main program for crunched binaries, it branches to a
28de566360SJordan K. Hubbard  * 	particular subprogram based on the value of argv[0].  Also included
29de566360SJordan K. Hubbard  *	is a little program invoked when the crunched binary is called via
30de566360SJordan K. Hubbard  *	its EXECNAME.  This one prints out the list of compiled-in binaries,
31de566360SJordan K. Hubbard  *	or calls one of them based on argv[1].   This allows the testing of
32de566360SJordan K. Hubbard  *	the crunched binary without creating all the links.
33de566360SJordan K. Hubbard  */
3402c75192SDavid E. O'Brien 
3502c75192SDavid E. O'Brien #include <sys/cdefs.h>
3602c75192SDavid E. O'Brien __FBSDID("$FreeBSD$");
3702c75192SDavid E. O'Brien 
38de566360SJordan K. Hubbard #include <stdio.h>
395e8bbdf1SYaroslav Tykhiy #include <stdlib.h>
40de566360SJordan K. Hubbard #include <string.h>
41de566360SJordan K. Hubbard 
42de566360SJordan K. Hubbard struct stub {
43de566360SJordan K. Hubbard 	char *name;
44de566360SJordan K. Hubbard 	int (*f)();
45de566360SJordan K. Hubbard };
46de566360SJordan K. Hubbard 
47a7aebe89SYaroslav Tykhiy extern char *__progname;
48de566360SJordan K. Hubbard extern struct stub entry_points[];
49de566360SJordan K. Hubbard 
50e881ec16SRyan Libby static void crunched_usage(void);
51e881ec16SRyan Libby 
5202c75192SDavid E. O'Brien int
5302c75192SDavid E. O'Brien main(int argc, char **argv, char **envp)
54de566360SJordan K. Hubbard {
55de566360SJordan K. Hubbard 	char *slash, *basename;
56de566360SJordan K. Hubbard 	struct stub *ep;
57de566360SJordan K. Hubbard 
58de566360SJordan K. Hubbard 	if (argv[0] == NULL || *argv[0] == '\0')
59de566360SJordan K. Hubbard 		crunched_usage();
60de566360SJordan K. Hubbard 
61de566360SJordan K. Hubbard 	slash = strrchr(argv[0], '/');
62de566360SJordan K. Hubbard 	basename = slash ? slash + 1 : argv[0];
63de566360SJordan K. Hubbard 
64de566360SJordan K. Hubbard 	for (ep = entry_points; ep->name != NULL; ep++)
65*b0f558dfSAlex Richardson 		if (!strcmp(basename, ep->name))
66*b0f558dfSAlex Richardson 			break;
67de566360SJordan K. Hubbard 
68de566360SJordan K. Hubbard 	if (ep->name)
698f3548b2SGregory Neil Shapiro 		return ep->f(argc, argv, envp);
70de566360SJordan K. Hubbard 	else {
71de566360SJordan K. Hubbard 		fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, basename);
72de566360SJordan K. Hubbard 		crunched_usage();
73de566360SJordan K. Hubbard 	}
74de566360SJordan K. Hubbard }
75de566360SJordan K. Hubbard 
7602c75192SDavid E. O'Brien int
7702c75192SDavid E. O'Brien crunched_main(int argc, char **argv, char **envp)
78de566360SJordan K. Hubbard {
79a7aebe89SYaroslav Tykhiy 	char *slash;
80de566360SJordan K. Hubbard 	struct stub *ep;
81de566360SJordan K. Hubbard 	int columns, len;
82de566360SJordan K. Hubbard 
83de566360SJordan K. Hubbard 	if (argc <= 1)
84de566360SJordan K. Hubbard 		crunched_usage();
85de566360SJordan K. Hubbard 
86a7aebe89SYaroslav Tykhiy 	slash = strrchr(argv[1], '/');
87a7aebe89SYaroslav Tykhiy 	__progname = slash ? slash + 1 : argv[1];
88a7aebe89SYaroslav Tykhiy 
89b0c70f81SGregory Neil Shapiro 	return main(--argc, ++argv, envp);
90de566360SJordan K. Hubbard }
91de566360SJordan K. Hubbard 
92e881ec16SRyan Libby static void
9302c75192SDavid E. O'Brien crunched_usage()
94de566360SJordan K. Hubbard {
95de566360SJordan K. Hubbard 	int columns, len;
96de566360SJordan K. Hubbard 	struct stub *ep;
97de566360SJordan K. Hubbard 
98*b0f558dfSAlex Richardson 	fprintf(stderr,
99*b0f558dfSAlex Richardson 	    "usage: %s <prog> <args> ..., where <prog> is one of:\n", EXECNAME);
100de566360SJordan K. Hubbard 	columns = 0;
101de566360SJordan K. Hubbard 	for (ep = entry_points; ep->name != NULL; ep++) {
102de566360SJordan K. Hubbard 		len = strlen(ep->name) + 1;
103de566360SJordan K. Hubbard 		if (columns + len < 80)
104de566360SJordan K. Hubbard 			columns += len;
105de566360SJordan K. Hubbard 		else {
106de566360SJordan K. Hubbard 			fprintf(stderr, "\n");
107de566360SJordan K. Hubbard 			columns = len;
108de566360SJordan K. Hubbard 		}
109de566360SJordan K. Hubbard 		fprintf(stderr, " %s", ep->name);
110de566360SJordan K. Hubbard 	}
111de566360SJordan K. Hubbard 	fprintf(stderr, "\n");
112de566360SJordan K. Hubbard 	exit(1);
113de566360SJordan K. Hubbard }
114de566360SJordan K. Hubbard 
115de566360SJordan K. Hubbard /* end of crunched_main.c */
116