Back to index

cell-binutils  2.17cvs20070401
Defines | Typedefs | Functions | Variables
bucomm.c File Reference
#include "bfd.h"
#include "libiberty.h"
#include "bucomm.h"
#include "filenames.h"
#include "libbfd.h"
#include <sys/stat.h>
#include <time.h>
#include <assert.h>

Go to the source code of this file.

Defines

#define LONGEST_ARCH   sizeof ("powerpc:common")
#define template   "stXXXXXX"

Typedefs

typedef long time_t

Functions

static const char * endian_string (enum bfd_endian)
static int display_target_list (void)
static int display_info_table (int, int)
static int display_target_tables (void)
void bfd_nonfatal (const char *string)
void bfd_fatal (const char *string)
void report (const char *format, va_list args)
void fatal VPARAMS ((const char *format,...))
void set_default_bfd_target (void)
void list_matching_formats (char **p)
void list_supported_targets (const char *name, FILE *f)
void list_supported_architectures (const char *name, FILE *f)
int display_info (void)
void print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose)
static char * template_in_dir (const char *path)
char * make_tempname (char *filename)
char * make_tempdir (char *filename)
bfd_vma parse_vma (const char *s, const char *arg)
off_t get_file_size (const char *file_name)
const char * bfd_get_archive_filename (bfd *abfd)

Variables

char * program_name

Define Documentation

#define LONGEST_ARCH   sizeof ("powerpc:common")

Definition at line 164 of file bucomm.c.

#define template   "stXXXXXX"

Typedef Documentation

typedef long time_t

Definition at line 38 of file bucomm.c.


Function Documentation

void bfd_fatal ( const char *  string)

Definition at line 63 of file bucomm.c.

{
  bfd_nonfatal (string);
  xexit (1);
}

Here is the call graph for this function:

Here is the caller graph for this function:

const char* bfd_get_archive_filename ( bfd abfd)

Definition at line 531 of file bucomm.c.

{
  static size_t curr = 0;
  static char *buf;
  size_t needed;

  assert (abfd != NULL);
  
  if (!abfd->my_archive)
    return bfd_get_filename (abfd);

  needed = (strlen (bfd_get_filename (abfd->my_archive))
           + strlen (bfd_get_filename (abfd)) + 3);
  if (needed > curr)
    {
      if (curr)
       free (buf);
      curr = needed + (needed >> 1);
      buf = bfd_malloc (curr);
      /* If we can't malloc, fail safe by returning just the file name.
        This function is only used when building error messages.  */
      if (!buf)
       {
         curr = 0;
         return bfd_get_filename (abfd);
       }
    }
  sprintf (buf, "%s(%s)", bfd_get_filename (abfd->my_archive),
          bfd_get_filename (abfd));
  return buf;
}

Here is the call graph for this function:

void bfd_nonfatal ( const char *  string)

Definition at line 52 of file bucomm.c.

