2003-09-24 Pierre Humblet <pierre.humblet@ieee.org>

* shared_info.h (class user_info): New.
	(cygwin_user_h): New.
	(user_shared): New.
	(enum shared_locations): Replace SH_MOUNT_TABLE by SH_USER_SHARED;
	(mount_table): Change from variable to macro.
	* shared.cc: Use sizeof(user_info) in "offsets".
	(user_shared_initialize): Add "reinit" argument to indicate need
	to reinitialize the mapping. Replace "mount_table" by "user_shared"
	throughout. Call user_shared->mountinfo.init and
	user_shared->delqueue.init.
	(shared_info::initialize): Do not call delqueue.init.
	(memory_init): Add argument to user_shared_initialize.
	* child_info.h (child_info::mount_h): Delete.
	(child_info::user_h): New.
	* sigpproc.cc (init_child_info): Use user_h instead of mount_h.
	* dcrt0.cc (_dll_crt0): Ditto.
	* fhandler_disk_file.cc (fhandler_disk_file::close): Use
	user_shared->delqueue instead of cygwin_shared->delqueue.
	* fhandler_virtual.cc (fhandler_virtual::close): Ditto.
	* syscalls.cc (close_all_files): Ditto.
	(unlink): Ditto.
	(seteuid32): Add argument to user_shared_initialize.
This commit is contained in:
Pierre Humblet 2003-09-25 02:29:05 +00:00
parent a4e167fa27
commit 138847683d
8 changed files with 69 additions and 60 deletions

View File

@ -44,7 +44,7 @@ public:
unsigned short type; // type of record, exec, spawn, fork unsigned short type; // type of record, exec, spawn, fork
int cygpid; // cygwin pid of child process int cygpid; // cygwin pid of child process
HANDLE subproc_ready; // used for synchronization with parent HANDLE subproc_ready; // used for synchronization with parent
HANDLE mount_h; HANDLE user_h;
HANDLE parent; HANDLE parent;
HANDLE pppid_handle; HANDLE pppid_handle;
init_cygheap *cygheap; init_cygheap *cygheap;

View File

@ -901,7 +901,7 @@ _dll_crt0 ()
multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union)); multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
else else
{ {
cygwin_mount_h = child_proc_info->mount_h; cygwin_user_h = child_proc_info->user_h;
mypid = child_proc_info->cygpid; mypid = child_proc_info->cygpid;
break; break;
} }

View File

@ -446,7 +446,7 @@ fhandler_base::close_fs ()
{ {
int res = fhandler_base::close (); int res = fhandler_base::close ();
if (!res) if (!res)
cygwin_shared->delqueue.process_queue (); user_shared->delqueue.process_queue ();
return res; return res;
} }

View File

@ -167,7 +167,7 @@ fhandler_virtual::close ()
free (filebuf); free (filebuf);
filebuf = NULL; filebuf = NULL;
bufalloc = (size_t) -1; bufalloc = (size_t) -1;
cygwin_shared->delqueue.process_queue (); user_shared->delqueue.process_queue ();
return 0; return 0;
} }

View File

