Support -o -, note what the defaults are
[wraplinux.git] / main.c
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2008 H. Peter Anvin - All Rights Reserved
4  *
5  *   This program is free software; you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * main.c
15  *
16  * Wrap a Linux image in an ELF (or other) container
17  */
18
19 #include <stdio.h>
20 #include <unistd.h>
21 #include <getopt.h>
22 #include <errno.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sysexits.h>
26 #include <sys/mman.h>
27 #include <sys/types.h>
28
29 #include "wraplinux.h"
30
31 const char *program;
32
33 const struct option long_options[] = {
34   { "params",          1, 0, 'p' },
35   { "cmdline",         1, 0, 'p' },
36   { "commandline",     1, 0, 'p' },
37   { "initrd",          1, 0, 'i' },
38   { "output",          1, 0, 'o' },
39   { "elf",             0, 0, 'E' },
40   { "nbi",             0, 0, 'N' },
41   { "help",            0, 0, 'h' },
42   { 0, 0, 0, 0 }
43 };
44 #define OPTSTRING "p:i:o:ENh"
45
46 static void usage(int err)
47 {
48   fprintf(stderr,
49           "Usage: %s [-ENh] [-p \"kernel_comandline\"] [-i initrd_filename]"
50           " [-o output_filename] kernel\n"
51           "  --params       -p    kernel commandline parameters\n"
52           "  --initrd       -i    initrd (multiple initrd options supported)\n"
53           "  --output       -o    output filename (default stdout)\n"
54           "  --elf          -E    output in ELF format (default)\n"
55           "  --nbi          -N    output in NBI format\n"
56           "  --help         -h    display this help text\n"
57           ,program);
58   exit(err);
59 }
60
61 int main(int argc, char *argv[])
62 {
63   int optch;
64   const char *kernel;
65   struct string_list *ird = NULL, **irdp = &ird, *ip;
66   FILE *out = stdout;
67
68   program = argv[0];
69
70   opt.output = output_elf;
71
72   while ( (optch = getopt_long(argc, argv, OPTSTRING, long_options, NULL))
73           != EOF ) {
74     switch (optch) {
75     case 'p':
76       opt.params = optarg;
77       break;
78     case 'i':
79       ip = xmalloc(sizeof *ip);
80       ip->str = optarg;
81       ip->next = NULL;
82       *irdp = ip;
83       irdp = &ip->next;
84       break;
85     case 'o':
86       if (optarg[0] == '-' && !optarg[1]) {
87         out = stdout;
88       } else {
89         out = fopen(optarg, "w");
90         if (!out) {
91           fprintf(stderr, "%s: %s: %s\n", program, optarg, strerror(errno));
92           return EX_CANTCREAT;
93         }
94       }
95       break;
96     case 'E':
97       opt.output = output_elf;
98       break;
99     case 'N':
100       opt.output = output_nbi;
101       break;
102     case 'h':
103       usage(EX_USAGE);
104       break;
105     default:
106       usage(EX_USAGE);
107       break;
108     }
109   }
110
111   if ((argc-optind) != 1)
112     usage(EX_USAGE);
113
114   kernel = argv[optind];
115
116   if (!opt.params)
117     opt.params = "";
118
119   return wrap_kernel(kernel, opt.params, ird, out);
120 }