* shm.cc (shmat): If shmid is unknown, call a special variation

of shmget to retrieve the shared memory segment from Cygserver
	instead of failing immediately.
	* include/cygwin/ipc.h (IPC_KEY_IS_SHMID): New internal flag for
	shmget when called from shmat.
This commit is contained in:
Corinna Vinschen
2004-03-30 15:20:08 +00:00
parent 66c8e18830
commit 5c7b73ed97
3 changed files with 31 additions and 3 deletions

View File

@@ -160,9 +160,26 @@ shmat (int shmid, const void *shmaddr, int shmflg)
}
if (!ssh_entry)
{
/* Invalid shmid */
set_errno (EINVAL);
return (void *) -1;
/* The shmid is unknown to this process so far. Try to get it from
the server if it exists. Use special internal call to shmget,
which interprets the key as a shmid and only returns a valid
shmid if one exists. Since shmctl inserts a new entry for this
shmid into ssh_list automatically, we just have to go through
that list again. If that still fails, well, bad luck. */
if (shmid && shmget ((key_t) shmid, 0, IPC_KEY_IS_SHMID) != -1)
{
SLIST_FOREACH (ssh_entry, &ssh_list, ssh_next)
{
if (ssh_entry->shmid == shmid)
break;
}
}
if (!ssh_entry)
{
/* Invalid shmid */
set_errno (EINVAL);
return (void *) -1;
}
}
vm_object_t attach_va = NULL;
if (shmaddr)