/** Esercizio 1 * Scrivere il programma abyssmlink che ha come parametro il pathname di una directory. * Il programma deve cercare tutti i link simbolici presenti nella directory * e trasformare ogni link simbolico in uno equivalente al pathname assoluto e non relativo. * * link testo: https://dynamik.vercel.app/sistemi-operativi/prove/pratica/scritto-2021-01-18-testo.pdf */ #include <stdlib.h> #include <stdio.h> #include <sys/types.h> // lstat #include <sys/stat.h> // lstat #include <unistd.h> // lstat #include <dirent.h> // opendir #include <fcntl.h> // open #include <limits.h> // PATH_MAX int main (int argc, char* argv){ if(argc!= 2){ printf("Usage: %s <directory>\n", argv[0]); return -1; } char pathname = argv[1]; struct stat st; lstat(pathname, &st); if(S_ISDIR(st.st_mode)){ // e` una directory? DIR *dir = opendir(pathname); struct dirent *ent; while (ent = readdir(dir) != NULL){ // fino a quando riesce a leggere la directory int file_desc = open(pathname, O_RDONLY); // apro il file in read-only if (file_desc != -1){ // non c'e` errore? struct stat filestat; lstat(entry->d_name, &filestat); if (S_ISLNK(filestat.st_mode)){ // il file e` davvero un link //sostituisco il file con la copia char real_path[1024]; // 1024 caratteri max realpath(entry->d_name, real_path); close(file_desc); char real_name[1024]; strcpy(real_name, entry->d_name); // salvo il nome del file unlink(entry->d_name); copyfile(real_path, real_name); } else // il file non e` un link close(file_desc); } } }else printf("Il file non e` una directory\n"); }