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

1.1       root        1: /* trunc.c
                      2:    Truncate a file to zero length.  */
                      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 FD_CLOEXEC
                     21: #define FD_CLOEXEC 1
                     22: #endif
                     23: 
                     24: #ifndef SEEK_SET
                     25: #define SEEK_SET 0
                     26: #endif
                     27: 
                     28: /* External functions.  */
                     29: #ifndef lseek
                     30: extern off_t lseek ();
                     31: #endif
                     32: 
                     33: /* Truncate a file to zero length.  If this fails, it closes and
                     34:    removes the file.  We support a number of different means of
                     35:    truncation, which is probably a waste of time since this function
                     36:    is currently only called when the 'f' protocol resends a file.  */
                     37: 
                     38: #if HAVE_FTRUNCATE
                     39: #undef HAVE_LTRUNC
                     40: #define HAVE_LTRUNC 0
                     41: #endif
                     42: 
                     43: #if ! HAVE_FTRUNCATE && ! HAVE_LTRUNC
                     44: #ifdef F_CHSIZE
                     45: #define HAVE_F_CHSIZE 1
                     46: #else /* ! defined (F_CHSIZE) */
                     47: #ifdef F_FREESP
                     48: #define HAVE_F_FREESP 1
                     49: #endif /* defined (F_FREESP) */
                     50: #endif /* ! defined (F_CHSIZE) */
                     51: #endif /* ! HAVE_FTRUNCATE && ! HAVE_LTRUNC */
                     52: 
                     53: openfile_t
                     54: esysdep_truncate (e, zname)
                     55:      openfile_t e;
                     56:      const char *zname;
                     57: {
                     58:   int o;
                     59: 
                     60: #if HAVE_FTRUNCATE || HAVE_LTRUNC || HAVE_F_CHSIZE || HAVE_F_FREESP
                     61:   int itrunc;
                     62: 
                     63:   if (! ffilerewind (e))
                     64:     {
                     65:       ulog (LOG_ERROR, "rewind: %s", strerror (errno));
                     66:       (void) ffileclose (e);
                     67:       (void) remove (zname);
                     68:       return EFILECLOSED;
                     69:     }
                     70: 
                     71: #if USE_STDIO
                     72:   o = fileno (e);
                     73: #else
                     74:   o = e;
                     75: #endif
                     76: 
                     77: #if HAVE_FTRUNCATE
                     78:   itrunc = ftruncate (o, 0);
                     79: #endif
                     80: #if HAVE_LTRUNC
                     81:   itrunc = ltrunc (o, (long) 0, SEEK_SET);
                     82: #endif
                     83: #if HAVE_F_CHSIZE
                     84:   itrunc = fcntl (o, F_CHSIZE, (off_t) 0);
                     85: #endif
                     86: #if HAVE_F_FREESP
                     87:   /* This selection is based on an implementation of ftruncate by
                     88:      [email protected] (William Kucharski).  */
                     89:   {
                     90:     struct flock fl;
                     91: 
                     92:     fl.l_whence = 0;
                     93:     fl.l_len = 0;
                     94:     fl.l_start = 0;
                     95:     fl.l_type = F_WRLCK;
                     96: 
                     97:     itrunc = fcntl (o, F_FREESP, &fl);
                     98:   }
                     99: #endif
                    100: 
                    101:   if (itrunc != 0)
                    102:     {
                    103: #if HAVE_FTRUNCATE
                    104:       ulog (LOG_ERROR, "ftruncate: %s", strerror (errno));
                    105: #endif
                    106: #ifdef HAVE_LTRUNC
                    107:       ulog (LOG_ERROR, "ltrunc: %s", strerror (errno));
                    108: #endif
                    109: #ifdef HAVE_F_CHSIZE
                    110:       ulog (LOG_ERROR, "fcntl (F_CHSIZE): %s", strerror (errno));
                    111: #endif
                    112: #ifdef HAVE_F_FREESP
                    113:       ulog (LOG_ERROR, "fcntl (F_FREESP): %s", strerror (errno));
                    114: #endif
                    115: 
                    116:       (void) ffileclose (e);
                    117:       (void) remove (zname);
                    118:       return EFILECLOSED;
                    119:     }
                    120: 
                    121:   return e;
                    122: #else /* ! (HAVE_FTRUNCATE || HAVE_LTRUNC || HAVE_F_CHSIZE || HAVE_F_FREESP) */
                    123:   (void) ffileclose (e);
                    124:   (void) remove (zname);
                    125: 
                    126:   o = creat ((char *) zname, IPRIVATE_FILE_MODE);
                    127: 
                    128:   if (o == -1)
                    129:     {
                    130:       ulog (LOG_ERROR, "creat (%s): %s", zname, strerror (errno));
                    131:       return EFILECLOSED;
                    132:     }
                    133: 
                    134:   if (fcntl (o, F_SETFD, fcntl (o, F_GETFD, 0) | FD_CLOEXEC) < 0)
                    135:     {
                    136:       ulog (LOG_ERROR, "fcntl (FD_CLOEXEC): %s", strerror (errno));
                    137:       (void) close (o);
                    138:       return EFILECLOSED;
                    139:     }
                    140: 
                    141: #if USE_STDIO
                    142:   e = fdopen (o, (char *) BINWRITE);
                    143: 
                    144:   if (e == NULL)
                    145:     {
                    146:       ulog (LOG_ERROR, "fdopen (%s): %s", zname, strerror (errno));
                    147:       (void) close (o);
                    148:       (void) remove (zname);
                    149:       return NULL;
                    150:     }
                    151: #else /* ! USE_STDIO */
                    152:   e = o;
                    153: #endif /* ! USE_STDIO */
                    154: 
                    155:   return e;
                    156: #endif /* ! (HAVE_FTRUNCATE || HAVE_LTRUNC || HAVE_F_CHSIZE || HAVE_F_FREESP) */
                    157: }

unix.superglobalmegacorp.com

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