1 /*
2 * Copyright 2005, ?.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6
7 #include <boot/FileMapDisk.h>
8 #include <boot_item.h>
9
10 #include <new>
11
12 #include <endian.h>
13 #include <stdio.h>
14 #include <string.h>
15
16 #include <OS.h>
17 #include <SupportDefs.h>
18
19
20 //#define TRACE_FILEMAPDISK
21 #ifdef TRACE_FILEMAPDISK
22 # define TRACE(x) dprintf x
23 #else
24 # define TRACE(x) ;
25 #endif
26
27
28 using std::nothrow;
29
30
31 // constructor
FileMapDisk()32 FileMapDisk::FileMapDisk()
33 :
34 fNode(NULL)
35 {
36 }
37
38 // destructor
~FileMapDisk()39 FileMapDisk::~FileMapDisk()
40 {
41 }
42
43 // Init
44 status_t
Init(Node * node)45 FileMapDisk::Init(Node *node/*, Partition *partition, FileMap *map, off_t imageSize*/)
46 {
47 TRACE(("FileMapDisk::FileMapDisk(%p)\n", node));
48 fNode = node;
49 /*
50 fPartition = partition;
51 fMap = map;
52 fImageSize = imageSize;
53
54 // create and bind socket
55 fSocket = new(nothrow) UDPSocket;
56 if (!fSocket)
57 return B_NO_MEMORY;
58
59 status_t error = fSocket->Bind(INADDR_ANY, 6666);
60 if (error != B_OK)
61 return error;
62 */
63
64 return B_OK;
65 }
66
67
68 status_t
Open(void ** _cookie,int mode)69 FileMapDisk::Open(void **_cookie, int mode)
70 {
71 TRACE(("FileMapDisk::Open(, 0x%08x)\n", mode));
72 if (fNode == NULL)
73 return B_NO_INIT;
74
75 return fNode->Open(_cookie, mode);
76 }
77
78
79 status_t
Close(void * cookie)80 FileMapDisk::Close(void *cookie)
81 {
82 TRACE(("FileMapDisk::Close(%p)\n", cookie));
83 if (fNode == NULL)
84 return B_NO_INIT;
85
86 return fNode->Close(cookie);
87 }
88
89
90 // ReadAt
91 ssize_t
ReadAt(void * cookie,off_t pos,void * _buffer,size_t bufferSize)92 FileMapDisk::ReadAt(void *cookie, off_t pos, void *_buffer,
93 size_t bufferSize)
94 {
95 TRACE(("FileMapDisk::ReadAt(%p, %lld, , %ld)\n", cookie, pos, bufferSize));
96 if (fNode == NULL)
97 return B_NO_INIT;
98
99 return fNode->ReadAt(cookie, pos, _buffer, bufferSize);
100 }
101
102
103 // WriteAt
104 ssize_t
WriteAt(void *,off_t pos,const void * buffer,size_t bufferSize)105 FileMapDisk::WriteAt(void */*cookie*/, off_t pos, const void *buffer,
106 size_t bufferSize)
107 {
108 // Not needed in the boot loader.
109 return B_PERMISSION_DENIED;
110 }
111
112 // GetName
113 status_t
GetName(char * nameBuffer,size_t bufferSize) const114 FileMapDisk::GetName(char *nameBuffer, size_t bufferSize) const
115 {
116 const char *prefix = "FileMapDisk:";
117 if (nameBuffer == NULL)
118 return B_BAD_VALUE;
119
120 strlcpy(nameBuffer, prefix, bufferSize);
121 if (bufferSize > strlen(prefix) && fNode)
122 return fNode->GetName(nameBuffer + strlen(prefix),
123 bufferSize - strlen(prefix));
124
125 return B_OK;
126 }
127
128
129 status_t
GetFileMap(struct file_map_run * runs,int32 * count)130 FileMapDisk::GetFileMap(struct file_map_run *runs, int32 *count)
131 {
132 return fNode->GetFileMap(runs, count);
133 }
134
135
136 off_t
Size() const137 FileMapDisk::Size() const
138 {
139 if (fNode == NULL)
140 return B_NO_INIT;
141 return fNode->Size();
142 }
143
144
145 FileMapDisk *
FindAnyFileMapDisk(Directory * volume)146 FileMapDisk::FindAnyFileMapDisk(Directory *volume)
147 {
148 TRACE(("FileMapDisk::FindAnyFileMapDisk(%p)\n", volume));
149 Node *node;
150 status_t error;
151
152 if (volume == NULL)
153 return NULL;
154
155 //XXX: check lower/mixed case as well
156 Node *dirnode;
157 Directory *dir;
158 dirnode = volume->Lookup(FMAP_FOLDER_NAME, true);
159 if (dirnode == NULL || !S_ISDIR(dirnode->Type()))
160 return NULL;
161 dir = (Directory *)dirnode;
162 node = dir->Lookup(FMAP_IMAGE_NAME, true);
163 if (node == NULL)
164 return NULL;
165
166 // create a FileMapDisk object
167 FileMapDisk *disk = new(nothrow) FileMapDisk;
168 if (disk != NULL) {
169 error = disk->Init(node);
170 if (error != B_OK) {
171 delete disk;
172 disk = NULL;
173 }
174 }
175
176 return disk;
177 }
178
179
180 status_t
RegisterFileMapBootItem()181 FileMapDisk::RegisterFileMapBootItem()
182 {
183 return B_ERROR;
184 #if 0
185 struct file_map_boot_item *item;
186 item = (struct file_map_boot_item *)malloc(sizeof(struct file_map_boot_item));
187 item->num_runs = FMAP_MAX_RUNS;
188 status_t err;
189 err = GetFileMap(item->runs, &item->num_runs);
190 if (err < B_OK)
191 return err;
192 // err = add_boot_item("file_map_disk", item, sizeof(struct file_map_boot_item));
193 err = B_ERROR;
194 return err;
195 #endif
196 }
197