master.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * master.c -- the master module of a master/slave pair using kmod
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  */
  15. #ifndef __KERNEL__
  16. #  define __KERNEL__
  17. #endif
  18. #ifndef MODULE
  19. #  define MODULE
  20. #endif
  21. /*
  22.  * Inclusions related to version problems. They *might* go after
  23.  * <linux/module.h>, unless a symbol table is exported. All in all,
  24.  * better putting them first anyways.
  25.  */
  26. #include <linux/config.h> /* retrieve the CONFIG_* macros */
  27. #if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS)
  28. #  define MODVERSIONS /* force it on */
  29. #endif
  30. #ifdef MODVERSIONS
  31. #  include <linux/modversions.h>
  32. #endif
  33. #include <linux/module.h>
  34. #include <linux/version.h>
  35. /* This depends on kmod.h, refuse to go on with 2.0 */
  36. #if LINUX_VERSION_CODE < 0x020200
  37. #  error "This module needs kmod, so it won't run with 2.0"
  38. #else
  39. #include <linux/sched.h>
  40. #include <linux/kernel.h> /* printk() */
  41. #include <linux/string.h>
  42. #include <linux/init.h>
  43. #ifdef HAVE_INTER_MODULE                
  44. static const char *ime_string = NULL;
  45. static void master_test_inter();
  46. #endif                                  
  47. #include <linux/kmod.h>
  48. #include "sysdep.h"
  49. int master_init_module(void)
  50. {
  51.     int r[2]; /* results */
  52.     
  53.     r[0]=request_module("slave");
  54.     r[1]=request_module("nonexistent");
  55.     printk(KERN_INFO "master: loading results are %i, %in", r[0],r[1]);
  56. #ifdef HAVE_INTER_MODULE                
  57.     master_test_inter();
  58. #endif                                  
  59.     return 0; /* success */
  60. }
  61. #ifndef HAVE_INTER_MODULE                
  62. void master_cleanup_module(void)
  63. { }
  64. #endif                                  
  65. #ifdef HAVE_INTER_MODULE
  66. void master_test_inter()
  67. {
  68.     void (*ime_func)();
  69.     ime_string = inter_module_get_request("ime_string", "inter");
  70.     if (ime_string)
  71.         printk(KERN_INFO "master: got ime_string '%s'n", ime_string);
  72.     else
  73.         printk(KERN_INFO "master: inter_module_get failed");
  74.     ime_func = inter_module_get("ime_function");
  75.     if (ime_func) {
  76. (*ime_func)("master");
  77. inter_module_put("ime_function");
  78.     }
  79. }
  80. void master_cleanup_module(void)
  81. {
  82.     if (ime_string)
  83.         inter_module_put("ime_string");
  84. }
  85. #endif
  86. module_init(master_init_module);
  87. module_exit(master_cleanup_module);
  88. #endif /* no 2.0 allowed */