GNU file utilities FILEUTILS-3_5_5
authorJim Meyering <jim@meyering.net>
Sat, 22 May 1993 02:01:31 +0000 (02:01 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 22 May 1993 02:01:31 +0000 (02:01 +0000)
lib/fsusage.c
lib/mountlist.c
lib/rename.c

index 2a1fe86..c9ed26c 100644 (file)
@@ -156,9 +156,11 @@ get_fs_usage (path, disk, fsp)
      no matter what value f_bsize has.  */
 #define convert_blocks(b) (b)
 #ifndef _SEQUENT_              /* _SEQUENT_ is DYNIX/ptx.  */
+#ifndef DOLPHIN                        /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
 #define f_bavail f_bfree
 #endif
 #endif
+#endif
 
 #ifdef STAT_STATVFS            /* SVR4.  */
   struct statvfs fsd;
index 947fb7e..4528c9e 100644 (file)
@@ -82,6 +82,12 @@ void error ();
 #include <sys/vfs.h>
 #endif
 
+#ifdef DOLPHIN
+/* So special that it's not worth putting this in autoconf.  */
+#undef MOUNTED_FREAD_FSTYP
+#define MOUNTED_GETMNTTBL
+#endif
+
 #ifdef MOUNTED_GETMNTENT1      /* 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
 /* Return the value of the hexadecimal number represented by CP.
    No prefix (like '0x') or suffix (like 'h') is expected to be
@@ -358,6 +364,26 @@ read_filesystem_list (need_fs_type, all_fs)
   }
 #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP.  */
 
+#ifdef MOUNTED_GETMNTTBL       /* DolphinOS goes it's own way */
+  {
+    struct mntent **mnttbl=getmnttbl(),**ent;
+    for (ent=mnttbl;*ent;ent++)
+      {
+       me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
+       me->me_devname = xstrdup ( (*ent)->mt_resource);
+       me->me_mountdir = xstrdup( (*ent)->mt_directory);
+       me->me_type =  xstrdup ((*ent)->mt_fstype);
+       me->me_dev = -1;        /* Magic; means not known yet. */
+       me->me_next = NULL;
+       
+       /* Add to the linked list. */
+       mtail->me_next = me;
+       mtail = me;
+      }
+    endmnttbl();
+  }
+#endif
+
 #ifdef MOUNTED_GETMNTENT2      /* SVR4.  */
   {
     struct mnttab mnt;
index a40bbb5..858190c 100644 (file)
@@ -34,14 +34,30 @@ rename (from, to)
      char *from;
      char *to;
 {
-  struct stat from_stats;
+  struct stat from_stats, to_stats;
   int pid, status;
 
   if (stat (from, &from_stats))
     return -1;
 
-  if (unlink (to) && errno != ENOENT)
-    return -1;
+  /* Be careful not to unlink `from' if it happens to be equal to `to' or
+     (on filesystems that silently truncate filenames after 14 characters)
+     if `from' and `to' share the significant characters. */
+  if (stat (to, &to_stats))
+    {
+      if (errno != ENOENT)
+        return -1;
+    }
+  else
+    {
+      if ((from_stats.st_dev == to_stats.st_dev)
+          && (from_stats.st_ino == to_stats.st_dev))
+        /* `from' and `to' designate the same file on that filesystem. */
+        return 0;
+
+      if (unlink (to) && errno != ENOENT)
+        return -1;
+    }
 
   if (S_ISDIR (from_stats.st_mode))
     {