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 <vap...@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_mccullo...@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