umount falls into an infinite loop.
Chris Faylor
cgf@cygnus.com
Wed Jun 7 14:56:00 GMT 2000
Perfect. Thank you. That was service!
I'll install this patch once I've finished with the net release.
cgf
On Thu, Jun 08, 2000 at 05:54:56AM +0900, Kazuhiro Fujieda wrote:
>>>> On Wed, 7 Jun 2000 15:49:18 -0400
>>>> Chris Faylor <cgf@cygnus.com> said:
>
>> These look like good changes, but could I impose upon you to improve
>> the umount (and probably mount) error message handling facility
>> slightly?
>
>No problem. It took only three seconds with my toes.
>
>ChangeLog:
>2000-06-07 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
> mount.cc (error): New function to report an error and exit.
> umount.cc (error): Ditto.
> (remove_all_automounts): Check return status of cygwin_umount.
> (remove_all_user_mounts): Ditto.
> (remove_all_system_mounts): Ditto.
>
>Index: mount.cc
>===================================================================
>RCS file: /cvs/src/src/winsup/utils/mount.cc,v
>retrieving revision 1.4
>diff -u -p -r1.4 mount.cc
>--- mount.cc 2000/06/05 18:43:54 1.4
>+++ mount.cc 2000/06/07 20:36:35
>@@ -30,6 +30,14 @@ static short force = FALSE;
>
> static const char *progname;
>
>+static void
>+error (const char *path)
>+{
>+ fprintf (stderr, "%s: %s: %s\n", progname, path,
>+ (errno == EMFILE) ? "Too many mount entries" : strerror (errno));
>+ exit (1);
>+}
>+
> /* FIXME: do_mount should also print a warning message if the dev arg
> is a non-existent Win32 path. */
>
>@@ -59,10 +67,7 @@ do_mount (const char *dev, const char *w
> #endif
>
> if (mount (dev, where, flags))
>- {
>- perror ("mount failed");
>- exit (1);
>- }
>+ error (where);
>
> if (statres == -1)
> {
>@@ -159,8 +164,7 @@ main (int argc, const char **argv)
> if ((force == FALSE) && (mount_already_exists (argv[i + 1], flags)))
> {
> errno = EBUSY;
>- perror ("mount failed");
>- exit (1);
>+ error (argv[i + 1]);
> }
> else
> do_mount (argv[i], argv[i + 1], flags);
>@@ -232,10 +236,7 @@ change_cygdrive_prefix (const char *new_
> flags |= MOUNT_AUTO;
>
> if (mount (NULL, new_prefix, flags))
>- {
>- perror ("mount failed");
>- exit (1);
>- }
>+ error (new_prefix);
>
> exit (0);
> }
>Index: umount.cc
>===================================================================
>RCS file: /cvs/src/src/winsup/utils/umount.cc,v
>retrieving revision 1.2
>diff -u -p -r1.2 umount.cc
>--- umount.cc 2000/06/05 18:43:54 1.2
>+++ umount.cc 2000/06/07 20:36:35
>@@ -13,6 +13,7 @@ details. */
> #include <sys/mount.h>
> #include <mntent.h>
> #include <stdlib.h>
>+#include <errno.h>
>
> static void remove_all_mounts ();
> static void remove_all_automounts ();
>@@ -34,6 +35,13 @@ usage (void)
> exit (1);
> }
>
>+static void
>+error (char *path)
>+{
>+ fprintf (stderr, "%s: %s: %s\n", progname, path, strerror (errno));
>+ exit (1);
>+}
>+
> int
> main (int argc, char **argv)
> {
>@@ -81,10 +89,7 @@ main (int argc, char **argv)
> usage ();
>
> if (cygwin_umount (argv[i], flags) != 0)
>- {
>- perror ("umount");
>- exit (1);
>- }
>+ error (argv[i]);
>
> return 0;
> }
>@@ -109,14 +114,18 @@ remove_all_automounts ()
> /* Remove the mount if it's an automount. */
> if (strcmp (p->mnt_type, "user,auto") == 0)
> {
>- cygwin_umount (p->mnt_dir, 0);
>+ if (cygwin_umount (p->mnt_dir, 0))
>+ error (p->mnt_dir);
>+
> /* We've modified the table so we need to start over. */
> endmntent (m);
> m = setmntent ("/-not-used-", "r");
> }
> else if (strcmp (p->mnt_type, "system,auto") == 0)
> {
>- cygwin_umount (p->mnt_dir, MOUNT_SYSTEM);
>+ if (cygwin_umount (p->mnt_dir, MOUNT_SYSTEM))
>+ error (p->mnt_dir);
>+
> /* We've modified the table so we need to start over. */
> endmntent (m);
> m = setmntent ("/-not-used-", "r");
>@@ -132,14 +141,14 @@ remove_all_user_mounts ()
> {
> FILE *m = setmntent ("/-not-used-", "r");
> struct mntent *p;
>- int err;
>
> while ((p = getmntent (m)) != NULL)
> {
> /* Remove the mount if it's a user mount. */
> if (strncmp (p->mnt_type, "user", 4) == 0)
> {
>- err = cygwin_umount (p->mnt_dir, 0);
>+ if (cygwin_umount (p->mnt_dir, 0))
>+ error (p->mnt_dir);
>
> /* We've modified the table so we need to start over. */
> endmntent (m);
>@@ -162,7 +171,8 @@ remove_all_system_mounts ()
> /* Remove the mount if it's a system mount. */
> if (strncmp (p->mnt_type, "system", 6) == 0)
> {
>- cygwin_umount (p->mnt_dir, MOUNT_SYSTEM);
>+ if (cygwin_umount (p->mnt_dir, MOUNT_SYSTEM))
>+ error (p->mnt_dir);
>
> /* We've modified the table so we need to start over. */
> endmntent (m);
>
>____
> | AIST Kazuhiro Fujieda <fujieda@jaist.ac.jp>
> | HOKURIKU School of Information Science
>o_/ 1990 Japan Advanced Institute of Science and Technology
--
cgf@cygnus.com Cygnus Solutions, a Red Hat company
http://sourceware.cygnus.com/ http://www.redhat.com/
More information about the Cygwin-patches
mailing list