void dm_init_char_devices(void) { int zero = dm_device_register(&__zero_kdev); int null = dm_device_register(&__null_kdev); sys_mknod("/dev/null", S_IFCHR | 0666, GETDEV(null, 0)); sys_mknod("/dev/zero", S_IFCHR | 0666, GETDEV(zero, 0)); }
int sys_openpty(int *master, int *slave, char *slavename, const struct termios *term, const struct winsize *win) { int num = atomic_fetch_add(&__pty_next_num, 1); char mname[32]; char sname[32]; snprintf(mname, 32, "/dev/ptym%d", num); snprintf(sname, 32, "/dev/ptys%d", num); sys_mknod(mname, S_IFCHR | 0666, GETDEV(pty_major, num)); sys_mknod(sname, S_IFCHR | 0666, GETDEV(pty_major, num)); int mfd = sys_open(mname, O_RDWR, 0); int sfd = sys_open(sname, O_RDWR, 0); if(mfd < 0 || sfd < 0) { sys_unlink(mname); sys_unlink(sname); return -ENOENT; } struct file *mf = file_get(mfd); struct file *sf = file_get(sfd); vfs_inode_get(mf->inode); vfs_inode_get(sf->inode); pty_create(mf->inode); sf->inode->devdata = mf->inode->devdata; struct pty *pty = mf->inode->devdata; assert(pty); pty->master = mf->inode; pty->slave = sf->inode; pty->num = num; if(term) memcpy(&pty->term, term, sizeof(*term)); if(win) memcpy(&pty->size, win, sizeof(*win)); file_put(mf); file_put(sf); if(slavename) strncpy(slavename, sname, 32); if(master) *master = mfd; if(slave) *slave = sfd; return 0; }
int module_install(void) { printk(1, "[keyboard]: Driver loading\n"); spinlock_create(&lock); irqk = cpu_interrupt_register_handler(IRQ1, __int_handle); flush_port(); keyboard_major = dm_device_register(&kbkd); sys_mknod("/dev/keyboard", S_IFCHR | 0644, GETDEV(keyboard_major, 0)); printk(1, "[keyboard]: initialized keyboard\n"); return 0; }
int blockdev_register(struct inode *node, struct blockctl *ctl) { struct blockdev *bd = kmalloc(sizeof(struct blockdev)); mutex_create(&ctl->cachelock, 0); hash_create(&ctl->cache, 0, 0x4000); mpscq_create(&ctl->queue, 1000); bd->ctl = ctl; int num = atomic_fetch_add(&next_minor, 1); node->devdata = bd; node->phys_dev = GETDEV(block_major, num); node->kdev = dm_device_get(block_major); kthread_create(&ctl->elevator, "[kelevator]", 0, block_elevator_main, node); char name[64]; snprintf(name, 64, "/dev/bcache-%d", num); kerfs_register_parameter(name, ctl, 0, 0, kerfs_block_cache_report); return num; }
void pty_init(void) { pty_major = dm_device_register(&__pty_kdev); sys_mknod("/dev/tty", S_IFCHR | 0666, GETDEV(pty_major, 0)); }