reg_sample2.c File Reference

#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/sched.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <rsbac/types.h>
#include <rsbac/reg.h>
#include <rsbac/adf.h>
#include <rsbac/aci.h>
#include <rsbac/aci_data_structures.h>
#include <rsbac/getname.h>
#include <rsbac/error.h>
#include <rsbac/proc_fs.h>

Go to the source code of this file.

Defines

#define FILENAME   "regsmp2"
#define FILE_VERSION   1

Functions

 MODULE_AUTHOR ("Amon Ott")
 MODULE_DESCRIPTION ("RSBAC REG sample decision module 2")
 MODULE_PARM (name,"s")
 MODULE_PARM (syscall_name,"s")
 MODULE_PARM (handle,"l")
 MODULE_PARM (syscall_registration_handle,"l")
 MODULE_PARM (syscall_dispatcher_handle,"l")
static int read_info (void)
static int write_info (void)
static int request_func (enum rsbac_adf_request_t request, rsbac_pid_t owner_pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_attribute_t attr, union rsbac_attribute_value_t attr_val, rsbac_uid_t owner)
static int set_attr_func (enum rsbac_adf_request_t request, rsbac_pid_t owner_pid, enum rsbac_target_t target, union rsbac_target_id_t tid, enum rsbac_target_t new_target, union rsbac_target_id_t new_tid, enum rsbac_attribute_t attr, union rsbac_attribute_value_t attr_val, rsbac_uid_t owner)
static rsbac_boolean_t need_overwrite_func (struct dentry *dentry_p)
static int write_func (rsbac_boolean_t need_lock)
static int syscall_func (void *arg)
int init_module (void)
void cleanup_module (void)

Variables

static u_long nr_request_calls = 0
static u_long nr_set_attr_calls = 0
static u_long nr_need_overwrite_calls = 0
static rsbac_boolean_t no_write = FALSE
static u_long nr_system_calls = 0
static void * system_call_arg = 0
static char * name = NULL
static char dummy_buf [70] = "To protect against wrong insmod params"
static char * syscall_name = NULL
static char dummy_buf2 [70] = "To protect against wrong insmod params"
static long handle = 123457
static long syscall_registration_handle = 754321
static long syscall_dispatcher_handle = 2


Define Documentation

#define FILE_VERSION   1
 

Definition at line 61 of file reg_sample2.c.

Referenced by read_info(), and write_info().

#define FILENAME   "regsmp2"
 

Definition at line 58 of file reg_sample2.c.

Referenced by init_module(), read_info(), and write_info().


Function Documentation

void cleanup_module void   ) 
 

Definition at line 544 of file reg_sample2.c.

References handle, proc_rsbac_root_p, rsbac_printk(), rsbac_reg_unregister(), rsbac_reg_unregister_syscall(), syscall_registration_handle, and write_info().

00545 {
00546   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Unregistering.\n");
00547   #if defined(CONFIG_RSBAC_PROC)
00548   remove_proc_entry(PROC_NAME, proc_rsbac_root_p);
00549   #endif 
00550   if(write_info())
00551     {
00552       rsbac_printk(KERN_WARNING
00553              "RSBAC REG decision module sample 2: Could not save info for next session.\n");
00554     }
00555   if(rsbac_reg_unregister_syscall(syscall_registration_handle))
00556     {
00557       rsbac_printk(KERN_ERR "RSBAC REG decision module sample 2: Unregistering syscall failed - beware of possible system failure!\n");
00558     }
00559   if(rsbac_reg_unregister(handle))
00560     {
00561       rsbac_printk(KERN_ERR "RSBAC REG decision module sample 2: Unregistering module failed - beware of possible system failure!\n");
00562     }
00563   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Unloaded.\n");
00564 }

int init_module void   ) 
 

Definition at line 440 of file reg_sample2.c.

References dummy_buf, dummy_buf2, handle, name, need_overwrite_func(), proc_rsbac_root_p, read_info(), request_func(), rsbac_printk(), RSBAC_REG_NAME_LEN, rsbac_reg_register(), rsbac_reg_register_syscall(), rsbac_reg_unregister(), rsbac_reg_unregister_syscall(), RSBAC_REG_VERSION, set_attr_func(), syscall_dispatcher_handle, syscall_func(), syscall_name, syscall_registration_handle, TRUE, and write_func().

