diff options
Diffstat (limited to 'kernel/configs.c')
| -rw-r--r-- | kernel/configs.c | 98 |
1 files changed, 43 insertions, 55 deletions
diff --git a/kernel/configs.c b/kernel/configs.c index 7faf6837bfb2..6a5c0c9d9176 100644 --- a/kernel/configs.c +++ b/kernel/configs.c @@ -23,6 +23,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <linux/config.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/proc_fs.h> @@ -35,129 +36,116 @@ /**************************************************/ /* the actual current config file */ +/* This one is for extraction from the kernel binary file image. */ #include "ikconfig.h" #ifdef CONFIG_IKCONFIG_PROC +/* This is the data that can be read from /proc/config.gz. */ +#include "config_data.h" + /**************************************************/ /* globals and useful constants */ -static const char IKCONFIG_NAME[] = "ikconfig"; static const char IKCONFIG_VERSION[] = "0.6"; -static int ikconfig_size; -static struct proc_dir_entry *ikconfig_dir; - static ssize_t -ikconfig_read(struct file *file, char __user *buf, - size_t len, loff_t *offset) +ikconfig_read_current(struct file *file, char __user *buf, + size_t len, loff_t * offset) { loff_t pos = *offset; ssize_t count; - - if (pos >= ikconfig_size) + + if (pos >= kernel_config_data_size) return 0; - count = min(len, (size_t)(ikconfig_size - pos)); - if(copy_to_user(buf, ikconfig_config + pos, count)) + count = min(len, (size_t)(kernel_config_data_size - pos)); + if(copy_to_user(buf, kernel_config_data + pos, count)) return -EFAULT; *offset += count; return count; } -static struct file_operations config_fops = { +static struct file_operations ikconfig_file_ops = { .owner = THIS_MODULE, - .read = ikconfig_read, + .read = ikconfig_read_current, }; + /***************************************************/ -/* built_with_show: let people read the info */ +/* build_info_show: let people read the info */ /* we have on the tools used to build this kernel */ -static int builtwith_show(struct seq_file *seq, void *v) +static int build_info_show(struct seq_file *seq, void *v) { - seq_printf(seq, + seq_printf(seq, "Kernel: %s\nCompiler: %s\nVersion_in_Makefile: %s\n", - ikconfig_built_with, LINUX_COMPILER, UTS_RELEASE); + ikconfig_build_info, LINUX_COMPILER, UTS_RELEASE); return 0; } -static int built_with_open(struct inode *inode, struct file *file) +static int build_info_open(struct inode *inode, struct file *file) { - return single_open(file, builtwith_show, PDE(inode)->data); + return single_open(file, build_info_show, PDE(inode)->data); } - -static struct file_operations builtwith_fops = { + +static struct file_operations build_info_file_ops = { .owner = THIS_MODULE, - .open = built_with_open, + .open = build_info_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, -}; +}; /***************************************************/ /* ikconfig_init: start up everything we need to */ -int __init -ikconfig_init(void) +static int __init ikconfig_init(void) { struct proc_dir_entry *entry; - printk(KERN_INFO "ikconfig %s with /proc/ikconfig\n", + printk(KERN_INFO "ikconfig %s with /proc/config*\n", IKCONFIG_VERSION); - /* create the ikconfig directory */ - ikconfig_dir = proc_mkdir(IKCONFIG_NAME, NULL); - if (ikconfig_dir == NULL) - goto leave; - ikconfig_dir->owner = THIS_MODULE; - /* create the current config file */ - entry = create_proc_entry("config", S_IFREG | S_IRUGO, ikconfig_dir); + entry = create_proc_entry("config.gz", S_IFREG | S_IRUGO, + &proc_root); if (!entry) - goto leave2; + goto leave; - entry->proc_fops = &config_fops; - entry->size = ikconfig_size = strlen(ikconfig_config); + entry->proc_fops = &ikconfig_file_ops; + entry->size = kernel_config_data_size; - /* create the "built with" file */ - entry = create_proc_entry("built_with", S_IFREG | S_IRUGO, - ikconfig_dir); + /* create the "build_info" file */ + entry = create_proc_entry("config_build_info", + S_IFREG | S_IRUGO, &proc_root); if (!entry) - goto leave3; - entry->proc_fops = &builtwith_fops; + goto leave_gz; + entry->proc_fops = &build_info_file_ops; return 0; -leave3: +leave_gz: /* remove the file from proc */ - remove_proc_entry("config", ikconfig_dir); - -leave2: - /* remove the ikconfig directory */ - remove_proc_entry(IKCONFIG_NAME, NULL); + remove_proc_entry("config.gz", &proc_root); leave: return -ENOMEM; } /***************************************************/ -/* cleanup_ikconfig: clean up our mess */ +/* ikconfig_cleanup: clean up our mess */ -static void -cleanup_ikconfig(void) +static void __exit ikconfig_cleanup(void) { /* remove the files */ - remove_proc_entry("config", ikconfig_dir); - remove_proc_entry("built_with", ikconfig_dir); - - /* remove the ikconfig directory */ - remove_proc_entry(IKCONFIG_NAME, NULL); + remove_proc_entry("config.gz", &proc_root); + remove_proc_entry("config_build_info", &proc_root); } module_init(ikconfig_init); -module_exit(cleanup_ikconfig); +module_exit(ikconfig_cleanup); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Randy Dunlap"); |
