summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/Makefile4
-rw-r--r--include/objformat.h39
-rw-r--r--lib/libc/gen/Makefile.inc8
-rw-r--r--lib/libc/gen/getobjformat.3114
-rw-r--r--lib/libc/gen/getobjformat.c119
-rw-r--r--sbin/ldconfig/ldconfig.c89
-rw-r--r--sys/alpha/include/param.h9
-rw-r--r--sys/i386/include/param.h13
8 files changed, 315 insertions, 80 deletions
diff --git a/include/Makefile b/include/Makefile
index 7b8e6de..4f12b46 100644
--- a/include/Makefile
+++ b/include/Makefile
@@ -1,5 +1,5 @@
# From: @(#)Makefile 8.2 (Berkeley) 1/4/94
-# $Id: Makefile,v 1.79 1998/06/11 08:56:40 peter Exp $
+# $Id: Makefile,v 1.80 1998/08/01 13:42:12 alex Exp $
#
# Doing a make install builds /usr/include
#
@@ -14,7 +14,7 @@ FILES= a.out.h ar.h assert.h bitstring.h ctype.h db.h dirent.h disktab.h \
dlfcn.h elf.h err.h fnmatch.h fstab.h \
fts.h glob.h grp.h strhash.h histedit.h iso646.h \
kvm.h limits.h link.h locale.h malloc.h memory.h mpool.h \
- ndbm.h netdb.h nl_types.h nlist.h \
+ ndbm.h netdb.h nl_types.h nlist.h objformat.h \
paths.h pthread.h pthread_np.h pwd.h \
ranlib.h regex.h regexp.h resolv.h rune.h runetype.h setjmp.h sgtty.h \
signal.h stab.h stddef.h stdio.h stdlib.h string.h stringlist.h \
diff --git a/include/objformat.h b/include/objformat.h
new file mode 100644
index 0000000..a32c1a9
--- /dev/null
+++ b/include/objformat.h
@@ -0,0 +1,39 @@
+/*-
+ * Copyright (c) 1998 John D. Polstra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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 AUTHOR 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 AUTHOR 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.
+ *
+ * $Id$
+ */
+
+#ifndef _OBJFORMAT_H_
+#define _OBJFORMAT_H_
+
+#include <sys/cdefs.h>
+#include <stddef.h>
+
+__BEGIN_DECLS
+int getobjformat(char *, size_t, int *, char **);
+__END_DECLS
+
+#endif /* _OBJFORMAT_H_ */
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 060359a..b15f0bb 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -1,5 +1,5 @@
# @(#)Makefile.inc 8.6 (Berkeley) 5/4/95
-# $Id: Makefile.inc,v 1.48 1998/07/08 15:42:57 dt Exp $
+# $Id: Makefile.inc,v 1.49 1998/08/03 15:35:41 bde Exp $
# machine-independent gen sources
.PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
@@ -11,7 +11,8 @@ SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \
exec.c fnmatch.c fstab.c ftok.c fts.c getbootfile.c getbsize.c \
getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \
gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \
- getosreldate.c getpagesize.c getpass.c getpwent.c getttyent.c \
+ getobjformat.c getosreldate.c getpagesize.c \
+ getpass.c getpwent.c getttyent.c \
getusershell.c getvfsbyname.c getvfsent.c glob.c \
initgroups.c isatty.c jrand48.c lcong48.c \
lockf.c lrand48.c mrand48.c msgctl.c \
@@ -38,7 +39,8 @@ MAN3+= alarm.3 arc4random.3 clock.3 \
getbootfile.3 getbsize.3 getcap.3 getcwd.3 \
getdiskbyname.3 getdomainname.3 getfsent.3 \
getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
- getmntinfo.3 getnetgrent.3 getpagesize.3 getpass.3 getpwent.3 \
+ getmntinfo.3 getnetgrent.3 getobjformat.3 \
+ getpagesize.3 getpass.3 getpwent.3 \
getttyent.3 getusershell.3 getvfsbyname.3 getvfsent.3 \
glob.3 initgroups.3 isinf.3 \
ldexp.3 lockf.3 modf.3 msgctl.3 msgget.3 msgrcv.3 msgsnd.3 \
diff --git a/lib/libc/gen/getobjformat.3 b/lib/libc/gen/getobjformat.3
new file mode 100644
index 0000000..228bb5f
--- /dev/null
+++ b/lib/libc/gen/getobjformat.3
@@ -0,0 +1,114 @@
+.\" Copyright (c) 1998 John D. Polstra
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. 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 AUTHOR 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 AUTHOR 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.
+.\"
+.\" $Id$
+.\"
+.Dd September 7, 1998
+.Dt GETOBJFORMAT 3
+.Os FreeBSD
+.Sh NAME
+.Nm getobjformat
+.Nd get preferred object file format
+.Sh SYNOPSIS
+.Fd #include <objformat.h>
+.Ft int
+.Fn getobjformat "char *buf" "size_t bufsize" "int *argcp" "char **argv"
+.Sh DESCRIPTION
+.Fn getobjformat
+queries several sources to determine the preferred object file
+format, and copies its name into a buffer provided by the caller.
+.Pp
+The object file format is determined as follows. If
+.Va argv
+is
+.No non- Ns Ev NULL
+and an explicit command line argument such as
+.Fl aout
+or
+.Fl elf
+is present, then that determines the object file format.
+.Pp
+Otherwise, if the variable
+.Ev OBJFORMAT
+is set in the environment, the object file format is taken from its
+value.
+.Pp
+Otherwise, if the file
+.Pa /etc/objformat
+is readable and contains a line of the form
+.Ql OBJFORMAT=xxx ,
+the object file format is taken from there.
+.Pp
+Otherwise, a built-in system default object file format is returned.
+.Pp
+.Va buf
+points to a user-supplied buffer into which the name of the object
+file format is copied.
+.Va bufsize
+gives the size of the buffer in bytes. The string placed in
+.Va buf
+is always null-terminated. It is an error if the buffer is too
+small to hold the null-terminated name.
+.Pp
+.Va argv
+points to a
+.Dv NULL Ns -terminated
+argument vector to be scanned for object
+format options.
+.Va argv
+may be
+.Dv NULL ,
+in which case the argument vector is not scanned.
+.Pp
+If
+.Va argcp
+is non-NULL, any object format options are deleted from the
+argument vector, and the updated argument count is stored into
+the integer referenced by
+.Va argcp .
+If
+.Va argcp
+is
+.Dv NULL ,
+the argument vector is left unchanged.
+.Sh RETURN VALUES
+On success,
+.Fn getobjformat
+returns the length of the object file format name, not counting the
+null terminator.
+If the supplied buffer is too small to hold the object file format
+and its null terminator,
+.Fn getobjformat
+returns -1. In that case, the contents of the buffer and argument
+vector supplied by the caller are indeterminate.
+.Sh ENVIRONMENT
+.Ev OBJFORMAT
+.Sh FILES
+.Pa /etc/objformat
+.Sh SEE ALSO
+.Xr objformat 1
+.Sh HISTORY
+The
+.Fn getobjformat
+function first appeared in FreeBSD 3.0.
diff --git a/lib/libc/gen/getobjformat.c b/lib/libc/gen/getobjformat.c
new file mode 100644
index 0000000..c1e9915
--- /dev/null
+++ b/lib/libc/gen/getobjformat.c
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 1998 John D. Polstra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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 AUTHOR 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 AUTHOR 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.
+ *
+ * $Id$
+ */
+
+#include <sys/param.h>
+#include <objformat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define PATH_OBJFORMAT "/etc/objformat"
+
+static int copyformat(char *, const char *, size_t);
+
+static const char *known_formats[] = { OBJFORMAT_NAMES, NULL };
+
+static int
+copyformat(char *buf, const char *fmt, size_t bufsize)
+{
+ size_t len;
+
+ len = strlen(fmt);
+ if (len > bufsize - 1)
+ return -1;
+ strcpy(buf, fmt);
+ return len;
+}
+
+int
+getobjformat(char *buf, size_t bufsize, int *argcp, char **argv)
+{
+ const char *fmt;
+ char **src, **dst;
+ const char *env;
+ FILE *fp;
+
+ fmt = NULL;
+
+ if (argv != NULL) {
+ /*
+ * Scan for arguments setting known formats, e.g., "-elf".
+ * If "argcp" is non-NULL, delete these arguments from the
+ * list and update the argument count in "*argcp".
+ */
+ for (dst = src = argv; *src != NULL; src++) {
+ if ((*src)[0] == '-') {
+ const char **p;
+
+ for (p = known_formats; *p != NULL; p++)
+ if (strcmp(*src + 1, *p) == 0)
+ break;
+ if (*p != NULL) {
+ fmt = *p;
+ if (argcp == NULL) /* Don't delete */
+ *dst++ = *src;
+ } else
+ *dst++ = *src;
+ } else
+ *dst++ = *src;
+ }
+ *dst = NULL;
+ if (argcp != NULL)
+ *argcp -= src - dst;
+ if (fmt != NULL)
+ return copyformat(buf, fmt, bufsize);
+ }
+
+ /* Check the OBJFORMAT environment variable. */
+ if ((env = getenv("OBJFORMAT")) != NULL)
+ return copyformat(buf, env, bufsize);
+
+ /* Take a look at "/etc/objformat". */
+ if ((fp = fopen(PATH_OBJFORMAT, "r")) != NULL) {
+ char line[1024];
+ int found;
+ int len;
+
+ found = 0;
+ while (fgets(line, sizeof line, fp) != NULL) {
+ if (strncmp(line, "OBJFORMAT=", 10) == 0) {
+ char *p = &line[10];
+
+ p[strcspn(p, " \t\n")] = '\0';
+ len = copyformat(buf, p, bufsize);
+ found = 1;
+ }
+ }
+ fclose(fp);
+ if (found)
+ return len;
+ }
+
+ /* As a last resort, use the compiled in default. */
+ return copyformat(buf, OBJFORMAT_DEFAULT, bufsize);
+}
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()
{
diff --git a/sys/alpha/include/param.h b/sys/alpha/include/param.h
index bd5f26f..c07ff73 100644
--- a/sys/alpha/include/param.h
+++ b/sys/alpha/include/param.h
@@ -1,4 +1,4 @@
-/* $Id: param.h,v 1.5 1998/07/12 16:32:10 dfr Exp $ */
+/* $Id: param.h,v 1.6 1998/07/30 08:12:14 dfr Exp $ */
/* From: NetBSD: param.h,v 1.20 1997/09/19 13:52:53 leo Exp */
/*
@@ -56,6 +56,13 @@
#include <machine/cpu.h>
/*
+ * OBJFORMAT_NAMES is a comma-separated list of the object formats
+ * that are supported on the architecture.
+ */
+#define OBJFORMAT_NAMES "elf"
+#define OBJFORMAT_DEFAULT "elf"
+
+/*
* Round p (pointer or byte index) up to a correctly-aligned value for all
* data types (int, long, ...). The result is u_long and must be cast to
* any desired pointer type.
diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h
index cd566e2..462f874 100644
--- a/sys/i386/include/param.h
+++ b/sys/i386/include/param.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)param.h 5.8 (Berkeley) 6/28/91
- * $Id: param.h,v 1.44 1998/06/15 04:50:55 bde Exp $
+ * $Id: param.h,v 1.45 1998/08/31 08:41:40 kato Exp $
*/
#ifndef _MACHINE_PARAM_H_
@@ -49,6 +49,17 @@
#define MACHINE_ARCH "i386"
#define MID_MACHINE MID_I386
+/*
+ * OBJFORMAT_NAMES is a comma-separated list of the object formats
+ * that are supported on the architecture.
+ */
+#define OBJFORMAT_NAMES "elf", "aout"
+#ifdef __ELF__
+#define OBJFORMAT_DEFAULT "elf"
+#else
+#define OBJFORMAT_DEFAULT "aout"
+#endif
+
#ifdef SMP
#define NCPUS 2
#else
OpenPOWER on IntegriCloud