3 Copyright (C) 1999 Benjamin Herrenschmidt
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #include "partition.h"
31 extern char bootdevice[1024];
33 /* This function follows the device path in the devtree and separates
34 the device name, partition number, and other datas (mostly file name)
35 the string passed in parameters is changed since 0 are put in place
36 of some separators to terminate the various strings
40 parse_device_path(char *imagepath, char *defdevice, int defpart,
41 char *deffile, struct boot_fspec_t *result)
44 char *ipath = strdup(imagepath);
45 char *defdev = strdup(defdevice);
51 if (!strstr(defdev, "ethernet") && !strstr(defdev, "enet")) {
52 if ((ptr = strrchr(defdev, ':')) != NULL)
53 *ptr = 0; /* remove trailing : from defdevice if necessary */
59 if ((ptr = strrchr(ipath, ',')) != NULL) {
60 result->file = strdup(ptr+1);
61 /* Trim the filename off */
65 if (strstr(ipath, "ethernet") || strstr(ipath, "enet"))
66 if ((ptr = strstr(ipath, "bootp")) != NULL) { /* `n' key booting boots enet:bootp */
68 result->dev = strdup(ipath);
70 result->dev = strdup(ipath);
71 else if ((ptr = strchr(ipath, ':')) != NULL) {
73 result->dev = strdup(ipath);
75 result->part = simple_strtol(ptr+1, NULL, 10);
76 } else if (strlen(ipath)) {
77 result->file = strdup(ipath);
84 result->dev = strdup(defdev);
87 result->part = defpart;
90 result->file = strdup(deffile);
97 file_block_open( struct boot_file_t* file,
99 const char* file_name,
102 struct partition_t* parts;
103 struct partition_t* p;
104 struct partition_t* found;
106 parts = partitions_lookup(dev_name);
111 prom_printf("partitions:\n");
113 prom_printf("no partitions found.\n");
115 for (p = parts; p && !found; p=p->next) {
116 DEBUG_F("number: %02d, start: 0x%08lx, length: 0x%08lx\n",
117 p->part_number, p->part_start, p->part_size );
118 if (partition == -1) {
119 file->fs = fs_open( file, dev_name, p, file_name );
120 if (file->fs != NULL)
123 if ((partition >= 0) && (partition == p->part_number))
127 prom_printf(" (match)\n");
131 /* Note: we don't skip when found is NULL since we can, in some
132 * cases, let OF figure out a default partition.
134 DEBUG_F( "Using OF defaults.. (found = %p)\n", found );
135 file->fs = fs_open( file, dev_name, found, file_name );
139 partitions_free(parts);
145 file_net_open( struct boot_file_t* file,
146 const char* dev_name,
147 const char* file_name)
149 file->fs = fs_of_netboot;
150 return fs_of_netboot->open(file, dev_name, NULL, file_name);
154 default_read( struct boot_file_t* file,
158 prom_printf("WARNING ! default_read called !\n");
163 default_seek( struct boot_file_t* file,
166 prom_printf("WARNING ! default_seek called !\n");
171 default_close( struct boot_file_t* file)
173 prom_printf("WARNING ! default_close called !\n");
177 static struct fs_t fs_default =
187 int open_file(const struct boot_fspec_t* spec, struct boot_file_t* file)
191 memset(file, 0, sizeof(struct boot_file_t*));
192 file->fs = &fs_default;
194 DEBUG_F("dev_path = %s\nfile_name = %s\npartition = %d\n",
195 spec->dev, spec->file, spec->part);
197 result = prom_get_devtype(spec->dev);
199 file->device_kind = result;
203 switch(file->device_kind) {
204 case FILE_DEVICE_BLOCK:
205 DEBUG_F("device is a block device\n");
206 return file_block_open(file, spec->dev, spec->file, spec->part);
207 case FILE_DEVICE_NET:
208 DEBUG_F("device is a network device\n");
209 return file_net_open(file, spec->dev, spec->file);
216 * c-file-style: "k&r"