From 9f65adf2ba3bb15feb8b7a7b3eef788df3fd270e Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 10 Feb 2009 15:43:56 -0800 Subject: auto import from //branches/cupcake/...@130745 --- libdl/dltest.c | 266 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 147 insertions(+), 119 deletions(-) (limited to 'libdl/dltest.c') diff --git a/libdl/dltest.c b/libdl/dltest.c index e84d5a3..14cd854 100755 --- a/libdl/dltest.c +++ b/libdl/dltest.c @@ -1,119 +1,147 @@ -#include -#include -#include -#include -#include -#include - -extern char *optarg; -extern int optind, opterr, optopt; - -static struct option long_options[] = { - {"library", required_argument, 0, 'l'}, - {"symbol", required_argument, 0, 's'}, - {"help", no_argument, 0, 'h'}, - {0, 0, 0, 0}, -}; - -/* This array must parallel long_options[] */ -static const char *descriptions[] = { - "specify a library path to look up symbol", - "specify symbol to look up", - "print this help screen", -}; - -void print_help(const char *name) { - fprintf(stdout, - "invokation:\n" - "\t%s [-l ] -s \n" - "\t%s -h\n\n", name, name); - fprintf(stdout, "options:\n"); - struct option *opt = long_options; - const char **desc = descriptions; - while (opt->name) { - fprintf(stdout, "\t-%c/--%s%s: %s\n", - opt->val, - opt->name, - (opt->has_arg ? " (argument)" : ""), - *desc); - opt++; - desc++; - } -} - -int get_options(int argc, char **argv, char **lib, char **sym) -{ - int c; - - *lib = 0; - *sym = 0; - - while (1) { - /* getopt_long stores the option index here. */ - int option_index = 0; - - c = getopt_long (argc, argv, - "l:s:h", - long_options, - &option_index); - /* Detect the end of the options. */ - if (c == -1) break; - - switch (c) { - case 'l': - *lib = strdup(optarg); - break; - case 's': - *sym = strdup(optarg); - break; - case 'h': print_help(argv[0]); exit(EXIT_FAILURE); break; - case '?': - /* getopt_long already printed an error message. */ - break; - default: - fprintf(stderr, "Unknown option"); - exit(EXIT_FAILURE); - } - } - - return optind; -} - -int main(int argc, char **argv) -{ - char *libname, *symname, *prog = *argv; - - get_options(argc, argv, &libname, &symname); - - if (symname == NULL) { - fprintf(stderr, "You must specify a symbol!\n"); - print_help(prog); - exit(EXIT_FAILURE); - } - - { - const char *dlerr; - void *handle, *symbol; - - printf("opening library [%s]\n", libname); - dlerr = dlerror(); - handle = libname ? dlopen(libname, RTLD_NOW) : RTLD_DEFAULT; - dlerr = dlerror(); - if (dlerr != NULL) fprintf(stderr, "dlopen() error: %s\n", dlerr); - - printf("opening symbol [%s]\n", symname); - symbol = dlsym(handle, symname); - dlerr = dlerror(); - if (dlerr != NULL) fprintf(stderr, "dlsym() error: %s\n", dlerr); - - printf("closing library [%s]\n", libname); - dlclose(handle); - dlerr = dlerror(); - if (dlerr != NULL) fprintf(stderr, "dlclose() error: %s\n", dlerr); - else printf("successfully opened symbol\n"); - } - - if (libname != NULL) free(libname); - if (symname != NULL) free(symname); - return 0; -} +/* + * Copyright (C) 2008 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include + +extern char *optarg; +extern int optind, opterr, optopt; + +static struct option long_options[] = { + {"library", required_argument, 0, 'l'}, + {"symbol", required_argument, 0, 's'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0}, +}; + +/* This array must parallel long_options[] */ +static const char *descriptions[] = { + "specify a library path to look up symbol", + "specify symbol to look up", + "print this help screen", +}; + +void print_help(const char *name) { + fprintf(stdout, + "invokation:\n" + "\t%s [-l ] -s \n" + "\t%s -h\n\n", name, name); + fprintf(stdout, "options:\n"); + struct option *opt = long_options; + const char **desc = descriptions; + while (opt->name) { + fprintf(stdout, "\t-%c/--%s%s: %s\n", + opt->val, + opt->name, + (opt->has_arg ? " (argument)" : ""), + *desc); + opt++; + desc++; + } +} + +int get_options(int argc, char **argv, char **lib, char **sym) +{ + int c; + + *lib = 0; + *sym = 0; + + while (1) { + /* getopt_long stores the option index here. */ + int option_index = 0; + + c = getopt_long (argc, argv, + "l:s:h", + long_options, + &option_index); + /* Detect the end of the options. */ + if (c == -1) break; + + switch (c) { + case 'l': + *lib = strdup(optarg); + break; + case 's': + *sym = strdup(optarg); + break; + case 'h': print_help(argv[0]); exit(EXIT_FAILURE); break; + case '?': + /* getopt_long already printed an error message. */ + break; + default: + fprintf(stderr, "Unknown option"); + exit(EXIT_FAILURE); + } + } + + return optind; +} + +int main(int argc, char **argv) +{ + char *libname, *symname, *prog = *argv; + + get_options(argc, argv, &libname, &symname); + + if (symname == NULL) { + fprintf(stderr, "You must specify a symbol!\n"); + print_help(prog); + exit(EXIT_FAILURE); + } + + { + const char *dlerr; + void *handle, *symbol; + + printf("opening library [%s]\n", libname); + dlerr = dlerror(); + handle = libname ? dlopen(libname, RTLD_NOW) : RTLD_DEFAULT; + dlerr = dlerror(); + if (dlerr != NULL) fprintf(stderr, "dlopen() error: %s\n", dlerr); + + printf("opening symbol [%s]\n", symname); + symbol = dlsym(handle, symname); + dlerr = dlerror(); + if (dlerr != NULL) fprintf(stderr, "dlsym() error: %s\n", dlerr); + + printf("closing library [%s]\n", libname); + dlclose(handle); + dlerr = dlerror(); + if (dlerr != NULL) fprintf(stderr, "dlclose() error: %s\n", dlerr); + else printf("successfully opened symbol\n"); + } + + if (libname != NULL) free(libname); + if (symname != NULL) free(symname); + return 0; +} -- cgit v1.1