, Komunikacja miedzy procesami w (Jnixie prowadzania konwersji, choć jest ciekawy, wykracza poza ramy objętościowe niniejszej książki (jednorozdzialowego opisu systemu RPC). W tym miejscu wypada jedynie podkreślić, że wszystkie wspomniane wyżej procedury są potrzebne i że podczas przekazywania danych przez RPC należy wybrać odpowiednie funkcje konwersji. Na szczęście, jeżeli korzysta się z programu rpcgen, wszystkie stosowne funkcje są generowane automatycznie i umieszczane w osobnym pliku źródłowym, z którego mogą korzystać programy użytkownika. Ten plik z procedurami konwersji zarówno dla klienta, jak i serwera ma nazwę składającą się z nazwy pliku definicji protokołu oraz członu _xdr. c.
Aby zilustrować działanie konwersji, utworzymy aplikację wykonującą zdalne listowanie drzewiastej struktury katalogów. Kiedy serwer tej aplikacji otrzyma prawidłową nazwę katalogu, spróbuje przeanalizować wskazany katalog i wygenerować drzewo jego podkatalogów. Załóżmy, że dysponujemy następującą strukturą (patrz ilustracja 9.28): Jeżeli zażądamy od aplikacji wygenerowania drzewa podkatalogów katalogu /usrO, to dane wyjściowe zwrócone z aplikacji powinny przypominać te z ilustracji 9.29.
/
joe bill exO exl exź
Ilustracja 9.28. Hipotetyczna struktura katalogów
home
joe
bill
prgm
exO
exl
ex2
Analizowany katalog jest oznaczany dwukropkiem na końcu nazwy. Następnie każdy wyświetlony katalog jest wcinany względem jego przodka stosownie do jego pozycji w drzewie. Podkatalogi home i prgm są na tym samym poziomie, ich nazwy więc zostały wcięte o jednakową liczbę spacji. Podobnie jest z katalogami exO, exl i ex2, które są podkatalogami katalogu prgm.
Aplikacja będzie przekazywać od klienta do serwera nazwę katalogu przeznaczonego do przeanalizowania. Serwer zarezerwuje miejsce na tablicę o stałej wielkości1, w której będą przechowywane nazwy odczytanych katalogów. Tablica ta zostanie zwrócona do klienta w przypadku bezbłędnego zakończenia działania serwera. Jeżeli serwer napotka błędy, zwróci wartość NULL.
Tablica zostanie zapełniona danymi o drzewie katalogów odczytanymi zgodnie z poniższym algorytmem. Najpierw program otworzy przekazany mu katalog. Każdy wskaźnik na nazwę katalogu, dopóki nie będzie równy NULL, zostanie sprawdzony pod kątem dostępności. Uwaga! W przypadku gdy proces-serwer nie będzie miał uprawnień super-użytkownika, pewne katalogi mogą zostać pominięte. Jeśli pozycja jest dostępna i stanowi odwołanie do katalogu (a nie do pliku), przy czym, z oczywistych względów, nie będzie to katalog (kropka) ani (dwie kropki), to zostanie zapisana (już z odpowiednim wcięciem) w zarezerwowanej wcześniej tablicy. Aby wygodniej było później zapisywane dane wyświetlać, do każdej pozycji dopisywany jest od razu znak nowej linii (\ n), oddzielający bieżącą pozycję od następnej. Ponieważ struktury katalogów mają naturę rekursywną, po odczytaniu wszystkich podkatalogowych pozycji danego katalogu procedura tree wywoła rekurencyjnie siebie samą, przekazując w parametrze nazwę nowej pozycji. Kiedy cała zawartość katalogu będzie już w ten sposób przejrzana, katalog zostanie zamknięty. Po przeanalizowaniu całej struktury drzewiastej zapełniona tablica zwracana jest do klienta, który może wyświetlić jej zawartość. Na ilustracji 9.30 pokazano fragment takiej gotowej tablicy.
Ilustracja 9.30. Fragment zwróconej do klienta tablicy z nazwami pozycji podkatalogów danego katalogu /usrO
Plik z definicją protokołu tree. x dla powyższego programu pokazano na ilustracji 9.31.
* Plik definicji protokołu programu tree
*/
const MAX = 4096; /* górny limit rozmiaru pakietu wynosi 8K */
const DELIM = ''\n"; /* do oddzielania poszczególnych pozycji katalog. */
const INDENT= 5; /* liczba spacji wcięć jednego poziomu */
const DIR_1 = 128; /* maksymalna długość pozycji katalogowych */
typedef char line(MAX]; /* dużo miejsca na wszystkie pozycje */
279
Wiem, wiem. Nie jest to najlepszy sposób. Lepsze byłoby rezerwowanie dynamiczne, ponieważ nie jest jeszcze znany przyszły rozmiar danych. Jednak rozpatrujemy tylko przykład poglądowy. Dodanie dynamicznego rezerwowania jest przedmiotem jednego z ćwiczeń.