00441 {
00442   struct rsbac_reg_entry_t entry;
00443   struct rsbac_reg_syscall_entry_t syscall_entry;
00444 
00445   if(!handle)
00446     handle = 123457;
00447   if(!syscall_registration_handle)
00448     syscall_registration_handle = 754321;
00449   if(!syscall_dispatcher_handle)
00450     syscall_dispatcher_handle = 2;
00451 
00452   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Initializing.\n");
00453 
00454   /* clearing registration entries */
00455   memset(&entry, 0, sizeof(entry));
00456   memset(&syscall_entry, 0, sizeof(syscall_entry));
00457 
00458   if((dummy_buf[0] != 'T') || (dummy_buf2[0] != 'T'))
00459     {
00460       rsbac_printk(KERN_WARNING "RSBAC REG decision module sample 2: Not loaded due to invalid param string.\n");
00461       return -ENOEXEC;
00462     }
00463   if(name)
00464     {
00465       strncpy(entry.name, name, RSBAC_REG_NAME_LEN);
00466       entry.name[RSBAC_REG_NAME_LEN] = 0;
00467     }
00468   else
00469     strcpy(entry.name, "RSBAC REG sample 2 ADF module");
00470   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: REG Version: %u, Name: %s, Handle: %li\n",
00471          RSBAC_REG_VERSION, entry.name, handle);
00472 
00473   entry.handle = handle;
00474   entry.request_func = request_func;
00475   entry.set_attr_func = set_attr_func;
00476   entry.need_overwrite_func = need_overwrite_func;
00477   entry.write_func = write_func;
00478   entry.switch_on = TRUE;
00479 
00480   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Registering to ADF.\n");
00481   if(rsbac_reg_register(RSBAC_REG_VERSION, entry) < 0)
00482     {
00483       rsbac_printk(KERN_WARNING "RSBAC REG decision module sample 2: Registering failed. Unloading.\n");
00484       return -ENOEXEC;
00485     }
00486 
00487   if(syscall_name)
00488     {
00489       strncpy(syscall_entry.name, syscall_name, RSBAC_REG_NAME_LEN);
00490       syscall_entry.name[RSBAC_REG_NAME_LEN] = 0;
00491     }
00492   else
00493     strcpy(syscall_entry.name, "RSBAC REG sample 2 syscall");
00494   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: REG Version: %u, Name: %s, Dispatcher Handle: %li\n",
00495          RSBAC_REG_VERSION, syscall_entry.name, syscall_dispatcher_handle);
00496 
00497   syscall_entry.registration_handle = syscall_registration_handle;
00498   syscall_entry.dispatcher_handle = syscall_dispatcher_handle;
00499   syscall_entry.syscall_func = syscall_func;
00500 
00501   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Registering syscall.\n");
00502   syscall_registration_handle = rsbac_reg_register_syscall(RSBAC_REG_VERSION, syscall_entry);
00503   if(syscall_registration_handle < 0)
00504     {
00505       rsbac_printk(KERN_WARNING "RSBAC REG decision module sample 2: Registering syscall failed. Unloading.\n");
00506       if(rsbac_reg_unregister(handle))
00507         {
00508           rsbac_printk(KERN_ERR "RSBAC REG decision module sample 2: Unregistering failed - beware of possible system failure!\n");
00509         }
00510       return -ENOEXEC;
00511     }
00512 
00513   if(read_info())
00514     {
00515       rsbac_printk(KERN_WARNING
00516              "RSBAC REG decision module sample 2: Could not read info from previous session.\n");
00517     }
00518   
00519   #if defined(CONFIG_RSBAC_PROC)
00520   proc_reg_sample_p = create_proc_entry(PROC_NAME,
00521                                         S_IFREG | S_IRUGO,
00522                                         proc_rsbac_root_p);
00523   if(!proc_reg_sample_p)
00524     {
00525       rsbac_printk(KERN_WARNING "%s: Not loaded due to failed proc entry registering.\n", name);
00526       if(rsbac_reg_unregister_syscall(syscall_registration_handle))
00527         {
00528           rsbac_printk(KERN_ERR "RSBAC REG decision module sample 2: Unregistering syscall failed - beware of possible system failure!\n");
00529         }
00530       if(rsbac_reg_unregister(handle))
00531         {
00532           rsbac_printk(KERN_ERR "RSBAC REG decision module sample 2: Unregistering from ADF failed - beware of possible system failure!\n");
00533         }
00534       return -ENOEXEC;
00535     }
00536   proc_reg_sample_p->get_info = adf_sample_proc_info;
00537   #endif 
00538 
00539   rsbac_printk(KERN_INFO "RSBAC REG decision module sample 2: Loaded.\n");
00540 
00541   return 0;
00542 }

