Przykłady ustawiania klasyfikacji etykiet czułości i porównywania etykiet czułości
Przedstawiany przykład dotyczy ustawiania klasyfikacji etykiet czułości i wykorzystania procedur bibliotecznych do ich porównywania.
Uprawnienie PV_LAB_LEF jest wymagane w zestawie uprawnień delegowanych programu oraz w maksymalnym zestawie uprawnień procesu wywołującego.
#include <stdio.h>
#include <mls/mls.h>
#include <userpriv.h>
#include <errno.h>
#define SUCCESS 0
#define ERROR 1
int
main (int argc, char **argv)
{
/* Etykiety czułości */
sl_t sl1, sl2;
/* łańcuchy do przechowywania nazw etykiet */
char *slBuffer1 = NULL;
char *slBuffer2 = NULL;
if (argc != 3) {
fprintf(stderr, "Składnia: compare etykieta1 etykieta2\n");
exit(ERROR);
}
/*
* Inicjowanie procesu funkcją initlabeldb(), aby odczytać
* domyślną systemową bazę danych etykiet.
*/
priv_raise(PV_LAB_LEF , -1);
if (initlabeldb(NULL) != 0) {
fprintf(stderr, "Nie można odczytać bazy danych kodowania etykiet.\n");
exit(ERROR);
}
priv_remove(PV_LAB_LEF, -1);
/* Konwersja przekazanej SL do formatu binarnego */
if (slhrtob(&sl1, argv[1]) != 0) {
fprintf(stderr, "Nie można przekształcić %s do formatu binarnego.\n", argv[1]);
exit(ERROR);
}
if (slhrtob(&sl2, argv[2]) != 0) {
fprintf(stderr, "Nie można przekształcić %s do formatu binarnego.\n", argv[2]);
exit(ERROR);
}
/* malloc dla maksymalnej długości etykiety SL możliwej do utworzenia */
slBuffer1 = (char *) malloc(maxlen_sl());
slBuffer2 = (char *) malloc(maxlen_sl());
if ((slBuffer1 == NULL) || (slBuffer2 == NULL)) {
perror("malloc");
exit(ERROR);
}
/*
* Tłumaczenie etykiety z powrotem do formatu czytelnego.
* Ten krok nie jest konieczny. Umieszczono go tu jako przykład
* użycia funkcji slbtohr().
*/
if (slbtohr(slBuffer1, &sl1, HR_LONG) != 0) {
fprintf(stderr, "Nie można przekształcić etykiety z postaci binarnej do czytelnej.\n");
exit(ERROR);
}
if (slbtohr(slBuffer2, &sl2, HR_LONG) != 0) {
fprintf(stderr, "Nie można przekształcić etykiety z postaci binarnej do czytelnej.\n");
exit(ERROR);
}
/*
* Użycie sl_cmp() do porównania dominacji obu etykiet.
*/
if (sl_cmp(&sl1, &sl2) == LAB_SAME) {
printf("etykieta (%s) jest równa etykiecie (%s).\n",
slBuffer1, slBuffer2);
}
else if (sl_cmp(&sl1, &sl2) == LAB_DOM) {
printf("etykieta (%s) dominuje nad etykietą (%s).\n",
slBuffer1, slBuffer2);
}
else if (sl_cmp(&sl2, &sl1) == LAB_DOM) {
printf("etykieta (%s) dominuje nad etykietą (%s).\n",
slBuffer2, slBuffer1);
}
else {
printf("Obie etykiety są rozłączne.\n");
}
return (SUCCESS);
}