• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Create descriptor from file descriptor for processing file.
2    Copyright (C) 2002, 2003, 2004 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4 
5    This program is Open Source software; you can redistribute it and/or
6    modify it under the terms of the Open Software License version 1.0 as
7    published by the Open Source Initiative.
8 
9    You should have received a copy of the Open Software License along
10    with this program; if not, you may obtain a copy of the Open Software
11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13    3001 King Ranch Road, Ukiah, CA 95482.   */
14 
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18 
19 #include <errno.h>
20 #include <stddef.h>
21 #include <sys/stat.h>
22 
23 #include <libdwP.h>
24 
25 
26 Dwarf *
dwarf_begin(fd,cmd)27 dwarf_begin (fd, cmd)
28      int fd;
29      Dwarf_Cmd cmd;
30 {
31   Elf *elf;
32   Elf_Cmd elfcmd;
33   Dwarf *result = NULL;
34 
35   switch (cmd)
36     {
37     case DWARF_C_READ:
38       elfcmd = ELF_C_READ_MMAP;
39       break;
40     case DWARF_C_WRITE:
41       elfcmd = ELF_C_WRITE;
42       break;
43     case DWARF_C_RDWR:
44       elfcmd = ELF_C_RDWR;
45       break;
46     default:
47       /* No valid mode.  */
48       __libdw_seterrno (DWARF_E_INVALID_CMD);
49       return NULL;
50     }
51 
52   /* We have to call `elf_version' here since the user might have not
53      done it or initialized libelf with a different version.  This
54      would break libdwarf since we are using the ELF data structures
55      in a certain way.  */
56   elf_version (EV_CURRENT);
57 
58   /* Get an ELF descriptor.  */
59   elf = elf_begin (fd, elfcmd, NULL);
60   if (elf == NULL)
61     {
62       /* Test why the `elf_begin" call failed.  */
63       struct stat64 st;
64 
65       if (fstat64 (fd, &st) == 0 && ! S_ISREG (st.st_mode))
66 	__libdw_seterrno (DWARF_E_NO_REGFILE);
67       else if (errno == EBADF)
68 	__libdw_seterrno (DWARF_E_INVALID_FILE);
69       else
70 	__libdw_seterrno (DWARF_E_IO_ERROR);
71     }
72   else
73     {
74       /* Do the real work now that we have an ELF descriptor.  */
75       result = dwarf_begin_elf (elf, cmd, NULL);
76 
77       /* If this failed, free the resources.  */
78       if (result == NULL)
79 	elf_end (elf);
80       else
81 	result->free_elf = true;
82     }
83 
84   return result;
85 }
86