/*
 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.  
 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
 *
 * This file is part of LVM2.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License v.2.1.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef _LVM_FILE_H
#define _LVM_FILE_H

/*
 * Create a temporary filename, and opens a descriptor to the file.
 */
int create_temp_name(const char *dir, char *buffer, size_t len, int *fd,
		     unsigned *seed);

/*
 * NFS-safe rename of a temporary file to a common name, designed
 * to avoid race conditions and not overwrite the destination if
 * it exists.
 */
int lvm_rename(const char *old, const char *new);

/*
 * Return 1 if path exists else return 0
 */
int path_exists(const char *path);
int dir_exists(const char *path);

/*
 * Return 1 if dir is empty
 */
int is_empty_dir(const char *dir);

/* Sync directory changes */
void sync_dir(const char *file);

/* fcntl locking wrappers */
int fcntl_lock_file(const char *file, short lock_type, int warn_if_read_only);
void fcntl_unlock_file(int lockfd);

#define is_same_inode(buf1, buf2) \
  ((buf1).st_ino == (buf2).st_ino && \
   (buf1).st_dev == (buf2).st_dev)

#define is_valid_fd(fd) (!(fcntl(fd, F_GETFD) == -1 && errno == EBADF))

/*
 * Close the specified stream, taking care to detect and diagnose any write
 * error.  If there is an error, use the supplied file name in a diagnostic
 * that is reported via log_error or log_sys_error, as appropriate.
 * Use this function to close a stream when you've written data to it via
 * unchecked fprintf, fputc, etc. calls.  Return 0 on success, EOF on failure.
 */
int lvm_fclose(FILE *fp, const char *filename);

/*
 * Convert stat->st_ctim  status of last change in nanoseconds
 * uses  st_ctime when not available.
 */
void lvm_stat_ctim(struct timespec *ts, const struct stat *buf);

/* Inspired by <sys/time.h>  timercmp() macro for timeval */
#define timespeccmp(tsp, usp, cmp)\
	(((tsp)->tv_sec == (usp)->tv_sec) ?\
		((tsp)->tv_nsec cmp (usp)->tv_nsec) :\
		((tsp)->tv_sec cmp (usp)->tv_sec))
#endif
