ihandle: Ensure FDH_REALLYCLOSE really closes
[openafs.git] / src / vol / ihandle.h
index 3f863cd..44b163b 100644 (file)
@@ -159,6 +159,7 @@ typedef int FD_t;
 typedef struct FdHandle_s {
     int fd_status;             /* status flags */
     int fd_refcnt;             /* refcnt */
+    int fd_needs_rclose;       /* do we need to fd_reallyclose? */
     FD_t fd_fd;                        /* file descriptor */
     struct IHandle_s *fd_ih;   /* Pointer to Inode handle */
     struct FdHandle_s *fd_next;        /* LRU/Avail list pointers */
@@ -288,7 +289,7 @@ typedef struct IHashBucket_s {
 extern void ih_clear(IHandle_t * h);
 extern Inode ih_create(IHandle_t * h, int dev, char *part, Inode nI, int p1,
                       int p2, int p3, int p4);
-extern FILE *ih_fdopen(FdHandle_t * h, char *fdperms);
+extern FD_t *ih_fdopen(FdHandle_t * h, char *fdperms);
 #endif /* AFS_NAMEI_ENV */
 
 /*
@@ -372,8 +373,8 @@ extern int ih_condsync(IHandle_t * ihP);
 #endif /* !O_LARGEFILE */
 #endif /* AFS_NT40_ENV */
 #else /* !HAVE_PIO */
-extern ssize_t ih_pread(int fd, void * buf, size_t count, afs_foff_t offset);
-extern ssize_t ih_pwrite(int fd, const void * buf, size_t count, afs_foff_t offset);
+extern ssize_t ih_pread(FD_t fd, void * buf, size_t count, afs_foff_t offset);
+extern ssize_t ih_pwrite(FD_t fd, const void * buf, size_t count, afs_foff_t offset);
 #define OS_PREAD(FD, B, S, O) ih_pread(FD, B, S, O)
 #define OS_PWRITE(FD, B, S, O) ih_pwrite(FD, B, S, O)
 #endif /* !HAVE_PIO */
@@ -419,13 +420,13 @@ extern Inode IH_CREATE(IHandle_t * H, int /*@alt Device @ */ D,
                       int /*@alt unsigned @ */ P4);
 extern FD_t OS_IOPEN(IHandle_t * H);
 extern int OS_OPEN(const char *F, int M, mode_t P);
-extern int OS_CLOSE(int FD);
-extern ssize_t OS_READ(int FD, void *B, size_t S);
-extern ssize_t OS_WRITE(int FD, void *B, size_t S);
-extern ssize_t OS_PREAD(int FD, void *B, size_t S, afs_foff_t O);
-extern ssize_t OS_PWRITE(int FD, void *B, size_t S, afs_foff_t O);
-extern int OS_SYNC(int FD);
-extern afs_sfsize_t OS_SIZE(int FD);
+extern int OS_CLOSE(FD_t FD);
+extern ssize_t OS_READ(FD_t FD, void *B, size_t S);
+extern ssize_t OS_WRITE(FD_t FD, void *B, size_t S);
+extern ssize_t OS_PREAD(FD_t FD, void *B, size_t S, afs_foff_t O);
+extern ssize_t OS_PWRITE(FD_t FD, void *B, size_t S, afs_foff_t O);
+extern int OS_SYNC(FD_t FD);
+extern afs_sfsize_t OS_SIZE(FD_t FD);
 extern int IH_INC(IHandle_t * H, Inode I, int /*@alt VolId, VolumeId @ */ P);
 extern int IH_DEC(IHandle_t * H, Inode I, int /*@alt VolId, VolumeId @ */ P);
 extern afs_sfsize_t IH_IREAD(IHandle_t * H, afs_foff_t O, void *B,
@@ -438,8 +439,8 @@ extern afs_sfsize_t IH_IWRITE(IHandle_t * H, afs_foff_t O, void *B,
 #define OFFT off_t
 #endif
 
-extern OFFT OS_SEEK(int FD, OFFT O, int F);
-extern int OS_TRUNC(int FD, OFFT L);
+extern OFFT OS_SEEK(FD_t FD, OFFT O, int F);
+extern int OS_TRUNC(FD_t FD, OFFT L);
 #endif /*S_SPLINT_S */
 
 #ifdef O_LARGEFILE
@@ -549,4 +550,55 @@ extern afs_sfsize_t ih_size(FD_t);
 #define FDH_LOCKFILE(H, O) OS_LOCKFILE((H)->fd_fd, O)
 #define FDH_UNLOCKFILE(H, O) OS_UNLOCKFILE((H)->fd_fd, O)
 
+#ifdef AFS_NT40_ENV
+#define afs_stat_st     __stat64
+#define afs_stat       _stat64
+#define afs_fstat      _fstat64
+#define afs_fopen      fopen
+#define afs_open       open
+#define afs_lseek(FD, O, F)    _lseeki64(FD, O, F)
+#else
+#ifdef O_LARGEFILE
+#define afs_stat_st     stat64
+#define afs_stat       stat64
+#define afs_fstat      fstat64
+#define afs_fopen      fopen64
+#define afs_open       open64
+#ifdef S_SPLINT_S
+extern off64_t afs_lseek(int FD, off64_t O, int F);
+#endif /*S_SPLINT_S */
+#define afs_lseek(FD, O, F)    lseek64(FD, (off64_t) (O), F)
+#define afs_ftruncate           ftruncate64
+#define afs_mmap                mmap64
+#ifdef AFS_AIX_ENV
+extern void * mmap64();  /* ugly hack since aix build env appears to be somewhat broken */
+#endif
+#else /* !O_LARGEFILE */
+#define afs_stat_st     stat
+#define        afs_stat        stat
+#define        afs_fstat       fstat
+#define afs_fopen      fopen
+#define afs_open       open
+#ifdef S_SPLINT_S
+extern off_t afs_lseek(int FD, off_t O, int F);
+#endif /*S_SPLINT_S */
+#define afs_lseek(FD, O, F)    lseek(FD, (off_t) (O), F)
+#define afs_ftruncate           ftruncate
+#define afs_mmap                mmap
+#endif /* !O_LARGEFILE */
+#if AFS_HAVE_STATVFS64
+# define afs_statvfs   statvfs64
+#else
+# if AFS_HAVE_STATFS64
+#  define afs_statfs   statfs64
+#else
+#  if AFS_HAVE_STATVFS
+#   define afs_statvfs statvfs
+#  else
+#   define afs_statfs  statfs
+#  endif /* !AFS_HAVE_STATVFS */
+# endif        /* !AFS_HAVE_STATFS64 */
+#endif /* !AFS_HAVE_STATVFS64 */
+#endif /* AFS_NT40_ENV */
+
 #endif /* _IHANDLE_H_ */