Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/child_info.h2
-rw-r--r--winsup/cygwin/dcrt0.cc2
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc2
-rw-r--r--winsup/cygwin/fhandler_virtual.cc2
-rw-r--r--winsup/cygwin/shared.cc85
-rw-r--r--winsup/cygwin/shared_info.h24
-rw-r--r--winsup/cygwin/sigproc.cc2
-rw-r--r--winsup/cygwin/syscalls.cc6
8 files changed, 67 insertions, 58 deletions
diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h
index f7d69ca6d..1865258d4 100644
--- a/winsup/cygwin/child_info.h
+++ b/winsup/cygwin/child_info.h
@@ -44,7 +44,7 @@ public:
unsigned short type; // type of record, exec, spawn, fork
int cygpid; // cygwin pid of child process
HANDLE subproc_ready; // used for synchronization with parent
- HANDLE mount_h;
+ HANDLE user_h;
HANDLE parent;
HANDLE pppid_handle;
init_cygheap *cygheap;
diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
index 9b064b2b3..377d6dd6f 100644
--- a/winsup/cygwin/dcrt0.cc
+++ b/winsup/cygwin/dcrt0.cc
@@ -901,7 +901,7 @@ _dll_crt0 ()
multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
else
{
- cygwin_mount_h = child_proc_info->mount_h;
+ cygwin_user_h = child_proc_info->user_h;
mypid = child_proc_info->cygpid;
break;
}
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index 3400b9c8f..1c11636e9 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -446,7 +446,7 @@ fhandler_base::close_fs ()
{
int res = fhandler_base::close ();
if (!res)
- cygwin_shared->delqueue.process_queue ();
+ user_shared->delqueue.process_queue ();
return res;
}
diff --git a/winsup/cygwin/fhandler_virtual.cc b/winsup/cygwin/fhandler_virtual.cc
index 258cba287..f2ca94476 100644
--- a/winsup/cygwin/fhandler_virtual.cc
+++ b/winsup/cygwin/fhandler_virtual.cc
@@ -167,7 +167,7 @@ fhandler_virtual::close ()
free (filebuf);
filebuf = NULL;
bufalloc = (size_t) -1;
- cygwin_shared->delqueue.process_queue ();
+ user_shared->delqueue.process_queue ();
return 0;
}
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
index eab999040..911465aea 100644
--- a/winsup/cygwin/shared.cc
+++ b/winsup/cygwin/shared.cc
@@ -28,8 +28,8 @@ details. */
#include "child_info.h"
shared_info NO_COPY *cygwin_shared;
-mount_info NO_COPY *mount_table;
-HANDLE NO_COPY cygwin_mount_h;
+user_info NO_COPY *user_shared;
+HANDLE NO_COPY cygwin_user_h;
char * __stdcall
shared_name (char *ret_buf, const char *str, int num)
@@ -54,14 +54,14 @@ static char *offsets[] =
+ pround (sizeof (shared_info)),
(char *) cygwin_shared_address
+ pround (sizeof (shared_info))
- + pround (sizeof (mount_info)),
+ + pround (sizeof (user_info)),
(char *) cygwin_shared_address
+ pround (sizeof (shared_info))
- + pround (sizeof (mount_info))
+ + pround (sizeof (user_info))
+ pround (sizeof (console_state)),
(char *) cygwin_shared_address
+ pround (sizeof (shared_info))
- + pround (sizeof (mount_info))
+ + pround (sizeof (user_info))
+ pround (sizeof (console_state))
+ pround (sizeof (_pinfo))
};
@@ -146,50 +146,54 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
}
void
-user_shared_initialize ()
+user_shared_initialize (bool reinit)
{
- char name[UNLEN + 1] = "";
+ char name[UNLEN + 1] = ""; /* Large enough for SID */
- if (wincap.has_security ())
+ if (reinit)
{
- cygsid tu (cygheap->user.sid ());
- tu.string (name);
+ if (!UnmapViewOfFile (user_shared))
+ debug_printf("UnmapViewOfFile %E");
+ if (!ForceCloseHandle (cygwin_user_h))
+ debug_printf("CloseHandle %E");
+ cygwin_user_h = NULL;
}
- else
- strcpy (name, cygheap->user.name ());
- if (cygwin_mount_h) /* Reinit */
+ if (!cygwin_user_h)
{
- if (!UnmapViewOfFile (mount_table))
- debug_printf("UnmapViewOfFile %E");
- if (!ForceCloseHandle (cygwin_mount_h))
- debug_printf("CloseHandle %E");
- cygwin_mount_h = NULL;
+ if (wincap.has_security ())
+ {
+ cygsid tu (cygheap->user.sid ());
+ tu.string (name);
+ }
+ else
+ strcpy (name, cygheap->user.name ());
}
- mount_table = (mount_info *) open_shared (name, MOUNT_VERSION,
- cygwin_mount_h, sizeof (mount_info),
- SH_MOUNT_TABLE, &sec_none);
- debug_printf ("opening mount table for '%s' at %p", name,
- mount_table);
- ProtectHandleINH (cygwin_mount_h);
- debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
+ user_shared = (user_info *) open_shared (name, USER_VERSION,
+ cygwin_user_h, sizeof (user_info),
+ SH_USER_SHARED, &sec_none);
+ debug_printf ("opening user shared for '%s' at %p", name, user_shared);
+ ProtectHandleINH (cygwin_user_h);
+ debug_printf ("user shared version %x", user_shared->version);
- /* Initialize the Cygwin per-user mount table, if necessary */
- if (!mount_table->version)
+ /* Initialize the Cygwin per-user shared, if necessary */
+ if (!user_shared->version)
{
- mount_table->version = MOUNT_VERSION_MAGIC;
- debug_printf ("initializing mount table");
- mount_table->cb = sizeof (*mount_table);
- if (mount_table->cb != MOUNT_INFO_CB)
- system_printf ("size of mount table region changed from %u to %u",
- MOUNT_INFO_CB, mount_table->cb);
- mount_table->init (); /* Initialize the mount table. */
+ user_shared->version = USER_VERSION_MAGIC;
+ debug_printf ("initializing user shared");
+ user_shared->cb = sizeof (*user_shared);
+ if (user_shared->cb != sizeof (*user_shared))
+ system_printf ("size of user shared region changed from %u to %u",
+ sizeof (*user_shared), user_shared->cb);
+ user_shared->mountinfo.init (); /* Initialize the mount table. */
+ /* Initialize the queue of deleted files. */
+ user_shared->delqueue.init ();
}
- else if (mount_table->version != MOUNT_VERSION_MAGIC)
- multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
- else if (mount_table->cb != MOUNT_INFO_CB)
- multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB);
+ else if (user_shared->version != USER_VERSION_MAGIC)
+ multiple_cygwin_problem ("user", user_shared->version, USER_VERSION_MAGIC);
+ else if (user_shared->cb != sizeof (*user_shared))
+ multiple_cygwin_problem ("user shared size", user_shared->cb, sizeof (*user_shared));
}
void
@@ -198,9 +202,6 @@ shared_info::initialize ()
DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC);
if (!sversion)
{
- /* Initialize the queue of deleted files. */
- delqueue.init ();
-
/* Initialize tty table. */
tty.init ();
}
@@ -249,7 +250,7 @@ memory_init ()
cygheap->shared_h = shared_h;
ProtectHandleINH (cygheap->shared_h);
- user_shared_initialize ();
+ user_shared_initialize (false);
}
unsigned
diff --git a/winsup/cygwin/shared_info.h b/winsup/cygwin/shared_info.h
index 4ae79ded9..02db4eb94 100644
--- a/winsup/cygwin/shared_info.h
+++ b/winsup/cygwin/shared_info.h
@@ -42,10 +42,9 @@ class mount_item
scheme should be satisfactory for a long while yet. */
#define MAX_MOUNTS 30
-#define MOUNT_VERSION 27 // increment when mount table changes and
-#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION)
-#define CURR_MOUNT_MAGIC 0x6dd73a3fU
-#define MOUNT_INFO_CB 16488
+#define USER_VERSION 1 // increment when mount table changes and
+#define USER_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, USER_VERSION)
+#define CURR_MOUNT_MAGIC 0x4fe431cdU /* FIXME */
class reg_key;
struct device;
@@ -133,6 +132,14 @@ public:
void process_queue ();
};
+class user_info
+{
+public:
+ DWORD version;
+ DWORD cb;
+ delqueue_list delqueue;
+ mount_info mountinfo;
+};
/******** Shared Info ********/
/* Data accessible to all tasks */
@@ -162,13 +169,14 @@ class shared_info
};
extern shared_info *cygwin_shared;
-extern mount_info *mount_table;
-extern HANDLE cygwin_mount_h;
+extern user_info *user_shared;
+#define mount_table (&(user_shared->mountinfo))
+extern HANDLE cygwin_user_h;
enum shared_locations
{
SH_CYGWIN_SHARED,
- SH_MOUNT_TABLE,
+ SH_USER_SHARED,
SH_SHARED_CONSOLE,
SH_MYSELF,
SH_TOTAL_SIZE
@@ -193,5 +201,5 @@ struct console_state
char *__stdcall shared_name (char *, const char *, int);
void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all);
-extern void user_shared_initialize ();
+extern void user_shared_initialize (bool reinit);
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 349974eb9..ba7ddec12 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -833,7 +833,7 @@ init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
ch->subproc_ready = subproc_ready;
ch->pppid_handle = myself->ppid_handle;
ch->fhandler_union_cb = sizeof (fhandler_union);
- ch->mount_h = cygwin_mount_h;
+ ch->user_h = cygwin_user_h;
}
/* Check the state of all of our children to see if any are stopped or
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 4c970646b..7f58c2857 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -98,7 +98,7 @@ close_all_files (void)
}
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
- cygwin_shared->delqueue.process_queue ();
+ user_shared->delqueue.process_queue ();
}
int
@@ -222,7 +222,7 @@ unlink (const char *ourname)
syscall_printf ("couldn't delete file, err %d", lasterr);
/* Add file to the "to be deleted" queue. */
- cygwin_shared->delqueue.queue_file (win32_name);
+ user_shared->delqueue.queue_file (win32_name);
/* Success condition. */
ok:
@@ -2214,7 +2214,7 @@ seteuid32 (__uid32_t uid)
RegCloseKey(HKEY_CURRENT_USER);
cygheap->user.reimpersonate ();
if (!issamesid)
- user_shared_initialize ();
+ user_shared_initialize (true);
success_9x:
cygheap->user.set_name (pw_new->pw_name);