@ -28,8 +28,8 @@ details. */
#include "child_info.h" #include "child_info.h"
shared_info NO_COPY *cygwin_shared; shared_info NO_COPY *cygwin_shared;
mount_info NO_COPY *mount_table; user_info NO_COPY *user_shared;
HANDLE NO_COPY cygwin_mount_h; HANDLE NO_COPY cygwin_user_h;
char * __stdcall char * __stdcall
shared_name (char *ret_buf, const char *str, int num) shared_name (char *ret_buf, const char *str, int num)
@ -54,14 +54,14 @@ static char *offsets[] =
+ pround (sizeof (shared_info)), + pround (sizeof (shared_info)),
(char *) cygwin_shared_address (char *) cygwin_shared_address
+ pround (sizeof (shared_info)) + pround (sizeof (shared_info))
+ pround (sizeof (mount_info)), + pround (sizeof (user_info)),
(char *) cygwin_shared_address (char *) cygwin_shared_address
+ pround (sizeof (shared_info)) + pround (sizeof (shared_info))
+ pround (sizeof (mount_info)) + pround (sizeof (user_info))
+ pround (sizeof (console_state)), + pround (sizeof (console_state)),
(char *) cygwin_shared_address (char *) cygwin_shared_address
+ pround (sizeof (shared_info)) + pround (sizeof (shared_info))
+ pround (sizeof (mount_info)) + pround (sizeof (user_info))
+ pround (sizeof (console_state)) + pround (sizeof (console_state))
+ pround (sizeof (_pinfo)) + pround (sizeof (_pinfo))
}; };
@ -146,10 +146,21 @@ open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
} }
void void
user_shared_initialize () user_shared_initialize (bool reinit)
{ {
char name[UNLEN + 1] = ""; char name[UNLEN + 1] = ""; /* Large enough for SID */
if (reinit)
{
if (!UnmapViewOfFile (user_shared))
debug_printf("UnmapViewOfFile %E");
if (!ForceCloseHandle (cygwin_user_h))
debug_printf("CloseHandle %E");
cygwin_user_h = NULL;
}
if (!cygwin_user_h)
{
if (wincap.has_security ()) if (wincap.has_security ())
{ {
cygsid tu (cygheap->user.sid ()); cygsid tu (cygheap->user.sid ());
@ -157,39 +168,32 @@ user_shared_initialize ()
} }
else else
strcpy (name, cygheap->user.name ()); strcpy (name, cygheap->user.name ());
if (cygwin_mount_h) /* Reinit */
{
if (!UnmapViewOfFile (mount_table))
debug_printf("UnmapViewOfFile %E");
if (!ForceCloseHandle (cygwin_mount_h))
debug_printf("CloseHandle %E");
cygwin_mount_h = NULL;
} }
mount_table = (mount_info *) open_shared (name, MOUNT_VERSION, user_shared = (user_info *) open_shared (name, USER_VERSION,
cygwin_mount_h, sizeof (mount_info), cygwin_user_h, sizeof (user_info),
SH_MOUNT_TABLE, &sec_none); SH_USER_SHARED, &sec_none);
debug_printf ("opening mount table for '%s' at %p", name, debug_printf ("opening user shared for '%s' at %p", name, user_shared);
mount_table); ProtectHandleINH (cygwin_user_h);
ProtectHandleINH (cygwin_mount_h); debug_printf ("user shared version %x", user_shared->version);
debug_printf ("mount table version %x at %p", mount_table->version, mount_table);
/* Initialize the Cygwin per-user mount table, if necessary */ /* Initialize the Cygwin per-user shared, if necessary */
if (!mount_table->version) if (!user_shared->version)
{ {
mount_table->version = MOUNT_VERSION_MAGIC; user_shared->version = USER_VERSION_MAGIC;
debug_printf ("initializing mount table"); debug_printf ("initializing user shared");
mount_table->cb = sizeof (*mount_table); user_shared->cb = sizeof (*user_shared);
if (mount_table->cb != MOUNT_INFO_CB) if (user_shared->cb != sizeof (*user_shared))
system_printf ("size of mount table region changed from %u to %u", system_printf ("size of user shared region changed from %u to %u",
MOUNT_INFO_CB, mount_table->cb); sizeof (*user_shared), user_shared->cb);
mount_table->init (); /* Initialize the mount table. */ 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) else if (user_shared->version != USER_VERSION_MAGIC)
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION); multiple_cygwin_problem ("user", user_shared->version, USER_VERSION_MAGIC);
else if (mount_table->cb != MOUNT_INFO_CB) else if (user_shared->cb != sizeof (*user_shared))
multiple_cygwin_problem ("mount table size", mount_table->cb, MOUNT_INFO_CB); multiple_cygwin_problem ("user shared size", user_shared->cb, sizeof (*user_shared));
} }
void void
@ -198,9 +202,6 @@ shared_info::initialize ()
DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC); DWORD sversion = (DWORD) InterlockedExchange ((LONG *) &version, SHARED_VERSION_MAGIC);
if (!sversion) if (!sversion)
{ {
/* Initialize the queue of deleted files. */
delqueue.init ();
/* Initialize tty table. */ /* Initialize tty table. */
tty.init (); tty.init ();
} }
@ -249,7 +250,7 @@ memory_init ()
cygheap->shared_h = shared_h; cygheap->shared_h = shared_h;
ProtectHandleINH (cygheap->shared_h); ProtectHandleINH (cygheap->shared_h);
user_shared_initialize (); user_shared_initialize (false);
} }
unsigned unsigned

