devfs: take cred struct in devfs_register

This commit is contained in:
Matheus
2024-08-24 21:51:55 -03:00
parent 357f5c65cf
commit 806fa3a333
12 changed files with 57 additions and 16 deletions
+1 -1
View File
@@ -32,6 +32,6 @@ static devops_t devops = {
void arch_e9_initdev() {
#ifdef X86_64_ENABLE_E9
__assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0644) == 0);
__assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0666, NULL) == 0);
#endif
}
+4 -1
View File
@@ -420,6 +420,7 @@ void devfs_init() {
__assert(devfsroot);
devfsroot->vnode.type = V_TYPE_DIR;
devfsroot->vnode.flags = V_FLAGS_ROOT;
devfsroot->attr.mode = 0755;
__assert(hashtable_init(&devfsroot->children, 100) == 0);
__assert(vfs_register(&vfsops, "devfs") == 0);
__assert(hashtable_set(&devfsroot->children, devfsroot, ".", 1, true) == 0);
@@ -434,7 +435,7 @@ int devfs_getbyname(char *name, vnode_t **ret) {
return error;
}
// register new device
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode) {
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode, cred_t *cred) {
__assert(type == V_TYPE_CHDEV || type == V_TYPE_BLKDEV);
devnode_t *master = slab_allocate(nodecache);
if (master == NULL)
@@ -456,6 +457,8 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor,
attr.mode = mode;
attr.rdevmajor = major;
attr.rdevminor = minor;
attr.uid = cred == NULL ? 0 : cred->euid;
attr.gid = cred == NULL ? 0 : cred->egid;
vnode_t *newvnode = NULL;
+1 -1
View File
@@ -44,7 +44,7 @@ typedef struct devnode_t {
void devfs_init();
int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node);
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode);
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode, cred_t *cred);
int devfs_getbyname(char *name, vnode_t **ret);
int devfs_createdir(char *name);
void devfs_remove(char *name, int major, int minor);
+38
View File
@@ -0,0 +1,38 @@
#include <kernel/pci.h>
#include <logging.h>
#include <kernel/hda.h>
static void initcontroller(pcienum_t *e) {
//pcibar_t bar0p = pci_getbar(e, 0);
//volatile nvmebar0_t *bar0 = (volatile nvmebar0_t *)bar0p.address;
//__assert(bar0);
pci_setcommand(e, PCI_COMMAND_MMIO, 1);
pci_setcommand(e, PCI_COMMAND_IO, 0);
pci_setcommand(e, PCI_COMMAND_IRQDISABLE, 1);
pci_setcommand(e, PCI_COMMAND_BUSMASTER, 1);
printf("hda: found controller at %02x:%02x.%x\n", e->bus, e->device, e->function);
// enable interrupts
size_t intcount;
if (e->msix.exists) {
intcount = pci_initmsix(e);
} else if (e->msi.exists) {
// intcount = pci_initmsi(e);
} else {
printf("hda: controller doesn't support msi-x or msi\n");
return;
}
}
void hda_init() {
int i = 0;
for (;;) {
pcienum_t *e = pci_getenum(-1, -1, -1, 0x8086, 0x2668, -1, i++);
if (e == NULL)
break;
initcontroller(e);
}
}
+1 -1
View File
@@ -170,7 +170,7 @@ static int registerdesc(blockdesc_t *desc, char *name) {
if (ret)
return ret;
return devfs_register(&devops, name, V_TYPE_BLKDEV, DEV_MAJOR_BLOCK, id, 0644);
return devfs_register(&devops, name, V_TYPE_BLKDEV, DEV_MAJOR_BLOCK, id, 0600, NULL);
}
#define PART_NONE 0
+1 -1
View File
@@ -244,7 +244,7 @@ void fb_init() {
char name[6];
snprintf(name, 6, "fb%d", i);
__assert(devfs_register(&ops, name, V_TYPE_CHDEV, DEV_MAJOR_FB, i, 0644) == 0);
__assert(devfs_register(&ops, name, V_TYPE_CHDEV, DEV_MAJOR_FB, i, 0666, NULL) == 0);
printf("%s: %dx%d %d bpp\n", name, fb->width, fb->height, fb->bpp);
}
+1 -1
View File
@@ -230,7 +230,7 @@ keyboard_t *keyboard_new() {
char name[12];
snprintf(name, 12, "keyboard%d", currentkbnum);
__assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_KEYBOARD, currentkbnum, 0644) == 0);
__assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_KEYBOARD, currentkbnum, 0666, NULL) == 0);
POLL_INITHEADER(&kb->pollheader);
++currentkbnum;
+1 -1
View File
@@ -171,7 +171,7 @@ mouse_t *mouse_new() {
char name[12];
snprintf(name, 12, "mouse%d", currentnum);
__assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_MOUSE, currentnum, 0644) == 0);
__assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_MOUSE, currentnum, 0600, NULL) == 0);
++currentnum;
return mouse;
+1 -1
View File
@@ -17,7 +17,7 @@ int netdev_register(netdev_t *netdev, char *name) {
goto leave;
e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, 0, 0644);
e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, 0, 0600, NULL);
if (e)
hashtable_remove(&nametable, name, strlen(name));
+4 -4
View File
@@ -61,8 +61,8 @@ static devops_t urandomops = {
};
void pseudodevices_init() {
__assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0644) == 0);
__assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0644) == 0);
__assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0644) == 0);
__assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0644) == 0);
__assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0666, NULL) == 0);
__assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0666, NULL) == 0);
__assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0666, NULL) == 0);
__assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0666, NULL) == 0);
}
+2 -2
View File
@@ -253,7 +253,7 @@ static int open(int oldminor, vnode_t **vnode, int flags) {
// register a master device and immediatelly remove it from the filesystem and tables
// while holding the refcount
int error = devfs_register(&devops, tmpname, V_TYPE_CHDEV, DEV_MAJOR_PTY, newminor, 0644);
int error = devfs_register(&devops, tmpname, V_TYPE_CHDEV, DEV_MAJOR_PTY, newminor, 0, NULL);
if (error) {
freeptyminor(newminor);
freepty(pty);
@@ -284,7 +284,7 @@ static int open(int oldminor, vnode_t **vnode, int flags) {
}
void pty_init() {
__assert(devfs_register(&devops, "ptmx", V_TYPE_CHDEV, DEV_MAJOR_PTY, PTMX_MINOR, 0644) == 0);
__assert(devfs_register(&devops, "ptmx", V_TYPE_CHDEV, DEV_MAJOR_PTY, PTMX_MINOR, 0666, NULL) == 0);
__assert(devfs_createdir("pts") == 0);
SPINLOCK_INIT(listlock);
}
+2 -2
View File
@@ -477,7 +477,7 @@ tty_t *tty_create(char *name, ttydevicewritefn_t writefn, ttyinactivefn_t inacti
goto error;
}
if (devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_TTY, minor, 0644)) {
if (devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_TTY, minor, 0600, _cpu()->thread->proc ? &_cpu()->thread->proc->cred : NULL)) {
freeminor(minor);
ringbuffer_destroy(&tty->readbuffer);
goto error;
@@ -541,6 +541,6 @@ void tty_unregister(tty_t *tty) {
void tty_init() {
__assert(devfs_register(&devops, "tty", V_TYPE_CHDEV, DEV_MAJOR_TTY, CONTROLLING_TTY_MINOR, 0644) == 0);
__assert(devfs_register(&devops, "tty", V_TYPE_CHDEV, DEV_MAJOR_TTY, CONTROLLING_TTY_MINOR, 0666, NULL) == 0);
MUTEX_INIT(&listmutex);
}