annotate packages/redboot/current/src/fs/disk.c @ 182:f62680ef1804

Merge from eCos master repository on 2001-09-07-06:43:02-BST
author jlarmour
date Wed, 12 Sep 2001 00:59:17 +0000
parents 4c750ce71ae3
children d60da272beeb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
2 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
3 // disk.c
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
4 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
5 // RedBoot disk support
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
6 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
9 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
10 // -------------------------------------------
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
14 // http://www.redhat.com/
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
15 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
19 // the License.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
20 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
22 // released September 30, 1998.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
23 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
25 // Portions created by Red Hat are
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
27 // All Rights Reserved.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
28 // -------------------------------------------
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
29 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
31 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
33 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
34 // Author(s): msalter
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
35 // Contributors: msalter
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
36 // Date: 2001-07-14
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
37 // Purpose:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
38 // Description:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
39 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
40 // This code is part of RedBoot (tm).
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
41 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
42 //####DESCRIPTIONEND####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
43 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
44 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
45
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
46 #include <redboot.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
47 #include <fs/disk.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
48
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
49 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
50 #include <fs/e2fs.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
51 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
52 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
53 #include <fs/iso9660fs.h>
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
54 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
55
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
56 static void do_disks(int argc, char *argv[]);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
57
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
58 RedBoot_cmd("disks",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
59 "Display disks/partitions.",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
60 "",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
61 do_disks
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
62 );
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
63
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
64 static disk_t disk_table[CYGNUM_REDBOOT_MAX_DISKS];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
65 static int disk_count = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
66
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
67 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
68 find_dos_partitions(disk_t *d, cyg_uint8 *mbr)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
69 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
70 cyg_uint32 s, n, tmp;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
71 struct mbr_partition *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
72 int i, found = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
73
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
74 p = (struct mbr_partition *)(mbr + MBR_PTABLE_OFFSET);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
75
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
76 // Look for primary partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
77 for (i = 0; i < 4 && i < CYGNUM_REDBOOT_MAX_PARTITIONS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
78
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
79 // Have to use memcpy because of alignment
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
80 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
81 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
82 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
83 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
84
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
85 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
86 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
87 d->partitions[i].disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
88 d->partitions[i].start_sector = s;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
89 d->partitions[i].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
90 d->partitions[i].systype = p->sys_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
91 d->partitions[i].bootflag = p->boot_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
92 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
93 p++;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
94 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
95
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
96 #if CYGNUM_REDBOOT_MAX_PARTITIONS > 4
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
97 {
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
98 cyg_uint32 buf[SECTOR_SIZE/sizeof(cyg_uint32)], xoffset;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
99 cyg_uint16 magic;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
100 int nextp;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
101
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
102 // Go back through and find extended partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
103 for (i = 0, nextp = 4; i < 4 && nextp < CYGNUM_REDBOOT_MAX_PARTITIONS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
104 if (d->partitions[i].systype == SYSTYPE_EXTENDED) {
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
105 // sector offsets in partition tables are relative to start
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
106 // of extended partition.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
107 xoffset = d->partitions[i].start_sector;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
108 for ( ; nextp < CYGNUM_REDBOOT_MAX_PARTITIONS; ++nextp) {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
109
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
110 // read partition boot record (same format as mbr except
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
111 // there should only be 2 entries max: a normal partition
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
112 // and another extended partition
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
113 if (DISK_READ(d, xoffset, buf, 1) <= 0)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
114 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
115
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
116 magic = *(cyg_uint16 *)((char *)buf + MBR_MAGIC_OFFSET);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
117 if (SWAB_LE16(magic) != MBR_MAGIC)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
118 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
119
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
120 p = (struct mbr_partition *)((char *)buf + MBR_PTABLE_OFFSET);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
121
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
122 // Have to use memcpy because of alignment
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
123 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
124 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
125 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
126 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
127
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
128 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
129 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
130 d->partitions[nextp].disk = d;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
131 d->partitions[nextp].start_sector = s + xoffset;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
132 d->partitions[nextp].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
133 d->partitions[nextp].systype = p->sys_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
134 d->partitions[nextp].bootflag = p->boot_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
135 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
136 ++p;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
137
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
138 memcpy(&tmp, p->start_sect, 4);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
139 s = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
140 memcpy(&tmp, p->nr_sects, 4);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
141 n = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
142
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
143 // more extended partitions?
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
144 if (p->sys_ind != SYSTYPE_EXTENDED || !s || !n)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
145 break;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
146
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
147 xoffset += s;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
148 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
149 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
150 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
151 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
152 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
153 return found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
154 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
155
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
156
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
157 // Find partitions on given disk.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
158 // Return number of partitions found
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
159 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
160 find_partitions(disk_t *d)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
161 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
162 cyg_uint32 buf[SECTOR_SIZE/sizeof(cyg_uint32)];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
163 cyg_uint16 magic;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
164 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
165 int i, found = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
166
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
167
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
168 if (d->kind == DISK_IDE_CDROM) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
169 // no partition table, so fake it
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
170 p = d->partitions;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
171 p->disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
172 p->start_sector = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
173 p->nr_sectors = d->nr_sectors;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
174 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
175 p->funs = &redboot_iso9660fs_funs;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
176 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
177 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
178 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
179
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
180 // read Master Boot Record
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
181 if (DISK_READ(d, 0, buf, 1) <= 0)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
182 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
183
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
184 // Check for DOS MBR
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
185 magic = *(cyg_uint16 *)((char *)buf + MBR_MAGIC_OFFSET);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
186 if (SWAB_LE16(magic) == MBR_MAGIC) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
187 found = find_dos_partitions(d, (cyg_uint8 *)buf);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
188 } else {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
189 // Might want to handle other MBR types, here...
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
190 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
191
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
192 // Now go through all partitions and install the correct
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
193 // funcs for supported filesystems.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
194 for (i = 0, p = d->partitions; i < CYGNUM_REDBOOT_MAX_PARTITIONS; i++, p++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
195 switch (p->systype) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
196 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
197 case SYSTYPE_LINUX:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
198 p->funs = &redboot_e2fs_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
199 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
200 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
201 #ifdef CYGSEM_REDBOOT_DISK_FAT16
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
202 case SYSTYPE_FAT16:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
203 p->funs = &redboot_fat16_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
204 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
205 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
206 #ifdef CYGSEM_REDBOOT_DISK_FAT32
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
207 case SYSTYPE_FAT32:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
208 p->funs = &redboot_fat32_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
209 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
210 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
211 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
212 break; // ignore unsupported filesystems
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
213 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
214 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
215
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
216 return found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
217 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
218
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
219 // Add a disk to the disk table.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
220 // Return zero if no more room in table.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
221 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
222 disk_register(disk_t *d)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
223 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
224 int i;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
225
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
226 // make sure we have room for it
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
227 if (disk_count >= CYGNUM_REDBOOT_MAX_DISKS)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
228 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
229
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
230 // Set the index
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
231 d->index = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
232 for (i = 0; i < disk_count; i++)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
233 if (disk_table[i].kind == d->kind)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
234 d->index++;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
235
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
236 // put it in the table
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
237 disk_table[disk_count] = *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
238
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
239 // fill in partition info
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
240 find_partitions(&disk_table[disk_count++]);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
241
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
242 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
243 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
244
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
245 // Convert a filename in the form <partition_name>:<filename> into
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
246 // a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
247 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
248 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
249 disk_parse_filename(const char *name, partition_t **part, const char **path)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
250 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
251 int i, kind, index, pindex;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
252
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
253 kind = index = pindex = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
254
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
255 if (name[0] == 'h' && name[1] == 'd') {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
256 // IDE hard drives
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
257 kind = DISK_IDE_HD;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
258 if (name[2] < 'a' || name[2] > 'z')
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
259 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
260 index = name[2] - 'a';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
261 if (name[3] < '1' || name[3] >= ('1' + CYGNUM_REDBOOT_MAX_PARTITIONS))
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
262 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
263 pindex = name[3] - '1';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
264 if (name[4] != ':')
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
265 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
266 *path = &name[5];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
267 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
268
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
269 if (kind) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
270 for (i = 0; i < CYGNUM_REDBOOT_MAX_DISKS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
271 if (disk_table[i].kind == kind && disk_table[i].index == index) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
272 *part = &disk_table[i].partitions[pindex];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
273 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
274 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
275 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
276 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
277 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
278 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
279
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
280 static const struct {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
281 int kind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
282 const char *str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
283 } systype_names[] = {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
284 { SYSTYPE_FAT12, "FAT12" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
285 { SYSTYPE_FAT16_32M, "FAT16 <32M" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
286 { SYSTYPE_FAT16, "FAT16" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
287 { SYSTYPE_EXTENDED, "Extended" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
288 { SYSTYPE_LINUX_SWAP, "Linux Swap" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
289 { SYSTYPE_LINUX, "Linux" }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
290 };
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
291
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
292 static const char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
293 systype_name(int systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
294 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
295 int i;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
296
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
297 for (i = 0; i < sizeof(systype_names)/sizeof(systype_names[0]); i++)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
298 if (systype_names[i].kind == systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
299 return systype_names[i].str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
300 return "Unknown";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
301 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
302
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
303 // List disk partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
304 static void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
305 do_disks(int argc, char *argv[])
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
306 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
307 int i, j;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
308 disk_t *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
309 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
310 char name[16];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
311
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
312 for (i = 0, d = disk_table; i < disk_count; i++, d++) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
313 switch (d->kind) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
314 case DISK_IDE_HD:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
315 for (j = 0, p = d->partitions;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
316 j < CYGNUM_REDBOOT_MAX_PARTITIONS;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
317 j++, p++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
318 if (p->systype) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
319 diag_sprintf(name, "hd%c%d", 'a' + d->index, j+1);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
320 diag_printf("%-8s %s\n", name, systype_name(p->systype));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
321 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
322 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
323 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
324 case DISK_IDE_CDROM:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
325 diag_sprintf(name, "cd%d", d->index);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
326 diag_printf("%-8s ISO9660\n", name);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
327 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
328 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
329 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
330 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
331
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
332 static void *fileptr;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
333 static partition_t *file_part;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
334
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
335 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
336 disk_stream_open(char *filename, int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
337 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
338 const char *filepath;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
339
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
340 // The filename is in <disk>:<path> format.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
341 // Convert to a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
342 if (!disk_parse_filename(filename, &file_part, &filepath)) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
343 *err = diskerr_badname;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
344 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
345 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
346
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
347 if (file_part->systype == 0 || file_part->funs == (fs_funs_t *)0) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
348 *err = diskerr_partition;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
349 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
350 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
351
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
352 fileptr = (file_part->funs->open)(file_part, filepath);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
353 if (fileptr == NULL) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
354 *err = diskerr_open;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
355 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
356 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
357 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
358 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
359
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
360 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
361 disk_stream_read(char *buf, int size, int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
362 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
363 int nread;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
364
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
365 if ((nread = (file_part->funs->read)(fileptr, buf, size)) != size) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
366 *err = diskerr_read;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
367 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
368 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
369 return nread;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
370 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
371
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
372 externC void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
373 disk_stream_close(int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
374 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
375 fileptr = NULL;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
376 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
377
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
378 externC char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
379 disk_error(int err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
380 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
381 switch (err) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
382 case diskerr_badname:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
383 return "Bad filename";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
384 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
385 case diskerr_partition:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
386 return "Unsupported filesystem";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
387 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
388 case diskerr_open:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
389 return "Can't open file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
390 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
391 case diskerr_read:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
392 return "Can't read file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
393 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
394 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
395 return "Unknown error";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
396 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
397 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
398 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
399