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);
	}