Systémové programování pro blbečky

Část 1: Kontrola a změna přístupových práv

K získání informací o souboru (včetně jeho práv) použijeme funkci stat(). Ta naplní speciální strukturu struct stat metadaty souboru. Bitová maska st_mode obsahuje aktuální práva. Pro jejich úpravu použijeme systémové volání chmod().

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

int main() {
    const char *filename = "tutorial_soubor.txt";
    struct stat file_stat;

    // 1. Načtení informací o souboru pomocí stat()
    if (stat(filename, &file_stat) == -1) {
        perror("Chyba při získávání informací o souboru");
        return 1;
    }

    // 2. Kontrola, zda má vlastník právo zápisu (S_IWUSR)
    if (file_stat.st_mode & S_IWUSR) {
        printf("Vlastník MÁ právo zapisovat do souboru.\n");
    } else {
        printf("Vlastník NEMÁ právo zapisovat do souboru.\n");
    }

    // 3. Změna práv: Přidáme vlastnikovi právo spouštět soubor (S_IXUSR)
    // Zkopírujeme stávající práva a pomocí bitového OR (|) přidáme nové právo
    mode_t new_mode = file_stat.st_mode | S_IXUSR;
    
    if (chmod(filename, new_mode) == -1) {
        perror("Chyba při změně práv");
        return 1;
    }
    printf("Práva souboru byla úspěšně změněna (přidáno právo spustit 'x').\n");

    return 0;
}

Část 2: Vytváření tvrdých a symbolických odkazů

  • Pro vytvoření tvrdého odkazu použijeme funkci link(). Pokud původní soubor smažeme, data budou skrze tvrdý odkaz stále přístupná.

  • Pro vytvoření symbolického (měkkého) odkazu použijeme funkci symlink(). Tento odkaz pouze ukazuje na název/cestu původního souboru. Pokud původní soubor smažeme, symbolický odkaz se stane „rozbitým“

#include <stdio.h>
#include <unistd.h>

int main() {
    const char *original = "tutorial_soubor.txt";
    const char *hard_link = "tvrdy_odkaz.txt";
    const char *sym_link = "symbolicky_odkaz.txt";

    // 1. Vytvoření tvrdého odkazu (Hard link)
    if (link(original, hard_link) == -1) {
        perror("Chyba při vytváření tvrdého odkazu");
    } else {
        printf("Tvrdý odkaz '%s' byl úspěšně vytvořen.\n", hard_link);
    }

    // 2. Vytvoření symbolického odkazu (Symbolic link)
    if (symlink(original, sym_link) == -1) {
        perror("Chyba při vytváření symbolického odkazu");
    } else {
        printf("Symbolický odkaz '%s' byl úspěšně vytvořen.\n", sym_link);
    }

    // Nyní můžeš v terminálu zkusit smazat původní soubor pomocí: rm tutorial_soubor.txt
    // Uvidíš, že 'tvrdy_odkaz.txt' stále funguje a má data, zatímco 'symbolicky_odkaz.txt' je nefunkční.

    return 0;
}

Co jsme se naučili?

  1. Jak získat a změnit práva soborů

  2. Rozdíl mezi symbolickým a trvdým odkazem