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:
Diffstat (limited to 'winsup/cygwin/shared.cc')
-rw-r--r--winsup/cygwin/shared.cc65
1 files changed, 46 insertions, 19 deletions
diff --git a/winsup/cygwin/shared.cc b/winsup/cygwin/shared.cc
index 6f47d2e85..760c33288 100644
--- a/winsup/cygwin/shared.cc
+++ b/winsup/cygwin/shared.cc
@@ -32,13 +32,7 @@ HANDLE NO_COPY cygwin_user_h;
/* This function returns a handle to the top-level directory in the global
NT namespace used to implement global objects including shared memory. */
-
-#define CYG_SHARED_DIR_ACCESS (DIRECTORY_QUERY \
- | DIRECTORY_TRAVERSE \
- | DIRECTORY_CREATE_SUBDIRECTORY \
- | DIRECTORY_CREATE_OBJECT \
- | READ_CONTROL)
-
+extern bool _cygwin_testing;
HANDLE
get_shared_parent_dir ()
@@ -47,15 +41,53 @@ get_shared_parent_dir ()
UNICODE_STRING uname;
OBJECT_ATTRIBUTES attr;
NTSTATUS status;
-
+
if (!dir)
{
- RtlInitUnicodeString (&uname, L"\\BaseNamedObjects\\cygwin-shared");
+ WCHAR bnoname[MAX_PATH];
+ __small_swprintf (bnoname, L"\\BaseNamedObjects\\%s%s",
+ cygwin_version.shared_id,
+ _cygwin_testing ? cygwin_version.dll_build_date : "");
+ RtlInitUnicodeString (&uname, bnoname);
InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
NULL, everyone_sd (CYG_SHARED_DIR_ACCESS));
status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr);
if (!NT_SUCCESS (status))
- api_fatal ("NtCreateDirectoryObject(parent): %p", status);
+ api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status);
+ }
+ return dir;
+}
+
+HANDLE
+get_session_parent_dir ()
+{
+ static HANDLE dir;
+ UNICODE_STRING uname;
+ OBJECT_ATTRIBUTES attr;
+ NTSTATUS status;
+
+ if (!dir)
+ {
+ PROCESS_SESSION_INFORMATION psi;
+ status = NtQueryInformationProcess (GetCurrentProcess (),
+ ProcessSessionInformation,
+ &psi, sizeof psi, NULL);
+ if (!NT_SUCCESS (status) || psi.SessionId == 0)
+ dir = get_shared_parent_dir ();
+ else
+ {
+ WCHAR bnoname[MAX_PATH];
+ __small_swprintf (bnoname,
+ L"\\Sessions\\BNOLINKS\\%d\\%s%s",
+ psi.SessionId, cygwin_version.shared_id,
+ _cygwin_testing ? cygwin_version.dll_build_date : "");
+ RtlInitUnicodeString (&uname, bnoname);
+ InitializeObjectAttributes (&attr, &uname, OBJ_INHERIT | OBJ_OPENIF,
+ NULL, everyone_sd(CYG_SHARED_DIR_ACCESS));
+ status = NtCreateDirectoryObject (&dir, CYG_SHARED_DIR_ACCESS, &attr);
+ if (!NT_SUCCESS (status))
+ api_fatal ("NtCreateDirectoryObject(%S): %p", &uname, status);
+ }
}
return dir;
}
@@ -63,14 +95,7 @@ get_shared_parent_dir ()
char * __stdcall
shared_name (char *ret_buf, const char *str, int num)
{
- extern bool _cygwin_testing;
-
- get_shared_parent_dir ();
- __small_sprintf (ret_buf, "%scygwin-shared\\%s.%s.%d",
- cygheap->shared_prefix,
- cygwin_version.shared_id, str, num);
- if (_cygwin_testing)
- strcat (ret_buf, cygwin_version.dll_build_date);
+ __small_sprintf (ret_buf, "%s.%d", str, num);
return ret_buf;
}
@@ -239,7 +264,9 @@ shared_info::initialize ()
cb = sizeof (*this); /* Do last, after all shared memory initialization */
}
- mt.initialize ();
+ mt.initialize (); /* Initialize shared tape information. */
+
+ get_session_parent_dir (); /* Create session dir if first process. */
if (cb != SHARED_INFO_CB)
system_printf ("size of shared memory region changed from %u to %u",