OSDN Git Service

Unify the duplicated windows and other system fallback logic in stubs.h
authorDavid McCullough <davidm@snapgear.com>
Tue, 7 Jul 2009 04:39:42 +0000 (04:39 +0000)
committerDavid McCullough <davidm@snapgear.com>
Tue, 7 Jul 2009 04:39:42 +0000 (04:39 +0000)
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>
Makefile.in
compress.c
elf2flt.c
flthdr.c
stubs.c
stubs.h [new file with mode: 0644]

index 8b82809..fc00851 100644 (file)
@@ -55,7 +55,7 @@ link = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
 $(PROG_ELF2FLT): elf2flt.o compress.o stubs.o
        $(link)
 
 $(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: $(srcdir)/ld-elf2flt.in
        $(link)
 
 ld-elf2flt: $(srcdir)/ld-elf2flt.in
index e5d4f17..144c96f 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <zlib.h>
 #include "compress.h"
 
 #include <zlib.h>
 #include "compress.h"
+#include "stubs.h"
 
 /* Open an (uncompressed) file as a stream.  Return 0 on success, 1 on
    error.
 
 /* 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;
                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 != -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);
 }
 }
index 0ae3ad1..5e9c698 100644 (file)
--- a/elf2flt.c
+++ b/elf2flt.c
 #include <unistd.h>   /* Userland prototypes of the Unix std system calls    */
 #include <fcntl.h>    /* Flag value for file handling functions              */
 #include <time.h>
 #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>
 
 
 /* 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)
 #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;
 /* 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)
 
 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
            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
   }
 
 #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)
 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"
     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",
        "       -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);
 }
        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;
   void *text;
   void *data;
   uint32_t *reloc;
-  
+
   struct flat_hdr hdr;
 
   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 (argc < 2)
        usage();
-  
-  if (sizeof(hdr) != 64) {
-    fprintf(stderr,
+
+  if (sizeof(hdr) != 64)
+    fatal(
            "Potential flat header incompatibility detected\n"
            "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));
            sizeof(hdr));
-    exit(64);
-  }
 
 #ifndef TARGET_e1
   stack = 4096;
 
 #ifndef TARGET_e1
   stack = 4096;
@@ -1789,7 +1709,7 @@ int main(int argc, char *argv[])
   if (!load_to_ram && !pfile)
     load_to_ram = 1;
 
   if (!load_to_ram && !pfile)
     load_to_ram = 1;
 
-  filename = fname = argv[argc-1];
+  fname = argv[argc-1];
 
   if (pfile) {
     pic_with_got = 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_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_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.  */
     /* `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));
             bfd_get_filename (abs_bfd));
-    exit (2);
-  }
 
   symbol_table = get_symbols(abs_bfd, &number_of_symbols);
 
 
   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;
   }
 
       *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);
 
 
   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)))
       {
                                   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)
   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)))
       {
                                   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)
       }
 
   if (bss_vma == ~0)
@@ -1988,18 +1889,14 @@ int main(int argc, char *argv[])
     strcat(ofile, ".bflt");
   }
 
     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);
 
 
   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);
 
   if (docompress == 1)
     reopen_stream_compressed(&gf);
index 90f9aa3..0485107 100644 (file)
--- a/flthdr.c
+++ b/flthdr.c
 #include <inttypes.h>
 #include <assert.h>
 
 #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 "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                      */
 
 /* 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;
 
 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)) {
        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);
                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) {
        }
 
        /* 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);
                unlink(tfile);
-               exit(1);
+               fatal("Failed to write to  %s\n", tfile);
        }
 
        /* Whole input file (including text) is compressed: start decompressing
        }
 
        /* 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) {
        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" : "");
                                input_error ? " input" : "",
                                output_error ? " output" : "");
-               unlink(tfile);
-               exit(1);
        }
 
        fclose_stream(&ifp);
        }
 
        fclose_stream(&ifp);
@@ -313,7 +302,7 @@ usage(char *s)
 {
        if (s)
                fprintf(stderr, "%s\n", 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");
        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;
 
        int c;
        char *ofile = NULL, *ifile;
 
-       program_name = argv[0];
+       elf2flt_progname = argv[0];
 
        while ((c = getopt(argc, argv, "pPdzZrRuUkKs:o:")) != EOF) {
                switch (c) {
 
        while ((c = getopt(argc, argv, "pPdzZrRuUkKs:o:")) != EOF) {
                switch (c) {
diff --git a/stubs.c b/stubs.c
index 59760a3..53a93aa 100644 (file)
--- 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
 #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
 {
   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 */
 {
   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 (file)
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 *, ...);