MODULE_AUTHOR "Amon Ott"   ) 
 

MODULE_DESCRIPTION "RSBAC REG sample decision module 2"   ) 
 

MODULE_PARM syscall_dispatcher_handle  ,
"l" 
 

MODULE_PARM syscall_registration_handle  ,
"l" 
 

MODULE_PARM handle  ,
"l" 
 

MODULE_PARM syscall_name  ,
"s" 
 

MODULE_PARM name  ,
"s" 
 

static rsbac_boolean_t need_overwrite_func struct dentry *  dentry_p  )  [static]
 

Definition at line 409 of file reg_sample2.c.

References FALSE, and nr_need_overwrite_calls.

00410   {
00411     nr_need_overwrite_calls++;
00412     return FALSE;
00413   }

static int read_info void   )  [static]
 

Definition at line 170 of file reg_sample2.c.

References FILE_VERSION, FILENAME, name, no_write, nr_need_overwrite_calls, nr_request_calls, nr_set_attr_calls, RSBAC_EREADFAILED, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_read_close(), rsbac_read_open(), rsbac_root_dev, and TRUE.

Referenced by init_module().

00171   {
00172     struct file                     file;
00173     char                            name[RSBAC_MAXNAMELEN];
00174     int                             err = 0;
00175     int                             tmperr;
00176     mm_segment_t                    oldfs;
00177     u_int                           version;
00178     u_long                          tmpval;
00179 
00180     /* copy name from base name */
00181     strcpy(name, FILENAME);
00182 
00183     /* open file */
00184     if ((err = rsbac_read_open(name,
00185                                &file,
00186                                rsbac_root_dev) ))
00187       return(err);
00188 
00189     /* OK, now we can start reading */
00190 
00191     /* There is a read function for this file, so read data from
00192      * previous module load.
00193      * A positive read return value means a read success,
00194      * 0 end of file and a negative value an error.
00195      */
00196 
00197     /* Set current user space to kernel space, because read() writes */
00198     /* to user space */
00199     oldfs = get_fs();
00200     set_fs(KERNEL_DS);
00201 
00202     tmperr = file.f_op->read(&file,
00203                              (char *) &version,
00204                              sizeof(version),
00205                              &file.f_pos);
00206     /* error? */
00207     if (tmperr < sizeof(version))
00208       {
00209         rsbac_printk(KERN_WARNING
00210                "read_info(): read error from file!\n");
00211         err = -RSBAC_EREADFAILED;
00212         goto end_read;
00213       }
00214     /* if wrong version, warn and skip */
00215     if (version != FILE_VERSION)
00216       {
00217         rsbac_printk(KERN_WARNING
00218                "read_info(): wrong version %u, expected %u - skipping file and setting no_write!\n",
00219                version, FILE_VERSION);
00220         no_write = TRUE;
00221         err = -RSBAC_EREADFAILED;
00222         goto end_read;
00223       }
00224 
00225     /* read nr_request_calls */
00226     tmperr = file.f_op->read(&file,
00227                              (char *) &tmpval,
00228                              sizeof(tmpval),
00229                              &file.f_pos);
00230     if (tmperr < sizeof(tmpval))
00231       {
00232         rsbac_printk(KERN_WARNING "%s\n",
00233                "read_info(): read error from file!");
00234         err = -RSBAC_EREADFAILED;
00235         goto end_read;
00236       }
00237     nr_request_calls = tmpval;
00238 
00239     /* read nr_set_attr_calls */
00240     tmperr = file.f_op->read(&file,
00241                              (char *) &tmpval,
00242                              sizeof(tmpval),
00243                              &file.f_pos);
00244     if (tmperr < sizeof(tmpval))
00245       {
00246         rsbac_printk(KERN_WARNING "%s\n",
00247                "read_info(): read error from file!");
00248         err = -RSBAC_EREADFAILED;
00249         goto end_read;
00250       }
00251     nr_set_attr_calls = tmpval;
00252 
00253     /* read nr_need_overwrite_calls */
00254     tmperr = file.f_op->read(&file,
00255                              (char *) &tmpval,
00256                              sizeof(tmpval),
00257                              &file.f_pos);
00258     if (tmperr < sizeof(tmpval))
00259       {
00260         rsbac_printk(KERN_WARNING "%s\n",
00261                "read_info(): read error from file!");
00262         err = -RSBAC_EREADFAILED;
00263         goto end_read;
00264       }
00265     nr_need_overwrite_calls = tmpval;
00266 
00267 end_read:
00268     /* Set current user space back to user space, because read() writes */
00269     /* to user space */
00270     set_fs(oldfs);
00271 
00272     /* We do not need this file dentry any more */
00273     rsbac_read_close(&file);
00274 
00275     /* ready */
00276     return(err);
00277   }; /* end of read_info() */

