/** * Initialize permanently existing procfs files. */ static int init_permanent_files(void) { struct procfs_file ** file; procfs_read_funcs = kcalloc(SET_COUNT(procfs_files), sizeof(procfs_readfn_t *)); procfs_write_funcs = kcalloc(SET_COUNT(procfs_files), sizeof(procfs_writefn_t *)); procfs_rele_funcs = kcalloc(SET_COUNT(procfs_files), sizeof(procfs_relefn_t *)); if (!(procfs_read_funcs && procfs_write_funcs && procfs_rele_funcs)) return -ENOMEM; SET_FOREACH(file, procfs_files) { enum procfs_filetype filetype = (*file)->filetype; procfs_read_funcs[filetype] = (*file)->readfn; procfs_write_funcs[filetype] = (*file)->writefn; procfs_rele_funcs[filetype] = (*file)->relefn; if (filetype > PROCFS_KERNEL_SEPARATOR) { const char * filename = (*file)->filename; create_proc_file(vn_procfs, 0, filename, filetype); } } return 0; }
int procfs_mkentry(const struct proc_info * proc) { char name[PROCFS_NAMELEN_MAX]; vnode_t * pdir = NULL; struct procfs_file ** file; int err; if (!vn_procfs) return 0; /* Not yet initialized. */ uitoa32(name, proc->pid); KERROR_DBG("%s(pid = %s)\n", __func__, name); err = vn_procfs->vnode_ops->mkdir(vn_procfs, name, PROCFS_PERMS); if (err == -EEXIST) { return 0; } else if (err) { goto fail; } err = vn_procfs->vnode_ops->lookup(vn_procfs, name, &pdir); if (err) { pdir = NULL; goto fail; } SET_FOREACH(file, procfs_files) { const enum procfs_filetype filetype = (*file)->filetype; if (filetype < PROCFS_KERNEL_SEPARATOR) { const char * filename = (*file)->filename; err = create_proc_file(pdir, proc->pid, filename, filetype); if (err) goto fail; } } fail: if (pdir) vrele(pdir); if (err) KERROR_DBG("Failed to create a procfs entry\n"); return err; }
void create_proc_registry(void) { create_proc_file(); }