* child_info.h (child_info): Move shared_h, console_h to cygheap. Add mount_h. * cygheap.h (init_cygheap): Add shared_h, console_h. * cygheap.cc (init_cheap): Initialize heap at a fixed location after the shared memory regions. Initialize cygheap->user name here. * dcrt0.cc (dll_crt0_1): Call getpagesize () to initialize constants. Remove cygheap_init since it is done in shared_init now. (_dll_crt0): Initialize mount_h, remove shared_h and console_h initialization. * fhandler_console.cc (console_shared_h): Eliminate. (get_tty_stuff): Use cygheap->console_h rather than console_shared_h. * heap.cc (heap_init): Use page size constant calculated earlier in initialization. * shared.cc: Eliminate cygwin_shared_h. Add cygwin_mount_h. (mount_table_init): New function for initializing a user mount table. (open_shared_file_map): Use constant for shared memory region. Initialize cygheap and mount table here. (open_shared): Improve debugging output. (shared_info::initialize): Eliminate call to mount.init. (shared_terminate): Use cygheap->shared_h. Close cygwin_mount_h. (open_shared_file_map): Eliminate. * shared_info.h (mount_info): Add a version field. (shared_align_past): New macro for calculating location for shared memory regions. * sigproc.cc (init_child_info): Eliminate shared_h, console_h. * spawn.cc (spawn_guts): Pass on cygwin_mount_h iff not a different user. * syscalls.cc (system_info): New global holding system memory defaults. (getpagesize): Use system_info. * uinfo.cc (internal_getlogin): Only fill in user name if nonexistent. * winsup.h: Declare system_info. * passwd.cc (read_etc_passwd): Use cygheap->user.name () rather than retrieving the name again.
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* 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,
 | 
						|
  HEAP_BUF,
 | 
						|
  HEAP_1_START,
 | 
						|
  HEAP_1_STR,
 | 
						|
  HEAP_1_ARGV,
 | 
						|
  HEAP_1_BUF,
 | 
						|
  HEAP_1_EXEC,
 | 
						|
  HEAP_1_MAX = 100
 | 
						|
};
 | 
						|
 | 
						|
#define CYGHEAPSIZE ((4000 * sizeof (fhandler_union)) + (2 * 65536))
 | 
						|
 | 
						|
#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
 | 
						|
 | 
						|
struct _cmalloc_entry
 | 
						|
{
 | 
						|
  union
 | 
						|
  {
 | 
						|
    DWORD b;
 | 
						|
    char *ptr;
 | 
						|
  };
 | 
						|
  struct _cmalloc_entry *prev;
 | 
						|
  char data[0];
 | 
						|
};
 | 
						|
 | 
						|
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; }
 | 
						|
};
 | 
						|
 | 
						|
class cygheap_user
 | 
						|
{
 | 
						|
  /* Extendend user information.
 | 
						|
     The information is derived from the internal_getlogin call
 | 
						|
     when on a NT system. */
 | 
						|
  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 */
 | 
						|
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 */
 | 
						|
 | 
						|
  /* 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;
 | 
						|
 | 
						|
  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)
 | 
						|
  {
 | 
						|
    set_name (user.name ());
 | 
						|
    set_logsrv (user.logsrv ());
 | 
						|
    set_domain (user.domain ());
 | 
						|
    set_sid (user.sid ());
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
struct init_cygheap
 | 
						|
{
 | 
						|
  _cmalloc_entry *chain;
 | 
						|
  cygheap_root root;
 | 
						|
  cygheap_user user;
 | 
						|
  mode_t umask;
 | 
						|
  HANDLE shared_h;
 | 
						|
  HANDLE console_h;
 | 
						|
};
 | 
						|
 | 
						|
extern init_cygheap *cygheap;
 | 
						|
extern void *cygheap_max;
 | 
						|
 | 
						|
extern "C" {
 | 
						|
void __stdcall cfree (void *) __attribute__ ((regparm(1)));
 | 
						|
void __stdcall cygheap_fixup_in_child (HANDLE, bool);
 | 
						|
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)));
 | 
						|
void __stdcall cygheap_init ();
 | 
						|
}
 |