* postinstall: New script.

* Makefile.in (sysconfdir): Define.
	(install): Create $(sysconfdir)/postinstall dir.  Install postinstall
	script into it.

	* path.cc: Add temorary comments to note later function removal.
	(conv_fstab_spaces): New inline function to handle \040 to space
	conversion.
	(struct opt): Add "system" and "user" mount options.
	(mount_info::from_fstab_line): Only allow # to start a comment at
	the beginning of the line.  Call conv_fstab_spaces on native_path and
	posix_path fields.  Don't enforce system mounts in /etc/fstab.
	Drop last argument in call to add_item.
	(mount_info::from_fstab): Create a default cygdrive entry.  Load
	user mount points from fstab.<username> instead of fstab.<sid>.
	(mount_info::read_mounts): Drop last argument in call to add_item.
	(mount_info::add_reg_mount): Remove.
	(mount_info::del_reg_mount): Remove.
	(mount_info::write_cygdrive_info): Rename from
	mount_info::write_cygdrive_info_to_registry.  Don't write to registry.
	Disallow to overwrite a system cygdrive prefix.
	(mount_info::remove_cygdrive_info_from_registry): Remove.
	(mount_info::get_cygdrive_info): Just fetch current cygdrive prefix and
	flags.
	(mount_info::add_item): Drop last argument.  Don't write to registry.
	Disallow to overwrite a system mount point.
	(mount_info::del_item): Drop last argument.  Don't write to registry.
	Disallow to remove a system mount point.
	(mount): Enforce user mount.
	(cygwin_umount): Ditto.
	* shared_info.h (mount_info::add_item): Drop last argument.
	(mount_info::del_item): Ditto.
	(mount_info::add_reg_mount): Remove.
	(mount_info::del_reg_mount): Remove.
	(mount_info::write_cygdrive_info): Rename from
	mount_info::write_cygdrive_info_to_registry.
	(mount_info::remove_cygdrive_info_from_registry): Remove.
This commit is contained in:
Corinna Vinschen 2008-04-05 09:30:06 +00:00
parent 6f810581fb
commit ac6f159cd7
5 changed files with 344 additions and 200 deletions

View File

@ -1,3 +1,43 @@
2008-04-05 Corinna Vinschen <corinna@vinschen.de>
* postinstall: New script.
* Makefile.in (sysconfdir): Define.
(install): Create $(sysconfdir)/postinstall dir. Install postinstall
script into it.
* path.cc: Add temorary comments to note later function removal.
(conv_fstab_spaces): New inline function to handle \040 to space
conversion.
(struct opt): Add "system" and "user" mount options.
(mount_info::from_fstab_line): Only allow # to start a comment at
the beginning of the line. Call conv_fstab_spaces on native_path and
posix_path fields. Don't enforce system mounts in /etc/fstab.
Drop last argument in call to add_item.
(mount_info::from_fstab): Create a default cygdrive entry. Load
user mount points from fstab.<username> instead of fstab.<sid>.
(mount_info::read_mounts): Drop last argument in call to add_item.
(mount_info::add_reg_mount): Remove.
(mount_info::del_reg_mount): Remove.
(mount_info::write_cygdrive_info): Rename from
mount_info::write_cygdrive_info_to_registry. Don't write to registry.
Disallow to overwrite a system cygdrive prefix.
(mount_info::remove_cygdrive_info_from_registry): Remove.
(mount_info::get_cygdrive_info): Just fetch current cygdrive prefix and
flags.
(mount_info::add_item): Drop last argument. Don't write to registry.
Disallow to overwrite a system mount point.
(mount_info::del_item): Drop last argument. Don't write to registry.
Disallow to remove a system mount point.
(mount): Enforce user mount.
(cygwin_umount): Ditto.
* shared_info.h (mount_info::add_item): Drop last argument.
(mount_info::del_item): Ditto.
(mount_info::add_reg_mount): Remove.
(mount_info::del_reg_mount): Remove.
(mount_info::write_cygdrive_info): Rename from
mount_info::write_cygdrive_info_to_registry.
(mount_info::remove_cygdrive_info_from_registry): Remove.
2008-04-03 Corinna Vinschen <corinna@vinschen.de> 2008-04-03 Corinna Vinschen <corinna@vinschen.de>
* path.cc (mount_info::from_fstab_line): Simplify. Recognize special * path.cc (mount_info::from_fstab_line): Simplify. Recognize special

