summaryrefslogtreecommitdiff
path: root/kernel/fs/procfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs/procfs.c')
-rw-r--r--kernel/fs/procfs.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/kernel/fs/procfs.c b/kernel/fs/procfs.c
index 69022d4..bfe3aac 100644
--- a/kernel/fs/procfs.c
+++ b/kernel/fs/procfs.c
@@ -23,8 +23,7 @@ void process_close(vfs_fd_t *fd) {
int procfs_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
struct sb builder;
sb_init_buffer(&builder, buffer, len);
-
- size_t read_amount = 0;
+ sb_set_ignore(&builder, offset);
process_t *p = ready_queue;
for (; p; p = p->next) {
@@ -32,13 +31,11 @@ int procfs_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
entry.d_ino = p->pid;
ksnprintf(entry.d_name, sizeof(entry.d_name), "%u", p->pid);
- if (read_amount >= offset) {
- if (0 == sb_append_buffer(&builder, (u8 *)&entry, sizeof(entry))) {
- break;
- }
+ if (0 == sb_append_buffer(&builder, (u8 *)&entry, sizeof(entry))) {
+ break;
}
- read_amount += sizeof(struct dirent);
}
+
return sv_length(SB_TO_SV(builder));
}
@@ -70,27 +67,23 @@ int process_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) {
struct sb builder;
sb_init_buffer(&builder, buffer, len);
+ sb_set_ignore(&builder, offset);
int id = fd->inode->inode_num;
if (PROCESS_ROOT == id) {
- size_t read_amount = 0;
for (size_t i = 0; i < ARRAY_LENGTH(process_entries); i++) {
if (0 == strlen(process_entries[i].d_name)) {
continue;
}
- if (read_amount >= offset) {
- if (0 == sb_append_buffer(&builder, (u8 *)&process_entries[i],
- sizeof(struct dirent))) {
- break;
- }
+ if (0 == sb_append_buffer(&builder, (u8 *)&process_entries[i],
+ sizeof(struct dirent))) {
+ break;
}
- read_amount += sizeof(struct dirent);
}
return sv_length(SB_TO_SV(builder));
}
if (PROCESS_NAME == id) {
struct sv program_name = C_TO_SV(p->program_name);
- sv_take(program_name, &program_name, offset);
sb_append_sv(&builder, program_name);
return sv_length(SB_TO_SV(builder));
}