blob: da9373ffb0f4281dc53f6d4d1d86c964f2ddce53 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
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 */
12extern int hymod_get_ethaddr (void);
13
14int
15fetch_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}