static int request_func enum rsbac_adf_request_t  request,
rsbac_pid_t  owner_pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_attribute_t  attr,
union rsbac_attribute_value_t  attr_val,
rsbac_uid_t  owner
[static]
 

Definition at line 379 of file reg_sample2.c.

References GRANTED, nr_request_calls, and R_SEARCH.

00386   {
00387     /* count call, but not for SEARCH request */
00388     if(request != R_SEARCH)
00389       nr_request_calls++;
00390     return GRANTED;
00391   }

static int set_attr_func enum rsbac_adf_request_t  request,
rsbac_pid_t  owner_pid,
enum rsbac_target_t  target,
union rsbac_target_id_t  tid,
enum rsbac_target_t  new_target,
union rsbac_target_id_t  new_tid,
enum rsbac_attribute_t  attr,
union rsbac_attribute_value_t  attr_val,
rsbac_uid_t  owner
[static]
 

Definition at line 393 of file reg_sample2.c.

References nr_set_attr_calls, and R_SEARCH.

00402   {
00403     /* count call, but not for SEARCH request */
00404     if(request != R_SEARCH)
00405       nr_set_attr_calls++;
00406     return 0;
00407   }

static int syscall_func void *  arg  )  [static]
 

Definition at line 431 of file reg_sample2.c.

References nr_system_calls, and system_call_arg.

00432   {
00433     nr_system_calls++;
00434     system_call_arg = arg;
00435     return nr_system_calls;
00436    }

static int write_func rsbac_boolean_t  need_lock  )  [static]
 

Definition at line 415 of file reg_sample2.c.

References write_info().

Referenced by init_module().

00416   {
00417     int res=0;
00418 
00419     if(need_lock)
00420       lock_kernel();
00421 
00422     if(!write_info())
00423       res = 1;
00424 
00425     if(need_lock)
00426       unlock_kernel();
00427 
00428     return(res);
00429   }

static int write_info void   )  [static]
 

Definition at line 279 of file reg_sample2.c.

References FILE_VERSION, FILENAME, name, nr_need_overwrite_calls, nr_request_calls, nr_set_attr_calls, RSBAC_EWRITEFAILED, RSBAC_MAXNAMELEN, rsbac_printk(), rsbac_root_dev, rsbac_write_close(), rsbac_write_open(), and rsbac_write_sem.

Referenced by cleanup_module(), and write_func().

