/*--------------------------------------------------------------------*/ /* f o p e n . c */ /* */ /* Support routines for UUPC/extended */ /* */ /* Changes Copyright 1990, 1991 (c) Andrew H. Derbyshire */ /* */ /* History: */ /* 21Nov1991 Break out of lib.c ahd */ /*--------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include /*--------------------------------------------------------------------*/ /* UUPC/extended include files */ /*--------------------------------------------------------------------*/ #include "lib.h" #include "hlib.h" #include "ssleep.h" #define SHARE_OPEN /*--------------------------------------------------------------------*/ /* F O P E N */ /* */ /* Like fopen() but create imtermediate directories */ /* */ /* This routine has dependency on the path separator characters */ /* being '/', we should relove that somehow someday. */ /*--------------------------------------------------------------------*/ FILE *FSOPEN(const char *name, const char *mode) { char *last; FILE *results; /* are we opening for write or append */ #ifdef SHARE_OPEN int share = SH_DENYWR; int retries = 0; results = _fsopen(name, mode, share ); #else results = fopen(name, mode ); #endif if ((results != nil(FILE)) || (*mode == 'r')) return results; /*--------------------------------------------------------------------*/ /* Verify all intermediate directories in the path exist */ /*--------------------------------------------------------------------*/ if ((last = strrchr(name, '/')) != nil(char)) { *last = '\0'; MKDIR(name); *last = '/'; } /*--------------------------------------------------------------------*/ /* Now try open again */ /*--------------------------------------------------------------------*/ #ifdef SHARE_OPEN for ( ;; ) { results = _fsopen(name, mode, share); if (( results != NULL ) || (!bflag[ F_MULTITASK ]) || (errno != EACCES) || (retries++ > 10)) return results; perror( name ); ssleep( retries * 2); } #else return fopen(name, mode); #endif } /*FOPEN*/