{
  const char *errmsg = bfd_errmsg (bfd_get_error ());

  if (string)
    fprintf (stderr, "%s: %s: %s\n", program_name, string, errmsg);
  else
    fprintf (stderr, "%s: %s\n", program_name, errmsg);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int display_info ( void  )

Definition at line 347 of file bucomm.c.

{
  printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
  if (! display_target_list () || ! display_target_tables ())
    return 1;
  else
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int display_info_table ( int  first,
int  last 
) [static]

Definition at line 233 of file bucomm.c.

{
  int t;
  int ret = 1;
  char *dummy_name;
  enum bfd_architecture a;

  /* Print heading of target names.  */
  printf ("\n%*s", (int) LONGEST_ARCH, " ");
  for (t = first; t < last && bfd_target_vector[t]; t++)
    printf ("%s ", bfd_target_vector[t]->name);
  putchar ('\n');

  dummy_name = make_temp_file (NULL);
  for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
    if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
      {
       printf ("%*s ", (int) LONGEST_ARCH - 1,
              bfd_printable_arch_mach (a, 0));
       for (t = first; t < last && bfd_target_vector[t]; t++)
         {
           const bfd_target *p = bfd_target_vector[t];
           bfd_boolean ok = TRUE;
           bfd *abfd = bfd_openw (dummy_name, p->name);

           if (abfd == NULL)
             {
              bfd_nonfatal (p->name);
                ret = 0;
              ok = FALSE;
             }

           if (ok)
             {
              if (! bfd_set_format (abfd, bfd_object))
                {
                  if (bfd_get_error () != bfd_error_invalid_operation)
                      {
                      bfd_nonfatal (p->name);
                        ret = 0;
                      }
                  ok = FALSE;
                }
             }

           if (ok)
             {
              if (! bfd_set_arch_mach (abfd, a, 0))
                ok = FALSE;
             }

           if (ok)
             printf ("%s ", p->name);
           else
             {
              int l = strlen (p->name);
              while (l--)
                putchar ('-');
              putchar (' ');
             }
           if (abfd != NULL)
             bfd_close_all_done (abfd);
         }
       putchar ('\n');
      }
  unlink (dummy_name);
  free (dummy_name);

  return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int display_target_list ( void  ) [static]

Definition at line 181 of file bucomm.c.

{
  char *dummy_name;
  int t;
  int ret = 1;

  dummy_name = make_temp_file (NULL);
  for (t = 0; bfd_target_vector[t]; t++)
    {
      const bfd_target *p = bfd_target_vector[t];
      bfd *abfd = bfd_openw (dummy_name, p->name);
      enum bfd_architecture a;

      printf ("%s\n (header %s, data %s)\n", p->name,
             endian_string (p->header_byteorder),
             endian_string (p->byteorder));

      if (abfd == NULL)
       {
          bfd_nonfatal (dummy_name);
          ret = 0;
         continue;
       }

      if (! bfd_set_format (abfd, bfd_object))
       {
         if (bfd_get_error () != bfd_error_invalid_operation)
            {
             bfd_nonfatal (p->name);
              ret = 0;
            }
         bfd_close_all_done (abfd);
         continue;
       }

      for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
       if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
         printf ("  %s\n",
                bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
      bfd_close_all_done (abfd);
    }
  unlink (dummy_name);
  free (dummy_name);

  return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int display_target_tables ( void  ) [static]

Definition at line 308 of file bucomm.c.

{
  int t;
  int columns;
  int ret = 1;
  char *colum;

  columns = 0;
  colum = getenv ("COLUMNS");
  if (colum != NULL)
    columns = atoi (colum);
  if (columns == 0)
    columns = 80;

  t = 0;
  while (bfd_target_vector[t] != NULL)
    {
      int oldt = t, wid;

      wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
      ++t;
      while (wid < columns && bfd_target_vector[t] != NULL)
       {
         int newwid;

         newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
         if (newwid >= columns)
           break;
         wid = newwid;
         ++t;
       }
      if (! display_info_table (oldt, t))
        ret = 0;
    }

  return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static const char * endian_string ( enum bfd_endian  endian) [static]

Definition at line 167 of file bucomm.c.

{
  switch (endian)
    {
    case BFD_ENDIAN_BIG: return "big endian";
    case BFD_ENDIAN_LITTLE: return "little endian";
    default: return "endianness unknown";
    }
}

Here is the caller graph for this function:

off_t get_file_size ( const char *  file_name)

Definition at line 508 of file bucomm.c.

{
  struct stat statbuf;
  
  if (stat (file_name, &statbuf) < 0)
    {
      if (errno == ENOENT)
       non_fatal (_("'%s': No such file"), file_name);
      else
       non_fatal (_("Warning: could not locate '%s'.  reason: %s"),
                 file_name, strerror (errno));
    }  
  else if (! S_ISREG (statbuf.st_mode))
    non_fatal (_("Warning: '%s' is not an ordinary file"), file_name);
  else
    return statbuf.st_size;

  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void list_matching_formats ( char **  p)

Definition at line 119 of file bucomm.c.

{
  fprintf (stderr, _("%s: Matching formats:"), program_name);
  while (*p)
    fprintf (stderr, " %s", *p++);
  fputc ('\n', stderr);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void list_supported_architectures ( const char *  name,
FILE *  f 
)

Definition at line 149 of file bucomm.c.

{
  const char **arch;

  if (name == NULL)
    fprintf (f, _("Supported architectures:"));
  else
    fprintf (f, _("%s: supported architectures:"), name);

  for (arch = bfd_arch_list (); *arch; arch++)
    fprintf (f, " %s", *arch);
  fprintf (f, "\n");
}

Here is the call graph for this function:

Here is the caller graph for this function:

void list_supported_targets ( const char *  name,
FILE *  f 
)

Definition at line 130 of file bucomm.c.

{
  int t;
  const char **targ_names = bfd_target_list ();

  if (name == NULL)
    fprintf (f, _("Supported targets:"));
  else
    fprintf (f, _("%s: supported targets:"), name);

  for (t = 0; targ_names[t] != NULL; t++)
    fprintf (f, " %s", targ_names[t]);
  fprintf (f, "\n");
  free (targ_names);
}

Here is the call graph for this function:

Here is the caller graph for this function:

char* make_tempdir ( char *  filename)

Definition at line 465 of file bucomm.c.

{
  char *tmpname = template_in_dir (filename);

#ifdef HAVE_MKDTEMP
  return mkdtemp (tmpname);
#else
  tmpname = mktemp (tmpname);
  if (tmpname == NULL)
    return NULL;
#if defined (_WIN32) && !defined (__CYGWIN32__)
  if (mkdir (tmpname) != 0)
    return NULL;
#else
  if (mkdir (tmpname, 0700) != 0)
    return NULL;
#endif
  return tmpname;
#endif
}

Here is the call graph for this function:

char* make_tempname ( char *  filename)

Definition at line 442 of file bucomm.c.

{
  char *tmpname = template_in_dir (filename);
  int fd;

#ifdef HAVE_MKSTEMP
  fd = mkstemp (tmpname);
#else
  tmpname = mktemp (tmpname);
  if (tmpname == NULL)
    return NULL;
  fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
#endif
  if (fd == -1)
    return NULL;
  close (fd);
  return tmpname;
}

Here is the call graph for this function:

Here is the caller graph for this function:

bfd_vma parse_vma ( const char *  s,
const char *  arg 
)

Definition at line 490 of file bucomm.c.

{
  bfd_vma ret;
  const char *end;

  ret = bfd_scan_vma (s, &end, 0);

  if (*end != '\0')
    fatal (_("%s: bad number: %s"), arg, s);

  return ret;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void print_arelt_descr ( FILE *  file,
bfd abfd,
bfd_boolean  verbose 
)

Definition at line 361 of file bucomm.c.

{
  struct stat buf;

  if (verbose)
    {
      if (bfd_stat_arch_elt (abfd, &buf) == 0)
       {
         char modebuf[11];
         char timebuf[40];
         time_t when = buf.st_mtime;
         const char *ctime_result = (const char *) ctime (&when);

         /* POSIX format:  skip weekday and seconds from ctime output.  */
         sprintf (timebuf, "%.12s %.4s", ctime_result + 4, ctime_result + 20);

         mode_string (buf.st_mode, modebuf);
         modebuf[10] = '\0';
         /* POSIX 1003.2/D11 says to skip first character (entry type).  */
         fprintf (file, "%s %ld/%ld %6ld %s ", modebuf + 1,
                 (long) buf.st_uid, (long) buf.st_gid,
                 (long) buf.st_size, timebuf);
       }
    }

  fprintf (file, "%s\n", bfd_get_filename (abfd));
}

Here is the call graph for this function:

Here is the caller graph for this function:

void report ( const char *  format,
va_list  args 
)

Definition at line 70 of file bucomm.c.

{
  fprintf (stderr, "%s: ", program_name);
  vfprintf (stderr, format, args);
  putc ('\n', stderr);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void set_default_bfd_target ( void  )

Definition at line 104 of file bucomm.c.

{
  /* The macro TARGET is defined by Makefile.  */
  const char *target = TARGET;

  if (! bfd_set_default_target (target))
    fatal (_("can't set BFD default target to `%s': %s"),
          target, bfd_errmsg (bfd_get_error ()));
}

Here is the call graph for this function:

Here is the caller graph for this function:

static char* template_in_dir ( const char *  path) [static]

Definition at line 393 of file bucomm.c.

{
#define template "stXXXXXX"
  const char *slash = strrchr (path, '/');
  char *tmpname;
  size_t len;

#ifdef HAVE_DOS_BASED_FILE_SYSTEM
  {
    /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
    char *bslash = strrchr (path, '\\');

    if (slash == NULL || (bslash != NULL && bslash > slash))
      slash = bslash;
    if (slash == NULL && path[0] != '\0' && path[1] == ':')
      slash = path + 1;
  }
#endif

  if (slash != (char *) NULL)
    {
      len = slash - path;
      tmpname = xmalloc (len + sizeof (template) + 2);
      memcpy (tmpname, path, len);

#ifdef HAVE_DOS_BASED_FILE_SYSTEM
      /* If tmpname is "X:", appending a slash will make it a root
        directory on drive X, which is NOT the same as the current
        directory on drive X.  */
      if (len == 2 && tmpname[1] == ':')
       tmpname[len++] = '.';
#endif
      tmpname[len++] = '/';
    }
  else
    {
      tmpname = xmalloc (sizeof (template));
      len = 0;
    }

  memcpy (tmpname + len, template, sizeof (template));
  return tmpname;
#undef template
}

Here is the call graph for this function:

Here is the caller graph for this function:

void non_fatal VPARAMS ( (const char *format,...)  )

Definition at line 78 of file bucomm.c.

{
  VA_OPEN (args, format);
  VA_FIXEDARG (args, const char *, format);

  report (format, args);
  VA_CLOSE (args);
  xexit (1);
}

Here is the call graph for this function:


Variable Documentation

char* program_name

Definition at line 49 of file bucomm.c.