kernel: add _sys_getprocfs in place of HANDLE_PROCFS
This makes the side-effects more explicit, and feels less hacky than `HANDLE_PROCFS`. I don't think accessing a handle alone should have side-effects, even if it's a "special" one.
This commit is contained in:
parent
cf7877737f
commit
6cbe587977
|
@ -1,10 +1,11 @@
|
|||
#include <_proc.h>
|
||||
#include <camellia.h>
|
||||
#include <camellia/flags.h>
|
||||
#include <camellia/fs/misc.h>
|
||||
#include <camellia/syscalls.h>
|
||||
#include <elfload.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <elfload.h>
|
||||
#include <camellia/fs/misc.h>
|
||||
|
||||
#include "tar.h"
|
||||
|
||||
|
@ -17,7 +18,7 @@ int main(void) {
|
|||
_sys_memflag(_psdata_loc, 1, MEMFLAG_PRESENT);
|
||||
setprogname("bootstrap");
|
||||
|
||||
_sys_mount(HANDLE_PROCFS, "/proc/", strlen("/proc/"));
|
||||
camellia_procfs("/proc/");
|
||||
MOUNT_AT("/") {
|
||||
fs_dirinject2((const char*[]) {
|
||||
"/proc/",
|
||||
|
|
|
@ -5,14 +5,24 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
main(void)
|
||||
void
|
||||
usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: ps [path]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
{
|
||||
const char *path = argc >= 2 ? argv[1] : "/proc/";
|
||||
if (argc > 2) usage();
|
||||
|
||||
char *readbuf = malloc(4096);
|
||||
char *procbuf = malloc(4096);
|
||||
FILE *f = fopen("/proc/", "r");
|
||||
FILE *f = fopen(path, "r");
|
||||
if (!f) {
|
||||
err(1, "couldn't open /proc/");
|
||||
err(1, "couldn't open %s", path);
|
||||
}
|
||||
|
||||
// TODO library for iterating over directories
|
||||
|
@ -27,7 +37,7 @@ main(void)
|
|||
size_t entryl = end - (readbuf+pos) + 1;
|
||||
if (isdigit(readbuf[pos])) {
|
||||
FILE *g;
|
||||
sprintf(procbuf, "/proc/%smem", readbuf+pos);
|
||||
sprintf(procbuf, "%s%smem", path, readbuf+pos);
|
||||
g = fopen(procbuf, "r");
|
||||
if (!g) {
|
||||
warn("couldn't open \"%s\"", procbuf);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "builtins.h"
|
||||
#include "shell.h"
|
||||
#include <camellia.h>
|
||||
#include <camellia/compat.h>
|
||||
#include <camellia/flags.h>
|
||||
#include <camellia/syscalls.h>
|
||||
|
@ -61,7 +62,7 @@ void run_args(int argc, char **argv, struct redir *redir) {
|
|||
fprintf(stderr, "procmnt: missing mountpoint\n");
|
||||
return;
|
||||
}
|
||||
_sys_mount(HANDLE_PROCFS, argv[1], strlen(argv[1]));
|
||||
camellia_procfs(argv[1]);
|
||||
/*
|
||||
if (!(3 <= argc && !strcmp(argv[2], "raw"))) {
|
||||
if (!mount_at("/")) {
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#include <kernel/panic.h>
|
||||
#include <kernel/proc.h>
|
||||
#include <kernel/vfs/mount.h>
|
||||
#include <kernel/vfs/procfs.h>
|
||||
#include <shared/mem.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -384,7 +383,6 @@ void proc_tryreap(Proc *dead) {
|
|||
return; /* keep the tombstone */
|
||||
}
|
||||
|
||||
handle_close(dead->specialh.procfs);
|
||||
assert(dead->refcount == 0);
|
||||
if (parent) { /* not applicable to init */
|
||||
proc_forget(dead);
|
||||
|
@ -513,18 +511,6 @@ Handle *proc_handle_get(Proc *p, hid_t id) {
|
|||
.refcount = 2, /* never free */
|
||||
};
|
||||
return &h;
|
||||
} else if (id == HANDLE_PROCFS) {
|
||||
if (!p->specialh.procfs) {
|
||||
Handle *h = kmalloc(sizeof *h);
|
||||
proc_ns_create(p);
|
||||
*h = (Handle){
|
||||
.type = HANDLE_FS_FRONT,
|
||||
.backend = procfs_backend(p),
|
||||
.refcount = 1,
|
||||
};
|
||||
p->specialh.procfs = h;
|
||||
}
|
||||
return p->specialh.procfs;
|
||||
} else if (0 <= id && id < HANDLE_MAX) {
|
||||
return p->_handles[id];
|
||||
} else {
|
||||
|
|
|
@ -69,9 +69,6 @@ struct Proc {
|
|||
VfsMount *mount;
|
||||
Handle **_handles; /* points to Handle *[HANDLE_MAX] */
|
||||
uint64_t *handles_refcount; /* works just like pages_refcount */
|
||||
struct {
|
||||
Handle *procfs;
|
||||
} specialh;
|
||||
|
||||
// TODO pids should be 64bit. also typedef pid_t
|
||||
uint32_t globalid; /* only for internal use, don't expose to userland */
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <kernel/panic.h>
|
||||
#include <kernel/pipe.h>
|
||||
#include <kernel/proc.h>
|
||||
#include <kernel/vfs/procfs.h>
|
||||
#include <shared/mem.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -120,7 +121,6 @@ long _sys_mount(hid_t hid, const char __user *path, long len) {
|
|||
// remove trailing slash
|
||||
// mounting something under `/this` and `/this/` should be equalivent
|
||||
if (path_buf[len - 1] == '/') {
|
||||
if (len == 0) goto fail;
|
||||
len--;
|
||||
}
|
||||
|
||||
|
@ -404,6 +404,21 @@ int _sys_wait2(int pid, int flags, struct sys_wait2 __user *out) {
|
|||
return 0; // dummy
|
||||
}
|
||||
|
||||
hid_t _sys_getprocfs(int flags) {
|
||||
if (flags != 0) {
|
||||
SYSCALL_RETURN(-ENOSYS);
|
||||
}
|
||||
proc_ns_create(proc_cur);
|
||||
|
||||
Handle *h;
|
||||
hid_t hid = proc_handle_init(proc_cur, HANDLE_FS_FRONT, &h);
|
||||
if (hid < 0) {
|
||||
SYSCALL_RETURN(-EMFILE);
|
||||
}
|
||||
h->backend = procfs_backend(proc_cur);
|
||||
SYSCALL_RETURN(hid);
|
||||
}
|
||||
|
||||
long _sys_execbuf(void __user *ubuf, size_t len) {
|
||||
if (len == 0) SYSCALL_RETURN(0);
|
||||
if (len > EXECBUF_MAX_LEN)
|
||||
|
@ -458,6 +473,7 @@ long _syscall(long num, long a, long b, long c, long d, long e) {
|
|||
break; case _SYS_GETPID: _sys_getpid();
|
||||
break; case _SYS_GETPPID: _sys_getppid();
|
||||
break; case _SYS_WAIT2: _sys_wait2(a, b, (userptr_t)c);
|
||||
break; case _SYS_GETPROCFS: _sys_getprocfs(a);
|
||||
break; case _SYS_EXECBUF: _sys_execbuf((userptr_t)a, b);
|
||||
break; case _SYS_DEBUG_KLOG: _sys_debug_klog((userptr_t)a, b);
|
||||
break;
|
||||
|
|
|
@ -28,3 +28,14 @@ hid_t camellia_open(const char *path, int flags) {
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int camellia_procfs(const char *path) {
|
||||
hid_t hid = _sys_getprocfs(0);
|
||||
if (hid < 0) {
|
||||
errno = -hid;
|
||||
return -1;
|
||||
}
|
||||
_sys_mount(hid, path, strlen(path));
|
||||
close(hid);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -3,3 +3,5 @@
|
|||
#include <camellia/types.h>
|
||||
|
||||
hid_t camellia_open(const char *path, int flags);
|
||||
|
||||
int camellia_procfs(const char *path);
|
||||
|
|
|
@ -90,6 +90,10 @@ int _sys_wait2(int pid, int flags, struct sys_wait2 __user *out) {
|
|||
return (int)_syscall(_SYS_WAIT2, (long)pid, (long)flags, (long)out, 0, 0);
|
||||
}
|
||||
|
||||
hid_t _sys_getprocfs(int flags) {
|
||||
return (hid_t)_syscall(_SYS_GETPROCFS, (long)flags, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
long _sys_execbuf(void __user *buf, size_t len) {
|
||||
return _syscall(_SYS_EXECBUF, (long)buf, (long)len, 0, 0, 0);
|
||||
}
|
||||
|
|
|
@ -32,4 +32,3 @@
|
|||
|
||||
/* special handles */
|
||||
#define HANDLE_NULLFS -2
|
||||
#define HANDLE_PROCFS -3
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define _SYS_GETPID 19
|
||||
#define _SYS_GETPPID 20
|
||||
#define _SYS_WAIT2 21
|
||||
#define _SYS_GETPROCFS 22
|
||||
|
||||
#define _SYS_EXECBUF 100
|
||||
#define _SYS_DEBUG_KLOG 101
|
||||
|
@ -81,6 +82,8 @@ uint32_t _sys_getppid(void);
|
|||
|
||||
int _sys_wait2(int pid, int flags, struct sys_wait2 __user *out);
|
||||
|
||||
hid_t _sys_getprocfs(int flags);
|
||||
|
||||
/* see shared/execbuf.h */
|
||||
long _sys_execbuf(void __user *buf, size_t len);
|
||||
|
||||
|
|
Loading…
Reference in New Issue