[prev in list] [next in list] [prev in thread] [next in thread]
List: uclinux-dev
Subject: Re: [uClinux-dev] [PATCH 5/7] unify portability handling and errors
From: David McCullough <David_Mccullough () securecomputing ! com>
Date: 2009-07-07 4:40:04
Message-ID: 20090707044004.GA27761 () securecomputing ! com
[Download RAW message or body]
Jivin Mike Frysinger lays it down ...
> Unify the duplicated windows and other system fallback logic in stubs.h
> and add some fatal() helper functions to standardize the error output when
> falling over. This way we don't end up with obscure error messages with
> no idea what util they are coming from.
>
> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Applied,
Thanks,
Davidm
> ---
> Makefile.in | 2 +-
> compress.c | 13 ++---
> elf2flt.c | 179 +++++++++++++----------------------------------------------
> flthdr.c | 29 +++-------
> stubs.c | 41 +++++++++++++-
> stubs.h | 38 +++++++++++++
> 6 files changed, 130 insertions(+), 172 deletions(-)
> create mode 100644 stubs.h
>
> diff --git a/Makefile.in b/Makefile.in
> index dbe9110..b7b6a5c 100644
> --- a/Makefile.in
> +++ b/Makefile.in
> @@ -56,7 +56,7 @@ link = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
> $(PROG_ELF2FLT): elf2flt.o compress.o stubs.o
> $(link)
>
> -$(PROG_FLTHDR): flthdr.o compress.o
> +$(PROG_FLTHDR): flthdr.o compress.o stubs.o
> $(link)
>
> ld-elf2flt.sh: $(srcdir)/ld-elf2flt.sh.in
> diff --git a/compress.c b/compress.c
> index e5d4f17..144c96f 100644
> --- a/compress.c
> +++ b/compress.c
> @@ -13,6 +13,7 @@
>
> #include <zlib.h>
> #include "compress.h"
> +#include "stubs.h"
>
> /* Open an (uncompressed) file as a stream. Return 0 on success, 1 on
> error.
> @@ -187,15 +188,11 @@ transfer(stream *ifp, stream *ofp, int count)
> n = fread_stream(cmd, 1, num, ifp);
> if (n == 0)
> break;
> - if (fwrite_stream(cmd, n, 1, ofp) != 1) {
> - fprintf(stderr, "Write failed :-(\n");
> - exit(1);
> - }
> + if (fwrite_stream(cmd, n, 1, ofp) != 1)
> + fatal_perror("Write failed :-(\n");
> if (count != -1)
> count -= n;
> }
> - if (count > 0) {
> - fprintf(stderr, "Failed to transfer %d bytes\n", count);
> - exit(1);
> - }
> + if (count > 0)
> + fatal("Failed to transfer %d bytes\n", count);
> }
> diff --git a/elf2flt.c b/elf2flt.c
> index 0ae3ad1..5e9c698 100644
> --- a/elf2flt.c
> +++ b/elf2flt.c
> @@ -44,18 +44,14 @@
> #include <unistd.h> /* Userland prototypes of the Unix std system calls */
> #include <fcntl.h> /* Flag value for file handling functions */
> #include <time.h>
> -#ifndef WIN32
> -#include <netinet/in.h> /* Consts and structs defined by the internet system */
> -#define BINARY_FILE_OPTS
> -#else
> -#include <winsock2.h>
> -#define BINARY_FILE_OPTS "b"
> -#endif
>
> /* from $(INSTALLDIR)/include */
> #include <bfd.h> /* Main header file for the BFD library */
> #include <libiberty.h>
>
> +#include "stubs.h"
> +const char *elf2flt_progname;
> +
> #if defined(TARGET_h8300)
> #include <elf/h8.h> /* TARGET_* ELF support for the BFD library */
> #elif defined(__CYGWIN__) || defined(__MINGW32__) || defined(TARGET_nios) || defined(TARGET_nios2)
> @@ -153,75 +149,6 @@ int use_resolved = 0; /* If true, get the value of symbol references from */
> /* Set if the text section contains any relocations. If it does, we must
> set the load_to_ram flag. */
> int text_has_relocs = 0;
> -const char *progname, *filename;
> -int lineno;
> -
> -int nerrors = 0;
> -int nwarnings = 0;
> -
> -static char where[200];
> -
> -enum {
> - /* Use exactly one of these: */
> - E_NOFILE = 0, /* "progname: " */
> - E_FILE = 1, /* "filename: " */
> - E_FILELINE = 2, /* "filename:lineno: " */
> - E_FILEWHERE = 3, /* "filename:%s: " -- set %s with ewhere() */
> -
> - /* Add in any of these with |': */
> - E_WARNING = 0x10,
> - E_PERROR = 0x20
> -};
> -
> -void ewhere (const char *format, ...);
> -void einfo (int type, const char *format, ...);
> -
> -
> -void
> -ewhere (const char *format, ...) {
> - va_list args;
> - va_start (args, format);
> - vsprintf (where, format, args);
> - va_end (args);
> -}
> -
> -
> -void
> -einfo (int type, const char *format, ...) {
> - va_list args;
> -
> - switch (type & 0x0f) {
> - case E_NOFILE:
> - fprintf (stderr, "%s: ", progname);
> - break;
> - case E_FILE:
> - fprintf (stderr, "%s: ", filename);
> - break;
> - case E_FILELINE:
> - ewhere ("%d", lineno);
> - /* fall-through */
> - case E_FILEWHERE:
> - fprintf (stderr, "%s:%s: ", filename, where);
> - break;
> - }
> -
> - if (type & E_WARNING) {
> - fprintf (stderr, "warning: ");
> - nwarnings++;
> - } else {
> - nerrors++;
> - }
> -
> - va_start (args, format);
> - vfprintf (stderr, format, args);
> - va_end (args);
> -
> - if (type & E_PERROR)
> - perror ("");
> - else
> - fprintf (stderr, "\n");
> -}
> -
>
> asymbol**
> get_symbols (bfd *abfd, long *num)
> @@ -443,11 +370,9 @@ dump_symbols(symbols, number_of_symbols);
> printf("GOT table contains %d entries (%d bytes)\n",
> got_size/sizeof(uint32_t), got_size);
> #ifdef TARGET_m68k
> - if (got_size > GOT_LIMIT) {
> - fprintf(stderr, "GOT too large: %d bytes (limit = %d bytes)\n",
> - got_size, GOT_LIMIT);
> - exit(1);
> - }
> + if (got_size > GOT_LIMIT)
> + fatal("GOT too large: %d bytes (limit = %d bytes)",
> + got_size, GOT_LIMIT);
> #endif
> }
>
> @@ -1645,10 +1570,8 @@ printf("%s(%d): symbol name=%s address=0x%x section=%s -> RELOC=0x%x\n",
>
>
>
> -static char * program;
> -
> static void usage(void)
> -{
> +{
> fprintf(stderr, "Usage: %s [vrzd] [-p <abs-pic-file>] [-s stack-size] "
> "[-o <output-file>] <elf-file>\n\n"
> " -v : verbose operation\n"
> @@ -1663,7 +1586,7 @@ static void usage(void)
> " -p abs-pic-file : GOT/PIC processing with files\n"
> " -s stacksize : set application stack size\n"
> " -o output-file : output file name\n\n",
> - program);
> + elf2flt_progname);
> fprintf(stderr, "Compiled for " ARCH " architecture\n\n");
> exit(2);
> }
> @@ -1716,23 +1639,20 @@ int main(int argc, char *argv[])
> void *text;
> void *data;
> uint32_t *reloc;
> -
> +
> struct flat_hdr hdr;
>
> - program = argv[0];
> - progname = argv[0];
> - xmalloc_set_program_name(program);
> + elf2flt_progname = argv[0];
> + xmalloc_set_program_name(elf2flt_progname);
>
> if (argc < 2)
> usage();
> -
> - if (sizeof(hdr) != 64) {
> - fprintf(stderr,
> +
> + if (sizeof(hdr) != 64)
> + fatal(
> "Potential flat header incompatibility detected\n"
> - "header size should be 64 but is %d\n",
> + "header size should be 64 but is %d",
> sizeof(hdr));
> - exit(64);
> - }
>
> #ifndef TARGET_e1
> stack = 4096;
> @@ -1789,7 +1709,7 @@ int main(int argc, char *argv[])
> if (!load_to_ram && !pfile)
> load_to_ram = 1;
>
> - filename = fname = argv[argc-1];
> + fname = argv[argc-1];
>
> if (pfile) {
> pic_with_got = 1;
> @@ -1800,43 +1720,30 @@ int main(int argc, char *argv[])
> if (! rel_file)
> rel_file = fname;
>
> - if (!(rel_bfd = bfd_openr(rel_file, 0))) {
> - fprintf(stderr, "Can't open %s\n", rel_file);
> - exit(1);
> - }
> + if (!(rel_bfd = bfd_openr(rel_file, 0)))
> + fatal_perror("Can't open '%s'", rel_file);
>
> - if (bfd_check_format (rel_bfd, bfd_object) == 0) {
> - fprintf(stderr, "File is not an object file\n");
> - exit(2);
> - }
> + if (bfd_check_format (rel_bfd, bfd_object) == 0)
> + fatal("File is not an object file");
>
> if (abs_file == rel_file)
> abs_bfd = rel_bfd; /* one file does all */
> else {
> - if (!(abs_bfd = bfd_openr(abs_file, 0))) {
> - fprintf(stderr, "Can't open %s\n", abs_file);
> - exit(1);
> - }
> + if (!(abs_bfd = bfd_openr(abs_file, 0)))
> + fatal_perror("Can't open '%s'", abs_file);
>
> - if (bfd_check_format (abs_bfd, bfd_object) == 0) {
> - fprintf(stderr, "File is not an object file\n");
> - exit(2);
> - }
> + if (bfd_check_format (abs_bfd, bfd_object) == 0)
> + fatal("File is not an object file");
> }
>
> - if (! (bfd_get_file_flags(rel_bfd) & HAS_RELOC)) {
> - fprintf (stderr, "%s: Input file contains no relocation info\n", rel_file);
> - exit (2);
> - }
> + if (! (bfd_get_file_flags(rel_bfd) & HAS_RELOC))
> + fatal("%s: Input file contains no relocation info", rel_file);
>
> - if (use_resolved && !(bfd_get_file_flags(abs_bfd) & EXEC_P)) {
> + if (use_resolved && !(bfd_get_file_flags(abs_bfd) & EXEC_P))
> /* `Absolute' file is not absolute, so neither are address
> contained therein. */
> - fprintf (stderr,
> - "%s: `-a' option specified with non-fully-resolved input file\n",
> + fatal("%s: `-a' option specified with non-fully-resolved input file",
> bfd_get_filename (abs_bfd));
> - exit (2);
> - }
>
> symbol_table = get_symbols(abs_bfd, &number_of_symbols);
>
> @@ -1871,10 +1778,8 @@ int main(int argc, char *argv[])
> *len = sec_vma + sec_size - *vma;
> }
>
> - if (text_len == 0) {
> - fprintf (stderr, "%s: no .text section", abs_file);
> - exit (2);
> - }
> + if (text_len == 0)
> + fatal("%s: no .text section", abs_file);
>
> text = xmalloc(text_len);
>
> @@ -1888,14 +1793,11 @@ int main(int argc, char *argv[])
> text + (s->vma - text_vma), 0,
> bfd_section_size(abs_bfd, s)))
> {
> - fprintf(stderr, "read error section %s\n", s->name);
> - exit(2);
> + fatal("read error section %s", s->name);
> }
>
> - if (data_len == 0) {
> - fprintf (stderr, "%s: no .data section", abs_file);
> - exit (2);
> - }
> + if (data_len == 0)
> + fatal("%s: no .data section", abs_file);
> data = xmalloc(data_len);
>
> if (verbose)
> @@ -1919,8 +1821,7 @@ int main(int argc, char *argv[])
> data + (s->vma - data_vma), 0,
> bfd_section_size(abs_bfd, s)))
> {
> - fprintf(stderr, "read error section %s\n", s->name);
> - exit(2);
> + fatal("read error section %s", s->name);
> }
>
> if (bss_vma == ~0)
> @@ -1988,18 +1889,14 @@ int main(int argc, char *argv[])
> strcat(ofile, ".bflt");
> }
>
> - if ((fd = open (ofile, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, 0744)) < 0) {
> - fprintf (stderr, "Can't open output file %s\n", ofile);
> - exit(4);
> - }
> + if ((fd = open (ofile, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, 0744)) < 0)
> + fatal_perror("Can't open output file %s", ofile);
>
> write(fd, &hdr, sizeof(hdr));
> close(fd);
>
> - if (fopen_stream_u(&gf, ofile, "a" BINARY_FILE_OPTS)) {
> - fprintf(stderr, "Can't open file %s for writing\n", ofile);
> - exit(4);
> - }
> + if (fopen_stream_u(&gf, ofile, "a" BINARY_FILE_OPTS))
> + fatal_perror("Can't open file %s for writing", ofile);
>
> if (docompress == 1)
> reopen_stream_compressed(&gf);
> diff --git a/flthdr.c b/flthdr.c
> index 90f9aa3..0485107 100644
> --- a/flthdr.c
> +++ b/flthdr.c
> @@ -18,18 +18,12 @@
> #include <inttypes.h>
> #include <assert.h>
>
> -/* macros for conversion between host and (internet) network byte order */
> -#ifndef WIN32
> -#include <netinet/in.h> /* Consts and structs defined by the internet system */
> -#define BINARY_FILE_OPTS
> -#else
> -#include <winsock2.h>
> -#define BINARY_FILE_OPTS "b"
> -#endif
> -
> #include "compress.h"
> #include <libiberty.h>
>
> +#include "stubs.h"
> +const char *elf2flt_progname;
> +
> /* from uClinux-x.x.x/include/linux */
> #include "flat.h" /* Binary flat header description */
>
> @@ -48,8 +42,6 @@
>
> /****************************************************************************/
>
> -char *program_name;
> -
> static int print = 0, print_relocs = 0, docompress = 0, ramload = 0,
> stacksize = 0, ktrace = 0, l1stack = 0;
>
> @@ -239,16 +231,14 @@ process_file(char *ifile, char *ofile)
> tfile = make_temp_file("flthdr");
>
> if (fopen_stream_u(&ofp, tfile, "w" BINARY_FILE_OPTS)) {
> - fprintf(stderr, "Failed to open %s for writing\n", tfile);
> unlink(tfile);
> - exit(1);
> + fatal("Failed to open %s for writing\n", tfile);
> }
>
> /* Copy header (always uncompressed). */
> if (fwrite_stream(&new_hdr, sizeof(new_hdr), 1, &ofp) != 1) {
> - fprintf(stderr, "Failed to write to %s\n", tfile);
> unlink(tfile);
> - exit(1);
> + fatal("Failed to write to %s\n", tfile);
> }
>
> /* Whole input file (including text) is compressed: start decompressing
> @@ -283,11 +273,10 @@ process_file(char *ifile, char *ofile)
> output_error = ferror_stream(&ofp);
>
> if (input_error || output_error) {
> - fprintf(stderr, "Error on file pointer%s%s\n",
> + unlink(tfile);
> + fatal("Error on file pointer%s%s\n",
> input_error ? " input" : "",
> output_error ? " output" : "");
> - unlink(tfile);
> - exit(1);
> }
>
> fclose_stream(&ifp);
> @@ -313,7 +302,7 @@ usage(char *s)
> {
> if (s)
> fprintf(stderr, "%s\n", s);
> - fprintf(stderr, "usage: %s [options] flat-file\n", program_name);
> + fprintf(stderr, "usage: %s [options] flat-file\n", elf2flt_progname);
> fprintf(stderr, " Allows you to change an existing flat file\n\n");
> fprintf(stderr, " -p : print current settings\n");
> fprintf(stderr, " -P : print relocations\n");
> @@ -340,7 +329,7 @@ main(int argc, char *argv[])
> int c;
> char *ofile = NULL, *ifile;
>
> - program_name = argv[0];
> + elf2flt_progname = argv[0];
>
> while ((c = getopt(argc, argv, "pPdzZrRuUkKs:o:")) != EOF) {
> switch (c) {
> diff --git a/stubs.c b/stubs.c
> index 59760a3..53a93aa 100644
> --- a/stubs.c
> +++ b/stubs.c
> @@ -1,13 +1,50 @@
> +#include <errno.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +#include "libiberty.h"
> +
> +#include "stubs.h"
> +
> #ifndef HAVE_DCGETTEXT
> -const char *dcgettext (const char *domain, const char *msg, int category)
> +const char *dcgettext(const char *domain, const char *msg, int category)
> {
> return msg;
> }
> #endif /* !HAVE_DCGETTEXT */
>
> #ifndef HAVE_LIBINTL_DGETTEXT
> -const char *libintl_dgettext (const char *domain, const char *msg)
> +const char *libintl_dgettext(const char *domain, const char *msg)
> {
> return msg;
> }
> #endif /* !HAVE_LIBINTL_DGETTEXT */
> +
> +/* fatal error & exit */
> +void fatal(const char *format, ...)
> +{
> + va_list args;
> +
> + va_start(args, format);
> + fprintf(stderr, "%s: ", elf2flt_progname);
> + vfprintf(stderr, format, args);
> + fprintf(stderr, "\n");
> + va_end(args);
> + exit(1);
> +}
> +
> +/* fatal error, perror & exit */
> +void fatal_perror(const char *format, ...)
> +{
> + int e = errno;
> + va_list args;
> +
> + va_start(args, format);
> + fprintf(stderr, "%s: ", elf2flt_progname);
> + vfprintf(stderr, format, args);
> + fprintf(stderr, ": %s\n", strerror(e));
> + va_end(args);
> + exit(1);
> +}
> diff --git a/stubs.h b/stubs.h
> new file mode 100644
> index 0000000..493ff73
> --- /dev/null
> +++ b/stubs.h
> @@ -0,0 +1,38 @@
> +/* macros for conversion between host and (internet) network byte order */
> +#ifndef WIN32
> +# include <netinet/in.h> /* Consts and structs defined by the internet system */
> +# define BINARY_FILE_OPTS
> +#else
> +# include <winsock2.h>
> +# define BINARY_FILE_OPTS "b"
> +#endif
> +
> +#ifndef __WIN32
> +# include <sys/wait.h>
> +#endif
> +#ifndef WIFSIGNALED
> +# define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
> +#endif
> +#ifndef WTERMSIG
> +# define WTERMSIG(S) ((S) & 0x7f)
> +#endif
> +#ifndef WIFEXITED
> +# define WIFEXITED(S) (((S) & 0xff) == 0)
> +#endif
> +#ifndef WEXITSTATUS
> +# define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
> +#endif
> +#ifndef WCOREDUMP
> +# define WCOREDUMP(S) ((S) & WCOREFLG)
> +#endif
> +#ifndef WCOREFLG
> +# define WCOREFLG 0200
> +#endif
> +#ifndef HAVE_STRSIGNAL
> +# define strsignal(sig) "SIG???"
> +#endif
> +
> +extern const char *elf2flt_progname;
> +
> +void fatal(const char *, ...);
> +void fatal_perror(const char *, ...);
> --
> 1.6.3.3
>
> _______________________________________________
> uClinux-dev mailing list
> uClinux-dev@uclinux.org
> http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
> This message was resent by uclinux-dev@uclinux.org
> To unsubscribe see:
> http://mailman.uclinux.org/mailman/options/uclinux-dev
>
--
David McCullough, david_mccullough@securecomputing.com, Ph:+61 734352815
McAfee - SnapGear http://www.snapgear.com http://www.uCdot.org
_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic