diff options
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/gen/Makefile.inc | 8 | ||||
-rw-r--r-- | lib/libc/gen/getobjformat.3 | 114 | ||||
-rw-r--r-- | lib/libc/gen/getobjformat.c | 119 |
3 files changed, 238 insertions, 3 deletions
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); +} |