From: Jim Meyering Date: Sun, 23 May 1999 19:42:59 +0000 (+0000) Subject: New file (function extracted from ln.c). X-Git-Tag: cvs-readonly~7315 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=1fe04cbac9d93ed7e9f4e2646f5902b64784741b;p=gnulib.git New file (function extracted from ln.c). --- 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 +#endif + +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#if HAVE_STDLIB_H +# include +#endif +#include +#include +#include +#include +#ifndef errno +extern int errno; +#endif + +#include "same.h" +#include "dirname.h" +#include "error.h" + +#if ENABLE_NLS +# include +# 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))); +}