2000-09-03 12:16:35 +08:00
|
|
|
/* cygheap.h: Cygwin heap manager.
|
|
|
|
|
|
|
|
Copyright 2000 Cygnus Solutions.
|
|
|
|
|
|
|
|
This file is part of Cygwin.
|
|
|
|
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
|
|
details. */
|
|
|
|
|
|
|
|
#undef cfree
|
|
|
|
|
|
|
|
enum cygheap_types
|
|
|
|
{
|
|
|
|
HEAP_FHANDLER,
|
|
|
|
HEAP_STR,
|
|
|
|
HEAP_ARGV,
|
2000-09-27 13:12:09 +08:00
|
|
|
HEAP_BUF,
|
|
|
|
HEAP_1_START,
|
|
|
|
HEAP_1_STR,
|
|
|
|
HEAP_1_ARGV,
|
|
|
|
HEAP_1_BUF,
|
2000-09-30 12:54:11 +08:00
|
|
|
HEAP_1_EXEC,
|
|
|
|
HEAP_1_MAX = 100
|
2000-09-03 12:16:35 +08:00
|
|
|
};
|
|
|
|
|
2000-10-02 10:26:04 +08:00
|
|
|
#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
|
2000-09-03 12:16:35 +08:00
|
|
|
|
2000-11-14 13:53:32 +08:00
|
|
|
struct _cmalloc_entry
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
DWORD b;
|
|
|
|
char *ptr;
|
|
|
|
};
|
|
|
|
struct _cmalloc_entry *prev;
|
|
|
|
char data[0];
|
|
|
|
};
|
|
|
|
|
2000-11-15 08:13:09 +08:00
|
|
|
class cygheap_root
|
|
|
|
{
|
|
|
|
/* Root directory information.
|
|
|
|
This is used after a chroot is called. */
|
|
|
|
size_t rootlen;
|
|
|
|
char *root;
|
|
|
|
public:
|
|
|
|
cygheap_root (cygheap_root &nroot);
|
|
|
|
~cygheap_root ();
|
|
|
|
char *operator =(const char *new_root);
|
|
|
|
size_t length () const { return rootlen; }
|
|
|
|
const char *path () const { return root; }
|
|
|
|
};
|
|
|
|
|
2001-01-17 22:57:09 +08:00
|
|
|
class cygheap_user
|
|
|
|
{
|
2000-11-15 08:13:09 +08:00
|
|
|
/* Extendend user information.
|
|
|
|
The information is derived from the internal_getlogin call
|
|
|
|
when on a NT system. */
|
2000-11-16 05:04:02 +08:00
|
|
|
char *pname; /* user's name */
|
|
|
|
char *plogsrv; /* Logon server, may be FQDN */
|
|
|
|
char *pdomain; /* Logon domain of the user */
|
|
|
|
PSID psid; /* buffer for user's SID */
|
2000-11-15 08:13:09 +08:00
|
|
|
public:
|
|
|
|
uid_t orig_uid; /* Remains intact even after impersonation */
|
|
|
|
uid_t orig_gid; /* Ditto */
|
|
|
|
uid_t real_uid; /* Remains intact on seteuid, replaced by setuid */
|
|
|
|
gid_t real_gid; /* Ditto */
|
|
|
|
|
2000-11-16 05:04:02 +08:00
|
|
|
/* token is needed if set(e)uid should be called. It can be set by a call
|
|
|
|
to `set_impersonation_token()'. */
|
|
|
|
HANDLE token;
|
|
|
|
BOOL impersonated;
|
|
|
|
|
2000-11-15 08:13:09 +08:00
|
|
|
cygheap_user () : pname (NULL), plogsrv (NULL), pdomain (NULL), psid (NULL) {}
|
|
|
|
~cygheap_user ();
|
|
|
|
|
|
|
|
void set_name (const char *new_name);
|
|
|
|
const char *name () const { return pname; }
|
|
|
|
|
|
|
|
void set_logsrv (const char *new_logsrv);
|
|
|
|
const char *logsrv () const { return plogsrv; }
|
|
|
|
|
|
|
|
void set_domain (const char *new_domain);
|
|
|
|
const char *domain () const { return pdomain; }
|
|
|
|
|
|
|
|
BOOL set_sid (PSID new_sid);
|
|
|
|
PSID sid () const { return psid; }
|
|
|
|
|
|
|
|
void operator =(cygheap_user &user)
|
2001-01-17 22:57:09 +08:00
|
|
|
{
|
|
|
|
set_name (user.name ());
|
|
|
|
set_logsrv (user.logsrv ());
|
|
|
|
set_domain (user.domain ());
|
|
|
|
set_sid (user.sid ());
|
|
|
|
}
|
2000-11-15 08:13:09 +08:00
|
|
|
};
|
2000-11-14 13:53:32 +08:00
|
|
|
|
2001-04-17 11:52:08 +08:00
|
|
|
/* cwd cache stuff. */
|
|
|
|
|
|
|
|
class muto;
|
|
|
|
|
|
|
|
struct cwdstuff
|
|
|
|
{
|
|
|
|
char *posix;
|
|
|
|
char *win32;
|
|
|
|
DWORD hash;
|
|
|
|
muto *lock;
|
|
|
|
char *get (char *buf, int need_posix = 1, int with_chroot = 0, unsigned ulen = MAX_PATH);
|
|
|
|
DWORD get_hash ();
|
|
|
|
void init ();
|
|
|
|
void fixup_after_exec (char *win32, char *posix, DWORD hash);
|
|
|
|
bool get_initial ();
|
|
|
|
void set (const char *win32_cwd, const char *posix_cwd = NULL);
|
|
|
|
};
|
|
|
|
|
2000-11-14 13:53:32 +08:00
|
|
|
struct init_cygheap
|
|
|
|
{
|
|
|
|
_cmalloc_entry *chain;
|
2000-11-15 08:13:09 +08:00
|
|
|
cygheap_root root;
|
|
|
|
cygheap_user user;
|
2000-11-14 13:53:32 +08:00
|
|
|
mode_t umask;
|
2001-01-28 13:51:15 +08:00
|
|
|
HANDLE shared_h;
|
|
|
|
HANDLE console_h;
|
2001-04-17 11:52:08 +08:00
|
|
|
cwdstuff cwd;
|
2001-04-19 05:10:15 +08:00
|
|
|
dtable fdtab;
|
2000-11-14 13:53:32 +08:00
|
|
|
};
|
|
|
|
|
2001-04-19 05:10:15 +08:00
|
|
|
#define CYGHEAPSIZE (sizeof (init_cygheap) + (4000 * sizeof (fhandler_union)) + (2 * 65536))
|
|
|
|
|
2000-11-14 13:53:32 +08:00
|
|
|
extern init_cygheap *cygheap;
|
|
|
|
extern void *cygheap_max;
|
|
|
|
|
2000-09-03 12:16:35 +08:00
|
|
|
extern "C" {
|
2000-10-17 07:55:58 +08:00
|
|
|
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
|
2000-09-30 12:54:11 +08:00
|
|
|
void __stdcall cygheap_fixup_in_child (HANDLE, bool);
|
2000-10-17 07:55:58 +08:00
|
|
|
void *__stdcall cmalloc (cygheap_types, DWORD) __attribute__ ((regparm(2)));
|
|
|
|
void *__stdcall crealloc (void *, DWORD) __attribute__ ((regparm(2)));
|
|
|
|
void *__stdcall ccalloc (cygheap_types, DWORD, DWORD) __attribute__ ((regparm(3)));
|
|
|
|
char *__stdcall cstrdup (const char *) __attribute__ ((regparm(1)));
|
|
|
|
char *__stdcall cstrdup1 (const char *) __attribute__ ((regparm(1)));
|
2000-10-02 10:26:04 +08:00
|
|
|
void __stdcall cygheap_init ();
|
2000-09-03 12:16:35 +08:00
|
|
|
}
|