summaryrefslogtreecommitdiff
path: root/libdwarf/dwarf_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdwarf/dwarf_init.c')
-rw-r--r--libdwarf/dwarf_init.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/libdwarf/dwarf_init.c b/libdwarf/dwarf_init.c
new file mode 100644
index 00000000..bbb86602
--- /dev/null
+++ b/libdwarf/dwarf_init.c
@@ -0,0 +1,92 @@
+/* Create descriptor from file descriptor for processing file.
+ Copyright (C) 2000, 2002 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2000.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <libdwarfP.h>
+
+
+int
+dwarf_init (fd, access, errhand, errarg, dbg, error)
+ int fd;
+ Dwarf_Unsigned access;
+ Dwarf_Handler errhand;
+ Dwarf_Ptr errarg;
+ Dwarf_Debug *dbg;
+ Dwarf_Error *error;
+{
+ Elf *elf;
+ Elf_Cmd cmd;
+ struct Dwarf_Debug_s newdbg;
+ int result = DW_DLV_ERROR;
+
+ switch (access)
+ {
+ case DW_DLC_READ:
+ cmd = ELF_C_READ_MMAP;
+ break;
+ case DW_DLC_WRITE:
+ cmd = ELF_C_WRITE;
+ break;
+ case DW_DLC_RDWR:
+ cmd = ELF_C_RDWR;
+ break;
+ default:
+ /* These are the error values we want to use. */
+ newdbg.dbg_errhand = errhand;
+ newdbg.dbg_errarg = errarg;
+
+ __libdwarf_error (&newdbg, error, DW_E_INVALID_ACCESS);
+ return DW_DLV_ERROR;
+ }
+
+ /* We have to call `elf_version' here since the user might have not
+ done it or initialized libelf with a different version. This
+ would break libdwarf since we are using the ELF data structures
+ in a certain way. */
+ elf_version (EV_CURRENT);
+
+ /* Get an ELF descriptor. */
+ elf = elf_begin (fd, cmd, NULL);
+ if (elf == NULL)
+ {
+ /* Test why the `elf_begin" call failed. */
+ struct stat64 st;
+
+ /* These are the error values we want to use. */
+ newdbg.dbg_errhand = errhand;
+ newdbg.dbg_errarg = errarg;
+
+ if (fstat64 (fd, &st) == 0 && ! S_ISREG (st.st_mode))
+ __libdwarf_error (&newdbg, error, DW_E_NO_REGFILE);
+ else
+ __libdwarf_error (&newdbg, error, DW_E_IO_ERROR);
+ }
+ else
+ {
+ /* Do the real work now that we have an ELF descriptor. */
+ result = dwarf_elf_init (elf, access, errhand, errarg, dbg, error);
+
+ /* If this failed, free the resources. */
+ if (result != DW_DLV_OK)
+ elf_end (elf);
+ }
+
+ return result;
+}