#include #include #include #include #define PERM 0666 /* in UNIX */ /* rispetto al file copia.c abbiamo cambiato i permessi: peccato che se il comando umask riporta come nel nostro caso soELab@licai02:~/file$ umask 0022 il risultato è comunque che il file viene creato con i diritti rw per U, e r per G e O e quindi 0644. Vediamo perchè. Dal manuale della creat scopriamo che: The effective permissions are modified by the process's umask in the usual way: The permissions of the created file are (mode & ~umask) Quindi se mode = 0666 e umask = 0022, tralasciando lo 0 iniziale abbiamo che 666 in binario è 110110110 e 022 è 000010010 e quindi ~umask è 111101101 e quindi mode & ~umask è 110110110 & 111101101 ========= 110100100 e quindi proprio 644 */ int copyfile (char *f1, char * f2) { int infile, outfile, nread; char buffer [BUFSIZ]; /* usato per i caratteri */ if ((infile = open(f1, O_RDONLY)) < 0) return 2; /* ERRORE se non si riesce ad aprire in LETTURA il primo file */ if ((outfile = creat (f2, PERM)) <0 ) /* ERRORE se non si riesce a creare il secondo file */ {close(infile); return 3; } while ((nread = read (infile, buffer, BUFSIZ)) > 0 ) { if (write(outfile , buffer, nread) < nread) /* ERRORE se non si riesce a SCRIVERE */ { close(infile); close(outfile); return 4; } } close(infile); close(outfile); return 0; /* se arriviamo qui, vuol dire che tutto e' andato bene */ } int main (int argc, char** argv) { int status; if (argc != 3) /* controllo sul numero di argomenti */ { printf("Errore: numero di argomenti sbagliato\n"); printf("Ci vogliono 2 argomenti: nome-file-sorgente e nome-file-destinazione\n"); exit (1); } status = copyfile (argv[1], argv[2]); if (status != 0) printf("Ci sono stati degli errori durante la copia\n"); return status; }