diff --git a/src/vol/ihandle.c b/src/vol/ihandle.c index 178d6b0350..8b053b37a2 100644 --- a/src/vol/ihandle.c +++ b/src/vol/ihandle.c @@ -1095,3 +1095,18 @@ ih_pwrite(int fd, const void * buf, size_t count, afs_foff_t offset) return OS_WRITE(fd, buf, count); } #endif /* !HAVE_PIO */ + +#ifndef AFS_NT40_ENV +int +ih_isunlinked(int fd) +{ + struct afs_stat_st status; + if (afs_fstat(fd, &status) < 0) { + return -1; + } + if (status.st_nlink < 1) { + return 1; + } + return 0; +} +#endif /* !AFS_NT40_ENV */ diff --git a/src/vol/ihandle.h b/src/vol/ihandle.h index 9e48d09625..88b54c4c4e 100644 --- a/src/vol/ihandle.h +++ b/src/vol/ihandle.h @@ -61,6 +61,7 @@ * status information: * FDH_SIZE - returns the size of the file. * FDH_NLINK - returns the link count of the file. + * FDH_ISUNLINKED - returns if the file has been unlinked out from under us * * Miscellaneous: * FDH_FDOPEN - create a descriptor for buffered I/O @@ -386,6 +387,8 @@ extern ssize_t ih_pwrite(FD_t fd, const void * buf, size_t count, afs_foff_t off # define OS_UNLOCKFILE(FD, O) (!UnlockFile(FD, (DWORD)((O) & 0xFFFFFFFF), (DWORD)((O) >> 32), 2, 0)) # define OS_ERROR(X) nterr_nt2unix(GetLastError(), X) # define OS_UNLINK(X) nt_unlink(X) +/* we can't have a file unlinked out from under us on NT */ +# define OS_ISUNLINKED(X) (0) # define OS_DIRSEP "\\" # define OS_DIRSEPC '\\' #else @@ -393,6 +396,8 @@ extern ssize_t ih_pwrite(FD_t fd, const void * buf, size_t count, afs_foff_t off # define OS_UNLOCKFILE(FD, O) flock(FD, LOCK_UN) # define OS_ERROR(X) X # define OS_UNLINK(X) unlink(X) +# define OS_ISUNLINKED(X) ih_isunlinked(X) +extern int ih_isunlinked(FD_t fd); # define OS_DIRSEP "/" # define OS_DIRSEPC '/' #endif @@ -550,6 +555,7 @@ extern afs_sfsize_t ih_size(FD_t); #define FDH_SIZE(H) OS_SIZE((H)->fd_fd) #define FDH_LOCKFILE(H, O) OS_LOCKFILE((H)->fd_fd, O) #define FDH_UNLOCKFILE(H, O) OS_UNLOCKFILE((H)->fd_fd, O) +#define FDH_ISUNLINKED(H) OS_ISUNLINKED((H)->fd_fd) #ifdef AFS_NT40_ENV # define afs_stat_st __stat64