* cygserver.h (client_request::request_code_t): Add
CYGSERVER_REQUEST_MSG and CYGSERVER_REQUEST_SEM. (admininstrator_group_sid): Add extern declaration. * cygserver_ipc.h: Rewrite. * cygserver_msg.h: New file. * cygserver_sem.h: New file. * cygserver_shm.h: More or less rewrite. * cygwin.din: Add msgctl, msgget, msgrcv, msgsnd, semctl, semget and semop. * msg.cc: Rewrite. * safe_memory.h: Remove. * sem.cc: Rewrite. * shm.cc: Rewrite. * include/cygwin/ipc.h: Use appropriate guard. (struct ipc_perm): Add seq. (IPCID_TO_IX): New define from BSD. (IPCID_TO_SEQ): Ditto. (IXSEQ_TO_IPCID): Ditto. (IPC_R): Ditto. (IPC_W): Ditto. (IPC_M): Ditto. * include/cygwin/msg.h: Use appropriate guard. #ifdef _KERNEL all stuff not explicitely defined by SUSv3. Use signed types in structs to match types used in BSD. (msgqnum_t): Define unsigned. (msglen_t): Ditto. (struct msqid_ds): Add msg_first and msg_last. (struct msginfo): Remove msgpool. Add msgssz and msgseg. * include/cygwin/sem.h: Use appropriate guard. #ifdef _KERNEL all stuff not explicitely defined by SUSv3. Use signed types in structs to match types used in BSD. (SEM_UNDO): Define appropriately. (struct semid_ds): Add sem_base. (struct seminfo): Add semmap and semusz. (SEM_A): New define from BSD. (SEM_R): Ditto. (SEM_ALLOC): Ditto. (union semun): Define. * include/cygwin/shm.h: Use appropriate guard. #ifdef _KERNEL all stuff not explicitely defined by SUSv3. Use signed types in structs to match types used in BSD. (SHMLBA): Define using cygwin_internal(CW_GET_SHMLBA) call. (struct shmid_ds): Add shm_internal. (struct shm_info): Rename shm_ids to used_ids as in BSD. Add define for shm_ids. * include/cygwin/sysproto.h: New file. * include/cygwin/version.h: Bump API minor number. * include/sys/ipc.h: New file. * include/sys/msg.h: New file. * include/sys/queue.h: New file from BSD. * include/sys/sem.h: New file. * include/sys/shm.h: New file. * include/sys/sysproto.h: New file.
This commit is contained in:
		| @@ -1,8 +1,6 @@ | ||||
