Annotation of coherent/g/usr/lib/uucp/tay104/unix/efopen.c, revision 1.1.1.1

1.1       root        1: /* efopen.c
                      2:    Open a stdio file with appropriate permissions.  */
                      3: 
                      4: #include "uucp.h"
                      5: 
                      6: #include "uudefs.h"
                      7: #include "sysdep.h"
                      8: #include "system.h"
                      9: 
                     10: #include <errno.h>
                     11: 
                     12: #if HAVE_FCNTL_H
                     13: #include <fcntl.h>
                     14: #else
                     15: #if HAVE_SYS_FILE_H
                     16: #include <sys/file.h>
                     17: #endif
                     18: #endif
                     19: 
                     20: #ifndef O_RDONLY
                     21: #define O_RDONLY 0
                     22: #define O_WRONLY 1
                     23: #define O_RDWR 2
                     24: #endif
                     25: 
                     26: #ifndef O_APPEND
                     27: #ifdef FAPPEND
                     28: #define O_APPEND FAPPEND
                     29: #endif
                     30: #endif
                     31: 
                     32: #ifndef O_NOCTTY
                     33: #define O_NOCTTY 0
                     34: #endif
                     35: 
                     36: #ifndef FD_CLOEXEC
                     37: #define FD_CLOEXEC 1
                     38: #endif
                     39: 
                     40: FILE *
                     41: esysdep_fopen (zfile, fpublic, fappend, fmkdirs)
                     42:      const char *zfile;
                     43:      boolean fpublic;
                     44:      boolean fappend;
                     45:      boolean fmkdirs;
                     46: {
                     47:   int imode;
                     48:   int o;
                     49:   FILE *e;
                     50: 
                     51:   if (fpublic)
                     52:     imode = IPUBLIC_FILE_MODE;
                     53:   else
                     54:     imode = IPRIVATE_FILE_MODE;
                     55: 
                     56:   if (! fappend)
                     57:     o = creat ((char *) zfile, imode);
                     58:   else
                     59:     {
                     60: #ifdef O_CREAT
                     61:       o = open ((char *) zfile,
                     62:                O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY,
                     63:                imode);
                     64: #else
                     65:       o = open ((char *) zfile, O_WRONLY | O_NOCTTY);
                     66:       if (o < 0 && errno == ENOENT)
                     67:        o = creat ((char *) zfile, imode);
                     68: #endif /* ! defined (O_CREAT) */
                     69:     }
                     70: 
                     71:   if (o < 0)
                     72:     {
                     73:       if (errno == ENOENT && fmkdirs)
                     74:        {
                     75:          if (! fsysdep_make_dirs (zfile, fpublic))
                     76:            return NULL;
                     77:          if (! fappend)
                     78:            o = creat ((char *) zfile, imode);
                     79:          else
                     80:            {
                     81: #ifdef O_CREAT
                     82:              o = open ((char *) zfile,
                     83:                        O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY,
                     84:                        imode);
                     85: #else
                     86:              o = creat ((char *) zfile, imode);
                     87: #endif
                     88:            }
                     89:        }
                     90:       if (o < 0)
                     91:        {
                     92:          ulog (LOG_ERROR, "open (%s): %s", zfile, strerror (errno));
                     93:          return NULL;
                     94:        }
                     95:     }
                     96: 
                     97: #ifndef O_CREAT
                     98: #ifdef O_APPEND
                     99:   if (fappend)
                    100:     {
                    101:       if (fcntl (o, F_SETFL, O_APPEND) < 0)
                    102:        {
                    103:          ulog (LOG_ERROR, "fcntl (%s, O_APPEND): %s", zfile,
                    104:                strerror (errno));
                    105:          (void) close (o);
                    106:          return NULL;
                    107:        }
                    108:     }
                    109: #endif /* defined (O_APPEND) */
                    110: #endif /* ! defined (O_CREAT) */
                    111: 
                    112:   if (fcntl (o, F_SETFD, fcntl (o, F_GETFD, 0) | FD_CLOEXEC) < 0)
                    113:     {
                    114:       ulog (LOG_ERROR, "fcntl (%s, FD_CLOEXEC): %s", zfile,
                    115:            strerror (errno));
                    116:       (void) close (o);
                    117:       return NULL;
                    118:     }
                    119: 
                    120:   if (fappend)
                    121:     e = fdopen (o, (char *) "a");
                    122:   else
                    123:     e = fdopen (o, (char *) "w");
                    124: 
                    125:   if (e == NULL)
                    126:     {
                    127:       ulog (LOG_ERROR, "fdopen: %s", strerror (errno));
                    128:       (void) close (o);
                    129:     }
                    130: 
                    131:   return e;
                    132: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.