helpers.c

Go to the documentation of this file.
00001 /************************************* */
00002 /* Rule Set Based Access Control       */
00003 /* Author and (c) 1999-2005:           */
00004 /*   Amon Ott <ao@rsbac.org>           */
00005 /* Helper functions for all parts      */
00006 /* Last modified: 13/Jun/2005          */
00007 /************************************* */
00008 
00009 #include <rsbac/types.h>
00010 #include <rsbac/error.h>
00011 #include <rsbac/helpers.h>
00012 #include <rsbac/rc_types.h>
00013 #include <rsbac/getname.h>
00014 #include <rsbac/cap_getname.h>
00015 
00016 #ifdef __KERNEL__
00017 #include <linux/kernel.h>
00018 #include <linux/module.h>
00019 #include <asm/uaccess.h>
00020 #include <linux/fs.h>
00021 #include <linux/mm.h>
00022 #include <rsbac/aci.h>
00023 #include <rsbac/rkmem.h>
00024 #include <rsbac/debug.h>
00025 #ifdef CONFIG_RSBAC_RC
00026 #include <rsbac/rc_getname.h>
00027 #endif
00028 #endif
00029 #ifndef __KERNEL__
00030 #include <stdio.h>
00031 #include <string.h>
00032 #include <errno.h>
00033 #include <pwd.h>
00034 #include <grp.h>
00035 #endif
00036 
00037 #ifndef __KERNEL__
00038 int rsbac_u32_compare(__u32 * a, __u32 * b)
00039   {
00040     if(*a < *b)
00041      return -1;
00042     if(*a > *b)
00043       return 1;
00044     return 0;
00045   }
00046 
00047 int rsbac_user_compare(const void * a, const void * b)
00048   {
00049     return rsbac_u32_compare((__u32 *) a, (__u32 *) b);
00050   }
00051 
00052 int rsbac_group_compare(const void * a, const void * b)
00053   {
00054     return rsbac_u32_compare((__u32 *) a, (__u32 *) b);
00055   }
00056 
00057 int rsbac_nettemp_id_compare(const void * a, const void * b)
00058   {
00059     return rsbac_u32_compare((__u32 *) a, (__u32 *) b);
00060   }
00061 
00062 int rsbac_dev_compare(const void * desc1,
00063                       const void * desc2)
00064   {
00065     struct rsbac_dev_desc_t * i_desc1 = desc1;
00066     struct rsbac_dev_desc_t * i_desc2 = desc2;
00067     int result;
00068 
00069     result = memcmp(&i_desc1->type,
00070                     &i_desc2->type,
00071                     sizeof(i_desc1->type));
00072     if(result)
00073       return result;
00074     result = memcmp(&i_desc1->major,
00075                     &i_desc2->major,
00076                     sizeof(i_desc1->major));
00077     if(result)
00078       return result;
00079     return memcmp(&i_desc1->minor,
00080                   &i_desc2->minor,
00081                   sizeof(i_desc1->minor));
00082   }
00083 #endif
00084 
00085 char * inttostr(char * str, int i)
00086   {
00087     int j = 0;
00088     
00089     if(!str)
00090       return(NULL);
00091       
00092     if (i<0)
00093       {
00094         str[j] = '-';
00095         j++;
00096         i = -i;
00097       }
00098     if (i>=10000)
00099       {
00100         str[j] = '0' + (i / 10000);
00101         j++;
00102       }
00103     if (i>=1000)
00104       {
00105         str[j] = '0' + ((i % 10000) / 1000);
00106         j++;
00107       }
00108     if (i>=100)
00109       {
00110         str[j] = '0' + ((i % 1000) / 100);
00111         j++;
00112       }
00113     if (i>=10)
00114       {
00115         str[j] = '0' + ((i % 100) / 10);
00116         j++;
00117       }
00118     str[j] = '0' + (i % 10);
00119     j++;
00120     str[j] = 0;
00121     return (str);
00122   };
00123 
00124 char * ulongtostr(char * str, u_long i)
00125   {
00126     int    j = 0;
00127     u_long k = 1000000000;
00128     
00129     if(!str)
00130       return(NULL);
00131 
00132     if (i>=k)
00133       {
00134         str[j] = '0' + ((i / k) % 100);
00135         j++;
00136       }
00137     k /= 10;
00138 
00139     while (k>1)
00140       {
00141         if (i>=k)
00142           {
00143             str[j] = '0' + ((i % (k*10)) / k);
00144             j++;
00145           }
00146         k /= 10;
00147       };
00148 
00149     str[j] = '0' + (i % 10);
00150     j++;
00151     str[j] = 0;
00152     return (str);
00153   };
00154 
00155 char * longtostr(char * str, long i)
00156   {
00157     int    j = 0;
00158     u_long k = 1000000000;
00159     
00160     if(!str)
00161       return(NULL);
00162 
00163     if (i<0)
00164       {
00165         str[0] = '-';
00166         j = 1;
00167         i = -i;
00168       }
00169     if (i>=k)
00170       {
00171         str[j] = '0' + ((i / k) % 100);
00172         j++;
00173       }
00174     k /= 10;
00175 
00176     while (k>1)
00177       {
00178         if (i>=k)
00179           {
00180             str[j] = '0' + ((i % (k*10)) / k);
00181             j++;
00182           }
00183         k /= 10;
00184       };
00185 
00186     str[j] = '0' + (i % 10);
00187     j++;
00188     str[j] = 0;
00189     return (str);
00190   };
00191 
00192 char * u64tostrmac(char * str, __u64 i)
00193   {
00194     int    j = 0;
00195     __u64  k;
00196 
00197     if(!str)
00198       return(NULL);
00199 
00200     k = 1;
00201     for(j = RSBAC_MAC_MAX_CAT;j >= 0;j--)
00202       {
00203         if (i & k)
00204           str[j] = '1';
00205         else
00206           str[j] = '0';
00207         k<<=1;
00208       };
00209 
00210     str[RSBAC_MAC_NR_CATS] = 0;
00211     return (str);
00212   };
00213 
00214 #ifndef __KERNEL__
00215 
00216 void error_exit(int error)
00217   {
00218     char tmp1[80];
00219 
00220     if(error<0)
00221       {
00222         get_error_name(tmp1,error);
00223         fprintf(stderr, "Error: %s\n", tmp1);
00224         exit(1);
00225       }
00226   }
00227 
00228 void show_error(int error)
00229   {
00230     char tmp1[80];
00231 
00232     if(error<0)
00233       {
00234         get_error_name(tmp1,error);
00235         fprintf(stderr, "Error: %s\n", tmp1);
00236       }
00237   }
00238 
00239 int rsbac_get_uid_name(rsbac_uid_t * uid, char * name, char * sourcename)
00240   {
00241     struct passwd * user_info_p;
00242     rsbac_uid_t uid_i;
00243 
00244     if(!(user_info_p = getpwnam(sourcename)))
00245       {
00246         uid_i = strtoul(sourcename,0,10);
00247         if(   !uid_i
00248            && strcmp("0", sourcename)
00249           )
00250           {
00251             return -RSBAC_EINVALIDVALUE;
00252           }
00253         if(name)
00254           {
00255             if((user_info_p = getpwuid(uid_i)))
00256               strcpy(name, user_info_p->pw_name);
00257             else
00258               sprintf(name, "%u", uid_i);
00259           }
00260       }
00261     else
00262       {
00263         uid_i = user_info_p->pw_uid;
00264         if(name)
00265           strcpy(name, user_info_p->pw_name);
00266       }
00267     if(uid)
00268       *uid = uid_i;
00269     return 0;
00270   }
00271 
00272 int rsbac_get_fullname(char * fullname, rsbac_uid_t uid)
00273   {
00274     struct passwd * user_info_p;
00275     rsbac_uid_t uid_i;
00276 
00277     if(!fullname)
00278       return -RSBAC_EINVALIDPOINTER;
00279     if(!(user_info_p = getpwuid(uid)))
00280       {
00281         sprintf(fullname, "%u", uid);
00282       }
00283     else
00284       {
00285         strcpy(fullname, user_info_p->pw_gecos);
00286       }
00287     return 0;
00288   }
00289 
00290 char * get_user_name(rsbac_uid_t user, char * name)
00291   {
00292     struct passwd * user_info_p;
00293 
00294     if((user_info_p = getpwuid(user)))
00295       {
00296         strcpy(name, user_info_p->pw_name);
00297       }
00298     else
00299       {
00300         sprintf(name, "%u", user);
00301       }
00302     return name;
00303   }
00304 
00305 char * get_group_name(rsbac_gid_t group, char * name)
00306   {
00307     struct group * group_info_p;
00308 
00309     if((group_info_p = getgrgid(group)))
00310       {
00311         strcpy(name, group_info_p->gr_name);
00312       }
00313     else
00314       {
00315         sprintf(name, "%u", group);
00316       }
00317     return name;
00318   }
00319 
00320 int rsbac_get_gid_name(rsbac_gid_t * gid, char * name, char * sourcename)
00321   {
00322     struct group * group_info_p;
00323     rsbac_gid_t gid_i;
00324 
00325     if(!(group_info_p = getgrnam(sourcename)))
00326       {
00327         gid_i = strtoul(sourcename,0,10);
00328         if(   !gid_i
00329            && strcmp("0", sourcename)
00330           )
00331           {
00332             return -RSBAC_EINVALIDVALUE;
00333           }
00334         if(name)
00335           {
00336             if((group_info_p = getgrgid(gid_i)))
00337               strcpy(name, group_info_p->gr_name);
00338             else
00339               sprintf(name, "%u", gid_i);
00340           }
00341       }
00342     else
00343       {
00344         gid_i = group_info_p->gr_gid;
00345         if(name)
00346           strcpy(name, group_info_p->gr_name);
00347       }
00348     if(gid)
00349       *gid = gid_i;
00350     return 0;
00351   }
00352 
00353 
00354 char * u64tostrlog(char * str, __u64 i)
00355   {
00356     int    j = 0;
00357     __u64  k;
00358 
00359     if(!str)
00360       return(NULL);
00361 
00362     k = 1;
00363     for(j = R_NONE - 1;j >= 0;j--)
00364       {
00365         if (i & k)
00366           str[j] = '1';
00367         else
00368           str[j] = '0';
00369         k<<=1;
00370       };
00371 
00372     str[R_NONE] = 0;
00373     return (str);
00374   };
00375 
00376 __u64 strtou64log(char * str, __u64 * i_p)
00377   {
00378     int    j;
00379     __u64  k = 1, res=0;
00380     
00381     if(!str)
00382       return(0);
00383 
00384     if (strlen(str) < R_NONE)
00385       return(-1);
00386     for(j=R_NONE-1;j>=0;j--)
00387       {
00388         if(str[j] != '0')
00389           {
00390             res |= k;
00391           }
00392         k <<= 1;
00393       }
00394     for(j=R_NONE;j<64;j++)
00395       {
00396         res |= k;
00397         k <<= 1;
00398       }
00399     *i_p = res;
00400     return(res);
00401   };
00402 
00403 char * u64tostrrc(char * str, __u64 i)
00404   {
00405     int    j = 0;
00406     __u64  k;
00407 
00408     if(!str)
00409       return(NULL);
00410 
00411     k = 1;
00412     for(j = 63;j >= 0;j--)
00413       {
00414         if (i & k)
00415           str[j] = '1';
00416         else
00417           str[j] = '0';
00418         k<<=1;
00419       };
00420 
00421     str[64] = 0;
00422     return (str);
00423   };
00424 
00425 __u64 strtou64rc(char * str, __u64 * i_p)
00426   {
00427     int    j;
00428     __u64  k = 1, res=0;
00429     
00430     if(!str)
00431       return(0);
00432 
00433     if (strlen(str) < 64)
00434       return(-1);
00435     for(j=63;j>=0;j--)
00436       {
00437         if(str[j] != '0')
00438           {
00439             res |= k;
00440           }
00441         k <<= 1;
00442       }
00443     *i_p = res;
00444     return(res);
00445   };
00446 
00447 char * u64tostrrcr(char * str, __u64 i)
00448   {
00449     int    j = 0;
00450     __u64  k;
00451 
00452     if(!str)
00453       return(NULL);
00454 
00455     k = 1;
00456     for(j = RCR_NONE - 1;j >= 0;j--)
00457       {
00458         if (i & k)
00459           str[j] = '1';
00460         else
00461           str[j] = '0';
00462         k<<=1;
00463       };
00464 
00465     str[RCR_NONE] = 0;
00466     return (str);
00467   };
00468 
00469 __u64 strtou64rcr(char * str, __u64 * i_p)
00470   {
00471     int    j;
00472     __u64  k = 1, res=0;
00473     
00474     if(!str)
00475       return(0);
00476 
00477     if (strlen(str) < RCR_NONE)
00478       return(-1);
00479     for(j=RCR_NONE-1;j>=0;j--)
00480       {
00481         if(str[j] != '0')
00482           {
00483             res |= k;
00484           }
00485         k <<= 1;
00486       }
00487     for(j=RCR_NONE;j<64;j++)
00488       {
00489         res |= k;
00490         k <<= 1;
00491       }
00492     *i_p = res;
00493     return(res);
00494   };
00495 
00496 __u64 strtou64mac(char * str, __u64 * i_p)
00497   {
00498     int    j;
00499     __u64  k = 1, res=0;
00500     
00501     if(!str)
00502       return(0);
00503 
00504     if (strlen(str) < RSBAC_MAC_NR_CATS)
00505       return(-1);
00506     for(j=RSBAC_MAC_MAX_CAT;j>=0;j--)
00507       {
00508         if(str[j] != '0')
00509           {
00510             res |= k;
00511           }
00512         k <<= 1;
00513       }
00514     for(j=RSBAC_MAC_NR_CATS;j<64;j++)
00515       {
00516         res |= k;
00517         k <<= 1;
00518       }
00519     *i_p = res;
00520     return(res);
00521   };
00522 
00523 __u64 strtou64acl(char * str, __u64 * i_p)
00524   {
00525     int    j;
00526     __u64  k = 1, res=0;
00527     
00528     if(!str)
00529       return(0);
00530 
00531     if (strlen(str) < (ACLR_NONE - 1))
00532       return(-1);
00533     for(j=ACLR_NONE-1;j>=0;j--)
00534       {
00535         if(str[j] != '0')
00536           {
00537             res |= k;
00538           }
00539         k <<= 1;
00540       }
00541     for(j=ACLR_NONE-1;j<64;j++)
00542       {
00543         res |= k;
00544         k <<= 1;
00545       }
00546     *i_p = res;
00547     return(res);
00548   }
00549 
00550 int strtodevdesc(char * str, struct rsbac_dev_desc_t * dev_p)
00551   {
00552     char * p;
00553     char * c;
00554 
00555     if(!str)
00556       return -RSBAC_EINVALIDVALUE;
00557     if(!strcmp(str, ":DEFAULT:"))
00558       {
00559         *dev_p = RSBAC_ZERO_DEV_DESC;
00560         return 0;
00561       }
00562     p = str;
00563     c = strchr(p,':');
00564     switch(*p)
00565       {
00566         case 'b':
00567         case 'B':
00568           if(c)
00569             dev_p->type = D_block;
00570           else
00571             dev_p->type = D_block_major;
00572           break;
00573         case 'c':
00574         case 'C':
00575           if(c)
00576             dev_p->type = D_char;
00577           else
00578             dev_p->type = D_char_major;
00579           break;
00580         default:
00581           return -RSBAC_EINVALIDTARGET;
00582       }
00583     p++;
00584     dev_p->major = strtoul(p,0,0);
00585     if(c)
00586       {
00587         c++;
00588         dev_p->minor = strtoul(c,0,0);
00589       }
00590     else
00591       dev_p->minor = 0;
00592     return 0;
00593   }
00594 
00595 char * devdesctostr(char * str, struct rsbac_dev_desc_t dev)
00596   {
00597     if(RSBAC_IS_ZERO_DEV_DESC(dev))
00598       {
00599         sprintf(str, ":DEFAULT:");
00600         return str;
00601       }
00602     switch(dev.type)
00603       {
00604         case D_block:
00605         case D_char:
00606           sprintf(str, "%c%u:%u", 'b' + dev.type, dev.major, dev.minor);
00607           break;
00608         case D_block_major:
00609         case D_char_major:
00610           sprintf(str, "%c%u",
00611                   'b' + dev.type - (D_block_major - D_block),
00612                   dev.major);
00613           break;
00614         default:
00615           sprintf(str, "invalid!");
00616       }
00617     return str;
00618   }
00619 #endif /* ifndef __KERNEL__ */
00620 
00621 char * u64tostracl(char * str, __u64 i)
00622   {
00623     int    j = 0;
00624     __u64  k;
00625 
00626     if(!str)
00627       return(NULL);
00628 
00629     k = 1;
00630     for(j = ACLR_NONE - 1;j >= 0;j--)
00631       {
00632         if (i & k)
00633           str[j] = '1';
00634         else
00635           str[j] = '0';
00636         k<<=1;
00637       };
00638 
00639     str[ACLR_NONE] = 0;
00640     return (str);
00641   };
00642 
00643 char * u32tostrcap(char * str, __u32 i)
00644   {
00645     int    j = 0;
00646     __u32  k;
00647 
00648     if(!str)
00649       return(NULL);
00650 
00651     k = 1;
00652     for(j = CAP_NONE - 1;j >= 0;j--)
00653       {
00654         if (i & k)
00655           str[j] = '1';
00656         else
00657           str[j] = '0';
00658         k<<=1;
00659       };
00660 
00661     str[CAP_NONE] = 0;
00662     return (str);
00663   };
00664 
00665 __u32 strtou32cap(char * str, __u32 * i_p)
00666   {
00667     int    j;
00668     __u32  k = 1, res=0;
00669     
00670     if(!str)
00671       return(0);
00672 
00673     if (strlen(str) < CAP_NONE)
00674       return(-1);
00675     for(j=CAP_NONE-1;j>=0;j--)
00676       {
00677         if(str[j] != '0')
00678           {
00679             res |= k;
00680           }
00681         k <<= 1;
00682       }
00683     for(j=CAP_NONE;j<32;j++)
00684       {
00685         res |= k;
00686         k <<= 1;
00687       }
00688     *i_p = res;
00689     return(res);
00690   };
00691 
00692 
00693 #ifdef __KERNEL__
00694 
00695 /* find the current owner of this process */
00696 int rsbac_get_owner(rsbac_uid_t * user_p)
00697   {
00698     *user_p = current->uid;
00699     return(0);
00700   }
00701 
00702 void rsbac_ds_get_error(char * function, enum rsbac_attribute_t attr)
00703   {
00704     if(!function)
00705       return;
00706     if(attr != A_none)
00707       {
00708         char tmp[80];
00709 
00710         get_attribute_name(tmp, attr);
00711         rsbac_printk(KERN_WARNING
00712                      "%s: rsbac_get_attr() for %s returned error!\n",
00713                      function, tmp);
00714       }
00715     else
00716       {
00717         rsbac_printk(KERN_WARNING
00718                      "%s: rsbac_get_attr() returned error!\n",
00719                      function);
00720       }
00721   }
00722 
00723 void rsbac_ds_get_error_num(char * function, enum rsbac_attribute_t attr, int err)
00724   {
00725     if(!function)
00726       return;
00727     if(attr != A_none)
00728       {
00729         char tmp[80];
00730         char tmp2[80];
00731 
00732         get_attribute_name(tmp, attr);
00733         get_error_name(tmp2, err);
00734         rsbac_printk(KERN_WARNING
00735                      "%s: rsbac_get_attr() for %s returned error %s!\n",
00736                      function, tmp, tmp2);
00737       }
00738     else
00739       {
00740         rsbac_printk(KERN_WARNING
00741                      "%s: rsbac_get_attr() returned error!\n",
00742                      function);
00743       }
00744   }
00745 
00746 void rsbac_ds_set_error(char * function, enum rsbac_attribute_t attr)
00747   {
00748     if(!function)
00749       return;
00750     if(attr != A_none)
00751       {
00752         char tmp[80];
00753 
00754         get_attribute_name(tmp, attr);
00755         rsbac_printk(KERN_WARNING
00756                      "%s: rsbac_set_attr() for %s returned error!\n",
00757                      function, tmp);
00758       }
00759     else
00760       {
00761         rsbac_printk(KERN_WARNING
00762                      "%s: rsbac_set_attr() returned error!\n",
00763                      function);
00764       }
00765   }
00766 
00767 void rsbac_ds_set_error_num(char * function, enum rsbac_attribute_t attr, int err)
00768   {
00769     if(!function)
00770       return;
00771     if(attr != A_none)
00772       {
00773         char tmp[80];
00774         char tmp2[80];
00775 
00776         get_attribute_name(tmp, attr);
00777         get_error_name(tmp2, err);
00778         rsbac_printk(KERN_WARNING
00779                      "%s: rsbac_set_attr() for %s returned error %s!\n",
00780                      function, tmp, tmp2);
00781       }
00782     else
00783       {
00784         rsbac_printk(KERN_WARNING
00785                      "%s: rsbac_set_attr() returned error!\n",
00786                      function);
00787       }
00788   }
00789 
00790 #ifdef CONFIG_RSBAC_RC
00791 void rsbac_rc_ds_get_error(char * function, enum rsbac_rc_item_t item)
00792   {
00793     if(!function)
00794       return;
00795     if(item != RI_none)
00796       {
00797         char tmp[80];
00798 
00799         get_rc_item_name(tmp, item);
00800         rsbac_printk(KERN_WARNING
00801                      "%s: rsbac_rc_get_item() for %s returned error!\n",
00802                      function, tmp);
00803       }
00804     else
00805       {
00806         rsbac_printk(KERN_WARNING
00807                      "%s: rsbac_rc_get_item() returned error!\n",
00808                      function);
00809       }
00810   }
00811 
00812 void rsbac_rc_ds_set_error(char * function, enum rsbac_rc_item_t item)
00813   {
00814     if(!function)
00815       return;
00816     if(item != RI_none)
00817       {
00818         char tmp[80];
00819 
00820         get_rc_item_name(tmp, item);
00821         rsbac_printk(KERN_WARNING
00822                      "%s: rsbac_rc_set_item() for %s returned error!\n",
00823                      function, tmp);
00824       }
00825     else
00826       {
00827         rsbac_printk(KERN_WARNING
00828                      "%s: rsbac_rc_set_item() returned error!\n",
00829                      function);
00830       }
00831   }
00832 #endif
00833 
00834 
00835 /****************************************************************/
00836 /* Access to user data space                                    */
00837 
00838 
00839 #if defined(CONFIG_RSBAC_REG) || defined(CONFIG_RSBAC_REG_MAINT)
00840 EXPORT_SYMBOL(rsbac_get_user);
00841 #endif
00842 int rsbac_get_user(unsigned char * kern_p, unsigned char * user_p, int size)
00843   {
00844     if(kern_p && user_p && (size > 0))
00845       {
00846         return copy_from_user(kern_p, user_p, size);
00847       }
00848     return(0);
00849   }
00850 
00851 
00852 #if defined(CONFIG_RSBAC_REG) || defined(CONFIG_RSBAC_REG_MAINT)
00853 EXPORT_SYMBOL(rsbac_put_user);
00854 #endif
00855 int rsbac_put_user(unsigned char * kern_p, unsigned char * user_p, int size)
00856   {
00857     if(kern_p && user_p && (size > 0))
00858       {
00859         return copy_to_user(user_p,kern_p,size);
00860       }
00861     return(0);
00862   };
00863 
00864 #if defined(CONFIG_RSBAC_REG) || defined(CONFIG_RSBAC_REG_MAINT)
00865 EXPORT_SYMBOL(rsbac_getname);
00866 #endif
00867 char * rsbac_getname(const char * name)
00868   {
00869     return getname(name);
00870   };
00871 
00872 #if defined(CONFIG_RSBAC_REG) || defined(CONFIG_RSBAC_REG_MAINT)
00873 EXPORT_SYMBOL(rsbac_putname);
00874 #endif
00875 void rsbac_putname(const char * name)
00876   {
00877     putname(name);
00878   }
00879 
00880 inline int clear_user_buf(char * ubuf, int len)
00881   {
00882     return clear_user(ubuf,len);
00883   }
00884 
00885 #endif /* __KERNEL__ */

Generated on Thu Sep 22 16:42:20 2005 for RSBAC by  doxygen 1.4.2