| /* cygserver_ipc.h | ||||
|  | ||||
|    Copyright 2002 Red Hat, Inc. | ||||
|  | ||||
|    Originally written by Conrad Scott <conrad.scott@dsl.pipex.com> | ||||
|    Copyright 2002, 2003 Red Hat, Inc. | ||||
|  | ||||
| This file is part of Cygwin. | ||||
|  | ||||
| @@ -13,72 +11,72 @@ details. */ | ||||
| #ifndef __CYGSERVER_IPC_H__ | ||||
| #define __CYGSERVER_IPC_H__ | ||||
|  | ||||
| #include <assert.h> | ||||
| #include <limits.h>		/* For OPEN_MAX. */ | ||||
|  | ||||
| /* | ||||
|  * The sysv ipc id's (msgid, semid, shmid) are integers arranged such | ||||
|  * that they no subsystem will generate the same id as some other | ||||
|  * subsystem; nor do these ids overlap file descriptors (the other | ||||
|  * common integer ids).  Since Cygwin can allocate more than OPEN_MAX | ||||
|  * file descriptors, it can't be guaranteed not to overlap, but it | ||||
|  * should help catch some errors. | ||||
|  * | ||||
|  * msgid's: OPEN_MAX,     OPEN_MAX + 3, OPEN_MAX + 6, . . . | ||||
|  * semid's: OPEN_MAX + 1, OPEN_MAX + 4, OPEN_MAX + 7, . . . | ||||
|  * shmid's: OPEN_MAX + 2, OPEN_MAX + 5, OPEN_MAX + 8, . . . | ||||
|  * | ||||
|  * To further ensure that ids are unique, if ipc objects are created | ||||
|  * and destroyed and then re-created, they are given new ids by | ||||
|  * munging the basic id (as above) with a sequence number. | ||||
|  * | ||||
|  * Internal ipc id's, which are 0, 1, ... within each subsystem (and | ||||
|  * not munged with a sequence number), are used solely by the ipcs(8) | ||||
|  * interface. | ||||
|  * Datastructure which is part of any IPC input parameter block. | ||||
|  */ | ||||
| struct vmspace { | ||||
|   void *vm_map;			/* UNUSED */ | ||||
|   struct shmmap_state *vm_shm; | ||||
| }; | ||||
|  | ||||
| enum ipc_subsys_t | ||||
|   { | ||||
|     IPC_MSGOP = 0, | ||||
|     IPC_SEMOP = 1, | ||||
|     IPC_SHMOP = 2, | ||||
|     IPC_SUBSYS_COUNT | ||||
| struct proc { | ||||
|   pid_t cygpid; | ||||
|   DWORD winpid; | ||||
|   __uid32_t uid; | ||||
|   __gid32_t gid; | ||||
|   int gidcnt; | ||||
|   __gid32_t *gidlist; | ||||
|   bool is_admin; | ||||
|   struct vmspace *p_vmspace; | ||||
| }; | ||||
|  | ||||
| #ifdef __INSIDE_CYGWIN__ | ||||
| inline void | ||||
| ipc_set_proc_info (proc &blk) | ||||
| { | ||||
|   blk.cygpid = getpid (); | ||||
|   blk.winpid = GetCurrentProcessId (); | ||||
|   blk.uid = geteuid32 (); | ||||
|   blk.gid = getegid32 (); | ||||
|   blk.gidcnt = 0; | ||||
|   blk.gidlist = NULL; | ||||
|   blk.is_admin = false; | ||||
| } | ||||
| #endif /* __INSIDE_CYGWIN__ */ | ||||
|  | ||||
| #ifndef __INSIDE_CYGWIN__ | ||||
| class ipc_retval { | ||||
| private: | ||||
|   union { | ||||
|     int i; | ||||
|     unsigned int u; | ||||
|     vm_offset_t off; | ||||
|     vm_object_t obj; | ||||
|   }; | ||||
|  | ||||
| /* | ||||
|  * IPCMNI - The absolute maximum number of simultaneous ipc ids for | ||||
|  * any one subsystem. | ||||
|  */ | ||||
| public: | ||||
|   ipc_retval (int ni) { i = ni; } | ||||
|  | ||||
| enum | ||||
|   { | ||||
|     IPCMNI = 0x10000		// Must be a power of two. | ||||
|   }; | ||||
|   operator int () const { return i; } | ||||
|   int operator = (int ni) { return i = ni; } | ||||
|  | ||||
| inline int | ||||
| ipc_int2ext (const int intid, const ipc_subsys_t subsys, long & sequence) | ||||
| { | ||||
|   assert (0 <= intid && intid < IPCMNI); | ||||
|   operator unsigned int () const { return u; } | ||||
|   unsigned int operator = (unsigned int nu) { return u = nu; } | ||||
|  | ||||
|   const long tmp = InterlockedIncrement (&sequence); | ||||
|   operator vm_offset_t () const { return off; } | ||||
|   vm_offset_t operator = (vm_offset_t noff) { return off = noff; } | ||||
|  | ||||
|   return (((tmp & 0x7fff) << 16) | ||||
| 	  | (OPEN_MAX + (intid * IPC_SUBSYS_COUNT) + subsys)); | ||||
| } | ||||
|   operator vm_object_t () const { return obj; } | ||||
|   vm_object_t operator = (vm_object_t nobj) { return obj = nobj; } | ||||
| }; | ||||
|  | ||||
| inline int | ||||
| ipc_ext2int_subsys (const int extid) | ||||
| { | ||||
|   return ((extid & (IPCMNI - 1)) - OPEN_MAX) % IPC_SUBSYS_COUNT; | ||||
| } | ||||
|  | ||||
| inline int | ||||
| ipc_ext2int (const int extid, const ipc_subsys_t subsys) | ||||
| { | ||||
|   if (ipc_ext2int_subsys (extid) != subsys) | ||||
|     return -1; | ||||
|   else | ||||
|     return ((extid & (IPCMNI - 1)) - OPEN_MAX) / IPC_SUBSYS_COUNT; | ||||
| } | ||||
| struct thread { | ||||
|   class process *client; | ||||
|   proc *ipcblk; | ||||
|   ipc_retval td_retval[2]; | ||||
| }; | ||||
| #define td_proc ipcblk | ||||
| #define p_pid cygpid | ||||
| #endif | ||||
|  | ||||
| #endif /* __CYGSERVER_IPC_H__ */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user