Mailing-List: contact cygwin-developers-help AT sourceware DOT cygnus DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-developers-owner AT sourceware DOT cygnus DOT com Delivered-To: mailing list cygwin-developers AT sourceware DOT cygnus DOT com From: Chris Faylor Date: Thu, 15 Jun 2000 13:36:58 -0400 To: cygwin-developers AT sourceware DOT cygnus DOT com Subject: Re: mount doesn't complain about missing "mount directory" any more? Message-ID: <20000615133658.A1155@cygnus.com> Reply-To: cygwin-developers AT sourceware DOT cygnus DOT com Mail-Followup-To: cygwin-developers AT sourceware DOT cygnus DOT com References: <20000613213415 DOT A20386 AT cygnus DOT com> <20000613225819 DOT A12800 AT cygnus DOT com> <20000614010312 DOT B7392 AT cygnus DOT com> <20000615123419 DOT E5388 AT cygnus DOT com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2i In-Reply-To: ; from fujieda@jaist.ac.jp on Fri, Jun 16, 2000 at 02:32:29AM +0900 On Fri, Jun 16, 2000 at 02:32:29AM +0900, Kazuhiro Fujieda wrote: >>>> On Thu, 15 Jun 2000 12:34:19 -0400 >>>> Chris Faylor said: > >> Actually, UNIX can mount two devices, too. I just tried it, and a umount >> removes the first in the mount list. Is it possible to adapt your patch >> to do that? > >On SunOS 5.7, I couldn't mount a block special device on two >different directories. Then I tried a network file system and >found it succeeded. In this case, a umount removes the last in >the list. Anyway, I tried to tailor my patch to your request. Huh. I tried this on a Digital UNIX system with a network file system. I guess there's no standard. Thanks for making the change. I'll install this patch. cgf >ChangeLog: >2000-06-15 Kazuhiro Fujieda > * path.cc (mount_info::add_item): Eliminate a trailing backslash > included in a native path starting with '//[A-Za-z]/...'. > * path.cc (mount_info::del_item): Accept a native path as its target. > >Index: path.cc >=================================================================== >RCS file: /cvs/src/src/winsup/cygwin/path.cc,v >retrieving revision 1.30 >diff -u -p -r1.30 path.cc >--- path.cc 2000/06/13 16:48:37 1.30 >+++ path.cc 2000/06/15 17:03:16 >@@ -1614,10 +1614,8 @@ mount_info::add_item (const char *native > if (slash_drive_prefix_p (native)) > slash_drive_to_win32_path (native, nativetmp, 0); > else >- { >- backslashify (native, nativetmp, 0); >- nofinalslash (nativetmp, nativetmp); >- } >+ backslashify (native, nativetmp, 0); >+ nofinalslash (nativetmp, nativetmp); > > slashify (posix, posixtmp, 0); > nofinalslash (posixtmp, posixtmp); >@@ -1677,36 +1675,49 @@ int > mount_info::del_item (const char *path, unsigned flags, int reg_p) > { > char pathtmp[MAX_PATH]; >+ int posix_path_p = FALSE; > > /* Something's wrong if path is NULL or empty. */ >- if (path == NULL || *path == 0) >+ if (path == NULL || *path == 0 || !isabspath (path)) > { > set_errno (EINVAL); > return -1; > } > >- slashify (path, pathtmp, 0); >+ if (slash_drive_prefix_p (path)) >+ slash_drive_to_win32_path (path, pathtmp, 0); >+ else if (slash_unc_prefix_p (path) || strpbrk (path, ":\\")) >+ backslashify (path, pathtmp, 0); >+ else >+ { >+ slashify (path, pathtmp, 0); >+ posix_path_p = TRUE; >+ } > nofinalslash (pathtmp, pathtmp); >- >- debug_printf ("%s[%s]", path, pathtmp); > >- if (reg_p && del_reg_mount (pathtmp, flags) >- && del_reg_mount (path, flags)) /* for old irregular entries */ >+ if (reg_p && posix_path_p && >+ del_reg_mount (pathtmp, flags) && >+ del_reg_mount (path, flags)) /* for old irregular entries */ > return -1; > > for (int i = 0; i < nmounts; i++) > { >- /* Delete if paths and mount locations match. */ >- if ((strcasematch (mount[i].posix_path, pathtmp) >- || strcasematch (mount[i].native_path, pathtmp)) && >- (mount[i].flags & MOUNT_SYSTEM) == (flags & MOUNT_SYSTEM)) >+ int ent = native_sorted[i]; /* in the same order as getmntent() */ >+ if (((posix_path_p) >+ ? strcasematch (mount[ent].posix_path, pathtmp) >+ : strcasematch (mount[ent].native_path, pathtmp)) && >+ (mount[ent].flags & MOUNT_SYSTEM) == (flags & MOUNT_SYSTEM)) > { >- nmounts--; /* One less mount table entry */ >+ if (!posix_path_p && >+ reg_p && del_reg_mount (mount[ent].posix_path, flags)) >+ return -1; >+ >+ nmounts--; /* One less mount table entry */ > /* Fill in the hole if not at the end of the table */ >- if (i < nmounts) >- memmove (mount + i, mount + i + 1, >- sizeof (mount[i]) * (nmounts - i)); >- sort (); /* Resort the table */ >+ if (ent < nmounts) >+ memmove (mount + ent, mount + ent + 1, >+ sizeof (mount[ent]) * (nmounts - ent)); >+ sort (); /* Resort the table */ > return 0; > } > } > >____ > | AIST Kazuhiro Fujieda > | HOKURIKU School of Information Science >o_/ 1990 Japan Advanced Institute of Science and Technology -- cgf AT cygnus DOT com Cygnus Solutions, a Red Hat company http://sourceware.cygnus.com/ http://www.redhat.com/