reg_sample1.c

Go to the documentation of this file.
00001 /*
00002  * RSBAC REG decision module sample 1
00003  *
00004  * Author and (c) 1999-2005 Amon Ott <ao@rsbac.org>
00005  */
00006 
00007 #include <linux/config.h>
00008 #include <linux/module.h>
00009 #include <linux/types.h>
00010 #include <linux/kernel.h>
00011 #include <linux/string.h>
00012 #include <linux/fs.h>
00013 #include <rsbac/types.h>
00014 #include <rsbac/reg.h>
00015 #include <rsbac/adf.h>
00016 #include <rsbac/aci.h>
00017 #include <rsbac/getname.h>
00018 #include <rsbac/error.h>
00019 #include <rsbac/proc_fs.h>
00020 
00021 static u_long nr_request_calls = 0;
00022 static u_long nr_set_attr_calls = 0;
00023 static u_long nr_need_overwrite_calls = 0;
00024 static u_long nr_system_calls = 0;
00025 static void * system_call_arg = NULL;
00026 
00027 MODULE_AUTHOR("Amon Ott");
00028 MODULE_DESCRIPTION("RSBAC REG sample decision module 1");
00029 MODULE_LICENSE("GPL");
00030 
00031 MODULE_PARM(name, "s");
00032 static char * name = NULL;
00033 static char dummy_buf[70]="To protect against wrong insmod params";
00034 
00035 MODULE_PARM(syscall_name, "s");
00036 static char * syscall_name = NULL;
00037 static char dummy_buf2[70]="To protect against wrong insmod params";
00038 
00039 MODULE_PARM(handle, "l");
00040 static long handle = 123456;
00041 
00042 MODULE_PARM(syscall_registration_handle, "l");
00043 static long syscall_registration_handle = 654321;
00044 MODULE_PARM(syscall_dispatcher_handle, "l");
00045 static long syscall_dispatcher_handle = 1;
00046 
00047 /* PROC functions */
00048 
00049 #if defined(CONFIG_RSBAC_PROC)
00050 #define PROC_NAME "reg_sample1"
00051 static struct proc_dir_entry * proc_reg_sample_p;
00052 
00053 static int
00054 adf_sample_proc_info(char *buffer, char **start, off_t offset, int length)
00055 {
00056   int len = 0;
00057   off_t pos   = 0;
00058   off_t begin = 0;
00059 
00060   union rsbac_target_id_t       rsbac_target_id;
00061   union rsbac_attribute_value_t rsbac_attribute_value;
00062 
00063   if (!rsbac_is_initialized())
00064     return (-ENOSYS);
00065 
00066   rsbac_target_id.scd = ST_rsbac;
00067   rsbac_attribute_value.dummy = 0;
00068   if (!rsbac_adf_request(R_GET_STATUS_DATA,
00069                          current->pid,
00070                          T_SCD,
00071                          rsbac_target_id,
00072                          A_none,
00073                          rsbac_attribute_value))
00074     {
00075       return -EPERM;
00076     }
00077   len += sprintf(buffer, "RSBAC REG decision module sample 1\n----------------------------------\n");
00078   pos = begin + len;
00079   if (pos < offset)
00080     {
00081       len = 0;
00082       begin = pos;
00083     }
00084   if (pos > offset+length)
00085     goto out;
00086 
00087   len += sprintf(buffer + len, "%lu calls to request function.\n",
00088                  nr_request_calls);
00089   pos = begin + len;
00090   if (pos < offset)
00091     {
00092       len = 0;
00093       begin = pos;
00094     }
00095   if (pos > offset+length)
00096     goto out;
00097 
00098   len += sprintf(buffer + len, "%lu calls to set_attr function.\n",
00099                  nr_set_attr_calls);
00100   pos = begin + len;
00101   if (pos < offset)
00102     {
00103       len = 0;
00104       begin = pos;
00105     }
00106   if (pos > offset+length)
00107     goto out;
00108 
00109   len += sprintf(buffer + len, "%lu calls to need_overwrite function.\n",
00110                  nr_need_overwrite_calls);
00111   pos = begin + len;
00112   if (pos < offset)
00113     {
00114       len = 0;
00115       begin = pos;
00116     }
00117   if (pos > offset+length)
00118     goto out;
00119 
00120   len += sprintf(buffer + len, "%lu calls to system_call function %lu, last arg was %p.\n",
00121                  nr_system_calls,
00122                  syscall_dispatcher_handle,
00123                  system_call_arg);
00124   pos = begin + len;
00125   if (pos < offset)
00126     {
00127       len = 0;
00128       begin = pos;
00129     }
00130   if (pos > offset+length)
00131     goto out;
00132 
00133 out:
00134   *start = buffer + (offset - begin);
00135   len -= (offset - begin);
00136   
00137   if (len > length)
00138     len = length;
00139   return len;
00140 }
00141 #endif /* CONFIG_RSBAC_PROC */
00142 
00143 /**** Decision Functions ****/
00144 
00145 static  int request_func  ( enum  rsbac_adf_request_t     request,
00146                                   rsbac_pid_t             owner_pid,
00147                             enum  rsbac_target_t          target,
00148                             union rsbac_target_id_t       tid,
00149                             enum  rsbac_attribute_t       attr,
00150                             union rsbac_attribute_value_t attr_val,
00151                             rsbac_uid_t                   owner)
00152   {
00153     /* count call, but not for SEARCH request */
00154     if(request != R_SEARCH)
00155       nr_request_calls++;
00156     return GRANTED;
00157   }
00158 
00159 static  int set_attr_func ( enum  rsbac_adf_request_t     request,
00160                                   rsbac_pid_t             owner_pid,
00161                             enum  rsbac_target_t          target,
00162                             union rsbac_target_id_t       tid,
00163                             enum  rsbac_target_t          new_target,
00164                             union rsbac_target_id_t       new_tid,
00165                             enum  rsbac_attribute_t       attr,
00166                             union rsbac_attribute_value_t attr_val,
00167                             rsbac_uid_t                   owner)
00168   {
00169     /* count call, but not for SEARCH request */
00170     if(request != R_SEARCH)
00171       nr_set_attr_calls++;
00172     return 0;
00173   }
00174 
00175 static rsbac_boolean_t need_overwrite_func (struct dentry * dentry_p)
00176   {
00177     nr_need_overwrite_calls++;
00178     return FALSE;
00179   }
00180 
00181 static int syscall_func (void * arg)
00182   {
00183     nr_system_calls++;
00184     system_call_arg = arg;
00185     return nr_system_calls;
00186   }
00187 
00188 /**** Init ****/
00189 
00190 int init_module(void)
00191 {
00192   struct rsbac_reg_entry_t entry;
00193   struct rsbac_reg_syscall_entry_t syscall_entry;
00194 
00195   if(!handle)
00196     handle = 123456;
00197   if(!syscall_registration_handle)
00198     syscall_registration_handle = 654321;
00199   if(!syscall_dispatcher_handle)
00200     syscall_dispatcher_handle = 1;
00201 
00202   printk(KERN_INFO "RSBAC REG decision module sample 1: Initializing.\n");
00203 
00204   /* clearing registration entries */
00205   memset(&entry, 0, sizeof(entry));
00206   memset(&syscall_entry, 0, sizeof(syscall_entry));
00207 
00208   if((dummy_buf[0] != 'T') || (dummy_buf2[0] != 'T'))
00209     {
00210       printk(KERN_WARNING "RSBAC REG decision module sample 1: Not loaded due to invalid param string.\n");
00211       return -ENOEXEC;
00212     }
00213   if(name)
00214     {
00215       strncpy(entry.name, name, RSBAC_REG_NAME_LEN);
00216       entry.name[RSBAC_REG_NAME_LEN] = 0;
00217     }
00218   else
00219     strcpy(entry.name, "RSBAC REG sample 1 ADF module");
00220   printk(KERN_INFO "RSBAC REG decision module sample 1: REG Version: %u, Name: %s, Handle: %li\n",
00221          RSBAC_REG_VERSION, entry.name, handle);
00222 
00223   entry.handle = handle;
00224   entry.request_func = request_func;
00225   entry.set_attr_func = set_attr_func;
00226   entry.need_overwrite_func = need_overwrite_func;
00227   entry.switch_on = TRUE;
00228   printk(KERN_INFO "RSBAC REG decision module sample 1: Registering to ADF.\n");
00229   if(rsbac_reg_register(RSBAC_REG_VERSION, entry) < 0)
00230     {
00231       printk(KERN_WARNING "RSBAC REG decision module sample 1: Registering failed. Unloading.\n");
00232       return -ENOEXEC;
00233     }
00234 
00235   if(syscall_name)
00236     {
00237       strncpy(syscall_entry.name, syscall_name, RSBAC_REG_NAME_LEN);
00238       syscall_entry.name[RSBAC_REG_NAME_LEN] = 0;
00239     }
00240   else
00241     strcpy(syscall_entry.name, "RSBAC REG sample 1 syscall");
00242   printk(KERN_INFO "RSBAC REG decision module sample 1: REG Version: %u, Name: %s, Dispatcher Handle: %li\n",
00243          RSBAC_REG_VERSION, syscall_entry.name, syscall_dispatcher_handle);
00244 
00245   syscall_entry.registration_handle = syscall_registration_handle;
00246   syscall_entry.dispatcher_handle = syscall_dispatcher_handle;
00247   syscall_entry.syscall_func = syscall_func;
00248   printk(KERN_INFO "RSBAC REG decision module sample 1: Registering syscall.\n");
00249   syscall_registration_handle = rsbac_reg_register_syscall(RSBAC_REG_VERSION, syscall_entry);
00250   if(syscall_registration_handle < 0)
00251     {
00252       printk(KERN_WARNING "RSBAC REG decision module sample 1: Registering syscall failed. Unloading.\n");
00253       if(rsbac_reg_unregister(handle))
00254         {
00255           printk(KERN_ERR "RSBAC REG decision module sample 1: Unregistering failed - beware of possible system failure!\n");
00256         }
00257       return -ENOEXEC;
00258     }
00259 
00260   #if defined(CONFIG_RSBAC_PROC)
00261   proc_reg_sample_p = create_proc_entry(PROC_NAME,
00262                                         S_IFREG | S_IRUGO,
00263                                         proc_rsbac_root_p);
00264   if(!proc_reg_sample_p)
00265     {
00266       printk(KERN_WARNING "%s: Not loaded due to failed proc entry registering.\n", name);
00267       if(rsbac_reg_unregister(handle))
00268         {
00269           printk(KERN_ERR "RSBAC REG decision module sample 1: Unregistering failed - beware of possible system failure!\n");
00270         }
00271       if(rsbac_reg_unregister_syscall(syscall_registration_handle))
00272         {
00273           printk(KERN_ERR "RSBAC REG decision module sample 1: Unregistering syscall failed - beware of possible system failure!\n");
00274         }
00275       return -ENOEXEC;
00276     }
00277   proc_reg_sample_p->get_info = adf_sample_proc_info;
00278   #endif 
00279 
00280   printk(KERN_INFO "RSBAC REG decision module sample 1: Loaded.\n");
00281 
00282   return 0;
00283 }
00284 
00285 void cleanup_module(void)
00286 {
00287   printk(KERN_INFO "RSBAC REG decision module sample 1: Unregistering.\n");
00288   #if defined(CONFIG_RSBAC_PROC)
00289   remove_proc_entry(PROC_NAME, proc_rsbac_root_p);
00290   #endif 
00291   if(rsbac_reg_unregister_syscall(syscall_registration_handle))
00292     {
00293       printk(KERN_ERR "RSBAC REG decision module sample 1: Unregistering syscall failed - beware of possible system failure!\n");
00294     }
00295   if(rsbac_reg_unregister(handle))
00296     {
00297       printk(KERN_ERR "RSBAC REG decision module sample 1: Unregistering failed - beware of possible system failure!\n");
00298     }
00299   printk(KERN_INFO "RSBAC REG decision module sample 1: Unloaded.\n");
00300 }

Generated on Fri Jun 17 09:45:20 2005 for RSBAC by  doxygen 1.4.2