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