Remove stupid copy
[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   /* Copy the input ELF to the output file */
62   if (!opts.fnOutput) {
63     if (opts.copy) {
64       fprintf(stderr, "Error: Missing output file name for requested operation.\n");
65     }
66   } else {
67     if (opts.copy) {
68       ElfuElf *me;
69
70       me = elfu_modelFromElf(hIn.e);
71
72       if (me) {
73         printf("Model successfully loaded.\n");
74
75         elfu_modelToElf(me, hOut.e);
76
77         printf("Model converted to ELF, ready to be written.\n");
78       } else {
79         printf("Failed to load model.\n");
80       }
81     }
82   }
83
84
85
86 EXIT:
87   if (hOut.e) {
88     if (elf_update(hOut.e, ELF_C_WRITE) < 0) {
89       fprintf(stderr, "elf_update() failed: %s\n", elf_errmsg(-1));
90     }
91     closeElf(&hOut);
92   }
93
94   if (hIn.e) {
95     closeElf(&hIn);
96   }
97
98   return (exitval);
99 }