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