Mercurial > hg > chrpath
diff main.c @ 0:b8f7423e385c
import 0.13
author | Peter Meerwald <pmeerw@pmeerw.net> |
---|---|
date | Fri, 20 Jul 2012 01:51:24 +0200 |
parents | |
children | 7bf4a164d5bb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.c Fri Jul 20 01:51:24 2012 +0200 @@ -0,0 +1,129 @@ +/* + * Author: Petter Reinholdtsen <pere@hungry.com> + * date: 2001-01-20 + * + * Alter ELF rpath information (insert, modify, remove). + * + * Based on source from Peeter Joot <peeterj@ca.ibm.com> and Geoffrey + * Keating <geoffk@ozemail.com.au>. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#ifdef HAVE_GETOPT_H +#include <getopt.h> +#endif +#include "protos.h" + +#ifdef HAVE_GETOPT_LONG +# define GETOPT_LONG getopt_long + +static struct option long_options[] = +{ + {"convert", 0, 0, 'c'}, + {"delete", 0, 0, 'd'}, + {"help", 0, 0, 'h'}, + {"keepgoing", 0, 0, 'k'}, + {"list", 0, 0, 'l'}, + {"replace", 1, 0, 'r'}, + {"version", 0, 0, 'v'} +}; + +#else /* not HAVE_GETOPT_LONG */ +# define GETOPT_LONG(argc,argv,optstr,lopts,lidx) getopt(argc,argv,optstr) +#endif /* not HAVE_GETOPT_LONG */ + +static void +usage(char *progname) +{ + printf("Usage: %s [-v|-d|-c|-r <path>] <program> [<program> ...]\n\n", + progname); + printf(" -v|--version Display program version number\n"); + printf(" -d|--delete Delete current rpath/runpath setting\n"); +#if defined(DT_RUNPATH) + printf(" -c|--convert Convert rpath to runpath\n"); +#endif /* DT_RUNPATH */ + printf(" -r <path>|--replace <path> Replace current rpath/runpath setting\n"); + printf(" with the path given\n"); + printf(" -l|--list List the current rpath/runpath (default)\n"); + printf(" -h|--help Show this usage information.\n"); +#ifndef HAVE_GETOPT_LONG + printf("\n *** The long options are not available on this platform"); +#endif /* not HAVE_GETOPT_LONG */ +#if !defined(DT_RUNPATH) + printf("\n *** There is no support for runpath on this platform"); +#endif /* DT_RUNPATH */ + printf("\n"); +} + +int +main(int argc, char * const argv[]) +{ + int retval = 0; + int convert = 0; /* convert to given type */ + int remove = 0; /* remove or not */ + int keep_going = 0; /* Break on first error, or keep going? */ + char *newpath = NULL; /* insert this path */ + int opt; +#ifdef HAVE_GETOPT_LONG + int option_index = 0; +#endif /* HAVE_GETOPT_LONG */ + + if (argc < 2) + { + usage(argv[0]); + return 1; + } + + do { + opt = GETOPT_LONG(argc, argv, "cdhklr:v", long_options, &option_index); + switch (opt) + { +#if defined(DT_RUNPATH) + case 'c': + convert = 1; + break; +#endif /* DT_RUNPATH */ + case 'd': + remove = 1; + break; + case 'k': + keep_going = 1; + break; + case 'r': + newpath = optarg; + break; + case 'v': + printf("%s version %s\n", PACKAGE, VERSION); + exit(0); + break; + case 'l': /* This is the default action */ + newpath = NULL; + break; + case -1: + break; + default: + printf("Invalid argument '%c'\n", opt); + case 'h': + usage(argv[0]); + exit(0); + break; + } + } while (-1 != opt); + + while (optind < argc && (!retval || keep_going)) + { + if (remove) + retval |= killrpath(argv[optind++]); + else + /* list by default, replace if path is set */ + retval |= chrpath(argv[optind++], newpath, convert); + } + + return retval; +}