Initial revision
[etherboot.git] / contrib / auto-default / main.c.patch
1 --- main.c      Mon Nov  5 18:58:30 2001
2 +++ main.c.new  Thu Nov 15 01:45:12 2001
3 @@ -149,21 +151,49 @@
4  static unsigned short ipchksum(unsigned short *ip, int len);
5  static unsigned short udpchksum(struct iphdr *packet);
6  
7 +
8 +#if defined(ASK_BOOT) && ASK_BOOT > 0 && (ANS_DEFAULT == ANS_AUTO)
9 +/*
10 + * Read Installed Hard Disk Count from BIOS memory at 0:0475
11 + */
12 +static int hdsk_cnt(void)
13 +{
14 +       int retv;
15 +       __asm__ __volatile__(
16 +       "xorw %%ax,%%ax\n\t"
17 +       "movb 0x475,%%al\n"
18 +       : "=a" (retv)
19 +       : /* no inputs */
20 +       : "ax", "cc", "memory"
21 +       );
22 +       return(retv);
23 +}
24 +#endif /* ASK_BOOT && ANS_AUTO */
25 +
26 +
27  static inline void ask_boot(void)
28  {
29  #if defined(ASK_BOOT) && ASK_BOOT > 0
30         while(1) {
31 -               int c;
32 +               int c, deflt;
33                 unsigned long time;
34 +#if defined(ASK_BOOT) && ASK_BOOT > 0 && (ANS_DEFAULT == ANS_AUTO)
35 +               if (hdsk_cnt() != 0)
36 +                       deflt = ANS_LOCAL;
37 +               else
38 +                       deflt = ANS_NETWORK;
39 +#else
40 +               deflt = ANS_DEFAULT;
41 +#endif
42                 printf(ASK_PROMPT);
43                 for (time = currticks() + ASK_BOOT*TICKS_PER_SEC; !iskey(); )
44                         if (currticks() > time) {
45 -                               c = ANS_DEFAULT;
46 +                               c = deflt;
47                                 goto done;
48                         }
49                 c = getchar();
50                 if ((c >= 'a') && (c <= 'z')) c &= 0x5F;
51 -               if (c == '\n') c = ANS_DEFAULT;
52 +               if (c == '\n') c = deflt;
53  done:
54                 if ((c >= ' ') && (c <= '~')) putchar(c);
55                 putchar('\n');