pm_data_structures.c

Go to the documentation of this file.
00001 /*************************************************** */
00002 /* Rule Set Based Access Control                     */
00003 /* Implementation of PM data structures              */
00004 /* Author and (c) 1999-2009: Amon Ott <ao@rsbac.org> */
00005 /*                                                   */
00006 /* Last modified: 03/Jun/2005                        */
00007 /*************************************************** */
00008 
00009 #include <linux/types.h>
00010 #include <linux/sched.h>
00011 #include <linux/fs.h>
00012 #include <asm/uaccess.h>
00013 #include <linux/file.h>
00014 #include <linux/vmalloc.h>
00015 #include <linux/init.h>
00016 #include <rsbac/types.h>
00017 #include <rsbac/pm_types.h>
00018 #include <rsbac/pm_data_structures.h>
00019 #include <rsbac/getname.h>
00020 #include <rsbac/pm_getname.h>
00021 #include <rsbac/error.h>
00022 #include <rsbac/helpers.h>
00023 #include <rsbac/fs.h>
00024 #include <rsbac/adf.h>
00025 #include <rsbac/adf_main.h>
00026 #include <rsbac/debug.h>
00027 #include <rsbac/proc_fs.h>
00028 #include <rsbac/rkmem.h>
00029 #include <rsbac/lists.h>
00030 #include <linux/string.h>
00031 
00032 /************************************************************************** */
00033 /*                          Global Variables                                */
00034 /************************************************************************** */
00035 
00036 /* The following global variables are needed for access to PM data.         */
00037 
00038 static rsbac_list_handle_t task_set_handle = NULL;
00039 static rsbac_list_handle_t tp_set_handle = NULL;
00040 static rsbac_list_handle_t ru_set_handle = NULL;
00041 static rsbac_list_handle_t pp_set_handle = NULL;
00042 static rsbac_list_handle_t in_pp_set_handle = NULL;
00043 static rsbac_list_handle_t out_pp_set_handle = NULL;
00044 
00045 static rsbac_list_handle_t task_handle = NULL;
00046 static rsbac_list_handle_t class_handle = NULL;
00047 static rsbac_list_handle_t na_handle = NULL;
00048 static rsbac_list_handle_t cs_handle = NULL;
00049 static rsbac_list_handle_t tp_handle = NULL;
00050 static rsbac_list_handle_t pp_handle = NULL;
00051 static rsbac_list_handle_t tkt_handle = NULL;
00052 
00053 /**************************************************/
00054 /*       Declarations of external functions       */
00055 /**************************************************/
00056 
00057 int sys_write(u_int,char *, u_int);
00058 
00059 /**************************************************/
00060 /*       Declarations of internal functions       */
00061 /**************************************************/
00062 
00063 /* As some function use later defined functions, we declare those here.   */
00064 
00065 /************************************************* */
00066 /*               Internal Help functions           */
00067 /************************************************* */
00068 
00069 
00070 /************************************************* */
00071 /*               proc functions                    */
00072 /************************************************* */
00073 
00074 #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS)
00075 static int
00076 stats_pm_proc_info(char *buffer, char **start, off_t offset, int length)
00077 {
00078     u_int len = 0;
00079     off_t pos   = 0;
00080     off_t begin = 0;
00081 
00082     u_long                                   tmp_count;
00083     u_long                                   tmp_member_count;
00084     u_long                                   all_set_count = 0;
00085     u_long                                   all_member_count = 0;
00086     u_long                               all_count = 0;
00087 
00088 #if !defined(CONFIG_RSBAC_MAINT)
00089     union rsbac_target_id_t       rsbac_target_id;
00090     union rsbac_attribute_value_t rsbac_attribute_value;
00091 #endif
00092 
00093     if (!rsbac_is_initialized())
00094       {
00095         rsbac_printk(KERN_WARNING "stats_pm_proc_info(): RSBAC not initialized\n");
00096         return(-RSBAC_ENOTINITIALIZED);
00097       }
00098 #if !defined(CONFIG_RSBAC_MAINT)
00099 #ifdef CONFIG_RSBAC_DEBUG
00100     if (rsbac_debug_aef_pm)
00101       {
00102         rsbac_printk(KERN_DEBUG "stats_pm_proc_info(): calling ADF\n");
00103       }
00104 #endif
00105     rsbac_target_id.scd = ST_rsbac;
00106     rsbac_attribute_value.dummy = 0;
00107     if (!rsbac_adf_request(R_GET_STATUS_DATA,
00108                            current->pid,
00109                            T_SCD,
00110                            rsbac_target_id,
00111                            A_none,
00112                            rsbac_attribute_value))
00113       {
00114 #if defined(CONFIG_RSBAC_SOFTMODE)
00115         if(!rsbac_softmode)
00116 #endif
00117           return -EPERM;
00118       }
00119 #endif
00120 
00121     len += sprintf(buffer, "PM Status\n---------\n");
00122 
00123 /****************/
00124 /* Helper lists */
00125 /****************/
00126 
00127     tmp_count = rsbac_list_lol_count(task_set_handle);
00128     tmp_member_count = rsbac_list_lol_all_subcount(task_set_handle);
00129     len += sprintf(buffer + len, "%lu task-set-items, sum of %lu members\n",
00130                   tmp_count, tmp_member_count);
00131     pos = begin + len;
00132     if (pos < offset)
00133       {
00134         len = 0;
00135         begin = pos;
00136       }
00137     if (pos > offset+length)
00138       goto out;
00139     all_set_count += tmp_count;
00140     all_member_count += tmp_member_count;
00141 
00142     tmp_count = rsbac_list_lol_count(tp_set_handle);
00143     tmp_member_count = rsbac_list_lol_all_subcount(tp_set_handle);
00144     len += sprintf(buffer + len, "%lu tp-set-items, sum of %lu members\n",
00145                   tmp_count, tmp_member_count);
00146     pos = begin + len;
00147     if (pos < offset)
00148       {
00149         len = 0;
00150         begin = pos;
00151       }
00152     if (pos > offset+length)
00153       goto out;
00154     all_set_count += tmp_count;
00155     all_member_count += tmp_member_count;
00156 
00157     tmp_count = rsbac_list_lol_count(ru_set_handle);
00158     tmp_member_count = rsbac_list_lol_all_subcount(ru_set_handle);
00159     len += sprintf(buffer + len, "%lu ru-set-items, sum of %lu members\n",
00160                   tmp_count, tmp_member_count);
00161     pos = begin + len;
00162     if (pos < offset)
00163       {
00164         len = 0;
00165         begin = pos;
00166       }
00167     if (pos > offset+length)
00168       goto out;
00169     all_set_count += tmp_count;
00170     all_member_count += tmp_member_count;
00171 
00172     tmp_count = rsbac_list_lol_count(pp_set_handle);
00173     tmp_member_count = rsbac_list_lol_all_subcount(pp_set_handle);
00174     len += sprintf(buffer + len, "%lu pp-set-items, sum of %lu members\n",
00175                   tmp_count, tmp_member_count);
00176     pos = begin + len;
00177     if (pos < offset)
00178       {
00179         len = 0;
00180         begin = pos;
00181       }
00182     if (pos > offset+length)
00183       goto out;
00184     all_set_count += tmp_count;
00185     all_member_count += tmp_member_count;
00186 
00187     tmp_count = rsbac_list_lol_count(in_pp_set_handle);
00188     tmp_member_count = rsbac_list_lol_all_subcount(in_pp_set_handle);
00189     len += sprintf(buffer + len, "%lu in_pp-set-items, sum of %lu members\n",
00190                   tmp_count, tmp_member_count);
00191     pos = begin + len;
00192     if (pos < offset)
00193       {
00194         len = 0;
00195         begin = pos;
00196       }
00197     if (pos > offset+length)
00198       goto out;
00199     all_set_count += tmp_count;
00200     all_member_count += tmp_member_count;
00201 
00202     tmp_count = rsbac_list_lol_count(out_pp_set_handle);
00203     tmp_member_count = rsbac_list_lol_all_subcount(out_pp_set_handle);
00204     len += sprintf(buffer + len, "%lu out_pp-set-items, sum of %lu members\n",
00205                   tmp_count, tmp_member_count);
00206     pos = begin + len;
00207     if (pos < offset)
00208       {
00209         len = 0;
00210         begin = pos;
00211       }
00212     if (pos > offset+length)
00213       goto out;
00214     all_set_count += tmp_count;
00215     all_member_count += tmp_member_count;
00216 
00217     len += sprintf(buffer + len, "Total of %lu registered rsbac-pm-set-items, %lu members\n",
00218                  all_set_count, all_member_count);
00219 
00220 /**************/
00221 /* Main lists */
00222 /**************/
00223 
00224     tmp_count = rsbac_list_count(task_handle);
00225     len += sprintf(buffer + len, "%lu task-items\n",
00226                    tmp_count);
00227     pos = begin + len;
00228     if (pos < offset)
00229       {
00230         len = 0;
00231         begin = pos;
00232       }
00233     if (pos > offset+length)
00234       goto out;
00235     all_count += tmp_count;
00236 
00237     tmp_count = rsbac_list_count(class_handle);
00238     len += sprintf(buffer + len, "%lu class-items\n",
00239                    tmp_count);
00240     pos = begin + len;
00241     if (pos < offset)
00242       {
00243         len = 0;
00244         begin = pos;
00245       }
00246     if (pos > offset+length)
00247       goto out;
00248     all_count += tmp_count;
00249 
00250     tmp_count = rsbac_list_count(na_handle);
00251     len += sprintf(buffer + len, "%lu necessary access items\n",
00252                    tmp_count);
00253     pos = begin + len;
00254     if (pos < offset)
00255       {
00256         len = 0;
00257         begin = pos;
00258       }
00259     if (pos > offset+length)
00260       goto out;
00261     all_count += tmp_count;
00262 
00263     tmp_count = rsbac_list_count(cs_handle);
00264     len += sprintf(buffer + len, "%lu consent items\n",
00265                    tmp_count);
00266     pos = begin + len;
00267     if (pos < offset)
00268       {
00269         len = 0;
00270         begin = pos;
00271       }
00272     if (pos > offset+length)
00273       goto out;
00274     all_count += tmp_count;
00275 
00276     tmp_count = rsbac_list_count(tp_handle);
00277     len += sprintf(buffer + len, "%lu tp items\n",
00278                    tmp_count);
00279     pos = begin + len;
00280     if (pos < offset)
00281       {
00282         len = 0;
00283         begin = pos;
00284       }
00285     if (pos > offset+length)
00286       goto out;
00287     all_count += tmp_count;
00288 
00289     tmp_count = rsbac_list_count(pp_handle);
00290     len += sprintf(buffer + len, "%lu purpose items\n",
00291                    tmp_count);
00292     pos = begin + len;
00293     if (pos < offset)
00294       {
00295         len = 0;
00296         begin = pos;
00297       }
00298     if (pos > offset+length)
00299       goto out;
00300     all_count += tmp_count;
00301 
00302     tmp_count = rsbac_list_count(tkt_handle);
00303     len += sprintf(buffer + len, "%lu tkt items\n",
00304                    tmp_count);
00305     pos = begin + len;
00306     if (pos < offset)
00307       {
00308         len = 0;
00309         begin = pos;
00310       }
00311     if (pos > offset+length)
00312       goto out;
00313     all_count += tmp_count;
00314 
00315     len += sprintf(buffer + len, "Total of %lu registered rsbac-pm-items\n",
00316                  all_count);
00317     pos = begin + len;
00318     if (pos < offset)
00319       {
00320         len = 0;
00321         begin = pos;
00322       }
00323 
00324 out:
00325   *start = buffer + (offset - begin);
00326   len -= (offset - begin);
00327   
00328   if (len > length)
00329     len = length;
00330   return len;
00331 }
00332 
00333 /* list_proc_read() */
00334 /* Generic readable list generation function */
00335 static int pm_list_proc_read(char *buffer, char **start, off_t offset,
00336   int length, int *eof, void *data)
00337   {
00338     int len = 0;
00339     off_t pos   = 0;
00340     off_t begin = 0;
00341     long            count;
00342     long            subcount;
00343     u_long          i,j;
00344     enum rsbac_pm_list_t list;
00345 
00346     if (!rsbac_is_initialized())
00347       return (-ENOSYS);
00348     list = (enum rsbac_pm_all_list_t) data;
00349 
00350 #if !defined(CONFIG_RSBAC_MAINT)
00351     /* access control */
00352 #if defined(CONFIG_RSBAC_SWITCH_PM)
00353     if(rsbac_switch_pm)
00354 #endif
00355       {
00356         int error;
00357         union  rsbac_target_id_t         tid;
00358         union  rsbac_attribute_value_t   attr_val;
00359 
00360         rsbac_get_owner(&tid.user);
00361         error = rsbac_get_attr(PM,T_USER,tid,A_pm_role,&attr_val,TRUE);
00362         if (error)
00363           {
00364             char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00365 
00366             if(tmp)
00367               {
00368                 get_error_name(tmp,error);
00369                 rsbac_printk(KERN_WARNING
00370                        "pm_list_proc_read(): rsbac_get_attr() for pm_role returned error %s",
00371                        tmp);
00372                 rsbac_kfree(tmp);
00373               }
00374             return(error);  /* something weird happened */
00375           }
00376         if(   (attr_val.pm_role != PR_security_officer)
00377            && (attr_val.pm_role != PR_data_protection_officer)
00378            && (attr_val.pm_role != PR_tp_manager))
00379           {
00380             char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
00381 
00382             if(tmp)
00383               {
00384                 get_pm_all_list_name(tmp, list);
00385                 rsbac_printk(KERN_WARNING
00386                        "pm_list_proc_read(): access to list %s denied\n",
00387                        tmp);
00388                 rsbac_kfree(tmp);
00389               }
00390 #if defined(CONFIG_RSBAC_SOFTMODE)
00391             if(!rsbac_softmode)
00392 #endif
00393               return(-EPERM);
00394           }
00395         if(   (attr_val.pm_role == PR_tp_manager)
00396            && (list != PA_tp))
00397           {
00398             rsbac_printk(KERN_WARNING
00399                    "pm_list_proc_read(): access to list tp denied\n");
00400 #if defined(CONFIG_RSBAC_SOFTMODE)
00401             if(!rsbac_softmode)
00402 #endif
00403               return(-EPERM);
00404           }
00405       }
00406 #endif /* !MAINT */
00407 
00408     switch(list)
00409       {
00410         case PA_task_set:
00411           {
00412             rsbac_pm_task_set_id_t * set_array;
00413             rsbac_pm_task_id_t     * member_array;
00414 
00415             count = rsbac_list_lol_get_all_desc(task_set_handle, (void **) &set_array);
00416             if(count < 0)
00417               {
00418                 return count;
00419               }
00420             len += sprintf(buffer + len, "task-set\tmembers\n");
00421             for(i=0; i<count; i++)
00422               {
00423                 len += sprintf(buffer + len, "%u\t\t",
00424                                set_array[i]);
00425                 pos = begin + len;
00426                 if (pos < offset)
00427                   {
00428                     len = 0;
00429                     begin = pos;
00430                   }
00431                 if (pos > offset+length)
00432                   {
00433                     rsbac_vfree(set_array);
00434                     goto out;
00435                   }
00436 
00437                 subcount = rsbac_list_lol_get_all_subdesc(task_set_handle,
00438                                                           &set_array[i],
00439                                                           (void **) &member_array);
00440                 if(subcount < 0)
00441                   {
00442                     rsbac_vfree(set_array);
00443                     goto out;
00444                   }
00445                 for(j=0; j<subcount; j++)
00446                   {
00447                     len += sprintf(buffer + len, "%u ",
00448                                    member_array[j]);
00449                     pos = begin + len;
00450                     if (pos < offset)
00451                       {
00452                         len = 0;
00453                         begin = pos;
00454                       }
00455                     if (pos > offset+length)
00456                       {
00457                         rsbac_vfree(set_array);
00458                         rsbac_vfree(member_array);
00459                         goto out;
00460                       }
00461                   };
00462                 if(subcount > 0)
00463                   rsbac_vfree(member_array);
00464                 len += sprintf(buffer + len, "\n");
00465                 pos = begin + len;
00466                 if (pos < offset)
00467                   {
00468                     len = 0;
00469                     begin = pos;
00470                   }
00471                 if (pos > offset+length)
00472                   {
00473                     rsbac_vfree(set_array);
00474                     goto out;
00475                   }
00476               };
00477             if(count > 0)
00478               rsbac_vfree(set_array);
00479             break;
00480           }
00481 
00482         case PA_tp_set:
00483           {
00484             rsbac_pm_tp_set_id_t * set_array;
00485             rsbac_pm_tp_id_t     * member_array;
00486 
00487             count = rsbac_list_lol_get_all_desc(tp_set_handle, (void **) &set_array);
00488             if(count < 0)
00489               {
00490                 return count;
00491               }
00492             len += sprintf(buffer + len, "tp-set\t\tmembers\n");
00493             for(i=0; i<count; i++)
00494               {
00495                 len += sprintf(buffer + len, "%u\t\t",
00496                                set_array[i]);
00497                 pos = begin + len;
00498                 if (pos < offset)
00499                   {
00500                     len = 0;
00501                     begin = pos;
00502                   }
00503                 if (pos > offset+length)
00504                   {
00505                     rsbac_vfree(set_array);
00506                     goto out;
00507                   }
00508 
00509                 subcount = rsbac_list_lol_get_all_subdesc(tp_set_handle,
00510                                                           &set_array[i],
00511                                                           (void **) &member_array);
00512                 if(subcount < 0)
00513                   {
00514                     rsbac_vfree(set_array);
00515                     goto out;
00516                   }
00517                 for(j=0; j<subcount; j++)
00518                   {
00519                     len += sprintf(buffer + len, "%u ",
00520                                    member_array[j]);
00521                     pos = begin + len;
00522                     if (pos < offset)
00523                       {
00524                         len = 0;
00525                         begin = pos;
00526                       }
00527                     if (pos > offset+length)
00528                       {
00529                         rsbac_vfree(set_array);
00530                         rsbac_vfree(member_array);
00531                         goto out;
00532                       }
00533                   };
00534                 if(subcount > 0)
00535                   rsbac_vfree(member_array);
00536                 len += sprintf(buffer + len, "\n");
00537                 pos = begin + len;
00538                 if (pos < offset)
00539                   {
00540                     len = 0;
00541                     begin = pos;
00542                   }
00543                 if (pos > offset+length)
00544                   {
00545                     rsbac_vfree(set_array);
00546                     goto out;
00547                   }
00548               };
00549             if(count > 0)
00550               rsbac_vfree(set_array);
00551             break;
00552           }
00553 
00554         case PA_ru_set:
00555           {
00556             rsbac_pm_ru_set_id_t * set_array;
00557             rsbac_uid_t          * member_array;
00558 
00559             count = rsbac_list_lol_get_all_desc(ru_set_handle, (void **) &set_array);
00560             if(count < 0)
00561               {
00562                 return count;
00563               }
00564             len += sprintf(buffer + len, "ru-set\t\tmembers\n");
00565             for(i=0; i<count; i++)
00566               {
00567                 len += sprintf(buffer + len, "%u\t\t",
00568                                set_array[i]);
00569                 pos = begin + len;
00570                 if (pos < offset)
00571                   {
00572                     len = 0;
00573                     begin = pos;
00574                   }
00575                 if (pos > offset+length)
00576                   {
00577                     rsbac_vfree(set_array);
00578                     goto out;
00579                   }
00580 
00581                 subcount = rsbac_list_lol_get_all_subdesc(ru_set_handle,
00582                                                           &set_array[i],
00583                                                           (void **) &member_array);
00584                 if(subcount < 0)
00585                   {
00586                     rsbac_vfree(set_array);
00587                     goto out;
00588                   }
00589                 for(j=0; j<subcount; j++)
00590                   {
00591                     len += sprintf(buffer + len, "%u ",
00592                                    member_array[j]);
00593                     pos = begin + len;
00594                     if (pos < offset)
00595                       {
00596                         len = 0;
00597                         begin = pos;
00598                       }
00599                     if (pos > offset+length)
00600                       {
00601                         rsbac_vfree(set_array);
00602                         rsbac_vfree(member_array);
00603                         goto out;
00604                       }
00605                   };
00606                 if(subcount > 0)
00607                   rsbac_vfree(member_array);
00608                 len += sprintf(buffer + len, "\n");
00609                 pos = begin + len;
00610                 if (pos < offset)
00611                   {
00612                     len = 0;
00613                     begin = pos;
00614                   }
00615                 if (pos > offset+length)
00616                   {
00617                     rsbac_vfree(set_array);
00618                     goto out;
00619                   }
00620               };
00621             if(count > 0)
00622               rsbac_vfree(set_array);
00623             break;
00624           }
00625 
00626         case PA_pp_set:
00627           {
00628             rsbac_pm_pp_set_id_t  * set_array;
00629             rsbac_pm_purpose_id_t * member_array;
00630 
00631             count = rsbac_list_lol_get_all_desc(pp_set_handle, (void **) &set_array);
00632             if(count < 0)
00633               {
00634                 return count;
00635               }
00636             len += sprintf(buffer + len, "pp-set\t\tmembers\n");
00637             for(i=0; i<count; i++)
00638               {
00639                 len += sprintf(buffer + len, "%u\t\t",
00640                                set_array[i]);
00641                 pos = begin + len;
00642                 if (pos < offset)
00643                   {
00644                     len = 0;
00645                     begin = pos;
00646                   }
00647                 if (pos > offset+length)
00648                   {
00649                     rsbac_vfree(set_array);
00650                     goto out;
00651                   }
00652 
00653                 subcount = rsbac_list_lol_get_all_subdesc(pp_set_handle,
00654                                                           &set_array[i],
00655                                                           (void **) &member_array);
00656                 if(subcount < 0)
00657                   {
00658                     rsbac_vfree(set_array);
00659                     goto out;
00660                   }
00661                 for(j=0; j<subcount; j++)
00662                   {
00663                     len += sprintf(buffer + len, "%u ",
00664                                    member_array[j]);
00665                     pos = begin + len;
00666                     if (pos < offset)
00667                       {
00668                         len = 0;
00669                         begin = pos;
00670                       }
00671                     if (pos > offset+length)
00672                       {
00673                         rsbac_vfree(set_array);
00674                         rsbac_vfree(member_array);
00675                         goto out;
00676                       }
00677                   };
00678                 if(subcount > 0)
00679                   rsbac_vfree(member_array);
00680                 len += sprintf(buffer + len, "\n");
00681                 pos = begin + len;
00682                 if (pos < offset)
00683                   {
00684                     len = 0;
00685                     begin = pos;
00686                   }
00687                 if (pos > offset+length)
00688                   {
00689                     rsbac_vfree(set_array);
00690                     goto out;
00691                   }
00692               };
00693             if(count > 0)
00694               rsbac_vfree(set_array);
00695             break;
00696           }
00697 
00698         case PA_in_pp_set:
00699           {
00700             rsbac_pm_in_pp_set_id_t * set_array;
00701             rsbac_pm_purpose_id_t   * member_array;
00702 
00703             count = rsbac_list_lol_get_all_desc(in_pp_set_handle, (void **) &set_array);
00704             if(count < 0)
00705               {
00706                 return count;
00707               }
00708 
00709             len += sprintf(buffer + len, "in-pp-set\tmembers\n");
00710             for(i=0; i<count; i++)
00711               {
00712                 len += sprintf(buffer + len, "%u\t\t",
00713                                set_array[i]);
00714                 pos = begin + len;
00715                 if (pos < offset)
00716                   {
00717                     len = 0;
00718                     begin = pos;
00719                   }
00720                 if (pos > offset+length)
00721                   {
00722                     rsbac_vfree(set_array);
00723                     goto out;
00724                   }
00725 
00726                 subcount = rsbac_list_lol_get_all_subdesc(in_pp_set_handle,
00727                                                           &set_array[i],
00728                                                           (void **) &member_array);
00729                 if(subcount < 0)
00730                   {
00731                     rsbac_vfree(set_array);
00732                     goto out;
00733                   }
00734                 for(j=0; j<subcount; j++)
00735                   {
00736                     len += sprintf(buffer + len, "%u ",
00737                                    member_array[j]);
00738                     pos = begin + len;
00739                     if (pos < offset)
00740                       {
00741                         len = 0;
00742                         begin = pos;
00743                       }
00744                     if (pos > offset+length)
00745                       {
00746                         rsbac_vfree(set_array);
00747                         rsbac_vfree(member_array);
00748                         goto out;
00749                       }
00750                   };
00751                 if(subcount > 0)
00752                   rsbac_vfree(member_array);
00753                 len += sprintf(buffer + len, "\n");
00754                 pos = begin + len;
00755                 if (pos < offset)
00756                   {
00757                     len = 0;
00758                     begin = pos;
00759                   }
00760                 if (pos > offset+length)
00761                   {
00762                     rsbac_vfree(set_array);
00763                     goto out;
00764                   }
00765               };
00766             if(count > 0)
00767               rsbac_vfree(set_array);
00768             break;
00769           }
00770 
00771         case PA_out_pp_set:
00772           {
00773             rsbac_pm_out_pp_set_id_t * set_array;
00774             rsbac_pm_purpose_id_t    * member_array;
00775 
00776             count = rsbac_list_lol_get_all_desc(out_pp_set_handle, (void **) &set_array);
00777             if(count < 0)
00778               {
00779                 return count;
00780               }
00781 
00782             len += sprintf(buffer + len, "out-pp-set\tmembers\n");
00783             for(i=0; i<count; i++)
00784               {
00785                 len += sprintf(buffer + len, "%u\t\t",
00786                                set_array[i]);
00787                 pos = begin + len;
00788                 if (pos < offset)
00789                   {
00790                     len = 0;
00791                     begin = pos;
00792                   }
00793                 if (pos > offset+length)
00794                   {
00795                     rsbac_vfree(set_array);
00796                     goto out;
00797                   }
00798 
00799                 subcount = rsbac_list_lol_get_all_subdesc(out_pp_set_handle,
00800                                                           &set_array[i],
00801                                                           (void **) &member_array);
00802                 if(subcount < 0)
00803                   {
00804                     rsbac_vfree(set_array);
00805                     goto out;
00806                   }
00807                 for(j=0; j<subcount; j++)
00808                   {
00809                     len += sprintf(buffer + len, "%u ",
00810                                    member_array[j]);
00811                     pos = begin + len;
00812                     if (pos < offset)
00813                       {
00814                         len = 0;
00815                         begin = pos;
00816                       }
00817                     if (pos > offset+length)
00818                       {
00819                         rsbac_vfree(set_array);
00820                         rsbac_vfree(member_array);
00821                         goto out;
00822                       }
00823                   };
00824                 if(subcount > 0)
00825                   rsbac_vfree(member_array);
00826                 len += sprintf(buffer + len, "\n");
00827                 pos = begin + len;
00828                 if (pos < offset)
00829                   {
00830                     len = 0;
00831                     begin = pos;
00832                   }
00833                 if (pos > offset+length)
00834                   {
00835                     rsbac_vfree(set_array);
00836                     goto out;
00837                   }
00838               };
00839             if(count > 0)
00840               rsbac_vfree(set_array);
00841             break;
00842           }
00843 
00844 /***********/
00845           
00846         case PA_task:
00847           {
00848             rsbac_pm_task_id_t * desc_array;
00849 
00850             count = rsbac_list_get_all_desc(task_handle, (void **) &desc_array);
00851             if(count < 0)
00852               {
00853                 return count;
00854               }
00855 
00856             len += sprintf(buffer + len, "task-id\n");
00857             for(i=0; i<count; i++)
00858               {
00859                 len += sprintf(buffer + len, "%u\n",
00860                                desc_array[i]);
00861                 pos = begin + len;
00862                 if (pos < offset)
00863                   {
00864                     len = 0;
00865                     begin = pos;
00866                   }
00867                 if (pos > offset+length)
00868                   {
00869                     rsbac_vfree(desc_array);
00870                     goto out;
00871                   }
00872               };
00873             if(count > 0)
00874               rsbac_vfree(desc_array);
00875             break;
00876           }
00877 
00878         case PA_class:
00879           {
00880             rsbac_pm_object_class_id_t * desc_array;
00881 
00882             count = rsbac_list_get_all_desc(class_handle, (void **) &desc_array);
00883             if(count < 0)
00884               {
00885                 return count;
00886               }
00887 
00888             len += sprintf(buffer + len, "class-id\n");
00889             for(i=0; i<count; i++)
00890               {
00891                 len += sprintf(buffer + len, "%u\n",
00892                                desc_array[i]);
00893                 pos = begin + len;
00894                 if (pos < offset)
00895                   {
00896                     len = 0;
00897                     begin = pos;
00898                   }
00899                 if (pos > offset+length)
00900                   {
00901                     rsbac_vfree(desc_array);
00902                     goto out;
00903                   }
00904               };
00905             if(count > 0)
00906               rsbac_vfree(desc_array);
00907             break;
00908           }
00909 
00910         case PA_na:
00911           {
00912             struct rsbac_pm_na_data_t * data_array;
00913 
00914             count = rsbac_list_get_all_data(na_handle, (void **) &data_array);
00915             if(count < 0)
00916               {
00917                 return count;
00918               }
00919             len += sprintf(buffer + len, "task\tclass\ttp\taccesses\n");
00920             for(i=0; i<count; i++)
00921               {
00922                 len += sprintf(buffer + len, "%u\t%u\t%u\t%u\n",
00923                                data_array[i].task,
00924                                data_array[i].object_class,
00925                                data_array[i].tp,
00926                                data_array[i].accesses);
00927                 pos = begin + len;
00928                 if (pos < offset)
00929                   {
00930                     len = 0;
00931                     begin = pos;
00932                   }
00933                 if (pos > offset+length)
00934                   {
00935                     rsbac_vfree(data_array);
00936                     goto out;
00937                   }
00938               };
00939             if(count > 0)
00940               rsbac_vfree(data_array);
00941             break;
00942           }
00943           
00944         case PA_cs:
00945           {
00946             struct rsbac_pm_cs_id_t * desc_array;
00947 
00948             count = rsbac_list_get_all_desc(cs_handle, (void **) &desc_array);
00949             if(count < 0)
00950               {
00951                 return count;
00952               }
00953             len += sprintf(buffer + len, "purpose\tdevice\tinode\n");
00954             for(i=0; i<count; i++)
00955               {
00956                 len += sprintf(buffer + len, "%u\t%02u:02%u\t%u\n",
00957                                desc_array[i].purpose,
00958                                RSBAC_MAJOR(desc_array[i].file.device),
00959                                RSBAC_MINOR(desc_array[i].file.device),
00960                                desc_array[i].file.inode);
00961                 pos = begin + len;
00962                 if (pos < offset)
00963                   {
00964                     len = 0;
00965                     begin = pos;
00966                   }
00967                 if (pos > offset+length)
00968                   {
00969                     rsbac_vfree(desc_array);
00970                     goto out;
00971                   }
00972               };
00973             if(count > 0)
00974               rsbac_vfree(desc_array);
00975             break;
00976           }
00977           
00978         case PA_tp:
00979           {
00980             rsbac_pm_tp_id_t * desc_array;
00981 
00982             count = rsbac_list_get_all_desc(tp_handle, (void **) &desc_array);
00983             if(count < 0)
00984               {
00985                 return count;
00986               }
00987 
00988             len += sprintf(buffer + len, "tp-id\n");
00989             for(i=0; i<count; i++)
00990               {
00991                 len += sprintf(buffer + len, "%u\n",
00992                                desc_array[i]);
00993                 pos = begin + len;
00994                 if (pos < offset)
00995                   {
00996                     len = 0;
00997                     begin = pos;
00998                   }
00999                 if (pos > offset+length)
01000                   {
01001                     rsbac_vfree(desc_array);
01002                     goto out;
01003                   }
01004               };
01005             if(count > 0)
01006               rsbac_vfree(desc_array);
01007             break;
01008           }
01009           
01010         case PA_pp:
01011           {
01012             struct rsbac_pm_pp_data_t * data_array;
01013 
01014             count = rsbac_list_get_all_data(pp_handle, (void **) &data_array);
01015             if(count < 0)
01016               {
01017                 return count;
01018               }
01019             len += sprintf(buffer + len, "purpose\tdef-class\n");
01020             for(i=0; i<count; i++)
01021               {
01022                 len += sprintf(buffer + len, "%u\t%u\n",
01023                                data_array[i].id,
01024                                data_array[i].def_class);
01025                 pos = begin + len;
01026                 if (pos < offset)
01027                   {
01028                     len = 0;
01029                     begin = pos;
01030                   }
01031                 if (pos > offset+length)
01032                   {
01033                     rsbac_vfree(data_array);
01034                     goto out;
01035                   }
01036               };
01037             if(count > 0)
01038               rsbac_vfree(data_array);
01039             break;
01040           }
01041 
01042         case PA_tkt:
01043           {
01044             struct rsbac_pm_tkt_data_t * data_array;
01045 
01046             count = rsbac_list_get_all_data(tkt_handle, (void **) &data_array);
01047             if(count < 0)
01048               {
01049                 return count;
01050               }
01051             len += sprintf(buffer + len, "tkt-id\tvalid-for\tfunction-type\n");
01052             for(i=0; i<count; i++)
01053               {
01054                 char tmp1[RSBAC_MAXNAMELEN];
01055                 char tmp2[RSBAC_MAXNAMELEN];
01056 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
01057                 struct timespec now = CURRENT_TIME;
01058 #endif
01059 
01060                 tmp2[0] = 0;
01061 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
01062                 if(data_array[i].valid_until < now.tv_sec)
01063 #else
01064                 if(data_array[i].valid_until < CURRENT_TIME)
01065 #endif
01066                   {
01067                     strcpy(tmp2,"\t(removed on cleanup)");
01068                   }
01069                 len += sprintf(buffer + len, "%u\t%li\t\t%s%s\n",
01070                                data_array[i].id,
01071 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
01072                                data_array[i].valid_until - now.tv_sec,
01073 #else
01074                                data_array[i].valid_until - CURRENT_TIME,
01075 #endif
01076                                get_pm_function_type_name(tmp1, data_array[i].function_type),
01077                                tmp2);
01078                 pos = begin + len;
01079                 if (pos < offset)
01080                   {
01081                     len = 0;
01082                     begin = pos;
01083                   }
01084                 if (pos > offset+length)
01085                   {
01086                     rsbac_vfree(data_array);
01087                     goto out;
01088                   }
01089               };
01090             if(count > 0)
01091               rsbac_vfree(data_array);
01092             break;
01093           }
01094           
01095         default:
01096           rsbac_printk(KERN_WARNING
01097                  "pm_list_proc_read(): access to unknown list %i\n", list);
01098           return(-RSBAC_EINVALIDTARGET);
01099       }
01100 
01101   out:
01102     if(len <= offset+length)
01103       *eof=1;
01104     *start = buffer + (offset - begin);
01105     len -= (offset - begin);
01106   
01107     if (len > length)
01108       len = length;
01109     return len;
01110   }; /* end of list_proc_read */
01111 
01112 #endif /* CONFIG_PROC_FS && CONFIG_RSBAC_PROC */
01113 
01114 /************************************************* */
01115 /*               Init functions                    */
01116 /************************************************* */
01117 
01118 #ifdef CONFIG_RSBAC_INIT_DELAY
01119 static void registration_error(int err, char * listname)
01120 #else
01121 static void __init registration_error(int err, char * listname)
01122 #endif
01123   {
01124     if(err)
01125       {
01126         char * tmp = rsbac_kmalloc(RSBAC_MAXNAMELEN);
01127 
01128         if(tmp)
01129           {
01130             rsbac_printk(KERN_WARNING
01131                    "rsbac_init_pm(): Registering PM %s list failed with error %s\n",
01132                    listname,
01133                    get_error_name(tmp, err));
01134             rsbac_kfree(tmp);
01135           }
01136       }
01137   }
01138 
01139 /* All functions return 0, if no error occurred, and a negative error code  */
01140 /* otherwise. The error codes are defined in rsbac/error.h.                 */
01141 
01142 /************************************************************************** */
01143 /* Initialization of all PM data structures. After this call, all PM data   */
01144 /* is kept in memory for performance reasons, but is written to disk on     */
01145 /* every change.    */
01146 
01147 #ifdef CONFIG_RSBAC_INIT_DELAY
01148 int rsbac_init_pm(void)
01149 #else
01150 int __init rsbac_init_pm(void)
01151 #endif
01152   {
01153     int  err = 0;
01154     struct proc_dir_entry * tmp_entry_p;
01155     struct proc_dir_entry * pm_entry_p;
01156     struct rsbac_list_lol_info_t lol_info;
01157     struct rsbac_list_info_t     list_info;
01158 
01159     if (rsbac_is_initialized())
01160       {
01161         rsbac_printk(KERN_WARNING "rsbac_init_pm(): RSBAC already initialized\n");
01162         return(-RSBAC_EREINIT);
01163       }
01164 
01165     rsbac_printk(KERN_INFO "rsbac_init_pm(): Initializing RSBAC: PM subsystem\n");
01166 
01167 /* Helper lists */
01168     lol_info.version = RSBAC_PM_TASK_SET_LIST_VERSION;
01169     lol_info.key = RSBAC_PM_LIST_KEY;
01170     lol_info.desc_size = sizeof(rsbac_pm_task_set_id_t);
01171     lol_info.data_size = 0;
01172     lol_info.subdesc_size = sizeof(rsbac_pm_task_id_t);
01173     lol_info.subdata_size = 0;
01174     lol_info.max_age = 0;
01175     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01176                                   &task_set_handle,
01177                                   &lol_info,
01178                                   RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01179                                   rsbac_list_compare_u32,
01180                                   rsbac_list_compare_u32,
01181                                   NULL,
01182                                   NULL,
01183                                   NULL,
01184                                   NULL,
01185                                   RSBAC_PM_TASK_SET_LIST_NAME,
01186                                   RSBAC_AUTO_DEV);
01187     if(err)
01188       {
01189         registration_error(err, "task set");
01190         return err;
01191       }
01192 
01193     lol_info.version = RSBAC_PM_TP_SET_LIST_VERSION;
01194     lol_info.key = RSBAC_PM_LIST_KEY;
01195     lol_info.desc_size = sizeof(rsbac_pm_tp_set_id_t);
01196     lol_info.data_size = 0;
01197     lol_info.subdesc_size = sizeof(rsbac_pm_tp_id_t);
01198     lol_info.subdata_size = 0;
01199     lol_info.max_age = 0;
01200     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01201                                   &tp_set_handle,
01202                                   &lol_info,
01203                                   RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01204                                   rsbac_list_compare_u32,
01205                                   rsbac_list_compare_u32,
01206                                   NULL,
01207                                   NULL,
01208                                   NULL,
01209                                   NULL,
01210                                   RSBAC_PM_TP_SET_LIST_NAME,
01211                                   RSBAC_AUTO_DEV);
01212     if(err)
01213       {
01214         registration_error(err, "tp set");
01215         return err;
01216       }
01217 
01218     lol_info.version = RSBAC_PM_RU_SET_LIST_VERSION;
01219     lol_info.key = RSBAC_PM_LIST_KEY;
01220     lol_info.desc_size = sizeof(rsbac_pm_ru_set_id_t);
01221     lol_info.data_size = 0;
01222     lol_info.subdesc_size = sizeof(rsbac_uid_t);
01223     lol_info.subdata_size = 0;
01224     lol_info.max_age = 0;
01225     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01226                                   &ru_set_handle,
01227                                   &lol_info,
01228                                   RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01229                                   rsbac_list_compare_u32,
01230                                   rsbac_list_compare_u32,
01231                                   NULL,
01232                                   NULL,
01233                                   NULL,
01234                                   NULL,
01235                                   RSBAC_PM_RU_SET_LIST_NAME,
01236                                   RSBAC_AUTO_DEV);
01237     if(err)
01238       {
01239         registration_error(err, "ru set");
01240         return err;
01241       }
01242 
01243     lol_info.version = RSBAC_PM_PP_SET_LIST_VERSION;
01244     lol_info.key = RSBAC_PM_LIST_KEY;
01245     lol_info.desc_size = sizeof(rsbac_pm_pp_set_id_t);
01246     lol_info.data_size = 0;
01247     lol_info.subdesc_size = sizeof(rsbac_pm_purpose_id_t);
01248     lol_info.subdata_size = 0;
01249     lol_info.max_age = 0;
01250     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01251                                   &pp_set_handle,
01252                                   &lol_info,
01253                                   RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01254                                   rsbac_list_compare_u32,
01255                                   rsbac_list_compare_u32,
01256                                   NULL,
01257                                   NULL,
01258                                   NULL,
01259                                   NULL,
01260                                   RSBAC_PM_PP_SET_LIST_NAME,
01261                                   RSBAC_AUTO_DEV);
01262     if(err)
01263       {
01264         registration_error(err, "pp set");
01265         return err;
01266       }
01267 
01268     lol_info.version = RSBAC_PM_NO_VERSION;
01269     lol_info.key = RSBAC_PM_LIST_KEY;
01270     lol_info.desc_size = sizeof(rsbac_pm_in_pp_set_id_t);
01271     lol_info.data_size = 0;
01272     lol_info.subdesc_size = sizeof(rsbac_pm_purpose_id_t);
01273     lol_info.subdata_size = 0;
01274     lol_info.max_age = 0;
01275     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01276                                   &in_pp_set_handle,
01277                                   &lol_info,
01278                                   0,
01279                                   rsbac_list_compare_u32,
01280                                   rsbac_list_compare_u32,
01281                                   NULL,
01282                                   NULL,
01283                                   NULL,
01284                                   NULL,
01285                                   RSBAC_PM_IN_PP_SET_LIST_NAME,
01286                                   RSBAC_AUTO_DEV);
01287     if(err)
01288       {
01289         registration_error(err, "in_pp set");
01290         return err;
01291       }
01292 
01293     lol_info.version = RSBAC_PM_NO_VERSION;
01294     lol_info.key = RSBAC_PM_LIST_KEY;
01295     lol_info.desc_size = sizeof(rsbac_pm_out_pp_set_id_t);
01296     lol_info.data_size = 0;
01297     lol_info.subdesc_size = sizeof(rsbac_pm_purpose_id_t);
01298     lol_info.subdata_size = 0;
01299     lol_info.max_age = 0;
01300     err = rsbac_list_lol_register(RSBAC_LIST_VERSION,
01301                                   &out_pp_set_handle,
01302                                   &lol_info,
01303                                   0,
01304                                   rsbac_list_compare_u32,
01305                                   rsbac_list_compare_u32,
01306                                   NULL,
01307                                   NULL,
01308                                   NULL,
01309                                   NULL,
01310                                   RSBAC_PM_OUT_PP_SET_LIST_NAME,
01311                                   RSBAC_AUTO_DEV);
01312     if(err)
01313       {
01314         registration_error(err, "out_pp set");
01315         return err;
01316       }
01317 
01318 /* Main lists */
01319     list_info.version = RSBAC_PM_TASK_LIST_VERSION;
01320     list_info.key = RSBAC_PM_LIST_KEY;
01321     list_info.desc_size = sizeof(rsbac_pm_task_id_t);
01322     list_info.data_size = sizeof(struct rsbac_pm_task_data_t);
01323     list_info.max_age = 0;
01324     err = rsbac_list_register(RSBAC_LIST_VERSION,
01325                               &task_handle,
01326                               &list_info,
01327                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01328                               rsbac_list_compare_u32,
01329                               NULL,
01330                               NULL,
01331                               RSBAC_PM_TASK_LIST_NAME,
01332                               RSBAC_AUTO_DEV);
01333     if(err)
01334       {
01335         registration_error(err, "task");
01336         return err;
01337       }
01338 
01339     list_info.version = RSBAC_PM_CLASS_LIST_VERSION;
01340     list_info.key = RSBAC_PM_LIST_KEY;
01341     list_info.desc_size = sizeof(rsbac_pm_object_class_id_t);
01342     list_info.data_size = sizeof(struct rsbac_pm_class_data_t);
01343     list_info.max_age = 0;
01344     err = rsbac_list_register(RSBAC_LIST_VERSION,
01345                               &class_handle,
01346                               &list_info,
01347                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01348                               rsbac_list_compare_u32,
01349                               NULL,
01350                               NULL,
01351                               RSBAC_PM_CLASS_LIST_NAME,
01352                               RSBAC_AUTO_DEV);
01353     if(err)
01354       {
01355         registration_error(err, "class");
01356         return err;
01357       }
01358 
01359     list_info.version = RSBAC_PM_NA_LIST_VERSION;
01360     list_info.key = RSBAC_PM_LIST_KEY;
01361     list_info.desc_size = sizeof(struct rsbac_pm_na_id_t);
01362     list_info.data_size = sizeof(struct rsbac_pm_na_data_t);
01363     list_info.max_age = 0;
01364     err = rsbac_list_register(RSBAC_LIST_VERSION,
01365                               &na_handle,
01366                               &list_info,
01367                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01368                               rsbac_list_compare_u32,
01369                               NULL,
01370                               NULL,
01371                               RSBAC_PM_NA_LIST_NAME,
01372                               RSBAC_AUTO_DEV);
01373     if(err)
01374       {
01375         registration_error(err, "na");
01376         return err;
01377       }
01378 
01379     list_info.version = RSBAC_PM_CS_LIST_VERSION;
01380     list_info.key = RSBAC_PM_LIST_KEY;
01381     list_info.desc_size = sizeof(struct rsbac_pm_cs_id_t);
01382     list_info.data_size = sizeof(struct rsbac_pm_cs_data_t);
01383     list_info.max_age = 0;
01384     err = rsbac_list_register(RSBAC_LIST_VERSION,
01385                               &cs_handle,
01386                               &list_info,
01387                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01388                               rsbac_list_compare_u32,
01389                               NULL,
01390                               NULL,
01391                               RSBAC_PM_CS_LIST_NAME,
01392                               RSBAC_AUTO_DEV);
01393     if(err)
01394       {
01395         registration_error(err, "cs");
01396         return err;
01397       }
01398 
01399     list_info.version = RSBAC_PM_TP_LIST_VERSION;
01400     list_info.key = RSBAC_PM_LIST_KEY;
01401     list_info.desc_size = sizeof(rsbac_pm_tp_id_t);
01402     list_info.data_size = sizeof(struct rsbac_pm_tp_data_t);
01403     list_info.max_age = 0;
01404     err = rsbac_list_register(RSBAC_LIST_VERSION,
01405                               &tp_handle,
01406                               &list_info,
01407                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01408                               rsbac_list_compare_u32,
01409                               NULL,
01410                               NULL,
01411                               RSBAC_PM_TP_LIST_NAME,
01412                               RSBAC_AUTO_DEV);
01413     if(err)
01414       {
01415         registration_error(err, "tp");
01416         return err;
01417       }
01418 
01419     list_info.version = RSBAC_PM_PP_LIST_VERSION;
01420     list_info.key = RSBAC_PM_LIST_KEY;
01421     list_info.desc_size = sizeof(rsbac_pm_purpose_id_t);
01422     list_info.data_size = sizeof(struct rsbac_pm_pp_data_t);
01423     list_info.max_age = 0;
01424     err = rsbac_list_register(RSBAC_LIST_VERSION,
01425                               &pp_handle,
01426                               &list_info,
01427                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01428                               rsbac_list_compare_u32,
01429                               NULL,
01430                               NULL,
01431                               RSBAC_PM_PP_LIST_NAME,
01432                               RSBAC_AUTO_DEV);
01433     if(err)
01434       {
01435         registration_error(err, "pp");
01436         return err;
01437       }
01438 
01439     list_info.version = RSBAC_PM_TKT_LIST_VERSION;
01440     list_info.key = RSBAC_PM_LIST_KEY;
01441     list_info.desc_size = sizeof(rsbac_pm_tkt_id_t);
01442     list_info.data_size = sizeof(struct rsbac_pm_tkt_data_t);
01443     list_info.max_age = 0;
01444     err = rsbac_list_register(RSBAC_LIST_VERSION,
01445                               &tkt_handle,
01446                               &list_info,
01447                               RSBAC_LIST_PERSIST | RSBAC_LIST_BACKUP,
01448                               rsbac_list_compare_u32,
01449                               NULL,
01450                               NULL,
01451                               RSBAC_PM_TKT_LIST_NAME,
01452                               RSBAC_AUTO_DEV);
01453     if(err)
01454       {
01455         registration_error(err, "tkt");
01456         return err;
01457       }
01458 
01459     #if defined(CONFIG_RSBAC_PROC) && defined(CONFIG_PROC_FS)
01460     tmp_entry_p = create_proc_entry(RSBAC_PM_PROC_STATS_NAME,
01461                                     S_IFREG | S_IRUGO,
01462                                     proc_rsbac_root_p);
01463     if(tmp_entry_p)
01464       {
01465         tmp_entry_p->get_info = stats_pm_proc_info;
01466       }
01467 
01468     pm_entry_p = create_proc_entry(RSBAC_PM_PROC_DIR_NAME,
01469                                    S_IFDIR | S_IRUGO | S_IXUGO,
01470                                    proc_rsbac_root_p);
01471     if(pm_entry_p)
01472       {
01473         tmp_entry_p = create_proc_entry(RSBAC_PM_TASK_SET_LIST_PROC_NAME,
01474                                         S_IFREG | S_IRUGO,
01475                                         pm_entry_p);
01476         if(tmp_entry_p)
01477           {
01478             tmp_entry_p->read_proc = pm_list_proc_read;
01479             tmp_entry_p->data = (void *) PA_task_set;
01480           }
01481         tmp_entry_p = create_proc_entry(RSBAC_PM_TP_SET_LIST_PROC_NAME,
01482                                         S_IFREG | S_IRUGO,
01483                                         pm_entry_p);
01484         if(tmp_entry_p)
01485           {
01486             tmp_entry_p->read_proc = pm_list_proc_read;
01487             tmp_entry_p->data = (void *) PA_tp_set;
01488           }
01489         tmp_entry_p = create_proc_entry(RSBAC_PM_RU_SET_LIST_PROC_NAME,
01490                                         S_IFREG | S_IRUGO,
01491                                         pm_entry_p);
01492         if(tmp_entry_p)
01493           {
01494             tmp_entry_p->read_proc = pm_list_proc_read;
01495             tmp_entry_p->data = (void *) PA_ru_set;
01496           }
01497         tmp_entry_p = create_proc_entry(RSBAC_PM_PP_SET_LIST_PROC_NAME,
01498                                         S_IFREG | S_IRUGO,
01499                                         pm_entry_p);
01500         if(tmp_entry_p)
01501           {
01502             tmp_entry_p->read_proc = pm_list_proc_read;
01503             tmp_entry_p->data = (void *) PA_pp_set;
01504           }
01505         tmp_entry_p = create_proc_entry(RSBAC_PM_IN_PP_SET_LIST_PROC_NAME,
01506                                         S_IFREG | S_IRUGO,
01507                                         pm_entry_p);
01508         if(tmp_entry_p)
01509           {
01510             tmp_entry_p->read_proc = pm_list_proc_read;
01511             tmp_entry_p->data = (void *) PA_in_pp_set;
01512           }
01513         tmp_entry_p = create_proc_entry(RSBAC_PM_OUT_PP_SET_LIST_PROC_NAME,
01514                                         S_IFREG | S_IRUGO,
01515                                         pm_entry_p);
01516         if(tmp_entry_p)
01517           {
01518             tmp_entry_p->read_proc = pm_list_proc_read;
01519             tmp_entry_p->data = (void *) PA_out_pp_set;
01520           }
01521 
01522         tmp_entry_p = create_proc_entry(RSBAC_PM_TASK_LIST_PROC_NAME,
01523                                         S_IFREG | S_IRUGO,
01524                                         pm_entry_p);
01525         if(tmp_entry_p)
01526           {
01527             tmp_entry_p->read_proc = pm_list_proc_read;
01528             tmp_entry_p->data = (void *) PA_task;
01529           }
01530         tmp_entry_p = create_proc_entry(RSBAC_PM_CLASS_LIST_PROC_NAME,
01531                                         S_IFREG | S_IRUGO,
01532                                         pm_entry_p);
01533         if(tmp_entry_p)
01534           {
01535             tmp_entry_p->read_proc = pm_list_proc_read;
01536             tmp_entry_p->data = (void *) PA_class;
01537           }
01538         tmp_entry_p = create_proc_entry(RSBAC_PM_NA_LIST_PROC_NAME,
01539                                         S_IFREG | S_IRUGO,
01540                                         pm_entry_p);
01541         if(tmp_entry_p)
01542           {
01543             tmp_entry_p->read_proc = pm_list_proc_read;
01544             tmp_entry_p->data = (void *) PA_na;
01545           }
01546         tmp_entry_p = create_proc_entry(RSBAC_PM_CS_LIST_PROC_NAME,
01547                                         S_IFREG | S_IRUGO,
01548                                         pm_entry_p);
01549         if(tmp_entry_p)
01550           {
01551             tmp_entry_p->read_proc = pm_list_proc_read;
01552             tmp_entry_p->data = (void *) PA_cs;
01553           }
01554         tmp_entry_p = create_proc_entry(RSBAC_PM_TP_LIST_PROC_NAME,
01555                                         S_IFREG | S_IRUGO,
01556                                         pm_entry_p);
01557         if(tmp_entry_p)
01558           {
01559             tmp_entry_p->read_proc = pm_list_proc_read;
01560             tmp_entry_p->data = (void *) PA_tp;
01561           }
01562         tmp_entry_p = create_proc_entry(RSBAC_PM_PP_LIST_PROC_NAME,
01563                                         S_IFREG | S_IRUGO,
01564                                         pm_entry_p);
01565         if(tmp_entry_p)
01566           {
01567             tmp_entry_p->read_proc = pm_list_proc_read;
01568             tmp_entry_p->data = (void *) PA_pp;
01569           }
01570         tmp_entry_p = create_proc_entry(RSBAC_PM_TKT_LIST_PROC_NAME,
01571                                         S_IFREG | S_IRUGO,
01572                                         pm_entry_p);
01573         if(tmp_entry_p)
01574           {
01575             tmp_entry_p->read_proc = pm_list_proc_read;
01576             tmp_entry_p->data = (void *) PA_tkt;
01577           }
01578       }
01579     #endif
01580 
01581 #ifdef CONFIG_RSBAC_DEBUG
01582     if (rsbac_debug_ds_pm)
01583       {
01584         rsbac_printk(KERN_DEBUG "rsbac_init_pm(): Ready.\n");
01585       }
01586 #endif
01587     return(err);
01588   };
01589 
01590 /***************************************************/
01591 /* We also need some status information...         */
01592 
01593 int rsbac_stats_pm(void)
01594   {
01595     u_long                                   tmp_count;
01596     u_long                                   tmp_member_count;
01597     u_long                                   all_set_count = 0;
01598     u_long                                   all_member_count = 0;
01599     u_long                               all_count = 0;
01600   
01601     if (!rsbac_is_initialized())
01602       {
01603         rsbac_printk(KERN_WARNING "rsbac_stats_pm(): RSBAC not initialized\n");
01604         return(-RSBAC_ENOTINITIALIZED);
01605       }
01606 
01607 /****************/
01608 /* Helper lists */
01609 /****************/
01610 
01611     tmp_count = rsbac_list_lol_count(task_set_handle);
01612     tmp_member_count = rsbac_list_lol_all_subcount(task_set_handle);
01613     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu task-set-items, sum of %lu members\n",
01614                  tmp_count, tmp_member_count);
01615     all_set_count += tmp_count;
01616     all_member_count += tmp_member_count;
01617 
01618     tmp_count = rsbac_list_lol_count(tp_set_handle);
01619     tmp_member_count = rsbac_list_lol_all_subcount(tp_set_handle);
01620     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu tp set items, sum of %lu members\n",
01621                  tmp_count, tmp_member_count);
01622     all_set_count += tmp_count;
01623     all_member_count += tmp_member_count;
01624 
01625     tmp_count = rsbac_list_lol_count(ru_set_handle);
01626     tmp_member_count = rsbac_list_lol_all_subcount(ru_set_handle);
01627     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu ru set items, sum of %lu members\n",
01628                  tmp_count, tmp_member_count);
01629     all_set_count += tmp_count;
01630     all_member_count += tmp_member_count;
01631 
01632     tmp_count = rsbac_list_lol_count(pp_set_handle);
01633     tmp_member_count = rsbac_list_lol_all_subcount(pp_set_handle);
01634     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu pp set items, sum of %lu members\n",
01635                  tmp_count, tmp_member_count);
01636     all_set_count += tmp_count;
01637     all_member_count += tmp_member_count;
01638 
01639     tmp_count = rsbac_list_lol_count(in_pp_set_handle);
01640     tmp_member_count = rsbac_list_lol_all_subcount(in_pp_set_handle);
01641     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu input purpose set items, sum of %lu members\n",
01642                  tmp_count, tmp_member_count);
01643     all_set_count += tmp_count;
01644     all_member_count += tmp_member_count;
01645 
01646     tmp_count = rsbac_list_lol_count(out_pp_set_handle);
01647     tmp_member_count = rsbac_list_lol_all_subcount(out_pp_set_handle);
01648     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu output purpose set items, sum of %lu members\n",
01649                  tmp_count, tmp_member_count);
01650     all_set_count += tmp_count;
01651     all_member_count += tmp_member_count;
01652 
01653     rsbac_printk(KERN_INFO "rsbac_stats_pm(): Total of %lu registered rsbac-pm-set-items, %lu members\n",
01654                  all_set_count, all_member_count);
01655 
01656 /**************/
01657 /* Main lists */
01658 /**************/
01659     tmp_count = rsbac_list_count(task_handle);
01660     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu task items\n",
01661                  tmp_count);
01662     all_count += tmp_count;
01663 
01664     tmp_count = rsbac_list_count(class_handle);
01665     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu class items\n",
01666                  tmp_count);
01667     all_count += tmp_count;
01668 
01669     tmp_count = rsbac_list_count(na_handle);
01670     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu na items\n",
01671                  tmp_count);
01672     all_count += tmp_count;
01673 
01674     tmp_count = rsbac_list_count(cs_handle);
01675     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu cs items\n",
01676                  tmp_count);
01677     all_count += tmp_count;
01678 
01679     tmp_count = rsbac_list_count(tp_handle);
01680     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu tp items\n",
01681                  tmp_count);
01682     all_count += tmp_count;
01683 
01684     tmp_count = rsbac_list_count(pp_handle);
01685     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu pp items\n",
01686                  tmp_count);
01687     all_count += tmp_count;
01688 
01689     tmp_count = rsbac_list_count(tkt_handle);
01690     rsbac_printk(KERN_INFO "rsbac_stats_pm(): %lu tkt items\n",
01691                  tmp_count);
01692     all_count += tmp_count;
01693 
01694     rsbac_printk(KERN_INFO "rsbac_stats_pm(): Total of %lu registered rsbac-pm-items\n",
01695                  all_count);
01696     return 0;
01697   }
01698 
01699 /************************************************* */
01700 /*               Access functions                  */
01701 /************************************************* */
01702 
01703 /***********************/
01704 /* Helper lists / sets */
01705 /***********************/
01706 
01707 /* Trying to access a never created or removed set returns an error!        */
01708 
01709 
01710 /* rsbac_pm_add_to_set */
01711 /* Add a set member to a set sublist. Set behaviour: also returns success, */
01712 /* if member was already in set! */
01713 
01714 int rsbac_pm_add_to_set(
01715         rsbac_list_ta_number_t ta_number,
01716   enum  rsbac_pm_set_t set,
01717   union rsbac_pm_set_id_t id,
01718   union rsbac_pm_set_member_t member)
01719   {
01720     switch(set)
01721       {
01722         case PS_TASK:
01723           return(rsbac_ta_list_lol_subadd_ttl(ta_number, task_set_handle, 0, &id.task_set, &member.task, NULL));
01724         case PS_TP:
01725           return(rsbac_ta_list_lol_subadd_ttl(ta_number, tp_set_handle, 0, &id.tp_set, &member.tp, NULL));
01726         case PS_RU:
01727           return(rsbac_ta_list_lol_subadd_ttl(ta_number, ru_set_handle, 0, &id.ru_set, &member.ru, NULL));
01728         case PS_PP:
01729           return(rsbac_ta_list_lol_subadd_ttl(ta_number, pp_set_handle, 0, &id.pp_set, &member.pp, NULL));
01730         case PS_IN_PP:
01731           return(rsbac_ta_list_lol_subadd_ttl(ta_number, in_pp_set_handle, 0, &id.in_pp_set, &member.pp, NULL));
01732         case PS_OUT_PP:
01733           return(rsbac_ta_list_lol_subadd_ttl(ta_number, out_pp_set_handle, 0, &id.out_pp_set, &member.pp, NULL));
01734         default:
01735           return(-RSBAC_EINVALIDTARGET);
01736       }
01737   }
01738 
01739 /* rsbac_pm_remove_from_set */
01740 /* Remove a set member from a sublist. Set behaviour: Returns no error, if */
01741 /* member is not in list.                                                  */
01742 /* Caution: Writing to disk is not done in the remove functions!               */
01743 
01744 int rsbac_pm_remove_from_set(
01745         rsbac_list_ta_number_t ta_number,
01746   enum  rsbac_pm_set_t set,
01747   union rsbac_pm_set_id_t id,
01748   union rsbac_pm_set_member_t member)
01749   {
01750     switch(set)
01751       {
01752         case PS_TASK:
01753           return(rsbac_ta_list_lol_subremove(ta_number, task_set_handle, &id.task_set, &member.task));
01754         case PS_TP:
01755           return(rsbac_ta_list_lol_subremove(ta_number, tp_set_handle, &id.tp_set, &member.tp));
01756         case PS_RU:
01757           return(rsbac_ta_list_lol_subremove(ta_number, ru_set_handle, &id.ru_set, &member.ru));
01758         case PS_PP:
01759           return(rsbac_ta_list_lol_subremove(ta_number, pp_set_handle, &id.pp_set, &member.pp));
01760         case PS_IN_PP:
01761           return(rsbac_ta_list_lol_subremove(ta_number, in_pp_set_handle, &id.in_pp_set, &member.pp));
01762         case PS_OUT_PP:
01763           return(rsbac_ta_list_lol_subremove(ta_number, out_pp_set_handle, &id.out_pp_set, &member.pp));
01764         default:
01765           return(-RSBAC_EINVALIDTARGET);
01766       }
01767   }
01768 
01769 /* rsbac_pm_clear_set */
01770 /* Remove all set members from a sublist. Set behaviour: Returns no error, */
01771 /* if list is empty.                                                       */
01772 /* Caution: Writing to disk is not done in the remove functions!               */
01773 
01774 int rsbac_pm_clear_set(
01775         rsbac_list_ta_number_t ta_number,
01776   enum  rsbac_pm_set_t set,
01777   union rsbac_pm_set_id_t id)
01778   {
01779     switch(set)
01780       {
01781         case PS_TASK:
01782           return(rsbac_ta_list_lol_subremove_all(ta_number, task_set_handle, &id.task_set));
01783         case PS_TP:
01784           return(rsbac_ta_list_lol_subremove_all(ta_number, tp_set_handle, &id.tp_set));
01785         case PS_RU:
01786           return(rsbac_ta_list_lol_subremove_all(ta_number, ru_set_handle, &id.ru_set));
01787         case PS_PP:
01788           return(rsbac_ta_list_lol_subremove_all(ta_number, pp_set_handle, &id.pp_set));
01789         case PS_IN_PP:
01790           return(rsbac_ta_list_lol_subremove_all(ta_number, in_pp_set_handle, &id.in_pp_set));
01791         case PS_OUT_PP:
01792           return(rsbac_ta_list_lol_subremove_all(ta_number, out_pp_set_handle, &id.out_pp_set));
01793         default:
01794           return(-RSBAC_EINVALIDTARGET);
01795       }
01796   }
01797 
01798 /* rsbac_pm_set_member */
01799 /* Return truth value, whether member is in set */
01800 
01801 rsbac_boolean_t  rsbac_pm_set_member(
01802         rsbac_list_ta_number_t ta_number,
01803   enum  rsbac_pm_set_t set,
01804   union rsbac_pm_set_id_t id,
01805   union rsbac_pm_set_member_t member)
01806   {
01807     switch(set)
01808       {
01809         case PS_TASK:
01810           return(rsbac_ta_list_lol_subexist(ta_number, task_set_handle, &id.task_set, &member.task));
01811         case PS_TP:
01812           return(rsbac_ta_list_lol_subexist(ta_number, tp_set_handle, &id.tp_set, &member.tp));
01813         case PS_RU:
01814           return(rsbac_ta_list_lol_subexist(ta_number, ru_set_handle, &id.ru_set, &member.ru));
01815         case PS_PP:
01816           return(rsbac_ta_list_lol_subexist(ta_number, pp_set_handle, &id.pp_set, &member.pp));
01817         case PS_IN_PP:
01818           return(rsbac_ta_list_lol_subexist(ta_number, in_pp_set_handle, &id.in_pp_set, &member.pp));
01819         case PS_OUT_PP:
01820           return(rsbac_ta_list_lol_subexist(ta_number, out_pp_set_handle, &id.out_pp_set, &member.pp));
01821         default:
01822           return(FALSE);
01823       }
01824   }
01825 
01826 /* rsbac_pm_pp_subset */
01827 /* Return truth value, whether pp_set is subset of in_pp_set */
01828 
01829 rsbac_boolean_t  rsbac_pm_pp_subset (rsbac_pm_pp_set_id_t    pp_set,
01830                              rsbac_pm_in_pp_set_id_t in_pp_set)
01831   {
01832            rsbac_pm_purpose_id_t          * pp_array;
01833            long                             count;
01834            u_long                           i;
01835            rsbac_boolean_t                          result = TRUE;
01836 
01837     if(!pp_set || !in_pp_set)
01838       return(FALSE);
01839 
01840     /* get all pp_set members */
01841     count = rsbac_list_lol_get_all_subdesc(pp_set_handle, &pp_set, (void **) &pp_array);
01842     if(count < 0)
01843       return FALSE;
01844     if(!count)
01845       return TRUE;
01846     if(!rsbac_list_lol_exist(in_pp_set_handle, &in_pp_set))
01847       {
01848         rsbac_vfree(pp_array);
01849         return TRUE;
01850       }
01851     /* check all members in in_pp_set */
01852     for(i=0; i< count; i++)
01853       {
01854         if(!rsbac_list_lol_subexist(in_pp_set_handle, &in_pp_set, &pp_array[i]))
01855           {
01856             result = FALSE;
01857             break;
01858           }
01859       }
01860     rsbac_vfree(pp_array);
01861     return result;
01862   }
01863 
01864 /* rsbac_pm_pp_superset */
01865 /* Return truth value, whether pp_set is superset of out_pp_set */
01866 
01867 rsbac_boolean_t  rsbac_pm_pp_superset (rsbac_pm_pp_set_id_t    pp_set,
01868                                rsbac_pm_out_pp_set_id_t out_pp_set)
01869   {
01870            rsbac_pm_purpose_id_t          * pp_array;
01871            long                             count;
01872            u_long                           i;
01873            rsbac_boolean_t                          result = TRUE;
01874 
01875     if(!pp_set)
01876       return(FALSE);
01877     if(!out_pp_set)
01878       return(TRUE);
01879     if(!rsbac_list_lol_exist(pp_set_handle, &pp_set))
01880       return FALSE;
01881 
01882     /* get all pp_set members */
01883     count = rsbac_list_lol_get_all_subdesc(out_pp_set_handle, &out_pp_set, (void **) &pp_array);
01884     if(count <= 0)
01885       return TRUE;
01886     /* check all members in in_pp_set */
01887     for(i=0; i< count; i++)
01888       {
01889         if(!rsbac_list_lol_subexist(pp_set_handle, &pp_set, &pp_array[i]))
01890           {
01891             result = FALSE;
01892             break;
01893           }
01894       }
01895     rsbac_vfree(pp_array);
01896     return result;
01897   }
01898 
01899 /* rsbac_pm_pp_only */
01900 /* Return truth value, if there is no other item in out_pp_set than purpose */
01901 
01902 rsbac_boolean_t  rsbac_pm_pp_only (rsbac_pm_purpose_id_t    purpose,
01903                            rsbac_pm_out_pp_set_id_t out_pp_set)
01904   {
01905            long                             count;
01906 
01907     if(!out_pp_set)
01908       return(TRUE);
01909 
01910     /* get number of pp_set members */
01911     count = rsbac_list_lol_subcount(out_pp_set_handle, &out_pp_set);
01912     if(count <= 0)
01913       return TRUE;
01914     if(count == 1)
01915       return rsbac_list_lol_subexist(out_pp_set_handle, &out_pp_set, &purpose);
01916     else
01917       return FALSE;
01918   }
01919 
01920 /* rsbac_pm_pp_intersec */
01921 /* Create intersection of pp_set and in_pp_set in in_pp_set */
01922 /* If in_pp_set does not exist, it is created with all members of pp_set */
01923 /* If pp_set does not exist or one of them is invalid, an error is returned */
01924 
01925 int rsbac_pm_pp_intersec (rsbac_pm_pp_set_id_t      pp_set,
01926                           rsbac_pm_in_pp_set_id_t   in_pp_set)
01927   {
01928     rsbac_pm_purpose_id_t          * pp_array;
01929     long                             count;
01930     u_long                           i;
01931 
01932     if(!rsbac_list_lol_exist(pp_set_handle, &pp_set))
01933       return -RSBAC_EINVALIDVALUE;
01934 
01935     if(!rsbac_list_lol_exist(in_pp_set_handle, &in_pp_set))
01936       { /* in_pp_set not found -> try to create and fill with pp_set */
01937         if((count = rsbac_list_lol_add(in_pp_set_handle, &in_pp_set, NULL)))
01938           return count;
01939         /* creation successful -> copy list */
01940         /* get all pp_set members */
01941         count = rsbac_list_lol_get_all_subdesc(pp_set_handle, &pp_set, (void **) &pp_array);
01942         if(count <= 0)
01943           return count;
01944         for(i=0; i < count; i++)
01945           {
01946             rsbac_list_lol_subadd(in_pp_set_handle, &in_pp_set, &pp_array[i], NULL);
01947           }
01948         rsbac_vfree(pp_array);
01949       }
01950     else
01951       { /* in_pp_set exists -> remove all members not in pp_set */
01952         /* get all in_pp_set members */
01953         count = rsbac_list_lol_get_all_subdesc(in_pp_set_handle, &in_pp_set, (void **) &pp_array);
01954         if(count <= 0)
01955           return count;
01956         for(i=0; i < count; i++)
01957           {
01958             if(!rsbac_list_lol_subexist(pp_set_handle, &pp_set, &pp_array[i]))
01959               rsbac_list_lol_subremove(in_pp_set_handle, &in_pp_set, &pp_array[i]);
01960           }
01961         rsbac_vfree(pp_array);
01962       }
01963     return 0;
01964   }
01965 
01966 /* rsbac_pm_pp_union */
01967 /* Create union of pp_set and out_pp_set in out_pp_set
01968  * If out_pp_set does not exist, it is created with all members of pp_set
01969  * If pp_set does not exist or one of them is invalid, an error is returned */
01970 
01971 int rsbac_pm_pp_union (rsbac_pm_pp_set_id_t      pp_set,
01972                        rsbac_pm_out_pp_set_id_t   out_pp_set)
01973   {
01974     rsbac_pm_purpose_id_t          * pp_array;
01975     long                             count;
01976     u_long                           i;
01977     
01978     /* check, whether set-id pp_set exists */
01979     if(!rsbac_list_lol_exist(pp_set_handle, &pp_set))
01980       return -RSBAC_EINVALIDVALUE;
01981 
01982     if(!rsbac_list_lol_exist(out_pp_set_handle, &out_pp_set))
01983       { /* out_pp_set not found -> try to create */
01984         count = rsbac_list_lol_add(out_pp_set_handle, &out_pp_set, NULL);
01985         if(count)
01986           return count;
01987       }
01988     /* out_pp_set exists -> add all members in pp_set */
01989     /* get all pp_set members */
01990     count = rsbac_list_lol_get_all_subdesc(pp_set_handle, &pp_set, (void **) &pp_array);
01991     if(count <= 0)
01992       return count;
01993     for(i=0; i < count; i++)
01994       {
01995         rsbac_list_lol_subadd(out_pp_set_handle, &out_pp_set, &pp_array[i], NULL);
01996       }
01997     rsbac_vfree(pp_array);
01998     return 0;
01999   }
02000 
02001 /* rsbac_pm_create_set */
02002 /* Create a new set of given type set, using id id. Using any other set */
02003 /* function for a set id without creating this set returns an error.    */
02004 /* To empty an existing set use rsbac_pm_clear_set.                     */
02005 
02006 int rsbac_pm_create_set(
02007         rsbac_list_ta_number_t ta_number,
02008   enum  rsbac_pm_set_t set,
02009   union rsbac_pm_set_id_t id)
02010   {
02011     switch (set)
02012       {
02013         case PS_TASK:
02014 /*
02015 #ifdef CONFIG_RSBAC_DEBUG
02016           if (rsbac_debug_ds_pm)
02017             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating task set\n");
02018 #endif
02019 */
02020           if(rsbac_ta_list_lol_exist(ta_number, task_set_handle, &id.task_set))
02021             return -RSBAC_EEXISTS;
02022           return rsbac_ta_list_lol_add_ttl(ta_number, task_set_handle, 0, &id.task_set, NULL);
02023         case PS_TP:
02024 /*
02025 #ifdef CONFIG_RSBAC_DEBUG
02026           if (rsbac_debug_ds_pm)
02027             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating tp set\n");
02028 #endif
02029 */
02030           if(rsbac_ta_list_lol_exist(ta_number, tp_set_handle, &id.tp_set))
02031             return -RSBAC_EEXISTS;
02032           return rsbac_ta_list_lol_add_ttl(ta_number, tp_set_handle, 0, &id.tp_set, NULL);
02033         case PS_RU:
02034 /*
02035 #ifdef CONFIG_RSBAC_DEBUG
02036           if (rsbac_debug_ds_pm)
02037             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating ru set\n");
02038 #endif
02039 */
02040           if(rsbac_ta_list_lol_exist(ta_number, ru_set_handle, &id.ru_set))
02041             return -RSBAC_EEXISTS;
02042           return rsbac_ta_list_lol_add_ttl(ta_number, ru_set_handle, 0, &id.ru_set, NULL);
02043         case PS_PP:
02044 /*
02045 #ifdef CONFIG_RSBAC_DEBUG
02046           if (rsbac_debug_ds_pm)
02047             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating pp set\n");
02048 #endif
02049 */
02050           if(rsbac_ta_list_lol_exist(ta_number, pp_set_handle, &id.pp_set))
02051             return -RSBAC_EEXISTS;
02052           return rsbac_ta_list_lol_add_ttl(ta_number, pp_set_handle, 0, &id.pp_set, NULL);
02053         case PS_IN_PP:
02054 /*
02055 #ifdef CONFIG_RSBAC_DEBUG
02056           if (rsbac_debug_ds_pm)
02057             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating in_pp set\n");
02058 #endif
02059 */
02060           if(rsbac_ta_list_lol_exist(ta_number, in_pp_set_handle, &id.in_pp_set))
02061             return -RSBAC_EEXISTS;
02062           return rsbac_ta_list_lol_add_ttl(ta_number, in_pp_set_handle, 0, &id.in_pp_set, NULL);
02063         case PS_OUT_PP:
02064 /*
02065 #ifdef CONFIG_RSBAC_DEBUG
02066           if (rsbac_debug_ds_pm)
02067             rsbac_printk(KERN_DEBUG "rsbac_pm_create_set(): Creating out_pp set\n");
02068 #endif
02069 */
02070           if(rsbac_ta_list_lol_exist(ta_number, out_pp_set_handle, &id.out_pp_set))
02071             return -RSBAC_EEXISTS;
02072           return rsbac_ta_list_lol_add_ttl(ta_number, out_pp_set_handle, 0, &id.out_pp_set, NULL);
02073 
02074         default:
02075           return(-RSBAC_EINVALIDTARGET);          
02076       }
02077   }
02078 
02079 /* rsbac_pm_set_exist */
02080 /* Return rsbac_boolean_t value whether set exists */
02081 
02082 rsbac_boolean_t rsbac_pm_set_exist (
02083         rsbac_list_ta_number_t ta_number,
02084   enum  rsbac_pm_set_t set,
02085   union rsbac_pm_set_id_t id)
02086   {
02087     switch (set)
02088       {
02089         case PS_TASK:
02090           return rsbac_ta_list_lol_exist(ta_number, task_set_handle, &id.task_set);
02091         case PS_TP:
02092           return rsbac_ta_list_lol_exist(ta_number, tp_set_handle, &id.tp_set);
02093         case PS_RU:
02094           return rsbac_ta_list_lol_exist(ta_number, ru_set_handle, &id.ru_set);
02095         case PS_PP:
02096           return rsbac_ta_list_lol_exist(ta_number, pp_set_handle, &id.pp_set);
02097         case PS_IN_PP:
02098           return rsbac_ta_list_lol_exist(ta_number, in_pp_set_handle, &id.in_pp_set);
02099         case PS_OUT_PP:
02100           return rsbac_ta_list_lol_exist(ta_number, out_pp_set_handle, &id.out_pp_set);
02101 
02102         default:
02103           return FALSE;
02104       }
02105   }
02106 
02107 /* rsbac_pm_remove_set */
02108 /* Remove a full set. After this call the given id can only be used for */
02109 /* creating a new set, anything else returns an error.                  */
02110 /* To empty an existing set use rsbac_pm_clear_set.                     */
02111 /* Caution: Writing to disk is done in the remove_item functions!       */
02112 
02113 int rsbac_pm_remove_set(
02114         rsbac_list_ta_number_t ta_number,
02115   enum  rsbac_pm_set_t set,
02116   union rsbac_pm_set_id_t id)
02117   {
02118     switch (set)
02119       {
02120         case PS_TASK:
02121           return rsbac_ta_list_lol_remove(ta_number, task_set_handle, &id.task_set);
02122         case PS_TP:
02123           return rsbac_ta_list_lol_remove(ta_number, tp_set_handle, &id.tp_set);
02124         case PS_RU:
02125           return rsbac_ta_list_lol_remove(ta_number, ru_set_handle, &id.ru_set);
02126         case PS_PP:
02127           return rsbac_ta_list_lol_remove(ta_number, pp_set_handle, &id.pp_set);
02128         case PS_IN_PP:
02129           return rsbac_ta_list_lol_remove(ta_number, in_pp_set_handle, &id.in_pp_set);
02130         case PS_OUT_PP:
02131           return rsbac_ta_list_lol_remove(ta_number, out_pp_set_handle, &id.out_pp_set);
02132 
02133         default:
02134           return -RSBAC_EINVALIDTARGET;
02135       }
02136   }
02137 
02138 /**************/
02139 /* Main lists */
02140 /**************/
02141 
02142 /* rsbac_pm_get_data() and rsbac_pm_set_data() change single data values.   */
02143 /* rsbac_pm_add_target() adds a new list item and sets all data values as   */
02144 /* given. rsbac_pm_remove_target() removes an item.                         */
02145 
02146 /* A rsbac_pm_[sg]et_data() call for a non-existing target will return an   */
02147 /* error.*/
02148 /* Invalid parameter combinations return an error.                          */
02149 
02150 int rsbac_pm_get_data(
02151         rsbac_list_ta_number_t ta_number,
02152   enum  rsbac_pm_target_t target,
02153   union rsbac_pm_target_id_t tid,
02154   enum  rsbac_pm_data_t data,
02155   union rsbac_pm_data_value_t * value)
02156     { 
02157       int err = 0;
02158     
02159       if (!value)
02160         return(-RSBAC_EINVALIDVALUE);
02161 
02162       switch (target)
02163         {
02164           case PMT_TASK:
02165             {
02166               struct rsbac_pm_task_data_t all_data;
02167 
02168 /*
02169 #ifdef CONFIG_RSBAC_DEBUG
02170               if (rsbac_debug_ds_pm)
02171                 rsbac_printk(KERN_DEBUG
02172                        "rsbac_pm_get_data(): Getting task data\n");
02173 #endif
02174 */
02175               err = rsbac_ta_list_get_data_ttl(ta_number, task_handle,
02176                                                NULL, &tid.task, &all_data);
02177               if(err)
02178                 return err;
02179 
02180               switch (data)
02181                 {
02182                   case PD_purpose:
02183                     value->purpose = all_data.purpose;
02184                     break;
02185                   case PD_tp_set:
02186                     value->tp_set = all_data.tp_set;
02187                     break;
02188                   case PD_ru_set:
02189                     value->ru_set = all_data.ru_set;
02190                     break;
02191                   default:
02192                     return -RSBAC_EINVALIDATTR;
02193                 }
02194               return 0;
02195             }
02196 
02197           case PMT_CLASS:
02198             {
02199               struct rsbac_pm_class_data_t all_data;
02200 
02201 /*
02202 #ifdef CONFIG_RSBAC_DEBUG
02203               if (rsbac_debug_ds_pm)
02204                 rsbac_printk(KERN_DEBUG
02205                        "rsbac_pm_get_data(): Getting class data\n");
02206 #endif
02207 */
02208               err = rsbac_ta_list_get_data_ttl(ta_number, class_handle,
02209                                                NULL, &tid.object_class, &all_data);
02210               if(err)
02211                 return err;
02212 
02213               switch (data)
02214                 {
02215                   case PD_pp_set:
02216                     value->pp_set = all_data.pp_set;
02217                     break;
02218                   default:
02219                     return -RSBAC_EINVALIDATTR;
02220                 }
02221               return 0;
02222             }
02223             
02224           case PMT_NA:
02225             {
02226               struct rsbac_pm_na_data_t all_data;
02227 
02228 /*
02229 #ifdef CONFIG_RSBAC_DEBUG
02230               if (rsbac_debug_ds_pm)
02231                 rsbac_printk(KERN_DEBUG
02232                        "rsbac_pm_get_data(): Getting na data\n");
02233 #endif
02234 */
02235               err = rsbac_ta_list_get_data_ttl(ta_number, na_handle,
02236                                                NULL, &tid.na, &all_data);
02237               if(err)
02238                 return err;
02239 
02240               switch (data)
02241                 {
02242                   case PD_task:
02243                      value->task = all_data.task;
02244                     break;
02245                   case PD_class:
02246                     value->object_class = all_data.object_class;
02247                     break;
02248                   case PD_tp:
02249                     value->tp = all_data.tp;
02250                     break;
02251                   case PD_accesses:
02252                     value->accesses = all_data.accesses;
02253                     break;
02254                   default:
02255                     return -RSBAC_EINVALIDATTR;
02256                 }
02257               return 0;
02258             }
02259             
02260           case PMT_CS:
02261             {
02262               struct rsbac_pm_cs_data_t all_data;
02263 
02264 /*
02265 #ifdef CONFIG_RSBAC_DEBUG
02266               if (rsbac_debug_ds_pm)
02267                 rsbac_printk(KERN_DEBUG
02268                        "rsbac_pm_get_data(): Getting cs data\n");
02269 #endif
02270 */
02271               err = rsbac_ta_list_get_data_ttl(ta_number, cs_handle,
02272                                                NULL, &tid.cs, &all_data);
02273               if(err)
02274                 return err;
02275 
02276               switch (data)
02277                 {
02278                   case PD_purpose:
02279                     value->purpose = all_data.purpose;
02280                     break;
02281                   case PD_file:
02282                     value->file = all_data.file;
02283                     break;
02284                   default:
02285                     return -RSBAC_EINVALIDATTR;
02286                 }
02287               return 0;
02288             }
02289             
02290           case PMT_TP:
02291             {
02292               struct rsbac_pm_tp_data_t all_data;
02293 
02294 /*
02295 #ifdef CONFIG_RSBAC_DEBUG
02296               if (rsbac_debug_ds_pm)
02297                 rsbac_printk(KERN_DEBUG
02298                        "rsbac_pm_get_data(): Getting tp data\n");
02299 #endif
02300 */
02301               err = rsbac_ta_list_get_data_ttl(ta_number, tp_handle,
02302                                                NULL, &tid.tp, &all_data);
02303               if(err)
02304                 return err;
02305 
02306               switch (data)
02307                 {
02308                   case PD_tp:
02309                     value->tp = all_data.id;
02310                     break;
02311                   default:
02312                     return -RSBAC_EINVALIDATTR;
02313                 }
02314               return 0;
02315             }
02316             
02317           case PMT_PP:
02318             {
02319               struct rsbac_pm_pp_data_t all_data;
02320 
02321 /*
02322 #ifdef CONFIG_RSBAC_DEBUG
02323               if (rsbac_debug_ds_pm)
02324                 rsbac_printk(KERN_DEBUG
02325                        "rsbac_pm_get_data(): Getting pp data\n");
02326 #endif
02327 */
02328               err = rsbac_ta_list_get_data_ttl(ta_number, pp_handle,
02329                                                NULL, &tid.pp, &all_data);
02330               if(err)
02331                 return err;
02332 
02333               switch (data)
02334                 {
02335                   case PD_purpose:
02336                     value->purpose = all_data.id;
02337                     break;
02338                   case PD_def_class:
02339                     value->def_class = all_data.def_class;
02340                     break;
02341                   default:
02342                     return -RSBAC_EINVALIDATTR;
02343                 }
02344               return 0;
02345             }
02346             
02347           case PMT_TKT:
02348             {
02349               struct rsbac_pm_tkt_data_t all_data;
02350 
02351 /*
02352 #ifdef CONFIG_RSBAC_DEBUG
02353               if (rsbac_debug_ds_pm)
02354                 rsbac_printk(KERN_DEBUG
02355                        "rsbac_pm_get_data(): Getting tkt data\n");
02356 #endif
02357 */
02358               err = rsbac_ta_list_get_data_ttl(ta_number, tkt_handle,
02359                                                NULL, &tid.tkt, &all_data);
02360               if(err)
02361                 return err;
02362 
02363               switch (data)
02364                 {
02365                   case PD_issuer:
02366                     value->issuer = all_data.issuer;
02367                     break;
02368                   case PD_function_type:
02369                     value->function_type = all_data.function_type;
02370                     break;
02371                   case PD_function_param:
02372                     value->function_param = all_data.function_param;
02373                     break;
02374                   case PD_valid_until:
02375                     value->valid_until = all_data.valid_until;
02376                     break;
02377                   default:
02378                     return -RSBAC_EINVALIDATTR;
02379                 }
02380               return 0;
02381             }
02382 
02383           /* switch target: no valid target */
02384           default:  
02385             return(-RSBAC_EINVALIDTARGET);
02386         }
02387     };      /* end of rsbac_pm_get_data() */
02388 
02389 /************************************************************************** */
02390 
02391 int rsbac_pm_get_all_data(
02392         rsbac_list_ta_number_t ta_number,
02393   enum  rsbac_pm_target_t target,
02394   union rsbac_pm_target_id_t tid,
02395   union rsbac_pm_all_data_value_t * value)
02396     { 
02397       if (!value)
02398         return(-RSBAC_EINVALIDVALUE);
02399       switch (target)
02400         {
02401           case PMT_TASK:
02402 /*
02403 #ifdef CONFIG_RSBAC_DEBUG
02404             if (rsbac_debug_ds_pm)
02405               rsbac_printk(KERN_DEBUG
02406                      "rsbac_pm_get_data(): Getting task data\n");
02407 #endif
02408 */
02409             return rsbac_ta_list_get_data_ttl(ta_number, task_handle,
02410                                               NULL, &tid.task, &value->task);
02411 
02412           case PMT_CLASS:
02413 /*
02414 #ifdef CONFIG_RSBAC_DEBUG
02415             if (rsbac_debug_ds_pm)
02416               rsbac_printk(KERN_DEBUG
02417                      "rsbac_pm_get_data(): Getting class data\n");
02418 #endif
02419 */
02420             return rsbac_ta_list_get_data_ttl(ta_number, class_handle,
02421                                               NULL, &tid.object_class, &value->object_class);
02422 
02423           case PMT_NA:
02424 /*
02425 #ifdef CONFIG_RSBAC_DEBUG
02426             if (rsbac_debug_ds_pm) 
02427               rsbac_printk(KERN_DEBUG
02428                      "rsbac_pm_get_data(): Getting na data\n");
02429 #endif
02430 */
02431             return rsbac_ta_list_get_data_ttl(ta_number, na_handle,
02432                                               NULL, &tid.na, &value->na);
02433 
02434           case PMT_CS:
02435 /*
02436 #ifdef CONFIG_RSBAC_DEBUG
02437             if (rsbac_debug_ds_pm)
02438               rsbac_printk(KERN_DEBUG
02439                      "rsbac_pm_get_data(): Getting cs data\n");
02440 #endif
02441 */
02442             return rsbac_ta_list_get_data_ttl(ta_number, cs_handle,
02443                                               NULL, &tid.cs, &value->cs);
02444 
02445           case PMT_TP:
02446 /*
02447 #ifdef CONFIG_RSBAC_DEBUG
02448             if (rsbac_debug_ds_pm)
02449               rsbac_printk(KERN_DEBUG
02450                      "rsbac_pm_get_data(): Getting tp data\n");
02451 #endif
02452 */
02453             return rsbac_ta_list_get_data_ttl(ta_number, tp_handle,
02454                                               NULL, &tid.tp, &value->tp);
02455 
02456           case PMT_PP:
02457 /*
02458 #ifdef CONFIG_RSBAC_DEBUG
02459             if (rsbac_debug_ds_pm)
02460               rsbac_printk(KERN_DEBUG
02461                      "rsbac_pm_get_data(): Getting pp data\n");
02462 #endif
02463 */
02464             return rsbac_ta_list_get_data_ttl(ta_number, pp_handle,
02465                                               NULL, &tid.pp, &value->pp);
02466 
02467           case PMT_TKT:
02468 /*
02469 #ifdef CONFIG_RSBAC_DEBUG
02470             if (rsbac_debug_ds_pm)
02471               rsbac_printk(KERN_DEBUG
02472                      "rsbac_pm_get_data(): Getting tkt data\n");
02473 #endif
02474 */
02475             return rsbac_ta_list_get_data_ttl(ta_number, tkt_handle,
02476                                               NULL, &tid.tkt, &value->tkt);
02477 
02478           /* switch target: no valid target */
02479           default:  
02480             return(-RSBAC_EINVALIDTARGET);
02481         }
02482     }      /* end of rsbac_pm_get_all_data() */
02483 
02484 /************************************************************************** */
02485 
02486 rsbac_boolean_t rsbac_pm_exists(
02487         rsbac_list_ta_number_t ta_number,
02488   enum  rsbac_pm_target_t target,
02489   union rsbac_pm_target_id_t tid)
02490     { 
02491       switch (target)
02492         {
02493           case PMT_TASK:
02494             return rsbac_ta_list_exist(ta_number, task_handle, &tid.task);
02495 
02496           case PMT_CLASS:
02497             /* IPC and DEV classes always exist */
02498             if(   (tid.object_class == RSBAC_PM_IPC_OBJECT_CLASS_ID)
02499                || (tid.object_class == RSBAC_PM_DEV_OBJECT_CLASS_ID))
02500               return(TRUE);
02501             return rsbac_ta_list_exist(ta_number, class_handle, &tid.object_class);
02502 
02503           case PMT_NA:
02504             return rsbac_ta_list_exist(ta_number, na_handle, &tid.na);
02505 
02506           case PMT_CS:
02507             return rsbac_ta_list_exist(ta_number, cs_handle, &tid.cs);
02508 
02509           case PMT_TP:
02510             return rsbac_ta_list_exist(ta_number, tp_handle, &tid.tp);
02511 
02512           case PMT_PP:
02513             return rsbac_ta_list_exist(ta_number, pp_handle, &tid.pp);
02514 
02515           case PMT_TKT:
02516             {
02517               struct rsbac_pm_tkt_data_t all_data;
02518 
02519               if(rsbac_ta_list_get_data_ttl(ta_number, tkt_handle,
02520                                             NULL, &tid.tkt, &all_data))
02521                 return FALSE;
02522 
02523               /* ticket too old? -> remove it and return FALSE */
02524               {
02525                 if(all_data.valid_until < RSBAC_CURRENT_TIME)
02526                   {
02527                     rsbac_pm_pp_set_id_t pp_set = -tid.tkt;
02528 
02529                     if(rsbac_ta_list_lol_exist(ta_number, pp_set_handle, &pp_set))
02530                       rsbac_ta_list_lol_remove(ta_number, pp_set_handle, &pp_set);
02531                     rsbac_ta_list_remove(ta_number, tkt_handle, &tid.tkt);
02532                     return(FALSE);
02533                   }
02534                 else
02535                   return TRUE;
02536               }
02537             }
02538           /* switch target: no valid target */
02539           default:  
02540             rsbac_printk(KERN_WARNING
02541                    "rsbac_pm_exists(): Invalid target!\n");
02542             return FALSE;
02543         }
02544     }      /* end of rsbac_pm_exists() */
02545 
02546 /************************************************************************** */
02547 
02548 int rsbac_pm_set_data(
02549         rsbac_list_ta_number_t ta_number,
02550   enum  rsbac_pm_target_t target,
02551   union rsbac_pm_target_id_t tid,
02552   enum  rsbac_pm_data_t data,
02553   union rsbac_pm_data_value_t value)
02554     { 
02555       switch (target)
02556         {
02557           case PMT_TASK:
02558             {
02559               struct rsbac_pm_task_data_t all_data;
02560                      int                  err;
02561 
02562 /*
02563 #ifdef CONFIG_RSBAC_DEBUG
02564               if (rsbac_debug_ds_pm)
02565                 rsbac_printk(KERN_DEBUG
02566                        "rsbac_pm_set_data(): Setting task data\n");
02567 #endif
02568 */
02569               err = rsbac_ta_list_get_data_ttl(ta_number, task_handle,
02570                                                NULL, &tid.task, &all_data);
02571               if(err)
02572                 return err;
02573 
02574               switch (data)
02575                 {
02576                   case PD_purpose:
02577                     all_data.purpose = value.purpose;
02578                     break;
02579                   case PD_tp_set:
02580                     all_data.tp_set = value.tp_set;
02581                     break;
02582                   case PD_ru_set:
02583                     all_data.ru_set = value.ru_set;
02584                     break;
02585                   default:
02586                     return -RSBAC_EINVALIDATTR;
02587                 }
02588               err = rsbac_ta_list_add_ttl(ta_number, task_handle, 0, &tid.task, &all_data);
02589               return err;
02590             }
02591 
02592           case PMT_CLASS:
02593             {
02594               struct rsbac_pm_class_data_t all_data;
02595                      int                   err;
02596 
02597 /*
02598 #ifdef CONFIG_RSBAC_DEBUG
02599               if (rsbac_debug_ds_pm)
02600                 rsbac_printk(KERN_DEBUG
02601                        "rsbac_pm_set_data(): Setting class data\n");
02602 #endif
02603 */
02604               err = rsbac_ta_list_get_data_ttl(ta_number, class_handle,
02605                                                NULL, &tid.object_class, &all_data);
02606               if(err)
02607                 return err;
02608 
02609               switch (data)
02610                 {
02611                   case PD_pp_set:
02612                     all_data.pp_set = value.pp_set;
02613                     break;
02614                   default:
02615                     return -RSBAC_EINVALIDATTR;
02616                 }
02617               err = rsbac_ta_list_add_ttl(ta_number, class_handle, 0, &tid.object_class, &all_data);
02618               return err;
02619             }
02620 
02621           case PMT_NA:
02622             {
02623               struct rsbac_pm_na_data_t all_data;
02624                      int                err;
02625 
02626 /*
02627 #ifdef CONFIG_RSBAC_DEBUG
02628               if (rsbac_debug_ds_pm)
02629                 rsbac_printk(KERN_DEBUG
02630                        "rsbac_pm_set_data(): Setting na data\n");
02631 #endif
02632 */
02633               err = rsbac_ta_list_get_data_ttl(ta_number, na_handle,
02634                                                NULL, &tid.na, &all_data);
02635               if(err)
02636                 return err;
02637 
02638               switch (data)
02639                 {
02640                   case PD_task:
02641                     all_data.task = value.task;
02642                     break;
02643                   case PD_class:
02644                     all_data.object_class = value.object_class;
02645                     break;
02646                   case PD_tp:
02647                     all_data.tp = value.tp;
02648                     break;
02649                   case PD_accesses:
02650                     all_data.accesses = value.accesses;
02651                     break;
02652                   default:
02653                     return -RSBAC_EINVALIDATTR;
02654                 }
02655               err = rsbac_ta_list_add_ttl(ta_number, na_handle, 0, &tid.na, &all_data);
02656               return err;
02657             }
02658 
02659           case PMT_CS:
02660             {
02661               struct rsbac_pm_cs_data_t all_data;
02662                      int                err;
02663 
02664 /*
02665 #ifdef CONFIG_RSBAC_DEBUG
02666               if (rsbac_debug_ds_pm)
02667                 rsbac_printk(KERN_DEBUG
02668                        "rsbac_pm_set_data(): Setting cs data\n");
02669 #endif
02670 */
02671               err = rsbac_ta_list_get_data_ttl(ta_number, cs_handle,
02672                                                NULL, &tid.cs, &all_data);
02673               if(err)
02674                 return err;
02675 
02676               switch (data)
02677                 {
02678                   case PD_purpose:
02679                     all_data.purpose = value.purpose;
02680                     break;
02681                   case PD_file:
02682                     all_data.file = value.file;
02683                     break;
02684                   default:
02685                     return -RSBAC_EINVALIDATTR;
02686                 }
02687               err = rsbac_ta_list_add_ttl(ta_number, cs_handle, 0, &tid.cs, &all_data);
02688               return err;
02689             }
02690 
02691           case PMT_TP:
02692             return -RSBAC_EINVALIDATTR;
02693 
02694           case PMT_PP:
02695             {
02696               struct rsbac_pm_pp_data_t all_data;
02697                      int                err;
02698 
02699 /*
02700 #ifdef CONFIG_RSBAC_DEBUG
02701               if (rsbac_debug_ds_pm)
02702                 rsbac_printk(KERN_DEBUG
02703                        "rsbac_pm_set_data(): Setting pp data\n");
02704 #endif
02705 */
02706               err = rsbac_ta_list_get_data_ttl(ta_number, pp_handle,
02707                                                NULL, &tid.pp, &all_data);
02708               if(err)
02709                 return err;
02710 
02711               switch (data)
02712                 {
02713                   case PD_def_class:
02714                     all_data.def_class = value.def_class;
02715                     break;
02716                   default:
02717                     return -RSBAC_EINVALIDATTR;
02718                 }
02719               err = rsbac_ta_list_add_ttl(ta_number, pp_handle, 0, &tid.pp, &all_data);
02720               return err;
02721             }
02722 
02723           case PMT_TKT:
02724             {
02725               struct rsbac_pm_tkt_data_t all_data;
02726                      int                 err;
02727 
02728 /*
02729 #ifdef CONFIG_RSBAC_DEBUG
02730               if (rsbac_debug_ds_pm)
02731                 rsbac_printk(KERN_DEBUG
02732                        "rsbac_pm_set_data(): Setting tkt data\n");
02733 #endif
02734 */
02735               err = rsbac_ta_list_get_data_ttl(ta_number, tkt_handle,
02736                                                NULL, &tid.tkt, &all_data);
02737               if(err)
02738                 return err;
02739 
02740               switch (data)
02741                 {
02742                   case PD_issuer:
02743                     all_data.issuer = value.issuer;
02744                     break;
02745                   case PD_function_type:
02746                     all_data.function_type = value.function_type;
02747                     break;
02748                   case PD_function_param:
02749                     all_data.function_param = value.function_param;
02750                     break;
02751                   case PD_valid_until:
02752                     all_data.valid_until = value.valid_until;
02753                     break;
02754                   default:
02755                     return -RSBAC_EINVALIDATTR;
02756                 }
02757               err = rsbac_ta_list_add_ttl(ta_number, tkt_handle, 0, &tid.tkt, &all_data);
02758               return err;
02759             }
02760 
02761           /* switch target: no valid target */
02762           default:  
02763             return(-RSBAC_EINVALIDTARGET);
02764         }
02765     }      /* end of rsbac_pm_set_data() */
02766 
02767 /************************************************************************** */
02768 
02769 int rsbac_pm_add_target(
02770         rsbac_list_ta_number_t ta_number,
02771   enum  rsbac_pm_target_t target,
02772   union rsbac_pm_all_data_value_t data)
02773     { 
02774       switch (target)
02775         {
02776           case PMT_TASK:
02777 /*
02778 #ifdef CONFIG_RSBAC_DEBUG
02779             if (rsbac_debug_ds_pm)
02780               rsbac_printk(KERN_DEBUG
02781                      "rsbac_pm_add_target(): Adding task item\n");
02782 #endif
02783 */
02784             return rsbac_ta_list_add_ttl(ta_number, task_handle, 0, &data.task.id, &data.task);
02785             
02786           case PMT_CLASS:
02787 /*
02788 #ifdef CONFIG_RSBAC_DEBUG
02789             if (rsbac_debug_ds_pm)
02790               rsbac_printk(KERN_DEBUG
02791                      "rsbac_pm_add_target(): Adding class item\n");
02792 #endif
02793 */
02794             return rsbac_ta_list_add_ttl(ta_number, class_handle, 0, &data.object_class.id, &data.object_class);
02795 
02796           case PMT_NA:
02797             {
02798               struct rsbac_pm_na_id_t na_id;
02799 
02800 /*
02801 #ifdef CONFIG_RSBAC_DEBUG
02802               if (rsbac_debug_ds_pm)
02803                 rsbac_printk(KERN_DEBUG
02804                        "rsbac_pm_add_target(): Adding na item\n");
02805 #endif
02806 */
02807               na_id.task = data.na.task;
02808               na_id.object_class = data.na.object_class;
02809               na_id.tp = data.na.tp;
02810               return rsbac_ta_list_add_ttl(ta_number, na_handle, 0, &na_id, &data.na);
02811             }
02812 
02813           case PMT_CS:
02814             {
02815               struct rsbac_pm_cs_id_t cs_id;
02816 
02817 /*
02818 #ifdef CONFIG_RSBAC_DEBUG
02819               if (rsbac_debug_ds_pm)
02820                 rsbac_printk(KERN_DEBUG
02821                        "rsbac_pm_add_target(): Adding cs item\n");
02822 #endif
02823 */
02824               cs_id.purpose = data.cs.purpose;
02825               cs_id.file = data.cs.file;
02826               return rsbac_ta_list_add_ttl(ta_number, cs_handle, 0, &cs_id, &data.cs);
02827             }
02828 
02829           case PMT_TP:
02830 /*
02831 #ifdef CONFIG_RSBAC_DEBUG
02832             if (rsbac_debug_ds_pm)
02833               rsbac_printk(KERN_DEBUG
02834                      "rsbac_pm_add_target(): Adding tp item\n");
02835 #endif
02836 */
02837             return rsbac_ta_list_add_ttl(ta_number, tp_handle, 0, &data.tp.id, &data.tp);
02838 
02839           case PMT_PP:
02840 /*
02841 #ifdef CONFIG_RSBAC_DEBUG
02842             if (rsbac_debug_ds_pm)
02843               rsbac_printk(KERN_DEBUG
02844                      "rsbac_pm_add_target(): Adding pp item\n");
02845 #endif
02846 */
02847             return rsbac_ta_list_add_ttl(ta_number, pp_handle, 0, &data.pp.id, &data.pp);
02848 
02849           case PMT_TKT:
02850 /*
02851 #ifdef CONFIG_RSBAC_DEBUG
02852             if (rsbac_debug_ds_pm)
02853               rsbac_printk(KERN_DEBUG
02854                      "rsbac_pm_add_target(): Adding tkt item\n");
02855 #endif
02856 */
02857             return rsbac_ta_list_add_ttl(ta_number, tkt_handle, 0, &data.tkt.id, &data.tkt);
02858 
02859           /* switch target: no valid target */
02860           default:  
02861             return(-RSBAC_EINVALIDTARGET);
02862         }
02863     }      /* end of rsbac_pm_add_target() */
02864 
02865 /************************************************************************** */
02866 
02867 int rsbac_pm_remove_target(
02868         rsbac_list_ta_number_t ta_number,
02869   enum  rsbac_pm_target_t target,
02870   union rsbac_pm_target_id_t tid)
02871     { 
02872       switch (target)
02873         {
02874           case PMT_TASK:
02875 /*
02876 #ifdef CONFIG_RSBAC_DEBUG
02877             if (rsbac_debug_ds_pm)
02878               rsbac_printk(KERN_DEBUG
02879                      "rsbac_pm_remove_target(): Removing task data\n");
02880 #endif
02881 */
02882             return rsbac_ta_list_remove(ta_number, task_handle, &tid.task);
02883 
02884           case PMT_CLASS:
02885 /*
02886 #ifdef CONFIG_RSBAC_DEBUG
02887             if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02888                         "rsbac_pm_remove_target(): Removing class data");
02889 #endif
02890 */
02891             return rsbac_ta_list_remove(ta_number, class_handle, &tid.object_class);
02892 
02893           case PMT_NA:
02894 /*
02895 #ifdef CONFIG_RSBAC_DEBUG
02896             if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02897                         "rsbac_pm_remove_target(): Removing tp data");
02898 #endif
02899 */
02900             return rsbac_ta_list_remove(ta_number, na_handle, &tid.na);
02901 
02902           case PMT_CS:
02903 /*
02904 #ifdef CONFIG_RSBAC_DEBUG
02905             if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02906                         "rsbac_pm_remove_target(): Removing cs data");
02907 #endif
02908 */
02909             return rsbac_ta_list_remove(ta_number, cs_handle, &tid.cs);
02910 
02911           case PMT_TP:
02912 /*
02913 #ifdef CONFIG_RSBAC_DEBUG
02914             if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02915                         "rsbac_pm_remove_target(): Removing tp data");
02916 #endif
02917 */
02918             return rsbac_ta_list_remove(ta_number, tp_handle, &tid.tp);
02919 
02920           case PMT_PP:
02921 /*
02922 #ifdef CONFIG_RSBAC_DEBUG
02923             if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02924                         "rsbac_pm_remove_target(): Removing pp data");
02925 #endif
02926 */
02927             return rsbac_ta_list_remove(ta_number, pp_handle, &tid.pp);
02928 
02929           case PMT_TKT:
02930             {
02931               rsbac_pm_pp_set_id_t pp_set = -tid.tkt;
02932 
02933 /*
02934 #ifdef CONFIG_RSBAC_DEBUG
02935               if (rsbac_debug_ds_pm) rsbac_printk(KERN_DEBUG "%s\n",
02936                           "rsbac_pm_remove_target(): Removing tkt data");
02937 #endif
02938 */
02939               if(rsbac_ta_list_lol_exist(ta_number, pp_set_handle, &pp_set))
02940                 rsbac_ta_list_lol_remove(ta_number, pp_set_handle, &pp_set);
02941               return rsbac_ta_list_remove(ta_number, tkt_handle, &tid.tkt);
02942             }
02943 
02944           default:
02945             return(-RSBAC_EINVALIDTARGET);          
02946         }
02947     };      /* end of rsbac_remove_target() */
02948 
02949 /* end of pm_data_structures.c */

Generated on Sun May 21 14:30:55 2006 for RSBAC by  doxygen 1.4.2