00280   {
00281     struct file                     file;
00282     char                            name[RSBAC_MAXNAMELEN];
00283     int                             err = 0;
00284     int                             tmperr;
00285     mm_segment_t                    oldfs;
00286     u_int                           version = FILE_VERSION;
00287     
00288     /* copy name from base name */
00289     strcpy(name, FILENAME);
00290 
00291     /* get rsbac write-to-disk semaphore */
00292     down(&rsbac_write_sem);
00293 
00294     /* open file */
00295     if ((err = rsbac_write_open(name,
00296                                 &file,
00297                                 rsbac_root_dev) ))
00298       {
00299         up(&rsbac_write_sem);
00300         return(err);
00301       }
00302 
00303     /* OK, now we can start writing all sample items.
00304      * A positive return value means a write success,
00305      * 0 end of file and a negative value an error.
00306      */
00307 
00308     /* Set current user space to kernel space, because write() reads
00309      * from user space */
00310     oldfs = get_fs();
00311     set_fs(KERNEL_DS);
00312 
00313     tmperr = file.f_op->write(&file,
00314                               (char *) &version,
00315                               sizeof(version),
00316                               &file.f_pos);
00317     if (tmperr < sizeof(version))
00318       {
00319         rsbac_printk(KERN_WARNING
00320                "write_info(): write error %i on file!\n",
00321                tmperr);
00322         err = -RSBAC_EWRITEFAILED;
00323         goto end_write;
00324       }
00325 
00326     tmperr = file.f_op->write(&file,
00327                               (char *) &nr_request_calls,
00328                               sizeof(nr_request_calls),
00329                               &file.f_pos);
00330     if (tmperr < sizeof(nr_request_calls))
00331       {
00332         rsbac_printk(KERN_WARNING
00333                "write_info(): write error %i on file!\n",
00334                tmperr);
00335         err = -RSBAC_EWRITEFAILED;
00336         goto end_write;
00337       }
00338 
00339     tmperr = file.f_op->write(&file,
00340                               (char *) &nr_set_attr_calls,
00341                               sizeof(nr_set_attr_calls),
00342                               &file.f_pos);
00343     if (tmperr < sizeof(nr_set_attr_calls))
00344       {
00345         rsbac_printk(KERN_WARNING
00346                "write_info(): write error %i on file!\n",
00347                tmperr);
00348         err = -RSBAC_EWRITEFAILED;
00349         goto end_write;
00350       }
00351 
00352     tmperr = file.f_op->write(&file,
00353                               (char *) &nr_need_overwrite_calls,
00354                               sizeof(nr_need_overwrite_calls),
00355                               &file.f_pos);
00356     if (tmperr < sizeof(nr_need_overwrite_calls))
00357       {
00358         rsbac_printk(KERN_WARNING
00359                "write_info(): write error %i on file!\n",
00360                tmperr);
00361         err = -RSBAC_EWRITEFAILED;
00362         goto end_write;
00363       }
00364 
00365 end_write:
00366     /* Set current user space back to user space, because write() reads */
00367     /* from user space */
00368     set_fs(oldfs);
00369 
00370     /* End of write access */
00371     rsbac_write_close(&file);
00372     up(&rsbac_write_sem);
00373     return(err);
00374   }; /* end of write_info() */


Variable Documentation

char dummy_buf[70] = "To protect against wrong insmod params" [static]
 

Definition at line 43 of file reg_sample2.c.

char dummy_buf2[70] = "To protect against wrong insmod params" [static]
 

Definition at line 47 of file reg_sample2.c.

long handle = 123457 [static]
 

Definition at line 50 of file reg_sample2.c.

char* name = NULL [static]
 

Definition at line 42 of file reg_sample2.c.

rsbac_boolean_t no_write = FALSE [static]
 

Definition at line 34 of file reg_sample2.c.

Referenced by read_info().

u_long nr_need_overwrite_calls = 0 [static]
 

Definition at line 33 of file reg_sample2.c.

u_long nr_request_calls = 0 [static]
 

Definition at line 31 of file reg_sample2.c.

u_long nr_set_attr_calls = 0 [static]
 

Definition at line 32 of file reg_sample2.c.

u_long nr_system_calls = 0 [static]
 

Definition at line 35 of file reg_sample2.c.

long syscall_dispatcher_handle = 2 [static]
 

Definition at line 55 of file reg_sample2.c.

char* syscall_name = NULL [static]
 

Definition at line 46 of file reg_sample2.c.

long syscall_registration_handle = 754321 [static]
 

Definition at line 53 of file reg_sample2.c.

void* system_call_arg = 0 [static]
 

Definition at line 36 of file reg_sample2.c.


Generated on Sun May 21 14:31:03 2006 for RSBAC by  doxygen 1.4.2