The Pedigree Project 0.1
RawFsDir.cc
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include "RawFsDir.h"
21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/processor/types.h"
23
24#include "RawFs.h"
25#include "RawFsFile.h"
26#include "modules/system/vfs/File.h"
27
28class Filesystem;
29
30RawFsDir::RawFsDir(String name, RawFs* pFs, File* pParent)
31 : Directory(name, 0 /* Accessed time */, 0 /* Modified time */, 0 /* Creation time */,
32 0 /* Inode number */, static_cast<Filesystem*>(pFs), 0 /* Size */, pParent) {
33 // RW for root, readable only by others.
34 uint32_t permissions = FILE_UR | FILE_UW | FILE_UX | FILE_GR | FILE_GX | FILE_OR | FILE_OX;
35 setPermissions(permissions);
36}
37
38void RawFsDir::addEntry(File* pEntry) {
39 addDirectoryEntry(pEntry->getName(), pEntry);
40}
41
44 NOTICE("rawfs: removing '" << getName() << "'");
46}
47
48bool RawFsDir::syncFiles(bool terminal) {
49 struct Context {
50 RawFsDir* directory;
51 bool terminal;
52 bool succeeded;
53 } context = {this, terminal, true};
54 auto syncChild = [](void* opaque, const DirectoryEntryView& entry) -> bool {
55 auto* context = static_cast<Context*>(opaque);
56 ChildLease child;
57 if (context->directory->lookupChild(HashedStringView(entry.name), child) !=
58 LookupStatus::Found) {
59 context->succeeded = false;
60 return true;
61 }
62 const bool synced = child.get()->isDirectory()
63 ? static_cast<RawFsDir*>(child.get())->syncFiles(context->terminal)
64 : context->terminal ? static_cast<RawFsFile*>(child.get())->shutdown()
65 : child.get()->sync();
66 context->succeeded = synced && context->succeeded;
67 return true;
68 };
69 uint64_t cookie = 2; // Skip the synthetic self and parent entries.
70 const ReadStatus result = enumerate(cookie, syncChild, &context);
71 return result == ReadStatus::Complete && context.succeeded;
72}
ReadStatus enumerate(uint64_t &cookie, DirectoryEntryEmitter emitter, void *context)
Definition Directory.cc:218
bool addDirectoryEntry(const String &name, File *pTarget)
Definition Directory.cc:817
virtual bool isDirectory()
Definition Directory.h:171
Definition File.h:74
String getName() const
Definition File.cc:699
RawFsDir(const RawFsDir &file)
void removeRecursive()
Definition RawFsDir.cc:42
void addEntry(File *pEntry)
Definition RawFsDir.cc:38
virtual bool sync()
Definition RawFsFile.cc:56
Definition RawFs.h:33