source: branches/libc-0.6/src/emx/include/InnoTekLIBC/sharedpm.h@ 3055

Last change on this file since 3055 was 2538, checked in by bird, 20 years ago

#50: Inherit umask.

  • Property cvs2svn:cvs-rev set to 1.25
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 36.7 KB
Line 
1/** $Id: sharedpm.h 2538 2006-02-06 22:12:16Z bird $ */
2/** @file
3 *
4 * LIBC Shared Process Management.
5 *
6 * Copyright (c) 2004-2005 knut st. osmundsen <[email protected]>
7 * Copyright (c) 2004 nickk
8 *
9 * This file is part of InnoTek LIBC.
10 *
11 * InnoTek LIBC is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * InnoTek LIBC is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with InnoTek LIBC; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25 */
26
27#ifndef __InnoTekLIBC_sharedpm_h__
28#define __InnoTekLIBC_sharedpm_h__
29
30#include <sys/cdefs.h>
31#include <sys/types.h>
32#include <sys/signal.h>
33#include <sys/ipc.h>
34
35
36__BEGIN_DECLS
37
38/** The name of the shared semaphore protecting the memory. */
39#define SPM_MUTEX_NAME "\\SEM32\\INNOTEKLIBC-V1.3"
40
41/** The name of the shared memory. */
42#define SPM_MEMORY_NAME "\\SHAREMEM\\INNOTEKLIBC-V1.3"
43
44/** The timeout for accessing the shared mem semaphore. */
45#define SPM_MUTEX_TIMEOUT (30*1000)
46
47/** Allocate 512KB if OBJ_ANY isn't supported.
48 * If it is supported we allocated the double amount. */
49#define SPM_MEMORY_SIZE (512*1024)
50
51/** The defined max size of a process.
52 * A good bit is reserved for the future here.
53 *
54 * Theoretically speaking, OS/2 cannot entertain more than a 1000 processes.
55 * So, even if we reserve a good bit here it's not gonna cause any trouble.
56 */
57#define SPM_PROCESS_SIZE (256)
58
59/**
60 * The SPM version.
61 */
62#define SPM_VERSION 0x00010003
63
64
65/**
66 * Process termination reason.
67 */
68typedef enum __LIBC_EXIT_REASON
69{
70 /** No reason. */
71 __LIBC_EXIT_REASON_NONE = 0,
72 /** Normal exit. */
73 __LIBC_EXIT_REASON_EXIT = 1,
74 /** OS/2 hard error. */
75 __LIBC_EXIT_REASON_HARDERROR = 2,
76 /** Trap (i.e. 16-bit?). */
77 __LIBC_EXIT_REASON_TRAP = 3,
78 /** Kill process. */
79 __LIBC_EXIT_REASON_KILL = 4,
80 /** Exception. */
81 __LIBC_EXIT_REASON_XCPT = 5,
82 /** Signal base. */
83 __LIBC_EXIT_REASON_SIGNAL_BASE = 32,
84 /** Signal max. */
85 __LIBC_EXIT_REASON_SIGNAL_MAX = 256,
86 /** Hack to ensure that this will be a 32-bit int. */
87 __LIBC_EXIT_REASON_MAKE_INT32 = 0x7fffffff
88} __LIBC_EXIT_REASON;
89
90
91/** Pointer to child termination data. */
92typedef struct __LIBC_SPMCHILDNOTIFY *__LIBC_PSPMCHILDNOTIFY;
93
94/**
95 * Child termination notification data.
96 */
97typedef struct __LIBC_SPMCHILDNOTIFY
98{
99 /** Pointer to the next node in the list. */
100 __LIBC_PSPMCHILDNOTIFY volatile pNext;
101 /** Structure size. */
102 unsigned cb;
103 /** Process Id. */
104 pid_t pid;
105 /** Process Group Id. */
106 pid_t pgrp;
107 /** Exit code. */
108 int iExitCode;
109 /** Reason code. */
110 __LIBC_EXIT_REASON enmDeathReason;
111} __LIBC_SPMCHILDNOTIFY;
112
113
114/**
115 * Process state.
116 */
117typedef enum __LIBC_SPMPROCSTAT
118{
119 /** The process is free. */
120 __LIBC_PROCSTATE_FREE = 0,
121 /** The process is waiting for a chile to be created and snatch all the
122 * inherited goodies from it.
123 * If not caught before DosExecPgm/DosStartSession returns
124 * it will be freed by the disappointed parent.
125 */
126 __LIBC_PROCSTATE_EMBRYO = 1,
127 /** The process is running. */
128 __LIBC_PROCSTATE_ALIVE = 2,
129 /** The process is dead but other guys are still using it's data. */
130 __LIBC_PROCSTATE_ZOMBIE = 3,
131 /** Reserved process state. */
132 __LIBC_PROCSTATE_RESERVED = 4,
133 /** The maximum state number (exclusive). */
134 __LIBC_PROCSTATE_MAX = 5,
135 /** Hack to ensure that this will be a 32-bit int. */
136 __LIBC_PROCSTATE_MAKE_INT32 = 0x7fffffff
137} __LIBC_SPMPROCSTAT;
138
139
140/** Pointer to (queued) signal. */
141typedef struct __libc_SPMSignal *__LIBC_PSPMSIGNAL;
142
143/**
144 * Signal (queued).
145 */
146typedef struct __libc_SPMSignal
147{
148 /** Structure size. */
149 unsigned cb;
150 /** Pointer to the next signal. */
151 __LIBC_PSPMSIGNAL volatile pNext;
152 /** Sender process.
153 * This is used to decrement the cSigsSent count of the sender. */
154 pid_t pidSender;
155 /** Signal info. */
156 siginfo_t Info;
157} __LIBC_SPMSIGNAL;
158
159
160/** Inheritance FH Bundle Type.
161 * @{ */
162/** Termination bundle. */
163#define __LIBC_SPM_INH_FHB_TYPE_END (0)
164/** Standard bundle. */
165#define __LIBC_SPM_INH_FHB_TYPE_STANDARD (0xe0 | (sizeof(unsigned) + sizeof(ino_t) + sizeof(dev_t) + sizeof(unsigned)))
166/** Directory bundle. */
167#define __LIBC_SPM_INH_FHB_TYPE_DIRECTORY (0xc0 | (sizeof(unsigned) + sizeof(ino_t) + sizeof(dev_t) + sizeof(unsigned) + sizeof(unsigned)))
168/** Socket bundle, using the BSD 4.4 backend. */
169#define __LIBC_SPM_INH_FHB_TYPE_SOCKET_44 (0xa0 | (sizeof(unsigned) + sizeof(unsigned short)))
170/** Socket bundle, using the BSD 4.3 backend. */
171#define __LIBC_SPM_INH_FHB_TYPE_SOCKET_43 (0x80 | (sizeof(unsigned) + sizeof(unsigned short)))
172/*#define __LIBC_SPM_INH_FHB_TYPE_ (0x60 | (sizeof(unsigned) + ))*/
173/*#define __LIBC_SPM_INH_FHB_TYPE_ (0x40 | (sizeof(unsigned) + ))*/
174/*#define __LIBC_SPM_INH_FHB_TYPE_ (0x20 | (sizeof(unsigned) + ))*/
175/*#define __LIBC_SPM_INH_FHB_TYPE_ (0x00 | (sizeof(unsigned) + ))*/
176/** Get the per file handle size from the bundle type. */
177#define __LIBC_SPM_INH_FHB_SIZE(type) ((type) & 0x1f)
178/** @} */
179
180/**
181 * SPM Inheritance File Handle Bundle Header.
182 */
183#pragma pack(1)
184typedef struct __libc_SPMInhFHBHdr
185{
186 /** Bundle type. */
187 unsigned char uchType;
188 /** Count of handles in this bundle. */
189 unsigned char cHandles;
190 /** Start handle number. */
191 unsigned short StartFH;
192} __LIBC_SPMINHFHBHDR;
193#pragma pack()
194/** Pointer to SPM filehandle bundle header. */
195typedef __LIBC_SPMINHFHBHDR *__LIBC_PSPMINHFHBHDR;
196
197/**
198 * SPM standard filehandle inherit bundle
199 * This is used for OS/2 filehandles which only needs flags
200 * transfered.
201 */
202#pragma pack(1)
203typedef struct __libc_SPMInhFH
204{
205 /** The common bundle header. */
206 __LIBC_SPMINHFHBHDR Hdr;
207 /** Array Hdr.cHandles entries. */
208 struct
209 {
210 /** The flags. */
211 unsigned fFlags;
212 /** The inode number. */
213 ino_t Inode;
214 /** The device number. */
215 dev_t Dev;
216 /** String table offset of the native path. */
217 unsigned offNativePath : 24;
218 unsigned u8Reserved : 8;
219 } aHandles[1];
220} __LIBC_SPMINHFHBSTD;
221#pragma pack()
222/** Pointer to SPM standard filehandle inherit bundle. */
223typedef __LIBC_SPMINHFHBSTD *__LIBC_PSPMINHFHBSTD;
224
225/**
226 * SPM directory filehandle inherit bundle.
227 */
228#pragma pack(1)
229typedef struct __libc_SPMInhFHDir
230{
231 /** The common bundle header. */
232 __LIBC_SPMINHFHBHDR Hdr;
233 /** Array of flags of Hdr.cHandles entries. */
234 struct
235 {
236 /** The flags. */
237 unsigned fFlags;
238 /** The inode number. */
239 ino_t Inode;
240 /** The device number. */
241 dev_t Dev;
242 /** String table offset of the native path. */
243 unsigned offNativePath : 24;
244 /** Set if this path is in the unix tree. */
245 unsigned fInUnixTree : 1;
246 unsigned u7Reserved : 7;
247 /** The current position. */
248 unsigned uCurEntry;
249 } aHandles[1];
250} __LIBC_SPMINHFHBDIR;
251#pragma pack()
252/** Pointer to SPM directory filehandle inherit bundle. */
253typedef __LIBC_SPMINHFHBDIR *__LIBC_PSPMINHFHBDIR;
254
255/**
256 * SPM socket filehandle inherit bundle.
257 *
258 * This is used for both BSD 4.3 and 4.4 sockets. The data needed
259 * here is the flags and the socket number.
260 */
261#pragma pack(1)
262typedef struct __libc_SPMInhFHSocket
263{
264 /** The common bundle header. */
265 __LIBC_SPMINHFHBHDR Hdr;
266 /** Array of flags of Hdr.cHandles entries. */
267 struct
268 {
269 /** The file handle flags. */
270 unsigned fFlags;
271 /** The socket number. */
272 unsigned short usSocket;
273 } aHandles[1];
274} __LIBC_SPMINHFHBSOCK;
275#pragma pack()
276/** Pointer to SPM socket filehandle inherit bundle. */
277typedef __LIBC_SPMINHFHBSOCK *__LIBC_PSPMINHFHBSOCK;
278
279/**
280 * The SPM fs inherit data, part 1.
281 * The FS data is stored in two sections for legacy reasons.
282 */
283typedef struct __libc_SPMInhFS
284{
285 /** In Unix Tree global. */
286 int fInUnixTree;
287 /** Size of the unix root. Only set if there's an official root. */
288 size_t cchUnixRoot;
289 /** The current unix root if cchUnixRoot is non-zero. */
290 char szUnixRoot[1];
291} __LIBC_SPMINHFS;
292/** Pointer to FS inherit data. */
293typedef __LIBC_SPMINHFS *__LIBC_PSPMINHFS;
294
295/**
296 * SPM fs inherit data, part two.
297 */
298typedef struct __libc_SPMInhFS2
299{
300 /** The size of this structure. */
301 unsigned cb;
302 /** The umask value. */
303 unsigned fUMask;
304} __LIBC_SPMINHFS2;
305/** Pointer to FS inherit data, part two. */
306typedef __LIBC_SPMINHFS2 *__LIBC_PSPMINHFS2;
307
308/**
309 * SPM signal inherit data.
310 */
311typedef struct __libc_SPMInhSig
312{
313 /** The size of this structure. */
314 unsigned cb;
315 /** Mask of signals which should be ignored. */
316 sigset_t SigSetIGN;
317} __LIBC_SPMINHSIG;
318/** Pointer to Signal inherit data. */
319typedef __LIBC_SPMINHSIG *__LIBC_PSPMINHSIG;
320
321
322
323/**
324 * Inherit structure.
325 *
326 * All the data it contains is allocated in one block heap block!
327 */
328typedef struct __libc_SPMInherit
329{
330 /** Size of the inherit structure. */
331 size_t cb;
332 /** Pointer to the filehandle part.
333 * This is a succession of bundles terminating with a _END one. */
334 __LIBC_PSPMINHFHBHDR pFHBundles;
335 /** Pointer to the file system part. If NULL default values are assumed. */
336 __LIBC_PSPMINHFS pFS;
337 /** Pointer to the signal part. If NULL default values are assumed. */
338 __LIBC_PSPMINHSIG pSig;
339 /** Pointer to strings (filenames++).
340 * All the strings are NULL terminated and referenced by offset. */
341 char *pszStrings;
342 /** More file system stuff. */
343 __LIBC_PSPMINHFS2 pFS2;
344} __LIBC_SPMINHERIT;
345/** Pointer to inherit data. */
346typedef __LIBC_SPMINHERIT *__LIBC_PSPMINHERIT;
347
348
349/** Pointer to per process data structure. */
350typedef struct __libc_SPMProcess *__LIBC_PSPMPROCESS;
351
352/**
353 * Per Process Data.
354 */
355typedef struct __libc_SPMProcess
356{
357 /** 0 - Pointer to the next process in the list.
358 * Every process is in one or another list depending on their state. */
359 volatile __LIBC_PSPMPROCESS pNext;
360 /** 4 - Pointer to the previous process in the list. */
361 volatile __LIBC_PSPMPROCESS pPrev;
362
363
364 /** Core
365 * @{ */
366 /** 8 - Version of the SPM which created this process. */
367 unsigned uVersion;
368 /** 12 - Number of references to this process.
369 * A process is not actually free till the reference count
370 * reaches 0. */
371 volatile unsigned cReferences;
372 /** 16 - State of this process. */
373 volatile __LIBC_SPMPROCSTAT enmState;
374 /** 20 - Process id. */
375 pid_t pid;
376 /** 24 - Process id of parent.
377 * This might not match the OS/2 one since there are no notification
378 * when a parent dies. */
379 pid_t pidParent;
380 /** @} */
381
382
383 /** User & Group
384 * @{ */
385 /** 28 - User id (also called Real User id). */
386 uid_t uid;
387 /** 32 - Effective user id. */
388 uid_t euid;
389 /** 36 - Saved user id. */
390 uid_t svuid;
391 /** 40 - Group id (also called Real Group id). */
392 gid_t gid;
393 /** 44 - Effecive group id. */
394 gid_t egid;
395 /** 48 - Saved group id. */
396 gid_t svgid;
397 /** 52 - Supplementary group ids. */
398 gid_t agidGroups[16 /*NGROUPS_MAX*/];
399 /** @} */
400
401
402 /** Misc
403 * @{ */
404 /** 116 - Creation timestamp. */
405 unsigned uTimestamp;
406 /** 120 - The SPM open count of this process. */
407 unsigned cSPMOpens;
408 /** 124 - Indicates that the process is a full featured LIBC process.
409 * Until this flag is set (atomically) it's not a good idea to
410 * queue signals on the process since it won't have a signal handler
411 * installed, and thus won't get to know about them.
412 */
413 volatile unsigned fExeInited;
414 /** 128 - Reserved for future use. Must be 0. */
415 unsigned uMiscReserved;
416 /** @} */
417
418
419 /** Fork
420 * @{ */
421 /** 132 - Pointer to fork module list head. */
422 void * volatile pvModuleHead;
423 /** 136 - Pointer to fork module list tail pointer. */
424 void * volatile * volatile ppvModuleTail;
425 /** 140 - Pointer to fork handle which a child should use when spawned by fork(). */
426 void *pvForkHandle;
427 /** @} */
428
429
430 /** Signals & Job Control
431 * @{ */
432 /** 144 - Incoming signal queue (FIFO).
433 * For signals which aren't queable only one signal can be queued.
434 */
435 volatile __LIBC_PSPMSIGNAL pSigHead;
436 /** 148 - Number of signals send.
437 * After _POSIX_SIGQUEUE_MAX signals only SIGCHLD will be allowed sent.
438 */
439 volatile unsigned cSigsSent;