diff options
author | Jim Meyering <jim@meyering.net> | 1999-05-23 19:42:59 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1999-05-23 19:42:59 +0000 |
commit | 0e96b5d2e7a7c9f1ce774618cc37417ee56861a0 (patch) | |
tree | 14cd0dfa21de4408a97e2ee3ad18b429e9162e48 /lib/same.c | |
parent | 2a8c9424f0e9acd8bec68b8806dcf2aca61b59ff (diff) | |
download | coreutils-0e96b5d2e7a7c9f1ce774618cc37417ee56861a0.tar.xz |
New file (function extracted from ln.c).
Diffstat (limited to 'lib/same.c')
-rw-r--r-- | lib/same.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/same.c b/lib/same.c new file mode 100644 index 000000000..8dda9fd51 --- /dev/null +++ b/lib/same.c @@ -0,0 +1,75 @@ +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#include <sys/types.h> +#include <sys/stat.h> +#include <ctype.h> +#include <errno.h> +#ifndef errno +extern int errno; +#endif + +#include "same.h" +#include "dirname.h" +#include "error.h" + +#if ENABLE_NLS +# include <libintl.h> +# define _(Text) gettext (Text) +#else +# define _(Text) Text +#endif + +#define STREQ(a, b) (strcmp ((a), (b)) == 0) + +#ifndef HAVE_DECL_FREE +void free (); +#endif + +char *base_name PARAMS ((char const *)); + +#define SAME_INODE(Stat_buf_1, Stat_buf_2) \ + ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \ + && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev) + +/* Return nonzero if SOURCE and DEST point to the same name in the same + directory. */ + +int +same_name (const char *source, const char *dest) +{ + struct stat source_dir_stats; + struct stat dest_dir_stats; + char *source_dirname, *dest_dirname; + + source_dirname = dir_name (source); + dest_dirname = dir_name (dest); + if (source_dirname == NULL || dest_dirname == NULL) + error (1, 0, _("virtual memory exhausted")); + + if (stat (source_dirname, &source_dir_stats)) + { + /* Shouldn't happen. */ + error (1, errno, "%s", source_dirname); + } + + if (stat (dest_dirname, &dest_dir_stats)) + { + /* Shouldn't happen. */ + error (1, errno, "%s", dest_dirname); + } + + free (source_dirname); + free (dest_dirname); + + return (SAME_INODE (source_dir_stats, dest_dir_stats) + && STREQ (base_name (source), base_name (dest))); +} |