00001
00002
00003
00004
00005
00006
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
00034
00035
00036
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
00055
00056
00057 int sys_write(u_int,char *, u_int);
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
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
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
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
00334
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
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);
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
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 };
01111
01112 #endif
01113
01114
01115
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
01140
01141
01142
01143
01144
01145
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
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
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
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
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
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
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710
01711
01712
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
01740
01741
01742
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
01770
01771
01772
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
01799
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
01827
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
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
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
01865
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
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
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
01900
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
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
01921
01922
01923
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 {
01937 if((count = rsbac_list_lol_add(in_pp_set_handle, &in_pp_set, NULL)))
01938 return count;
01939
01940
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 {
01952
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
01967
01968
01969
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
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 {
01984 count = rsbac_list_lol_add(out_pp_set_handle, &out_pp_set, NULL);
01985 if(count)
01986 return count;
01987 }
01988
01989
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
02002
02003
02004
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
02016
02017
02018
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
02026
02027
02028
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
02036
02037
02038
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
02046
02047
02048
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
02056
02057
02058
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
02066
02067
02068
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
02080
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
02108
02109
02110
02111
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
02140
02141
02142
02143
02144
02145
02146
02147
02148
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
02170
02171
02172
02173
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
02203
02204
02205
02206
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
02230
02231
02232
02233
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
02266
02267
02268
02269
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
02296
02297
02298
02299
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
02323
02324
02325
02326
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
02353
02354
02355
02356
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
02384 default:
02385 return(-RSBAC_EINVALIDTARGET);
02386 }
02387 };
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
02404
02405
02406
02407
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
02415
02416
02417
02418
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
02426
02427
02428
02429
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
02437
02438
02439
02440
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
02448
02449
02450
02451
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
02459
02460
02461
02462
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
02470
02471
02472
02473
02474
02475 return rsbac_ta_list_get_data_ttl(ta_number, tkt_handle,
02476 NULL, &tid.tkt, &value->tkt);
02477
02478
02479 default:
02480 return(-RSBAC_EINVALIDTARGET);
02481 }
02482 }
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
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
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
02539 default:
02540 rsbac_printk(KERN_WARNING
02541 "rsbac_pm_exists(): Invalid target!\n");
02542 return FALSE;
02543 }
02544 }
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
02564
02565
02566
02567
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
02599
02600
02601
02602
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
02628
02629
02630
02631
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
02666
02667
02668
02669
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
02701
02702
02703
02704
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
02730
02731
02732
02733
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
02762 default:
02763 return(-RSBAC_EINVALIDTARGET);
02764 }
02765 }
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
02779
02780
02781
02782
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
02789
02790
02791
02792
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
02802
02803
02804
02805
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
02819
02820
02821
02822
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
02832
02833
02834
02835
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
02842
02843
02844
02845
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
02852
02853
02854
02855
02856
02857 return rsbac_ta_list_add_ttl(ta_number, tkt_handle, 0, &data.tkt.id, &data.tkt);
02858
02859
02860 default:
02861 return(-RSBAC_EINVALIDTARGET);
02862 }
02863 }
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
02877
02878
02879
02880
02881
02882 return rsbac_ta_list_remove(ta_number, task_handle, &tid.task);
02883
02884 case PMT_CLASS:
02885
02886
02887
02888
02889
02890
02891 return rsbac_ta_list_remove(ta_number, class_handle, &tid.object_class);
02892
02893 case PMT_NA:
02894
02895
02896
02897
02898
02899
02900 return rsbac_ta_list_remove(ta_number, na_handle, &tid.na);
02901
02902 case PMT_CS:
02903
02904
02905
02906
02907
02908
02909 return rsbac_ta_list_remove(ta_number, cs_handle, &tid.cs);
02910
02911 case PMT_TP:
02912
02913
02914
02915
02916
02917
02918 return rsbac_ta_list_remove(ta_number, tp_handle, &tid.tp);
02919
02920 case PMT_PP:
02921
02922
02923
02924
02925
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
02935
02936
02937
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 };
02948
02949