home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------*/
- /* 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 <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <time.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <share.h>
- #include <io.h>
-
- /*--------------------------------------------------------------------*/
- /* 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*/
-