1f4f33ea0SBaptiste Daroussin /* Copyright (C) 1995 Florian La Roche */
2f4f33ea0SBaptiste Daroussin /* Who wants to help coding? I don't like doing this... */
3f4f33ea0SBaptiste Daroussin
4f4f33ea0SBaptiste Daroussin /* You can just start setup as normal user and see how far it is coded
5*a96ef450SBaptiste Daroussin right now. This will do a fake installation and won't actually change
6f4f33ea0SBaptiste Daroussin any data on your computer. */
7f4f33ea0SBaptiste Daroussin
8f4f33ea0SBaptiste Daroussin /* TODO: write a good package selection code
9f4f33ea0SBaptiste Daroussin change functions to return better error code
10f4f33ea0SBaptiste Daroussin */
11f4f33ea0SBaptiste Daroussin
12f4f33ea0SBaptiste Daroussin /* Show an extra text-box with the contents of all external commands,
13f4f33ea0SBaptiste Daroussin before they are executed. So you can abort the installation, if any
14f4f33ea0SBaptiste Daroussin wrong commands are to be executed. (So don't format wrong partition.) */
15f4f33ea0SBaptiste Daroussin #define VERBOSE 1
16f4f33ea0SBaptiste Daroussin
17f4f33ea0SBaptiste Daroussin /* If defined, don't actually execute any comands and don't actually modify
18f4f33ea0SBaptiste Daroussin any files. So you can test any possible installation without doing any
19f4f33ea0SBaptiste Daroussin damage to your computer.
20f4f33ea0SBaptiste Daroussin The file FDISK.TEST is used instead of real "fdisk -l" output, so that
21f4f33ea0SBaptiste Daroussin it can be started as normal user. */
22f4f33ea0SBaptiste Daroussin #define DEBUG_THIS 1
23f4f33ea0SBaptiste Daroussin
24f4f33ea0SBaptiste Daroussin #include <dialog.h>
25f4f33ea0SBaptiste Daroussin
26f4f33ea0SBaptiste Daroussin /* max length of a partition name like e.g. '/dev/hda1' */
27f4f33ea0SBaptiste Daroussin #define MAX_DEV_NAME 25
28f4f33ea0SBaptiste Daroussin
29f4f33ea0SBaptiste Daroussin /* max number of possible Linux/Swap/MsDos partitions */
30f4f33ea0SBaptiste Daroussin #define MAX_PARTS 20
31f4f33ea0SBaptiste Daroussin
32f4f33ea0SBaptiste Daroussin char *progname = NULL;
33f4f33ea0SBaptiste Daroussin
34f4f33ea0SBaptiste Daroussin static void
error(const char * s)35f4f33ea0SBaptiste Daroussin error(const char *s)
36f4f33ea0SBaptiste Daroussin {
37f4f33ea0SBaptiste Daroussin fprintf(stderr, "%s: %s\n", progname, s);
38f4f33ea0SBaptiste Daroussin exit(1);
39f4f33ea0SBaptiste Daroussin }
40f4f33ea0SBaptiste Daroussin
41f4f33ea0SBaptiste Daroussin static int
my_system(const char * s,...)42f4f33ea0SBaptiste Daroussin my_system(const char *s,...)
43f4f33ea0SBaptiste Daroussin {
44f4f33ea0SBaptiste Daroussin int ret, i;
45f4f33ea0SBaptiste Daroussin va_list ap;
46f4f33ea0SBaptiste Daroussin char sh[200];
47f4f33ea0SBaptiste Daroussin
48f4f33ea0SBaptiste Daroussin va_start(ap, s);
49f4f33ea0SBaptiste Daroussin vsprintf(sh, s, ap);
50f4f33ea0SBaptiste Daroussin va_end(ap);
51f4f33ea0SBaptiste Daroussin
52f4f33ea0SBaptiste Daroussin #ifdef VERBOSE
53f4f33ea0SBaptiste Daroussin i = dialog_msgbox("I will run the following command:", sh, 10, 65, 1);
54f4f33ea0SBaptiste Daroussin dialog_clear();
55f4f33ea0SBaptiste Daroussin #ifdef DEBUG_THIS
56f4f33ea0SBaptiste Daroussin return 0;
57f4f33ea0SBaptiste Daroussin #endif
58f4f33ea0SBaptiste Daroussin #endif
59f4f33ea0SBaptiste Daroussin ret = system(sh);
60f4f33ea0SBaptiste Daroussin if (!(ret >> 8))
61f4f33ea0SBaptiste Daroussin return 0;
62f4f33ea0SBaptiste Daroussin i = dialog_msgbox("Error-Exit on the following command:",
63f4f33ea0SBaptiste Daroussin sh, 12, 73, 1);
64f4f33ea0SBaptiste Daroussin dialog_clear();
65f4f33ea0SBaptiste Daroussin return 1;
66f4f33ea0SBaptiste Daroussin }
67f4f33ea0SBaptiste Daroussin
68f4f33ea0SBaptiste Daroussin /* We support to install from DOS/Linux-partitions. */
69f4f33ea0SBaptiste Daroussin enum partition_type {
70f4f33ea0SBaptiste Daroussin MsDos,
71f4f33ea0SBaptiste Daroussin Linux,
72f4f33ea0SBaptiste Daroussin Swap
73f4f33ea0SBaptiste Daroussin };
74f4f33ea0SBaptiste Daroussin
75f4f33ea0SBaptiste Daroussin struct partition {
76f4f33ea0SBaptiste Daroussin enum partition_type type;
77f4f33ea0SBaptiste Daroussin char name[MAX_DEV_NAME];
78f4f33ea0SBaptiste Daroussin int blocks;
79f4f33ea0SBaptiste Daroussin int flag;
80f4f33ea0SBaptiste Daroussin } partitions[MAX_PARTS];
81f4f33ea0SBaptiste Daroussin int num_partition = 0;
82f4f33ea0SBaptiste Daroussin int num_linux = 0;
83f4f33ea0SBaptiste Daroussin int num_swap = 0;
84f4f33ea0SBaptiste Daroussin int num_msdos = 0;
85f4f33ea0SBaptiste Daroussin
86f4f33ea0SBaptiste Daroussin static int
get_line(char * line,int size,FILE * f)87f4f33ea0SBaptiste Daroussin get_line(char *line, int size, FILE * f)
88f4f33ea0SBaptiste Daroussin {
89f4f33ea0SBaptiste Daroussin char *ptr = line;
90f4f33ea0SBaptiste Daroussin int c;
91f4f33ea0SBaptiste Daroussin
92f4f33ea0SBaptiste Daroussin if (feof(f))
93f4f33ea0SBaptiste Daroussin return -1;
94f4f33ea0SBaptiste Daroussin while (size-- && ((c = getc(f)) != EOF) && (c != '\n'))
95f4f33ea0SBaptiste Daroussin *ptr++ = c;
96f4f33ea0SBaptiste Daroussin *ptr++ = '\0';
97f4f33ea0SBaptiste Daroussin return (int) (ptr - line);
98f4f33ea0SBaptiste Daroussin }
99f4f33ea0SBaptiste Daroussin
100f4f33ea0SBaptiste Daroussin static void
read_partitions(void)101f4f33ea0SBaptiste Daroussin read_partitions(void)
102f4f33ea0SBaptiste Daroussin {
103f4f33ea0SBaptiste Daroussin FILE *f;
104f4f33ea0SBaptiste Daroussin char line[200];
105f4f33ea0SBaptiste Daroussin int length;
106f4f33ea0SBaptiste Daroussin #ifndef DEBUG_THIS
107f4f33ea0SBaptiste Daroussin int ret = system("fdisk -l 2>/dev/null 1>/tmp/fdisk.output");
108f4f33ea0SBaptiste Daroussin if ((ret >> 8) != 0) {
109f4f33ea0SBaptiste Daroussin error("fdisk didn't run");
110f4f33ea0SBaptiste Daroussin }
111f4f33ea0SBaptiste Daroussin if ((f = fopen("/tmp/fdisk.output", "r")) == NULL)
112f4f33ea0SBaptiste Daroussin #else
113f4f33ea0SBaptiste Daroussin if ((f = fopen("FDISK.TEST", "r")) == NULL)
114f4f33ea0SBaptiste Daroussin #endif
115f4f33ea0SBaptiste Daroussin error("cannot read fdisk output");
116f4f33ea0SBaptiste Daroussin
117f4f33ea0SBaptiste Daroussin while (num_partition <= MAX_PARTS
118f4f33ea0SBaptiste Daroussin && (length = get_line(line, 200, f)) >= 0) {
119f4f33ea0SBaptiste Daroussin if (strncmp(line, "/dev/", 5) == 0) {
120f4f33ea0SBaptiste Daroussin int n = 0;
121f4f33ea0SBaptiste Daroussin char *s = line + 5;
122f4f33ea0SBaptiste Daroussin char *t = partitions[num_partition].name;
123f4f33ea0SBaptiste Daroussin strcpy(t, "/dev/");
124f4f33ea0SBaptiste Daroussin t += 5;
125f4f33ea0SBaptiste Daroussin while (n < MAX_DEV_NAME && *s != '\0'
126f4f33ea0SBaptiste Daroussin && !isspace((unsigned char) *s)) {
127f4f33ea0SBaptiste Daroussin *t++ = *s++;
128f4f33ea0SBaptiste Daroussin n++;
129f4f33ea0SBaptiste Daroussin }
130f4f33ea0SBaptiste Daroussin *t = '\0';
131f4f33ea0SBaptiste Daroussin /* Read the size of the partition. */
132f4f33ea0SBaptiste Daroussin t = line + 37;
133f4f33ea0SBaptiste Daroussin while (isspace((unsigned char) *t))
134f4f33ea0SBaptiste Daroussin t++;
135f4f33ea0SBaptiste Daroussin partitions[num_partition].blocks = atoi(t);
136f4f33ea0SBaptiste Daroussin if (strstr(line, "Linux native")) {
137f4f33ea0SBaptiste Daroussin partitions[num_partition].type = Linux;
138f4f33ea0SBaptiste Daroussin num_partition++;
139f4f33ea0SBaptiste Daroussin num_linux++;
140f4f33ea0SBaptiste Daroussin } else if (strstr(line, "Linux swap")) {
141f4f33ea0SBaptiste Daroussin partitions[num_partition].type = Swap;
142f4f33ea0SBaptiste Daroussin num_partition++;
143f4f33ea0SBaptiste Daroussin num_swap++;
144f4f33ea0SBaptiste Daroussin } else if (strstr(line, "DOS")) {
145f4f33ea0SBaptiste Daroussin partitions[num_partition].type = MsDos;
146f4f33ea0SBaptiste Daroussin num_partition++;
147f4f33ea0SBaptiste Daroussin num_msdos++;
148f4f33ea0SBaptiste Daroussin }
149f4f33ea0SBaptiste Daroussin }
150f4f33ea0SBaptiste Daroussin }
151f4f33ea0SBaptiste Daroussin fclose(f);
152f4f33ea0SBaptiste Daroussin #ifndef DEBUG_THIS
153f4f33ea0SBaptiste Daroussin unlink("/tmp/fdisk.output");
154f4f33ea0SBaptiste Daroussin #endif
155f4f33ea0SBaptiste Daroussin }
156f4f33ea0SBaptiste Daroussin
157f4f33ea0SBaptiste Daroussin static int
select_partition(const char * title,const char * prompt,int y,int x)158f4f33ea0SBaptiste Daroussin select_partition(const char *title, const char *prompt, int y, int x)
159f4f33ea0SBaptiste Daroussin {
160f4f33ea0SBaptiste Daroussin int i, num, ret;
161f4f33ea0SBaptiste Daroussin char info[MAX_PARTS][40];
162f4f33ea0SBaptiste Daroussin char *items[MAX_PARTS * 2];
163f4f33ea0SBaptiste Daroussin int num_pa[MAX_PARTS];
164f4f33ea0SBaptiste Daroussin
165f4f33ea0SBaptiste Daroussin num = 0;
166f4f33ea0SBaptiste Daroussin for (i = 0; i < num_partition; i++) {
167f4f33ea0SBaptiste Daroussin if (partitions[i].type == Linux) {
168f4f33ea0SBaptiste Daroussin items[num * 2] = partitions[i].name;
169f4f33ea0SBaptiste Daroussin sprintf(info[num], "Linux partition with %d blocks",
170f4f33ea0SBaptiste Daroussin partitions[i].blocks);
171f4f33ea0SBaptiste Daroussin items[num * 2 + 1] = info[num];
172f4f33ea0SBaptiste Daroussin num_pa[num] = i;
173f4f33ea0SBaptiste Daroussin num++;
174f4f33ea0SBaptiste Daroussin }
175f4f33ea0SBaptiste Daroussin }
176f4f33ea0SBaptiste Daroussin ret = dialog_menu(title, prompt, y + num, x, num, num, items);
177f4f33ea0SBaptiste Daroussin dialog_clear();
178f4f33ea0SBaptiste Daroussin if (ret >= 0) /* item selected */
179f4f33ea0SBaptiste Daroussin ret = num_pa[ret];
180f4f33ea0SBaptiste Daroussin return ret;
181f4f33ea0SBaptiste Daroussin }
182f4f33ea0SBaptiste Daroussin
183f4f33ea0SBaptiste Daroussin static int
select_install_partition(void)184f4f33ea0SBaptiste Daroussin select_install_partition(void)
185f4f33ea0SBaptiste Daroussin {
186f4f33ea0SBaptiste Daroussin return select_partition("Select Install Partition",
187f4f33ea0SBaptiste Daroussin "\\nWhere do you want to install Linux?\\n", 9, 60);
188f4f33ea0SBaptiste Daroussin }
189f4f33ea0SBaptiste Daroussin
190f4f33ea0SBaptiste Daroussin static int
select_source_partition(void)191f4f33ea0SBaptiste Daroussin select_source_partition(void)
192f4f33ea0SBaptiste Daroussin {
193f4f33ea0SBaptiste Daroussin return select_partition("Select Source Partition",
194f4f33ea0SBaptiste Daroussin "\\nOn which partition is the source?\\n", 9, 60);
195f4f33ea0SBaptiste Daroussin }
196f4f33ea0SBaptiste Daroussin
197f4f33ea0SBaptiste Daroussin const char *null = ">/dev/null 2>/dev/null";
198f4f33ea0SBaptiste Daroussin const char *install_partition = NULL;
199f4f33ea0SBaptiste Daroussin
200f4f33ea0SBaptiste Daroussin static void
extract_packages(const char * source_path)201f4f33ea0SBaptiste Daroussin extract_packages(const char *source_path)
202f4f33ea0SBaptiste Daroussin {
203f4f33ea0SBaptiste Daroussin #ifndef DEBUG_THIS
204f4f33ea0SBaptiste Daroussin FILE *f;
205f4f33ea0SBaptiste Daroussin #endif
206f4f33ea0SBaptiste Daroussin
207f4f33ea0SBaptiste Daroussin if (my_system("mkdir -p /install/var/installed/packages %s", null))
208f4f33ea0SBaptiste Daroussin return;
209f4f33ea0SBaptiste Daroussin if (my_system("cd /install; for i in /source%s/*.tgz; do "
210f4f33ea0SBaptiste Daroussin "tar xzplvvkf $i >> var/installed/packages/base "
211f4f33ea0SBaptiste Daroussin "2>>var/installed/packages/ERROR; done", source_path))
212f4f33ea0SBaptiste Daroussin return;
213f4f33ea0SBaptiste Daroussin #ifndef DEBUG_THIS
214f4f33ea0SBaptiste Daroussin if ((f = fopen("/install/etc/fstab", "w")) == NULL) {
215f4f33ea0SBaptiste Daroussin /* i = */ dialog_msgbox("Error", "Cannot write /etc/fstab",
216f4f33ea0SBaptiste Daroussin 12, 40, 1);
217f4f33ea0SBaptiste Daroussin return;
218f4f33ea0SBaptiste Daroussin }
219f4f33ea0SBaptiste Daroussin fprintf(f, "%s / ext2 defaults 1 1\n", install_partition);
220f4f33ea0SBaptiste Daroussin fprintf(f, "none /proc proc defaults 0 2\n");
221f4f33ea0SBaptiste Daroussin /* XXX write swap-partitions */
222f4f33ea0SBaptiste Daroussin fclose(f);
223f4f33ea0SBaptiste Daroussin #endif
224f4f33ea0SBaptiste Daroussin }
225f4f33ea0SBaptiste Daroussin
226f4f33ea0SBaptiste Daroussin static void
install_premounted(void)227f4f33ea0SBaptiste Daroussin install_premounted(void)
228f4f33ea0SBaptiste Daroussin {
229f4f33ea0SBaptiste Daroussin extract_packages("");
230f4f33ea0SBaptiste Daroussin }
231f4f33ea0SBaptiste Daroussin
232f4f33ea0SBaptiste Daroussin static void
install_harddisk(void)233f4f33ea0SBaptiste Daroussin install_harddisk(void)
234f4f33ea0SBaptiste Daroussin {
235f4f33ea0SBaptiste Daroussin const char *name;
236f4f33ea0SBaptiste Daroussin int part, ret;
237f4f33ea0SBaptiste Daroussin
238f4f33ea0SBaptiste Daroussin if ((part = select_source_partition()) <= -1)
239f4f33ea0SBaptiste Daroussin return;
240f4f33ea0SBaptiste Daroussin name = partitions[part].name;
241f4f33ea0SBaptiste Daroussin
242f4f33ea0SBaptiste Daroussin if (my_system("mount -t ext2 %s /source %s", name, null))
243f4f33ea0SBaptiste Daroussin return;
244f4f33ea0SBaptiste Daroussin ret = dialog_inputbox("Path in partition",
245f4f33ea0SBaptiste Daroussin "Please enter the directory in which the "
246f4f33ea0SBaptiste Daroussin "source files are.", 13, 50, "", FALSE);
247f4f33ea0SBaptiste Daroussin dialog_clear();
248f4f33ea0SBaptiste Daroussin if (ret != 0)
249f4f33ea0SBaptiste Daroussin return;
250f4f33ea0SBaptiste Daroussin /* XXX strdup */
251f4f33ea0SBaptiste Daroussin extract_packages(strdup(dialog_input_result));
252f4f33ea0SBaptiste Daroussin if (my_system("umount /source %s", null))
253f4f33ea0SBaptiste Daroussin return;
254f4f33ea0SBaptiste Daroussin }
255f4f33ea0SBaptiste Daroussin
256f4f33ea0SBaptiste Daroussin static void
install_nfs(void)257f4f33ea0SBaptiste Daroussin install_nfs(void)
258f4f33ea0SBaptiste Daroussin {
259f4f33ea0SBaptiste Daroussin if (my_system("ifconfig eth0 134.96.81.36 netmask 255.255.255.224 "
260f4f33ea0SBaptiste Daroussin "broadcast 134.96.81.63 %s", null))
261f4f33ea0SBaptiste Daroussin return;
262f4f33ea0SBaptiste Daroussin if (my_system("route add -net 134.96.81.32 %s", null))
263f4f33ea0SBaptiste Daroussin return;
264f4f33ea0SBaptiste Daroussin if (my_system("mount -t nfs 134.96.81.38:"
265f4f33ea0SBaptiste Daroussin "/local/ftp/pub/linux/ELF.binary/tar /source %s", null))
266f4f33ea0SBaptiste Daroussin return;
267f4f33ea0SBaptiste Daroussin extract_packages("/base");
268f4f33ea0SBaptiste Daroussin if (my_system("umount /source %s", null))
269f4f33ea0SBaptiste Daroussin return;
270f4f33ea0SBaptiste Daroussin if (my_system("ifconfig eth0 down %s", null))
271f4f33ea0SBaptiste Daroussin return;
272f4f33ea0SBaptiste Daroussin }
273f4f33ea0SBaptiste Daroussin
274f4f33ea0SBaptiste Daroussin static void
main_install(void)275f4f33ea0SBaptiste Daroussin main_install(void)
276f4f33ea0SBaptiste Daroussin {
277f4f33ea0SBaptiste Daroussin int part, ret;
278f4f33ea0SBaptiste Daroussin const char *name;
279f4f33ea0SBaptiste Daroussin char *items1[] =
280f4f33ea0SBaptiste Daroussin {
281f4f33ea0SBaptiste Daroussin "1", "Harddisk Install",
282f4f33ea0SBaptiste Daroussin "2", "Network Install(NFS)",
283f4f33ea0SBaptiste Daroussin "3", "Premounted on /source"
284f4f33ea0SBaptiste Daroussin };
285f4f33ea0SBaptiste Daroussin
286f4f33ea0SBaptiste Daroussin if (num_linux == 0) {
287f4f33ea0SBaptiste Daroussin /* XXX */
288f4f33ea0SBaptiste Daroussin return;
289f4f33ea0SBaptiste Daroussin }
290f4f33ea0SBaptiste Daroussin if ((part = select_install_partition()) <= -1)
291f4f33ea0SBaptiste Daroussin return;
292f4f33ea0SBaptiste Daroussin install_partition = name = partitions[part].name;
293f4f33ea0SBaptiste Daroussin if (my_system("mke2fs %s %s", name, null))
294f4f33ea0SBaptiste Daroussin return;
295f4f33ea0SBaptiste Daroussin if (my_system("mount -t ext2 %s /install %s", name, null))
296f4f33ea0SBaptiste Daroussin return;
297f4f33ea0SBaptiste Daroussin ret = dialog_menu("Choose install medium",
298f4f33ea0SBaptiste Daroussin "\\nPlease say from where you want to install.\\n",
299f4f33ea0SBaptiste Daroussin 12, 62, 3, 3, items1);
300f4f33ea0SBaptiste Daroussin dialog_clear();
301f4f33ea0SBaptiste Daroussin switch (ret) {
302f4f33ea0SBaptiste Daroussin case 0:
303f4f33ea0SBaptiste Daroussin install_harddisk();
304f4f33ea0SBaptiste Daroussin break;
305f4f33ea0SBaptiste Daroussin case 1:
306f4f33ea0SBaptiste Daroussin install_nfs();
307f4f33ea0SBaptiste Daroussin break;
308f4f33ea0SBaptiste Daroussin case 2:
309f4f33ea0SBaptiste Daroussin install_premounted();
310f4f33ea0SBaptiste Daroussin break;
311f4f33ea0SBaptiste Daroussin case -2: /* cancel */
312f4f33ea0SBaptiste Daroussin case -1:
313f4f33ea0SBaptiste Daroussin break; /* esc */
314f4f33ea0SBaptiste Daroussin }
315f4f33ea0SBaptiste Daroussin if (my_system("umount /install %s", null))
316f4f33ea0SBaptiste Daroussin return;
317f4f33ea0SBaptiste Daroussin }
318f4f33ea0SBaptiste Daroussin
319f4f33ea0SBaptiste Daroussin int
main(int argc,char ** argv)320f4f33ea0SBaptiste Daroussin main(int argc, char **argv)
321f4f33ea0SBaptiste Daroussin {
322f4f33ea0SBaptiste Daroussin int stop = 0;
323f4f33ea0SBaptiste Daroussin int ret;
324f4f33ea0SBaptiste Daroussin char *items1[] =
325f4f33ea0SBaptiste Daroussin {
326f4f33ea0SBaptiste Daroussin "1", "Display a help text",
327f4f33ea0SBaptiste Daroussin "2", "Start an installation",
328f4f33ea0SBaptiste Daroussin "3", "Exit to the shell"
329f4f33ea0SBaptiste Daroussin };
330f4f33ea0SBaptiste Daroussin
331f4f33ea0SBaptiste Daroussin progname = argv[0];
332f4f33ea0SBaptiste Daroussin
333f4f33ea0SBaptiste Daroussin read_partitions();
334f4f33ea0SBaptiste Daroussin if (num_linux == 0) {
335f4f33ea0SBaptiste Daroussin printf("\n\nPlease start \"fdisk\" or \"cfdisk\" and create a"
336f4f33ea0SBaptiste Daroussin "\nnative Linux-partition to install Linux on.\n\n");
337f4f33ea0SBaptiste Daroussin exit(1);
338f4f33ea0SBaptiste Daroussin }
339f4f33ea0SBaptiste Daroussin
340f4f33ea0SBaptiste Daroussin init_dialog();
341f4f33ea0SBaptiste Daroussin
342f4f33ea0SBaptiste Daroussin while (!stop) {
343f4f33ea0SBaptiste Daroussin ret = dialog_menu("Linux Install Utility",
344f4f33ea0SBaptiste Daroussin "\\nCopyright (C) 1995 Florian La Roche\\n"
345f4f33ea0SBaptiste Daroussin "\\nPre-Alpha version, be careful, read the doc!!!"
346f4f33ea0SBaptiste Daroussin "\\nemail: florian@jurix.jura.uni-sb.de, "
347f4f33ea0SBaptiste Daroussin "flla@stud.uni-sb.de\\n",
348f4f33ea0SBaptiste Daroussin 15, 64, 3, 3, items1);
349f4f33ea0SBaptiste Daroussin dialog_clear();
350f4f33ea0SBaptiste Daroussin switch (ret) {
351f4f33ea0SBaptiste Daroussin case 0:
352f4f33ea0SBaptiste Daroussin ret = dialog_textbox("Help Text",
353f4f33ea0SBaptiste Daroussin "setup.help", 20, 70);
354f4f33ea0SBaptiste Daroussin dialog_clear();
355f4f33ea0SBaptiste Daroussin break;
356f4f33ea0SBaptiste Daroussin case 1:
357f4f33ea0SBaptiste Daroussin main_install();
358f4f33ea0SBaptiste Daroussin break;
359f4f33ea0SBaptiste Daroussin case 2:
360f4f33ea0SBaptiste Daroussin stop = 1;
361f4f33ea0SBaptiste Daroussin break;
362f4f33ea0SBaptiste Daroussin case -2: /* cancel */
363f4f33ea0SBaptiste Daroussin case -1:
364f4f33ea0SBaptiste Daroussin stop = 1; /* esc */
365f4f33ea0SBaptiste Daroussin }
366f4f33ea0SBaptiste Daroussin }
367f4f33ea0SBaptiste Daroussin end_dialog();
368f4f33ea0SBaptiste Daroussin printf("\nExecute \"reboot\" to restart your computer...\n");
369f4f33ea0SBaptiste Daroussin
370f4f33ea0SBaptiste Daroussin exit(0);
371f4f33ea0SBaptiste Daroussin }
372