/* Test program for elf_strptr function.
   Copyright (C) 2015 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include ELFUTILS_HEADER(elf)
#include <gelf.h>

int
main (int argc, char *argv[])
{
  if (argc != 2)
    {
      printf ("No ELF file given as argument");
      exit (1);
    }

  const char *fname = argv[1];

  // Initialize libelf.
  elf_version (EV_CURRENT);

  /* Read the ELF from disk now.  */
  int fd = open (fname, O_RDONLY);
  if (fd == -1)
    {
      printf ("cannot open `%s' read-only: %s\n", fname, strerror (errno));
      exit (1);
    }

  Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
  if (elf == NULL)
    {
      printf ("cannot create ELF descriptor read-only: %s\n", elf_errmsg (-1));
      exit (1);
    }

  size_t ndx;
  if (elf_getshdrstrndx (elf, &ndx) != 0)
    {
      printf ("cannot get section header table index: %s\n", elf_errmsg (-1));
      exit (1);
    }

  if (ndx == SHN_UNDEF)
    {
      printf ("ELF file `%s' doesn't have a section header table index", fname);
      exit (1);
    }

  Elf_Scn *scn = elf_getscn (elf, ndx);
  if (scn == NULL)
    {
      printf ("Couldn't get section %zd: %s\n", ndx, elf_errmsg (-1));
      exit (1);
    }

  void print_strings (void)
  {
    GElf_Shdr shdr_mem;
    GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);

    printf ("Strings in section %zd (%s):\n", ndx,
	    ((shdr->sh_flags & SHF_COMPRESSED) != 0
	     ? "compressed" : "uncompressed"));

    size_t off = 0;
    const char *str = elf_strptr (elf, ndx, off);
    while (str != NULL)
      {
	printf ("[%zx] '%s'\n", off, str);
	off += strlen (str) + 1;
	str = elf_strptr (elf, ndx, off);
      }
  }

  if (elf_compress (scn, ELFCOMPRESS_ZLIB, 0) < 0)
    {
      printf ("Couldn't compress section %zd: %s\n", ndx, elf_errmsg (-1));
      exit (1);
    }
  print_strings ();

  if (elf_compress (scn, 0, 0) < 0)
    {
      printf ("Couldn't decompress section %zd: %s\n", ndx, elf_errmsg (-1));
      exit (1);
    }
  print_strings ();

  if (elf_end (elf) != 0)
    {
      printf ("failure in elf_end: %s\n", elf_errmsg (-1));
      exit (1);
    }

  close (fd);

  return 0;
}
