summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-09-09 01:21:25 +0000
committerjdp <jdp@FreeBSD.org>1998-09-09 01:21:25 +0000
commit7aadfa5c68916fc245b31ddeccdabc2deecd7c61 (patch)
tree52e3ead876c9fb810a56d0eaa0793ccf853b2efa /sbin
parent5279ba7b15b4567ed68a3eca5a0b3197d8a9f116 (diff)
downloadFreeBSD-src-7aadfa5c68916fc245b31ddeccdabc2deecd7c61.zip
FreeBSD-src-7aadfa5c68916fc245b31ddeccdabc2deecd7c61.tar.gz
Add a new library function getobjformat(). It checks all the
standard places ("/etc/objformat", ${OBJFORMAT}, argv) for an indication of the user's preferred object file format. This consolidates some code that was starting to be duplicated in more and more places. Use the new function in ldconfig. Note: I don't think that gcc should use getobjformat(), even though it could. The compiler should limit itself to functions that are widespread, to ease porting and cross-compilation.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/ldconfig/ldconfig.c89
1 files changed, 16 insertions, 73 deletions
diff --git a/sbin/ldconfig/ldconfig.c b/sbin/ldconfig/ldconfig.c
index 2206c0b..bacdcca 100644
--- a/sbin/ldconfig/ldconfig.c
+++ b/sbin/ldconfig/ldconfig.c
@@ -30,7 +30,7 @@
#ifndef lint
static const char rcsid[] =
- "$Id: ldconfig.c,v 1.26 1998/09/05 16:20:15 jdp Exp $";
+ "$Id: ldconfig.c,v 1.27 1998/09/06 20:43:25 jdp Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -45,6 +45,7 @@ static const char rcsid[] =
#include <errno.h>
#include <fcntl.h>
#include <link.h>
+#include <objformat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -65,16 +66,6 @@ static const char rcsid[] =
#undef major
#undef minor
-enum obj_format { Unknown, Aout, Elf };
-
-#ifndef DEFAULT_FORMAT
-#ifdef __ELF__
-#define DEFAULT_FORMAT Elf
-#else
-#define DEFAULT_FORMAT Aout
-#endif
-#endif
-
static int verbose;
static int nostd;
static int justread;
@@ -100,7 +91,6 @@ static int buildhints __P((void));
static int dodir __P((char *, int));
int dofile __P((char *, int));
static void enter __P((char *, char *, char *, int *, int));
-static enum obj_format getobjfmt __P((int *, char **));
static void listhints __P((void));
static int readhints __P((void));
static void usage __P((void));
@@ -112,10 +102,19 @@ char *argv[];
{
int i, c;
int rval = 0;
- enum obj_format fmt;
-
- fmt = getobjfmt(&argc, argv);
- hints_file = fmt == Aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS;
+ char objformat[32];
+ int is_aout;
+
+ if (getobjformat(objformat, sizeof objformat, &argc, argv) == -1)
+ errx(1, "getobjformat failed: name too long");
+ if (strcmp(objformat, "aout") == 0)
+ is_aout = 1;
+ else if (strcmp(objformat, "elf") == 0)
+ is_aout = 0;
+ else
+ errx(1, "unknown object format \"%s\"", objformat);
+
+ hints_file = is_aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS;
while ((c = getopt(argc, argv, "Rf:mrsv")) != -1) {
switch (c) {
case 'R':
@@ -142,7 +141,7 @@ char *argv[];
}
}
- if (fmt == Elf) {
+ if (!is_aout) {
if (justread)
list_elf_hints(hints_file);
else
@@ -204,62 +203,6 @@ char *argv[];
return rval;
}
-static enum obj_format
-getobjfmt(argcp, argv)
- int *argcp;
- char **argv;
-{
- enum obj_format fmt;
- char **src, **dst;
- const char *env;
- FILE *fp;
-
- fmt = Unknown;
-
- /* Scan for "-aout" or "-elf" arguments, deleting them as we go. */
- for (dst = src = argv + 1; *src != NULL; src++) {
- if (strcmp(*src, "-aout") == 0)
- fmt = Aout;
- else if (strcmp(*src, "-elf") == 0)
- fmt = Elf;
- else
- *dst++ = *src;
- }
- *dst = NULL;
- *argcp -= src - dst;
- if (fmt != Unknown)
- return fmt;
-
- /* Check the OBJFORMAT environment variable. */
- if ((env = getenv("OBJFORMAT")) != NULL) {
- if (strcmp(env, "aout") == 0)
- return Aout;
- else if (strcmp(env, "elf") == 0)
- return Elf;
- }
-
- /* Take a look at "/etc/objformat". */
- if ((fp = fopen("/etc/objformat", "r")) != NULL) {
- char buf[1024];
-
- while (fgets(buf, sizeof buf, fp) != NULL) {
- if (strcmp(buf, "OBJFORMAT=aout\n") == 0)
- fmt = Aout;
- else if (strcmp(buf, "OBJFORMAT=elf\n") == 0)
- fmt = Elf;
- else
- warnx("Unrecognized line in /etc/objformat: %s",
- buf);
- }
- fclose(fp);
- }
- if (fmt != Unknown)
- return fmt;
-
- /* As a last resort, use the compiled in default. */
- return DEFAULT_FORMAT;
-}
-
static void
usage()
{
OpenPOWER on IntegriCloud