All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul Rolland" <rol@as2917.net>
To: "'Khalid Aziz'" <khalid_aziz@hp.com>,
	"'Robert P. J. Day'" <rpjday@mindspring.com>
Cc: "'Alan Cox'" <alan@lxorguk.ukuu.org.uk>,
	"'Linux Kernel Mailing List'" <linux-kernel@vger.kernel.org>
Subject: Re: kernel .config support?
Date: Thu, 2 Jan 2003 19:37:56 +0100	[thread overview]
Message-ID: <000101c2b28e$120801d0$3f00a8c0@witbe> (raw)
In-Reply-To: <3E146E6B.8CCA954E@hp.com>

Hello,

Following some advices from the list, here is my patch updated,
to embed the .config in the kernel and give access to a gzip'ed
copy thru /proc/config/config.gz

Regards,
Paul


diff -urN linux-2.5.53-orig/drivers/char/Kconfig
linux-2.5.53/drivers/char/Kconfig
--- linux-2.5.53-orig/drivers/char/Kconfig      Tue Dec 24 06:19:26 2002
+++ linux-2.5.53/drivers/char/Kconfig   Mon Dec 30 08:35:54 2002
@@ -4,6 +4,13 @@

 menu "Character devices"

+config CONFIG
+       bool "Linux Kernel Configuration Driver"
+       ---help---
+         If you say Y here, and if you have /proc support enabled,
you'll find
+         a /proc/config directory that will contain a copy of the
.config used
+         to generate the running kernel.
+
 config VT
        bool "Virtual terminal"
        ---help---
diff -urN linux-2.5.53-orig/drivers/char/Makefile
linux-2.5.53/drivers/char/Makefile
--- linux-2.5.53-orig/drivers/char/Makefile     Tue Dec 24 06:21:17 2002
+++ linux-2.5.53/drivers/char/Makefile  Mon Dec 30 12:06:53 2002
@@ -7,6 +7,9 @@
 #
 FONTMAPFILE = cp437.uni

+EXTRA_TARGETS  := config.h
+host-progs     := dotHmaker
+
 obj-y   += mem.o tty_io.o n_tty.o tty_ioctl.o pty.o misc.o random.o

 # All of the (potential) objects that export symbols.
@@ -16,6 +19,7 @@
                        ite_gpio.o keyboard.o misc.o nvram.o random.o
rtc.o \
                        selection.o sonypi.o sysrq.o tty_io.o
tty_ioctl.o

+obj-$(CONFIG_CONFIG) += config.o
 obj-$(CONFIG_VT) += vt_ioctl.o vc_screen.o consolemap.o
consolemap_deftbl.o selection.o keyboard.o
 obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o
 obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o
@@ -85,7 +89,7 @@


 # Files generated that shall be removed upon make clean
-clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c
+clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c dotHmaker
config.txt config.txt.gz config.h

 $(obj)/consolemap_deftbl.c: $(src)/$(FONTMAPFILE)
        $(call do_cmd,CONMK  $@,$(objtree)/scripts/conmakehash $< > $@)
@@ -107,3 +111,13 @@
        rm $@.tmp

 endif
