ldlinux: Fix serial output and delete eprintf()
[syslinux.git] / com32 / elflink / ldlinux / kernel.c
blob920246fcbcab08b58dc0495c8334f0571144f1a4
1 #include <stdbool.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <console.h>
6 #include <dprintf.h>
7 #include <syslinux/loadfile.h>
8 #include <syslinux/linux.h>
9 #include <syslinux/pxe.h>
10 #include "core.h"
12 const char *globaldefault = NULL;
13 const char *append = NULL;
15 /* Will be called from readconfig.c */
16 int new_linux_kernel(char *okernel, char *ocmdline)
18 const char *kernel_name = NULL, *args = NULL;
19 struct initramfs *initramfs = NULL;
20 char *temp;
21 void *kernel_data;
22 size_t kernel_len, cmdline_len;
23 bool opt_quiet = false;
24 char *initrd_name, *cmdline;
26 dprintf("okernel = %s, ocmdline = %s", okernel, ocmdline);
28 if (okernel)
29 kernel_name = okernel;
30 else if (globaldefault)
31 kernel_name = globaldefault;
33 if (ocmdline)
34 args = ocmdline;
35 else if (append)
36 args = append;
38 cmdline_len = strlen(kernel_name);
39 if (args) {
40 /* +1 for the space (' ') between kernel and args */
41 cmdline_len += strlen(args) + 1;
44 /* +1 for NUL termination */
45 cmdline_len++;
47 cmdline = malloc(cmdline_len);
48 if (!cmdline) {
49 printf("Failed to alloc memory for cmdline\n");
50 return 1;
53 if (args)
54 snprintf(cmdline, cmdline_len, "%s %s", kernel_name, args);
55 else
56 snprintf(cmdline, cmdline_len, "%s", kernel_name);
58 /* "keeppxe" handling */
59 #if IS_PXELINUX
60 extern char KeepPXE;
62 if (strstr(cmdline, "keeppxe"))
63 KeepPXE |= 1;
64 #endif
66 if (strstr(cmdline, "quiet"))
67 opt_quiet = true;
69 if (!opt_quiet)
70 printf("Loading %s... ", kernel_name);
72 if (loadfile(kernel_name, &kernel_data, &kernel_len)) {
73 if (opt_quiet)
74 printf("Loading %s ", kernel_name);
75 printf("failed: ");
76 goto bail;
79 if (!opt_quiet)
80 printf("ok\n");
82 /* Find and load initramfs */
83 temp = strstr(cmdline, "initrd=");
84 if (temp) {
85 /* Initialize the initramfs chain */
86 initramfs = initramfs_init();
87 if (!initramfs)
88 goto bail;
90 temp += 6; /* strlen("initrd") */
91 do {
92 size_t n = 0;
93 char *p;
95 temp++; /* Skip = or , */
97 p = temp;
98 while (*p != ' ' && *p != ',' && *p) {
99 p++;
100 n++;
103 initrd_name = malloc(n + 1);
104 if (!initrd_name) {
105 printf("Failed to allocate space for initrd\n");
106 goto bail;
109 snprintf(initrd_name, n + 1, "%s", temp);
110 temp += n;
112 if (!opt_quiet)
113 printf("Loading %s...", initrd_name);
115 if (initramfs_load_archive(initramfs, initrd_name)) {
116 if (opt_quiet)
117 printf("Loading %s ", initrd_name);
118 free(initrd_name);
119 printf("failed: ");
120 goto bail;
123 free(initrd_name);
125 if (!opt_quiet)
126 printf("ok\n");
127 } while (*temp == ',');
130 /* This should not return... */
131 syslinux_boot_linux(kernel_data, kernel_len, initramfs, NULL, cmdline);
132 printf("Booting kernel failed: ");
134 bail:
135 free(cmdline);
136 printf("%s\n", strerror(errno));
137 return 1;