Unix Shell: poznaj punkt montowania

Opublikował siefca cz 16 paź 2008 17:06:03 GMT

Funkcja powłokowa getmount() próbuje określić, jaki jest punkt zamontowania w systemie plików dla podanego urządzenia. Oczywiście nie korzysta ona z pomocy użytkownika, ani tym bardziej jasnowidza, więc nie jest w stanie domyślić się ścieżki, jeśli nie jest ona nigdzie wpisana lub została schowana w gąszczu szalonych dowiązań.

Składnia C

int getmount(char *urządzenie);
char *mntpt;

Opis

Na podstawie podanej nazwy pliku urządzenia funkcja getmount() tworzy dwa łańcuchy znaków. Jeden jest kopią wprowadzonej nazwy ścieżkowej wiodącej do pliku specjalnego skojarzonego z urządzeniem, a drugi jego przekształceniem do postaci kanonicznej. W tym ostatnim przypadku funkcja używa polecenia readlink, aby uzyskać uproszczoną nazwę, na przykład oczyszczoną ze zbędnych dowiązań symbolicznych i odniesień do katalogu nadrzędnego lub bieżącego.

Następnie funkcja wczytuje zawartość plików /etc/fstab, /etc/mtab i /proc/mounts. Dla każdego rekordu pochodzącego z tych plików pobierane są informacje o urządzeniu i jego punkcie zamontowania. Również w tym przypadku tworzone są dwa warianty informacji: nieprzetworzona i zamieniona na postać kanoniczną.

Dla każdej znalezionej w ten sposób nazwy urządzenia dokonywane jest porównanie z dwoma wariantami podanej w argumencie ścieżki. W sumie dla każdego rekordu znalezionego w wymienionych plikach wykonywane są cztery instrukcje warunkowe testujące, czy podana ścieżka pliku urządzenia pasuje do ścieżki znalezionej w zbiorach.

Zwracana wartość

W przypadku znalezienia punktu montowania dla podanego urządzenia w zmiennej o nazwie mntpt zachowywana jest jego ścieżka, a funkcja zwraca 0. Gdy katalog montowania nie został znaleziony zmienna mntpt zawiera łańcuch o zerowej długości, a funkcja zwraca 1.

Wymagania

Do poprawnej pracy funkcja potrzebuje narzędzi: readlink, awk i cat. Wymagane jest również, aby system operacyjny odnotowywał zamontowane systemy plików w zbiorze /etc/mtab, przechowywał informacje o punktach montowania w /etc/fstab i obsługiwał pseudo-system plików proc.

Zgodność

  • bash
  • pdksh

Uwagi

Twój system może używać innego wariantu narzędzia readlink, w którym nie występuje opcja -m. Należy wtedy zastąpić przełącznik jego najbliższym odpowiednikiem. W tym przypadku opcja sprawia, że readlink spróbuje przekształcić nazwę ścieżkową do postaci kanonicznej nawet wtedy, gdy nie będzie możliwości skonfrontowania operacji z systemem plików (np. w przypadku chwilowo niedostępnego katalogu wchodzącego w skład ścieżki).

Przykład użycia

#!/bin/sh

getmount /dev/hda && echo "punkt montowania: ${mntpt}"

exit $?

Kod funkcji

function getmount()
{
    local deviceorig="$1"
    local device=$(readlink -m "${deviceorig}" 2>/dev/null)

    mntpt=$(cat /etc/fstab /etc/mtab /proc/mounts | \
        awk -v "device=${device}" -v "deviceorig=${deviceorig}" \
                '!/^[[:space:]]*#/ \
                { \
                    gsub(/#.*/,""); \
                    tabdevorig=$1; tabmnt=$2; \
                    if (tabdevorig == "" || tabdevorig == "none") next; \
                    if (tabdevorig == deviceorig || tabdevorig == device) \
                        { print tabmnt; exit; } \
                    command = ("readlink -m " tabdevorig " 2>/dev/null"); \
                    (command | getline tabdev); \
                    close(command); \
                    if (tabdev == deviceorig || tabdev == device) \
                        { print tabmnt; exit; } \
                }')

    if [ -z "$mntpt" ]; then
        return 1
    else
        return 0
    fi
}

Licencja

Copyright © 2008 by Paweł Wilk.

Powyższy program jest rozpowszechniany w nadziei, że będzie przydatny, ale bez żadnych gwarancji – wyrażonych wprost lub domyślnie – w tym bez gwarancji użyteczności lub przydatności do konkretnych celów. Używasz go na własne ryzyko i na własną odpowiedzialność.

Używając zamieszczonego powyżej programu, dystrybuując go, modyfikując lub zapisując go na nośniku służącym do przechowywania informacji, oświadczasz, że posługujesz się językiem angielskim i akceptujesz spisane w tym języku umowne regulacje określające warunki korzystania z programu zwane Licencją. Nazwa tej Licencji to GNU Lesser General Public License w wersji 3, a jej zasady zostały wyłożone w dokumencie dostępnym pod adresem http://www.fsf.org/licensing/licenses/lgpl-3.0.html. Nieoficjalne tłumaczenie Licencji możesz znaleźć na stronie Konrada Stobieckiego . Jeśli nie możesz połączyć się z witryną, na której przedstawiona jest treść Licencji, to aby ją uzyskać napisz pod adres:

Free Software Foundation
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301
USA


This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/

Podziel się

Trackbacki

Użyj następującego trackbacka na swojej stronie:

http://randomseed.pl/trackbacks?article_id=unix-shell-poznaj-punkt-montowania&day=16&month=10&year=2008

Komentarze

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz