Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / board / hymod / fetch.c
1 /*
2  * (C) Copyright 2001
3  * Murray Jensen, CSIRO-MIT, <Murray.Jensen@csiro.au>
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9 #include <net.h>
10
11 /* imports from input.c */
12 extern int hymod_get_ethaddr (void);
13
14 int
15 fetch_and_parse (char *fn, ulong addr, int (*cback)(uchar *, uchar *))
16 {
17         char *ethaddr;
18         uchar *fp, *efp;
19         int rc, count = 0;
20
21         while ((ethaddr = getenv ("ethaddr")) == NULL || *ethaddr == '\0') {
22
23                 printf ("*** Ethernet address is%s not set\n",
24                         count == 0 ? "" : " STILL");
25
26                 if ((rc = hymod_get_ethaddr ()) < 0) {
27                         if (rc == -1)
28                                 puts ("\n*** interrupted!");
29                         else
30                                 puts ("\n*** timeout!");
31                         printf (" - fetch of '%s' aborted\n", fn);
32                         return (0);
33                 }
34
35                 count++;
36         }
37
38         copy_filename (BootFile, fn, sizeof (BootFile));
39         load_addr = addr;
40         NetBootFileXferSize = 0;
41
42         if (NetLoop(TFTPGET) == 0) {
43                 printf ("tftp transfer of file '%s' failed\n", fn);
44                 return (0);
45         }
46
47         if (NetBootFileXferSize == 0) {
48                 printf ("can't determine size of file '%s'\n", fn);
49                 return (0);
50         }
51
52         fp = (uchar *)load_addr;
53         efp = fp + NetBootFileXferSize;
54
55         do {
56                 uchar *name, *value;
57
58                 if (*fp == '#' || *fp == '\n') {
59                         /* skip this line */
60                         while (fp < efp && *fp++ != '\n')
61                                 ;
62                         continue;
63                 }
64
65                 name = fp;
66
67                 while (fp < efp && *fp != '=' && *fp != '\n')
68                         fp++;
69                 if (fp >= efp)
70                         break;
71                 if (*fp == '\n') {
72                         fp++;
73                         continue;
74                 }
75                 *fp++ = '\0';
76
77                 value = fp;
78
79                 while (fp < efp && *fp != '\n')
80                         fp++;
81                 if (fp[-1] == '\r')
82                         fp[-1] = '\0';
83                 *fp++ = '\0';   /* ok if we go off the end here */
84
85                 if ((*cback)(name, value) == 0)
86                         return (0);
87
88         } while (fp < efp);
89
90         return (1);
91 }