Simplify includes
[centaur.git] / src / elfhandle.c
1 #include <errno.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <libelf.h>
9
10 #include "elfhandle.h"
11
12
13 void openElf(ELFHandles *h, char *fn, Elf_Cmd elfmode)
14 {
15   int openflags = 0;
16   int openmode = 0;
17
18   h->e = NULL;
19
20   switch(elfmode) {
21     case ELF_C_READ:
22       openflags = O_RDONLY;
23       break;
24     case ELF_C_WRITE:
25       openflags = O_WRONLY | O_CREAT;
26       openmode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
27       break;
28     case ELF_C_RDWR:
29       openflags = O_RDWR;
30       break;
31     default:
32       return;
33   }
34
35
36   h->fd = open(fn, openflags, openmode);
37   if (h->fd < 0) {
38     fprintf(stderr, "Cannot open %s: %s\n", fn, strerror(errno));
39     return;
40   }
41
42   h->e = elf_begin(h->fd, elfmode, NULL);
43   if (!h->e) {
44     fprintf(stderr, "elf_begin() failed on %s: %s\n", fn, elf_errmsg(-1));
45     goto ERR;
46   }
47
48   if (elfmode == ELF_C_READ || elfmode == ELF_C_RDWR) {
49     if (elf_kind(h->e) != ELF_K_ELF) {
50       fprintf(stderr, "Not an ELF object: %s", fn);
51       goto ERR;
52     }
53   }
54
55   return;
56
57 ERR:
58   if (h->e) {
59     elf_end(h->e);
60     h->e = NULL;
61   }
62   close(h->fd);
63 }
64
65
66 void closeElf(ELFHandles *h)
67 {
68   if (h->e) {
69     elf_end(h->e);
70     close(h->fd);
71     h->e = NULL;
72   }
73 }