+
+$(obj)/config.o: $(obj)/config.h
+
+$(obj)/config.h: $(obj)/config.txt.gz $(obj)/dotHmaker
+       $(obj)/dotHmaker < $< > $@
+
+$(obj)/config.txt.gz: .config FORCE
+       cp .config $(obj)/config.txt
+       $(call if_changed,gzip)
+
diff -urN linux-2.5.53-orig/drivers/char/config.c
linux-2.5.53/drivers/char/config.c
--- linux-2.5.53-orig/drivers/char/config.c     Thu Jan  1 01:00:00 1970
+++ linux-2.5.53/drivers/char/config.c  Mon Dec 30 08:33:48 2002
@@ -0,0 +1,149 @@
+/*
+ * Linux Configuration Driver
+ * (c) 2002 Paul Rolland
+ *
+ * This driver is intended to give access to the .config file that was
+ * used to compile the kernel.
+ * It does include a gzip'd copy of the file, which can be access thru
+ * /proc/config/config.gz
+ *
+ */
+
+#define DOT_CONFIG_VERSION         "1.0"
+
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <linux/smp_lock.h>
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/miscdevice.h>
+#include <linux/slab.h>
+#include <linux/ioport.h>
+#include <linux/fcntl.h>
+#include <linux/mc146818rtc.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <linux/spinlock.h>
+
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+
+#include "config.h"
+
+static int config_read_proc(char * page, char ** start, off_t off,
+                            int count, int *eof, void *data);
+
+
+#ifndef CONFIG_PROC_FS
+#warn Attention
+static int config_read_proc( char *buffer, char **start, off_t offset,
+                           int size, int *eof, void *data) { return 0; 
+} #else
+
+/* This macro frees the machine specific function from bounds checking 
+and
+ * this like that... */
+#define        PRINT_PROC(fmt,args...)
\
+        do {                                                   \
+          *len += sprintf( buffer+*len, fmt, ##args );         \
+          if (*begin + *len > offset + size)                   \
+            return( 0 );                                       \
+          if (*begin + *len < offset) {
\
+            *begin += *len;                                    \
+            *len = 0;                                          \
+           }                                                   \
+         } while(0)
+
+
+static int config_version_infos(char *buffer, int *len, off_t *begin,
+                                off_t offset, int size)
+{
+  PRINT_PROC("Linux Kernel Configuration driver version %s\n", 
+DOT_CONFIG_VERSION);
+  PRINT_PROC("(c) P. Rolland - Dec 2002\n");
+
+  return(1);
+}
+
+static int config_gz_infos(char *buffer, int *len, off_t *begin, off_t
offset, 
+                           int size)
+{
+  int i;
+ 
+  for (i=0; i<DOT_CONFIG_GZ_SIZE; i++) {
+    PRINT_PROC("%c", config_gz[i]);
+  }
+ 
+  return(1);
+}
+
+static int config_read_proc( char *buffer, char **start, off_t offset,
+                            int size, int *eof, void *data )
+{
+  int len = 0;
+  off_t begin = 0;
+
+  *eof = config_version_infos(buffer, &len, &begin, offset, size);
+
+  if (offset >= begin + len)
+    return(0);
+  *start = buffer + (offset - begin);
+  return( size < begin + len - offset ? size : begin + len - offset ); 
+}
+
+static int config_gz_read_proc( char *buffer, char **start, off_t
offset,
+                                int size, int *eof, void *data ) {
+  int len = 0;
+  off_t begin = 0;
+
+  *eof = config_gz_infos(buffer, &len, &begin, offset, size);
+
+  if (offset >= begin + len)
+    return(0);
+  *start = buffer + (offset - begin);
+  return( size < begin + len - offset ? size : begin + len - offset ); 
+}
+
+static int __init config_init(void)
+{
+  struct proc_dir_entry * entry;
+  entry = create_proc_entry("config", S_IRUGO|S_IXUGO|S_IFDIR, NULL);
+  if (entry == NULL) {
+    printk(KERN_ERR "config: can't create /proc/config\n");
+    return(-ENOMEM);
+  }
+
+  if
(!create_proc_read_entry("config/version",0,0,config_read_proc,NULL)) {
+    printk(KERN_ERR "config: can't create /proc/config/version\n");
+    return(-ENOMEM);
+  }
+  if
(!create_proc_read_entry("config/config.gz",0,0,config_gz_read_proc,NULL
)) {
+    printk(KERN_ERR "config: can't create /proc/config/config.gz\n");
+    return(-ENOMEM);
+  }
+  
+  printk(KERN_INFO "Linux Kernel Configuration driver v"
DOT_CONFIG_VERSION 
+ " (c) Paul Rolland\n");
+
+  return( 0 );
+}
+
+static void __exit config_cleanup_module (void)
+{ 
+  remove_proc_entry( "config/version", 0 );
+  remove_proc_entry( "config/config.gz", 0 );
+  remove_proc_entry( "config", 0 );
+}
+
+module_init(config_init);
+module_exit(config_cleanup_module);
+
+#endif /* CONFIG_PROC_FS */
+
+MODULE_AUTHOR("Paul Rolland");
+MODULE_DESCRIPTION("Driver for accessing kernel configuration"); 
+MODULE_LICENSE("GPL");
+
diff -urN linux-2.5.53-orig/drivers/char/dotHmaker.c
linux-2.5.53/drivers/char/dotHmaker.c
--- linux-2.5.53-orig/drivers/char/dotHmaker.c  Thu Jan  1 01:00:00 1970
+++ linux-2.5.53/drivers/char/dotHmaker.c       Mon Dec 30 08:33:04 2002
@@ -0,0 +1,41 @@
+#include <stdio.h>
+
+int main(void)
+{
+  FILE * in = stdin;
+  int i;
+  unsigned char buf;
+
+  int size = 0;
+
+  printf("/*\n");
+  printf(" * Automagically generated file, please don't edit !\n");  
+ printf(" */\n");  printf("\n");
+  printf("static char config_gz[] = \\\n");
+
+  i = 0;
+
+  fread(&buf, sizeof(unsigned char), 1, in);
+  while (!feof(in)) {
+    if (i == 0) {
+      printf("  \"");
+    } /* endif */
+    printf("\\x%x", buf);
+    size ++;
+    i ++;
+    if (i == 10) {
+      i = 0;
+      printf("\"\\\n");
+    } /* endif */
+    fread(&buf, sizeof(unsigned char), 1, in);
+  } /* endwhile */
+
+  if (i != 0) {
+    printf("  ;\n");
+  } else {
+    printf("\";\n");
+  } /* endif */
+  printf("\n");
+  printf("#define DOT_CONFIG_GZ_SIZE %d\n\n", size);
+
+  exit(0);
+}
+


  reply	other threads:[~2003-01-02 18:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-02 14:32 kernel .config support? Robert P. J. Day
2003-01-02 15:43 ` Randy.Dunlap
2003-01-03  0:51   ` Randy.Dunlap
2003-01-02 17:11 ` Alan Cox
2003-01-02 16:43   ` Robert P. J. Day
2003-01-02 16:52     ` Khalid Aziz
2003-01-02 18:37       ` Paul Rolland [this message]
2003-01-02 23:22     ` Randy.Dunlap
2003-01-05 14:47   ` [Patch 2.5] [Was: RE : kernel .config support?] Paul Rolland
2003-01-03  0:59 ` kernel .config support? Erik Hensema
     [not found] <buo3co7aujp.fsf@mcspd15.ucom.lsi.nec.co.jp>
     [not found] ` <004701c2b553$57c0c780$3f00a8c0@witbe>
2003-01-06 15:02   ` Miles Bader
2003-01-12 14:20     ` Paul Rolland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000101c2b28e$120801d0$3f00a8c0@witbe' \
    --to=rol@as2917.net \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=khalid_aziz@hp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rpjday@mindspring.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.