1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:48:10 +00:00

Implement sys$getcwd properly.

Also fixed broken strcpy that didn't copy the null terminator.
This commit is contained in:
Andreas Kling 2018-10-30 00:06:31 +01:00
parent 8e640539ef
commit 0f20be05a6
5 changed files with 18 additions and 27 deletions

View file

@ -13,8 +13,7 @@ void memcpy(void *dest, const void *src, DWORD n)
void strcpy(char* dest, const char *src) void strcpy(char* dest, const char *src)
{ {
while (*src) while ((*dest++ = *src++) != '\0');
*(dest++) = *(src++);
} }
void* memset(void* dest, BYTE c, DWORD n) void* memset(void* dest, BYTE c, DWORD n)

View file

@ -233,6 +233,8 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren
InterruptDisabler disabler; InterruptDisabler disabler;
if (auto* parentTask = Task::fromPID(parentPID)) if (auto* parentTask = Task::fromPID(parentPID))
cwd = parentTask->m_cwd.copyRef(); cwd = parentTask->m_cwd.copyRef();
if (!cwd)
cwd = VirtualFileSystem::the().root();
} }
auto handle = VirtualFileSystem::the().open(path, error, 0, cwd ? cwd->inode : InodeIdentifier()); auto handle = VirtualFileSystem::the().open(path, error, 0, cwd ? cwd->inode : InodeIdentifier());
@ -260,7 +262,7 @@ Task* Task::createUserTask(const String& path, uid_t uid, gid_t gid, pid_t paren
} }
InterruptDisabler disabler; // FIXME: Get rid of this, jesus christ. This "critical" section is HUGE. InterruptDisabler disabler; // FIXME: Get rid of this, jesus christ. This "critical" section is HUGE.
Task* t = new Task(parts.takeLast(), uid, gid, parentPID, Ring3, handle->vnode()); Task* t = new Task(parts.takeLast(), uid, gid, parentPID, Ring3, move(cwd), handle->vnode());
t->m_arguments = move(taskArguments); t->m_arguments = move(taskArguments);
@ -361,13 +363,14 @@ Task* Task::createKernelTask(void (*e)(), String&& name)
return task; return task;
} }
Task::Task(String&& name, uid_t uid, gid_t gid, pid_t parentPID, RingLevel ring, RetainPtr<VirtualFileSystem::Node>&& executable) Task::Task(String&& name, uid_t uid, gid_t gid, pid_t parentPID, RingLevel ring, RetainPtr<VirtualFileSystem::Node>&& cwd, RetainPtr<VirtualFileSystem::Node>&& executable)
: m_name(move(name)) : m_name(move(name))
, m_pid(next_pid++) , m_pid(next_pid++)
, m_uid(uid) , m_uid(uid)
, m_gid(gid) , m_gid(gid)
, m_state(Runnable) , m_state(Runnable)
, m_ring(ring) , m_ring(ring)
, m_cwd(move(cwd))
, m_executable(move(executable)) , m_executable(move(executable))
, m_parentPID(parentPID) , m_parentPID(parentPID)
{ {
@ -375,12 +378,6 @@ Task::Task(String&& name, uid_t uid, gid_t gid, pid_t parentPID, RingLevel ring,
m_fileHandles.append(nullptr); // stdout m_fileHandles.append(nullptr); // stdout
m_fileHandles.append(nullptr); // stderr m_fileHandles.append(nullptr); // stderr
auto* parentTask = Task::fromPID(parentPID);
if (parentTask)
m_cwd = parentTask->m_cwd.copyRef();
else
m_cwd = nullptr;
m_nextRegion = LinearAddress(0x600000); m_nextRegion = LinearAddress(0x600000);
memset(&m_tss, 0, sizeof(m_tss)); memset(&m_tss, 0, sizeof(m_tss));
@ -833,8 +830,13 @@ int Task::sys$chdir(const char* path)
int Task::sys$getcwd(char* buffer, size_t size) int Task::sys$getcwd(char* buffer, size_t size)
{ {
// FIXME: Implement!
VALIDATE_USER_BUFFER(buffer, size); VALIDATE_USER_BUFFER(buffer, size);
auto path = VirtualFileSystem::the().absolutePath(cwdInode());
if (path.isNull())
return -EINVAL;
if (size < path.length() + 1)
return -ERANGE;
strcpy(buffer, path.characters());
return -ENOTIMPL; return -ENOTIMPL;
} }

View file

@ -141,7 +141,7 @@ private:
friend class MemoryManager; friend class MemoryManager;
friend bool scheduleNewTask(); friend bool scheduleNewTask();
Task(String&& name, uid_t, gid_t, pid_t parentPID, RingLevel, RetainPtr<VirtualFileSystem::Node>&& = nullptr); Task(String&& name, uid_t, gid_t, pid_t parentPID, RingLevel, RetainPtr<VirtualFileSystem::Node>&& cwd = nullptr, RetainPtr<VirtualFileSystem::Node>&& executable = nullptr);
void allocateLDT(); void allocateLDT();

View file

@ -164,7 +164,11 @@ int main(int, char**)
printf("failed to open /dev/keyboard :(\n"); printf("failed to open /dev/keyboard :(\n");
return 1; return 1;
} }
g->cwd = "/"; {
char cwdbuf[1024];
getcwd(cwdbuf, sizeof(cwdbuf));
g->cwd = cwdbuf;
}
prompt(); prompt();
for (;;) { for (;;) {
char keybuf[16]; char keybuf[16];
@ -173,12 +177,6 @@ int main(int, char**)
printf("failed to read :(\n"); printf("failed to read :(\n");
return 2; return 2;
} }
if (nread > 2)
printf("read %u bytes\n", nread);
if (nread > (ssize_t)sizeof(keybuf)) {
printf("read() overran the buffer i gave it!\n");
return 3;
}
for (ssize_t i = 0; i < nread; ++i) { for (ssize_t i = 0; i < nread; ++i) {
putchar(keybuf[i]); putchar(keybuf[i]);
if (keybuf[i] != '\n') { if (keybuf[i] != '\n') {

View file

@ -50,8 +50,6 @@ int FileHandle::stat(Unix::stat* buffer)
Unix::off_t FileHandle::seek(Unix::off_t offset, int whence) Unix::off_t FileHandle::seek(Unix::off_t offset, int whence)
{ {
LOCKER(VirtualFileSystem::lock());
if (!m_vnode) if (!m_vnode)
return -EBADF; return -EBADF;
@ -94,8 +92,6 @@ Unix::off_t FileHandle::seek(Unix::off_t offset, int whence)
Unix::ssize_t FileHandle::read(byte* buffer, Unix::size_t count) Unix::ssize_t FileHandle::read(byte* buffer, Unix::size_t count)
{ {
LOCKER(VirtualFileSystem::lock());
if (m_vnode->isCharacterDevice()) { if (m_vnode->isCharacterDevice()) {
// FIXME: What should happen to m_currentOffset? // FIXME: What should happen to m_currentOffset?
return m_vnode->characterDevice()->read(buffer, count); return m_vnode->characterDevice()->read(buffer, count);
@ -114,8 +110,6 @@ bool FileHandle::hasDataAvailableForRead()
ByteBuffer FileHandle::readEntireFile() ByteBuffer FileHandle::readEntireFile()
{ {
LOCKER(VirtualFileSystem::lock());
if (m_vnode->isCharacterDevice()) { if (m_vnode->isCharacterDevice()) {
auto buffer = ByteBuffer::createUninitialized(1024); auto buffer = ByteBuffer::createUninitialized(1024);
Unix::ssize_t nread = m_vnode->characterDevice()->read(buffer.pointer(), buffer.size()); Unix::ssize_t nread = m_vnode->characterDevice()->read(buffer.pointer(), buffer.size());
@ -133,8 +127,6 @@ bool FileHandle::isDirectory() const
ssize_t FileHandle::get_dir_entries(byte* buffer, Unix::size_t size) ssize_t FileHandle::get_dir_entries(byte* buffer, Unix::size_t size)
{ {
LOCKER(VirtualFileSystem::lock());
auto metadata = m_vnode->metadata(); auto metadata = m_vnode->metadata();
if (!metadata.isValid()) if (!metadata.isValid())
return -EIO; return -EIO;