Fix build on Ubuntu 12.04
[centaur.git] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <getopt.h>
5 #include <libelf.h>
6 #include <gelf.h>
7
8 #include <libelfu/libelfu.h>
9
10 #include "elfhandle.h"
11 #include "options.h"
12 #include "printing.h"
13
14
15 int main(int argc, char **argv)
16 {
17   CLIOpts opts = { 0 };
18   ELFHandles hIn = { 0 };
19   ELFHandles hOut = { 0 };
20   int exitval = EXIT_SUCCESS;
21
22   /* Is libelf alive and well? */
23   if (elf_version(EV_CURRENT) == EV_NONE) {
24     fprintf(stderr, "libelf init error: %s\n", elf_errmsg(-1));
25   }
26
27
28   /* Parse and validate user input */
29   parseOptions(&opts, argc, argv);
30
31
32   /* Open input/output files */
33   openElf(&hIn, opts.fnInput, ELF_C_READ);
34   if (!hIn.e) {
35     exitval = EXIT_FAILURE;
36     goto EXIT;
37   }
38
39   if (opts.fnOutput) {
40     openElf(&hOut, opts.fnOutput, ELF_C_WRITE);
41     if (!hOut.e) {
42       exitval = EXIT_FAILURE;
43       goto EXIT;
44     }
45   }
46
47
48   /* Now that we have a (hopefully) sane environment, execute commands */
49   if (opts.printHeader) {
50     printHeader(hIn.e);
51   }
52
53   if (opts.printSegments) {
54     printSegments(hIn.e);
55   }
56
57   if (opts.printSections) {
58     printSections(hIn.e);
59   }
60
61
62   /* Copy the input ELF to the output file */
63   if (!opts.fnOutput) {
64     if (opts.copy) {
65       fprintf(stderr, "Error: Missing output file name for requested operation.\n");
66     }
67   } else {
68     if (opts.copy) {
69       ElfuElf *me;
70
71       me = elfu_modelFromElf(hIn.e);
72
73       if (me) {
74         printf("Model successfully loaded.\n");
75
76         elfu_modelToElf(me, hOut.e);
77
78         printf("Model converted to ELF, ready to be written.\n");
79       } else {
80         printf("Failed to load model.\n");
81       }
82     }
83   }
84
85
86
87 EXIT:
88   if (hOut.e) {
89     if (elf_update(hOut.e, ELF_C_WRITE) < 0) {
90       fprintf(stderr, "elf_update() failed: %s\n", elf_errmsg(-1));
91     }
92     closeElf(&hOut);
93   }
94
95   if (hIn.e) {
96     closeElf(&hIn);
97   }
98
99   return (exitval);
100 }