View File

@ -27,6 +27,7 @@ exec_prefix:=@exec_prefix@
bindir:=@bindir@ bindir:=@bindir@
libdir:=@libdir@ libdir:=@libdir@
mandir:=@mandir@ mandir:=@mandir@
sysconfdir:=@sysconfdir@
ifeq ($(target_alias),$(host_alias)) ifeq ($(target_alias),$(host_alias))
ifeq ($(build_alias),$(host_alias)) ifeq ($(build_alias),$(host_alias))
tooldir:=$(exec_prefix) tooldir:=$(exec_prefix)
@ -297,6 +298,8 @@ force:
install: install-libs install-headers install-man install_target \ install: install-libs install-headers install-man install_target \
$(install_host) $(install_target) $(install_host) $(install_target)
@$(MKDIRP) $(sysconfdir)/postinstall
$(INSTALL_PROGRAM) $(srcdir)/postinstall $(sysconfdir)/postinstall/000-cygwin-post-install.sh
uninstall: uninstall-libs uninstall-headers uninstall-man uninstall: uninstall-libs uninstall-headers uninstall-man

View File

@ -1640,6 +1640,9 @@ mount_info::init ()
if (from_fstab (false) | from_fstab (true)) /* The single | is correct! */ if (from_fstab (false) | from_fstab (true)) /* The single | is correct! */
return; return;
/* FIXME: Remove fetching from registry before releasing 1.7.0. */
/* Fetch the mount table and cygdrive-related information from /* Fetch the mount table and cygdrive-related information from
the registry. */ the registry. */
system_printf ("Fallback to fetching mounts from registry"); system_printf ("Fallback to fetching mounts from registry");
@ -2317,6 +2320,18 @@ find_ws (char *in)
return in; return in;
} }
inline char *
conv_fstab_spaces (char *field)
{
register char *sp = field;
while (sp = strstr (sp, "\\040"))
{
*sp++ = ' ';
memmove (sp, sp + 3, strlen (sp + 3) + 1);
}
return field;
}
struct opt struct opt
{ {
const char *name; const char *name;
@ -2324,6 +2339,8 @@ struct opt
bool clear; bool clear;
} oopts[] = } oopts[] =
{ {
{"user", MOUNT_SYSTEM, 1},
{"system", MOUNT_SYSTEM, 0},
{"binary", MOUNT_BINARY, 0}, {"binary", MOUNT_BINARY, 0},
{"text", MOUNT_BINARY, 1}, {"text", MOUNT_BINARY, 1},
{"exec", MOUNT_EXEC, 0}, {"exec", MOUNT_EXEC, 0},
@ -2375,44 +2392,41 @@ mount_info::from_fstab_line (char *line, bool user)
return true; return true;
char *cend = find_ws (c); char *cend = find_ws (c);
*cend = '\0'; *cend = '\0';
native_path = c; native_path = conv_fstab_spaces (c);
/* Second field: POSIX path. */ /* Second field: POSIX path. */
c = skip_ws (cend + 1); c = skip_ws (cend + 1);
if (!*c || *c == '#') if (!*c)
return true; return true;
cend = find_ws (c); cend = find_ws (c);
*cend = '\0'; *cend = '\0';
posix_path = c; posix_path = conv_fstab_spaces (c);
/* Third field: FS type. */ /* Third field: FS type. */
c = skip_ws (cend + 1); c = skip_ws (cend + 1);
if (!*c || *c == '#') if (!*c)
return true; return true;
cend = find_ws (c); cend = find_ws (c);
*cend = '\0'; *cend = '\0';
fs_type = c; fs_type = c;
/* Forth field: Flags. */ /* Forth field: Flags. */
c = skip_ws (cend + 1); c = skip_ws (cend + 1);
if (!*c || *c == '#') if (!*c)
return true; return true;
cend = find_ws (c); cend = find_ws (c);
*cend = '\0'; *cend = '\0';
unsigned mount_flags = 0; unsigned mount_flags = MOUNT_SYSTEM;
if (!read_flags (c, mount_flags)) if (!read_flags (c, mount_flags))
return true; return true;
if (user) if (user)
mount_flags &= ~MOUNT_SYSTEM; mount_flags &= ~MOUNT_SYSTEM;
else
mount_flags |= MOUNT_SYSTEM;
if (!strcmp (fs_type, "cygdrive")) if (!strcmp (fs_type, "cygdrive"))
{ {
cygdrive_flags = mount_flags; cygdrive_flags = mount_flags | MOUNT_CYGDRIVE;
slashify (posix_path, cygdrive, 1); slashify (posix_path, cygdrive, 1);
cygdrive_len = strlen (cygdrive); cygdrive_len = strlen (cygdrive);
} }
else else
{ {
int res = mount_table->add_item (native_path, posix_path, mount_flags, int res = mount_table->add_item (native_path, posix_path, mount_flags);
false);
if (res && get_errno () == EMFILE) if (res && get_errno () == EMFILE)
return false; return false;
} }
@ -2444,19 +2458,25 @@ mount_info::from_fstab (bool user)
return false; return false;
} }
/* Create a default root dir from the path the Cygwin DLL is in. */
if (!user) if (!user)
{ {
/* Create a default root dir from the path the Cygwin DLL is in. */
*w = L'\0'; *w = L'\0';
char *native_root = tp.c_get (); char *native_root = tp.c_get ();
sys_wcstombs (native_root, NT_MAX_PATH, path); sys_wcstombs (native_root, NT_MAX_PATH, path);
mount_table->add_item (native_root, "/", MOUNT_SYSTEM | MOUNT_BINARY, mount_table->add_item (native_root, "/", MOUNT_SYSTEM | MOUNT_BINARY);
false); /* Create a default cygdrive entry. Note that this is a user entry.
This allows to override it with mount, unless the sysadmin created
a cygdrive entry in /etc/fstab. */
cygdrive_flags = MOUNT_BINARY | MOUNT_CYGDRIVE;
strcpy (cygdrive, "/cygdrive/");
cygdrive_len = strlen (cygdrive);
} }
PWCHAR u = wcpcpy (w, L"\\etc\\fstab"); PWCHAR u = wcpcpy (w, L"\\etc\\fstab");
if (user) if (user)
cygheap->user.get_windows_id (wcpcpy (u, L".")); sys_mbstowcs (wcpcpy (u, L"."), NT_MAX_PATH - (u - path),
cygheap->user.name ());
debug_printf ("Try to read mounts from %W", path); debug_printf ("Try to read mounts from %W", path);
HANDLE h = CreateFileW (path, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih, HANDLE h = CreateFileW (path, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
@ -2506,6 +2526,7 @@ done:
/* read_mounts: Given a specific regkey, read mounts from under its /* read_mounts: Given a specific regkey, read mounts from under its
key. */ key. */
/* FIXME: Remove before releasing 1.7.0. */
void void
mount_info::read_mounts (reg_key& r) mount_info::read_mounts (reg_key& r)
@ -2550,7 +2571,7 @@ mount_info::read_mounts (reg_key& r)
mount_flags = subkey.get_int ("flags", 0); mount_flags = subkey.get_int ("flags", 0);
/* Add mount_item corresponding to registry mount point. */ /* Add mount_item corresponding to registry mount point. */
res = mount_table->add_item (native_path, posix_path, mount_flags, false); res = mount_table->add_item (native_path, posix_path, mount_flags);
if (res && get_errno () == EMFILE) if (res && get_errno () == EMFILE)
break; /* The number of entries exceeds MAX_MOUNTS */ break; /* The number of entries exceeds MAX_MOUNTS */
} }
@ -2558,6 +2579,7 @@ mount_info::read_mounts (reg_key& r)
/* from_registry: Build the entire mount table from the registry. Also, /* from_registry: Build the entire mount table from the registry. Also,
read in cygdrive-related information from its registry location. */ read in cygdrive-related information from its registry location. */
/* FIXME: Remove before releasing 1.7.0. */
void void
mount_info::from_registry () mount_info::from_registry ()
@ -2581,77 +2603,10 @@ mount_info::from_registry ()
} }
} }
/* add_reg_mount: Add mount item to registry. Return zero on success,
non-zero on failure. */
/* FIXME: Need a mutex to avoid collisions with other tasks. */
int
mount_info::add_reg_mount (const char *native_path, const char *posix_path, unsigned mountflags)
{
int res;
/* Add the mount to the right registry location, depending on
whether MOUNT_SYSTEM is set in the mount flags. */
reg_key reg (mountflags & MOUNT_SYSTEM, KEY_ALL_ACCESS,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
/* Start by deleting existing mount if one exists. */
res = reg.kill (posix_path);
if (res != ERROR_SUCCESS && res != ERROR_FILE_NOT_FOUND)
{
err:
__seterrno_from_win_error (res);
return -1;
}
/* Create the new mount. */
reg_key subkey (reg.get_key (), KEY_ALL_ACCESS, posix_path, NULL);
res = subkey.set_string ("native", native_path);
if (res != ERROR_SUCCESS)
goto err;
res = subkey.set_int ("flags", mountflags);
if (mountflags & MOUNT_SYSTEM)
{
sys_mount_table_counter++;
cygwin_shared->sys_mount_table_counter++;
}
return 0; /* Success */
}
/* del_reg_mount: delete mount item from registry indicated in flags.
Return zero on success, non-zero on failure.*/
/* FIXME: Need a mutex to avoid collisions with other tasks. */
int
mount_info::del_reg_mount (const char * posix_path, unsigned flags)
{
int res;
reg_key reg (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
res = reg.kill (posix_path);
if (res != ERROR_SUCCESS)
{
__seterrno_from_win_error (res);
return -1;
}
if (flags & MOUNT_SYSTEM)
{
sys_mount_table_counter++;
cygwin_shared->sys_mount_table_counter++;
}
return 0; /* Success */
}
/* read_cygdrive_info_from_registry: Read the default prefix and flags /* read_cygdrive_info_from_registry: Read the default prefix and flags
to use when creating cygdrives from the special user registry to use when creating cygdrives from the special user registry
location used to store cygdrive information. */ location used to store cygdrive information. */
/* FIXME: Remove before releasing 1.7.0. */
void void
mount_info::read_cygdrive_info_from_registry () mount_info::read_cygdrive_info_from_registry ()
@ -2685,109 +2640,54 @@ mount_info::read_cygdrive_info_from_registry ()
} }
} }
/* write_cygdrive_info_to_registry: Write the default prefix and flags /* write_cygdrive_info: Store default prefix and flags
to use when creating cygdrives to the special user registry to use when creating cygdrives to the special user shared mem
location used to store cygdrive information. */ location used to store cygdrive information. */
int int
mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags) mount_info::write_cygdrive_info (const char *cygdrive_prefix, unsigned flags)
{ {
/* Verify cygdrive prefix starts with a forward slash and if there's /* Verify cygdrive prefix starts with a forward slash and if there's
another character, it's not a slash. */ another character, it's not a slash. */
if ((cygdrive_prefix == NULL) || (*cygdrive_prefix == 0) || if ((cygdrive_prefix == NULL) || (*cygdrive_prefix == 0) ||
(!isslash (cygdrive_prefix[0])) || (!isslash (cygdrive_prefix[0])) ||
((cygdrive_prefix[1] != '\0') && (isslash (cygdrive_prefix[1])))) ((cygdrive_prefix[1] != '\0') && (isslash (cygdrive_prefix[1]))))
{
set_errno (EINVAL);
return -1;
}
char hold_cygdrive_prefix[strlen (cygdrive_prefix) + 1];
/* Ensure that there is never a final slash */
nofinalslash (cygdrive_prefix, hold_cygdrive_prefix);
reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL);
int res;
res = r.set_string (CYGWIN_INFO_CYGDRIVE_PREFIX, hold_cygdrive_prefix);
if (res != ERROR_SUCCESS)
{ {
__seterrno_from_win_error (res); set_errno (EINVAL);
return -1; return -1;
} }
r.set_int (CYGWIN_INFO_CYGDRIVE_FLAGS, flags); /* Don't allow to override a system cygdrive prefix. */
if (cygdrive_flags & MOUNT_SYSTEM)
if (flags & MOUNT_SYSTEM)
sys_mount_table_counter = ++cygwin_shared->sys_mount_table_counter;
/* This also needs to go in the in-memory copy of "cygdrive", but only if
appropriate:
1. setting user path prefix, or
2. overwriting (a previous) system path prefix */
if (!(flags & MOUNT_SYSTEM) || (mount_table->cygdrive_flags & MOUNT_SYSTEM))
{ {
slashify (cygdrive_prefix, cygdrive, 1); set_errno (EPERM);
cygdrive_flags = flags; return -1;
cygdrive_len = strlen (cygdrive);
} }
slashify (cygdrive_prefix, cygdrive, 1);
cygdrive_flags = flags & ~MOUNT_SYSTEM;
cygdrive_len = strlen (cygdrive);
return 0; return 0;
} }
int
mount_info::remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags)
{
reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS,
CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME,
NULL);
/* Delete cygdrive prefix and flags. */
int res = r.killvalue (CYGWIN_INFO_CYGDRIVE_PREFIX);
int res2 = r.killvalue (CYGWIN_INFO_CYGDRIVE_FLAGS);
if (flags & MOUNT_SYSTEM)
sys_mount_table_counter = ++cygwin_shared->sys_mount_table_counter;
/* Reinitialize the cygdrive path prefix to reflect to removal from the
registry. */
read_cygdrive_info_from_registry ();
if (res == ERROR_SUCCESS)
res = res2;
if (res == ERROR_SUCCESS)
return 0;
__seterrno_from_win_error (res);
return -1;
}
int int
mount_info::get_cygdrive_info (char *user, char *system, char* user_flags, mount_info::get_cygdrive_info (char *user, char *system, char* user_flags,
char* system_flags) char* system_flags)
{ {
/* Get the user path prefix from HKEY_CURRENT_USER. */ if (user)
reg_key r (false, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); *user = '\0';
int res = r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, user, CYG_MAX_PATH, "");
/* Get the user flags, if appropriate */ /* Get the user flags, if appropriate */
if (user_flags && res == ERROR_SUCCESS) if (user_flags)
{ *user_flags = '\0';
int flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE | MOUNT_BINARY);
strcpy (user_flags, (flags & MOUNT_BINARY) ? "binmode" : "textmode");
}
/* Get the system path prefix from HKEY_LOCAL_MACHINE. */ if (system)
reg_key r2 (true, KEY_READ, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); strcpy (system, cygdrive);
int res2 = r2.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, system, CYG_MAX_PATH, "");
/* Get the system flags, if appropriate */ if (system_flags)
if (system_flags && res2 == ERROR_SUCCESS) strcpy (system_flags,
{ (cygdrive_flags & MOUNT_BINARY) ? "binmode" : "textmode");
int flags = r2.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE | MOUNT_BINARY);
strcpy (system_flags, (flags & MOUNT_BINARY) ? "binmode" : "textmode");
}
return (res != ERROR_SUCCESS) ? res : res2; return 0;
} }
static mount_item *mounts_for_sort; static mount_item *mounts_for_sort;
@ -2883,7 +2783,8 @@ mount_info::sort ()
do this when called internally, but it's cleaner to keep it all here. */ do this when called internally, but it's cleaner to keep it all here. */
int int
mount_info::add_item (const char *native, const char *posix, unsigned mountflags, int reg_p) mount_info::add_item (const char *native, const char *posix,
unsigned mountflags)
{ {
tmp_pathbuf tp; tmp_pathbuf tp;
char *nativetmp = tp.c_get (); char *nativetmp = tp.c_get ();
@ -2929,9 +2830,17 @@ mount_info::add_item (const char *native, const char *posix, unsigned mountflags
int i; int i;
for (i = 0; i < nmounts; i++) for (i = 0; i < nmounts; i++)
{ {
if (strcasematch (mount[i].posix_path, posixtmp) && if (strcasematch (mount[i].posix_path, posixtmp))
(mount[i].flags & MOUNT_SYSTEM) == (mountflags & MOUNT_SYSTEM)) {
break; /* Don't allow to override a system mount with a user mount. */
if ((mount[i].flags & MOUNT_SYSTEM) && !(mountflags & MOUNT_SYSTEM))
{
set_errno (EPERM);
return -1;
}
if ((mount[i].flags & MOUNT_SYSTEM) == (mountflags & MOUNT_SYSTEM))
break;
}
} }
if (i == nmounts && nmounts == MAX_MOUNTS) if (i == nmounts && nmounts == MAX_MOUNTS)
@ -2940,9 +2849,6 @@ mount_info::add_item (const char *native, const char *posix, unsigned mountflags
return -1; return -1;
} }
if (reg_p && add_reg_mount (nativetmp, posixtmp, mountflags))
return -1;
if (i == nmounts) if (i == nmounts)
nmounts++; nmounts++;
mount[i].init (nativetmp, posixtmp, mountflags); mount[i].init (nativetmp, posixtmp, mountflags);
@ -2960,7 +2866,7 @@ mount_info::add_item (const char *native, const char *posix, unsigned mountflags
*/ */
int int
mount_info::del_item (const char *path, unsigned flags, int reg_p) mount_info::del_item (const char *path, unsigned flags)
{ {
tmp_pathbuf tp; tmp_pathbuf tp;
char *pathtmp = tp.c_get (); char *pathtmp = tp.c_get ();
@ -2982,23 +2888,19 @@ mount_info::del_item (const char *path, unsigned flags, int reg_p)
} }
nofinalslash (pathtmp, pathtmp); nofinalslash (pathtmp, pathtmp);
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++) for (int i = 0; i < nmounts; i++)
{ {
int ent = native_sorted[i]; /* in the same order as getmntent() */ int ent = native_sorted[i]; /* in the same order as getmntent() */
if (((posix_path_p) if (((posix_path_p)
? strcasematch (mount[ent].posix_path, pathtmp) ? strcasematch (mount[ent].posix_path, pathtmp)
: strcasematch (mount[ent].native_path, pathtmp)) && : strcasematch (mount[ent].native_path, pathtmp)))
(mount[ent].flags & MOUNT_SYSTEM) == (flags & MOUNT_SYSTEM))
{ {
if (!posix_path_p && /* Don't allow to remove a system mount. */
reg_p && del_reg_mount (mount[ent].posix_path, flags)) if ((mount[ent].flags & MOUNT_SYSTEM))
return -1; {
set_errno (EPERM);
return -1;
}
nmounts--; /* One less mount table entry */ nmounts--; /* One less mount table entry */
/* Fill in the hole if not at the end of the table */ /* Fill in the hole if not at the end of the table */
if (ent < nmounts) if (ent < nmounts)
@ -3173,6 +3075,7 @@ extern "C" int
mount (const char *win32_path, const char *posix_path, unsigned flags) mount (const char *win32_path, const char *posix_path, unsigned flags)
{ {
int res = -1; int res = -1;
flags &= ~MOUNT_SYSTEM;
myfault efault; myfault efault;
if (efault.faulted (EFAULT)) if (efault.faulted (EFAULT))
@ -3186,13 +3089,13 @@ mount (const char *win32_path, const char *posix_path, unsigned flags)
/* When flags include MOUNT_CYGDRIVE, take this to mean that /* When flags include MOUNT_CYGDRIVE, take this to mean that
we actually want to change the cygdrive prefix and flags we actually want to change the cygdrive prefix and flags
without actually mounting anything. */ without actually mounting anything. */
res = mount_table->write_cygdrive_info_to_registry (posix_path, flags); res = mount_table->write_cygdrive_info (posix_path, flags);
win32_path = NULL; win32_path = NULL;
} }
else if (!*win32_path) else if (!*win32_path)
set_errno (EINVAL); set_errno (EINVAL);
else else
res = mount_table->add_item (win32_path, posix_path, flags, true); res = mount_table->add_item (win32_path, posix_path, flags);
syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags); syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags);
return res; return res;
@ -3226,17 +3129,8 @@ cygwin_umount (const char *path, unsigned flags)
{ {
int res = -1; int res = -1;
if (flags & MOUNT_CYGDRIVE) if (!(flags & MOUNT_CYGDRIVE))
{ res = mount_table->del_item (path, flags & ~MOUNT_SYSTEM);
/* When flags include MOUNT_CYGDRIVE, take this to mean that we actually want
to remove the cygdrive prefix and flags without actually unmounting
anything. */
res = mount_table->remove_cygdrive_info_from_registry (path, flags);
}
else
{
res = mount_table->del_item (path, flags, true);
}
syscall_printf ("%d = cygwin_umount (%s, %d)", res, path, flags); syscall_printf ("%d = cygwin_umount (%s, %d)", res, path, flags);
return res; return res;

211
winsup/cygwin/postinstall Executable file
View File

@ -0,0 +1,211 @@
#!/bin/bash
#
# Copyright 2008 Red Hat, Inc.
#
# This file is part of Cygwin.
#
# This software is a copyrighted work licensed under the terms of the
# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
# details.
#
export PATH="/bin:$PATH"
DEVDIR=/dev
# Create fstab file if it doesn't exist.
if [ -e "/etc/fstab" -a ! -f "/etc/fstab" ]
then
# Try to move
mv -f "/etc/fstab" "/etc/fstab.orig"
if [ -e "/etc/fstab" -a ! -f "/etc/fstab" ]
then
echo
echo "/etc/fstab is existant but not a file."
echo "Since this file is specifying the mount points, this might"
echo "result in unexpected trouble. Please fix that manually."
echo
fi
fi
if [ ! -e "/etc/fstab" ]
then
mount |
(
while read -r line
do
[[ "$line" =~ ([^ ]*)\ on\ ([^ ]*)\ type\ ([^ ]*)\ .* ]]
if [ "${BASH_REMATCH[2]}" = "/" ]
then
CYGROOT="${BASH_REMATCH[1]}"
FS_TYPE="${BASH_REMATCH[3]}"
break
fi
done
cat > /etc/fstab << EOF
# The file fstab contains descriptive information about the various file
# systems. fstab is only read by programs, and not written; it is the
# duty of the system administrator to properly create and maintain this
# file. Each filesystem is described on a separate line; fields on each
# line are separated by tabs or spaces. Lines starting with '#' are com-
# ments.
#
# The first field, (fs_spec), describes the block special device or
# remote filesystem to be mounted. On Cygwin, this is the native Windows
# path which the mount point links in. As path separator you MUST use a
# slash. Usage of a backslash might lead to unexpected results. UNC
# paths (using slashes, not backslashes) are allowed. If the path
# contains spaces these can be escaped as '\040'.
#
# The second field, (fs_file), describes the mount point for the filesys-
# tem. If the name of the mount point contains spaces these can be
# escaped as '\040'.
#
# The third field, (fs_vfstype), describes the type of the filesystem.
# Cygwin supports any string here, since the file system type is usually
# not evaluated. The noticable exception is the file system type
# cygdrive. This type is used to set the cygdrive prefix. See the
# user's guide for more information about the cygdrive prefix.
#
# The fourth field, (fs_mntops), describes the mount options associated
# with the filesystem. It is formatted as a comma separated list of
# options. It contains at least the type of mount (binary or text) plus
# any additional options appropriate to the filesystem type. Recognized
# options are binary, text, system, user, exec, notexec, cygexec, nosuid,
# managed. For a description of the options see the user's guide. Note
# that system mount points are not overridable by a later call to
# mount(2). This is only possible for user mount points. Mount points
# are by default system mount points, unless you specify the option user.
#
# The fifth (fs_freq) and sixth (fs_passno) field are ignored. They are
# so far only specified to keep a Linux-like fstab file layout.
#
# Note that you don't have to specify an fstab entry for the root dir,
# unless you want to have the root dir pointing to somewhere entirely
# different (hopefully you know what you're doing), or if you want to
# mount the root dir with special options (for instance, as text mount).
#
# Example entries:
#
# Just a normal mount point:
#
# c:/foo /bar fat32 binary 0 0
#
# A mount point for a managed, textmode mount:
#
# C:/foo /bar/baz ntfs text,managed 0 0
#
# A mount point for a Windows directory with spaces in it:
#
# C:/Documents\040and\040Settings /docs ext3 binary 0 0
#
# A mount point for a remote directory:
#
# //server/share/subdir /srv/subdir smbfs binary 0 0
#
# This is just a comment:
#
# # This is just a comment
#
# Set the cygdrive prefix to /mnt:
#
# none /mnt cygdrive binary 0 0
#
${CYGROOT//\\//}/bin /usr/bin ${FS_TYPE} binary,system 0 0
${CYGROOT//\\//}/lib /usr/lib ${FS_TYPE} binary,system 0 0
# This is default anyway:
# none /cygdrive cygdrive binary,user 0 0
EOF
)
fi
# Check for ${DEVDIR} directory
if [ -e "${DEVDIR}" -a ! -d "${DEVDIR}" ]
then
# No mercy. Try to remove.
rm -f "${DEVDIR}"
if [ -e "${DEVDIR}" -a ! -d "${DEVDIR}" ]
then
echo
echo "${DEVDIR} is existant but not a directory."
echo "Please fix that manually, otherwise you WILL get problems."
echo
exit 1
fi
fi
# Create it if necessary
if [ ! -e "${DEVDIR}" ]
then
mkdir -m 755 "${DEVDIR}"
if [ ! -e "${DEVDIR}" ]
then
echo
echo "Creating ${DEVDIR} directory failed."
echo "Please fix that manually, otherwise you WILL get problems."
echo
exit 1
fi
fi
setfacl -m u:system:rwx "${DEVDIR}"
# Check for ${DEVDIR}/shm directory (for POSIX semaphores and POSIX shared mem)
if [ -e "${DEVDIR}/shm" -a ! -d "${DEVDIR}/shm" ]
then
# No mercy. Try to remove.
rm -f "${DEVDIR}/shm"
if [ -e "${DEVDIR}/shm" -a ! -d "${DEVDIR}/shm" ]
then
echo
echo "${DEVDIR}/shm is existant but not a directory."
echo "POSIX semaphores and POSIX shared memory will not work"
echo
fi
fi
# Create it if necessary
if [ ! -e "${DEVDIR}/shm" ]
then
mkdir -m 1777 "${DEVDIR}/shm"
if [ ! -e "${DEVDIR}/shm" ]
then
echo
echo "Creating ${DEVDIR}/shm directory failed."
echo "POSIX semaphores and POSIX shared memory will not work"
echo
fi
fi
# Check for ${DEVDIR}/mqueue directory (for POSIX message queues)
if [ -e "${DEVDIR}/mqueue" -a ! -d "${DEVDIR}/mqueue" ]
then
# No mercy. Try to remove.
rm -f "${DEVDIR}/shm"
if [ -e "${DEVDIR}/shm" -a ! -d "${DEVDIR}/shm" ]
then
echo
echo "${DEVDIR}/mqueue is existant but not a directory."
echo "POSIX message queues will not work"
echo
fi
fi
# Create it if necessary
if [ ! -e "${DEVDIR}/mqueue" ]
then
mkdir -m 1777 "${DEVDIR}/mqueue"
if [ ! -e "${DEVDIR}/mqueue" ]
then
echo
echo "Creating ${DEVDIR}/mqueue directory failed."
echo "POSIX message queues will not work"
echo
fi
fi

View File

@ -71,15 +71,12 @@ class mount_info
public: public:
void init (); void init ();
int add_item (const char *dev, const char *path, unsigned flags, int reg_p); int add_item (const char *dev, const char *path, unsigned flags);
int del_item (const char *path, unsigned flags, int reg_p); int del_item (const char *path, unsigned flags);
bool from_fstab_line (char *line, bool user); bool from_fstab_line (char *line, bool user);
bool from_fstab (bool user); bool from_fstab (bool user);
void from_registry (); void from_registry ();
int add_reg_mount (const char * native_path, const char * posix_path,
unsigned mountflags);
int del_reg_mount (const char * posix_path, unsigned mountflags);
unsigned set_flags_from_win32_path (const char *path); unsigned set_flags_from_win32_path (const char *path);
int conv_to_win32_path (const char *src_path, char *dst, device&, int conv_to_win32_path (const char *src_path, char *dst, device&,
@ -90,8 +87,7 @@ class mount_info
int keep_rel_p); int keep_rel_p);
struct mntent *getmntent (int x); struct mntent *getmntent (int x);
int write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsigned flags); int write_cygdrive_info (const char *cygdrive_prefix, unsigned flags);
int remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags);
int get_cygdrive_info (char *user, char *system, char* user_flags, int get_cygdrive_info (char *user, char *system, char* user_flags,
char* system_flags); char* system_flags);
void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p); void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p);