View File

@ -42,10 +42,9 @@ class mount_item
scheme should be satisfactory for a long while yet. */ scheme should be satisfactory for a long while yet. */
#define MAX_MOUNTS 30 #define MAX_MOUNTS 30
#define MOUNT_VERSION 27 // increment when mount table changes and #define USER_VERSION 1 // increment when mount table changes and
#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION) #define USER_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, USER_VERSION)
#define CURR_MOUNT_MAGIC 0x6dd73a3fU #define CURR_MOUNT_MAGIC 0x4fe431cdU /* FIXME */
#define MOUNT_INFO_CB 16488
class reg_key; class reg_key;
struct device; struct device;
@ -133,6 +132,14 @@ public:
void process_queue (); void process_queue ();
}; };
class user_info
{
public:
DWORD version;
DWORD cb;
delqueue_list delqueue;
mount_info mountinfo;
};
/******** Shared Info ********/ /******** Shared Info ********/
/* Data accessible to all tasks */ /* Data accessible to all tasks */
@ -162,13 +169,14 @@ class shared_info
}; };
extern shared_info *cygwin_shared; extern shared_info *cygwin_shared;
extern mount_info *mount_table; extern user_info *user_shared;
extern HANDLE cygwin_mount_h; #define mount_table (&(user_shared->mountinfo))
extern HANDLE cygwin_user_h;
enum shared_locations enum shared_locations
{ {
SH_CYGWIN_SHARED, SH_CYGWIN_SHARED,
SH_MOUNT_TABLE, SH_USER_SHARED,
SH_SHARED_CONSOLE, SH_SHARED_CONSOLE,
SH_MYSELF, SH_MYSELF,
SH_TOTAL_SIZE SH_TOTAL_SIZE
@ -193,5 +201,5 @@ struct console_state
char *__stdcall shared_name (char *, const char *, int); char *__stdcall shared_name (char *, const char *, int);
void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size, void *__stdcall open_shared (const char *name, int n, HANDLE &shared_h, DWORD size,
shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all); shared_locations, PSECURITY_ATTRIBUTES psa = &sec_all);
extern void user_shared_initialize (); extern void user_shared_initialize (bool reinit);

View File

@ -833,7 +833,7 @@ init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
ch->subproc_ready = subproc_ready; ch->subproc_ready = subproc_ready;
ch->pppid_handle = myself->ppid_handle; ch->pppid_handle = myself->ppid_handle;
ch->fhandler_union_cb = sizeof (fhandler_union); 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 /* Check the state of all of our children to see if any are stopped or

View File

@ -98,7 +98,7 @@ close_all_files (void)
} }
ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files"); ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "close_all_files");
cygwin_shared->delqueue.process_queue (); user_shared->delqueue.process_queue ();
} }
int int
@ -222,7 +222,7 @@ unlink (const char *ourname)
syscall_printf ("couldn't delete file, err %d", lasterr); syscall_printf ("couldn't delete file, err %d", lasterr);
/* Add file to the "to be deleted" queue. */ /* Add file to the "to be deleted" queue. */
cygwin_shared->delqueue.queue_file (win32_name); user_shared->delqueue.queue_file (win32_name);
/* Success condition. */ /* Success condition. */
ok: ok:
@ -2214,7 +2214,7 @@ seteuid32 (__uid32_t uid)
RegCloseKey(HKEY_CURRENT_USER); RegCloseKey(HKEY_CURRENT_USER);
cygheap->user.reimpersonate (); cygheap->user.reimpersonate ();
if (!issamesid) if (!issamesid)
user_shared_initialize (); user_shared_initialize (true);
success_9x: success_9x:
cygheap->user.set_name (pw_new->pw_name); cygheap->user.set_name (pw_new->pw_name);