#include #include #include #include #include "etc.h" #include "etc.m" /* Ouverture d'un fichier dans un répertoire virtuel. (voir les fonction vdir_xxxx) Vérifie si le path fname correspond existe localement ou dans l'archive. Si le fichier est ouvert en écriture et que le fichier est présent dans l'archive et pas localement, le fichier sera copier localement avant l'ouverture. Retourne NULL si erreur ou ne peut ouvrir ou fichier existe pas. Attention: L'ouverture en écriture seulement est identique à open (un peu plus lent peut-être). */ export int vopen_err ( const char *fname, int mode, int acces, /* Sert seulement avec O_CREAT */ int quit) { char reel[MAXSIZ_PATH]; int exist = vdir_exist (fname,reel); if (exist == 2){ /* Le fichier est présent dans l'archive. Si ouverture pour modification (pas seulement écriture), on doit copier le fichier */ if (mode & O_APPEND || (mode & O_RDWR)==O_RDWR){ if (file_copyp(reel,fname)==-1){ if (quit){ fprintf (stderr,MSG_R(E_CANTCOPY),reel,fname); exit (-1); } return -1; } }else if ((mode & (O_WRONLY|O_TRUNC|O_CREAT))==0){ /* Forcement mode lecture */ fname = reel; } } return open_err (fname,mode,acces,quit); }