]> sourceware.org Git - newlib-cygwin.git/blobdiff - winsup/cygwin/cygheap.h
* cygheap.cc (init_cygheap::etc_changed): New method to signal
[newlib-cygwin.git] / winsup / cygwin / cygheap.h
index 425185c6a8fde6b98b2ca9ffa9aa8f25df92bf37..8d34e671a70d9f045442131aef8f4b427ca7f9ff 100644 (file)
@@ -16,6 +16,7 @@ enum cygheap_types
   HEAP_STR,
   HEAP_ARGV,
   HEAP_BUF,
+  HEAP_MOUNT,
   HEAP_1_START,
   HEAP_1_STR,
   HEAP_1_ARGV,
@@ -24,16 +25,160 @@ enum cygheap_types
   HEAP_1_MAX = 100
 };
 
-#define CYGHEAPSIZE ((1000 * sizeof (fhandler_union)) + (2 * 65536))
+#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
 
-extern HANDLE cygheap;
-extern HANDLE cygheap_max;
+struct _cmalloc_entry
+{
+  union
+  {
+    DWORD b;
+    char *ptr;
+  };
+  struct _cmalloc_entry *prev;
+  char data[0];
+};
 
-#define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
+struct cygheap_root_mount_info
+{
+  char posix_path[MAX_PATH];
+  unsigned posix_pathlen;
+  char native_path[MAX_PATH];
+  unsigned native_pathlen;
+};
+
+/* CGF: FIXME This doesn't belong here */
+
+int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3)));
+class cygheap_root
+{
+  /* Root directory information.
+     This is used after a chroot is called. */
+  struct cygheap_root_mount_info *m;
+
+public:
+  bool posix_ok (const char *path)
+  {
+    if (!m)
+      return 1;
+    return path_prefix_p (m->posix_path, path, m->posix_pathlen);
+  }
+  bool ischroot_native (const char *path)
+  {
+    if (!m)
+      return 1;
+    return strncasematch (m->native_path, path, m->native_pathlen)
+           && (path[m->native_pathlen] == '\\' || !path[m->native_pathlen]);
+  }
+  const char *unchroot (const char *path)
+  {
+    if (!m)
+      return path;
+    const char *p = path + m->posix_pathlen;
+    if (!*p)
+      p = "/";
+    return p;
+  }
+  bool exists () {return !!m;}
+  void set (const char *posix, const char *native);
+  size_t posix_length () const { return m->posix_pathlen; }
+  const char *posix_path () const { return m->posix_path; }
+  size_t native_length () const { return m->native_pathlen; }
+  const char *native_path () const { return m->native_path; }
+};
+
+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), token (INVALID_HANDLE_VALUE) {}
+  ~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 ());
+  }
+};
+
+/* 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);
+};
+
+struct init_cygheap
+{
+  _cmalloc_entry *chain;
+  char *buckets[32];
+  void *heapbase;
+  void *heapptr;
+  void *heaptop;
+  cygheap_root root;
+  cygheap_user user;
+  mode_t umask;
+  HANDLE shared_h;
+  HANDLE console_h;
+  HANDLE etc_changed_h;
+  cwdstuff cwd;
+  dtable fdtab;
+
+  bool etc_changed ();
+};
+
+#define CYGHEAPSIZE (sizeof (init_cygheap) + (4000 * sizeof (fhandler_union)) + (2 * 65536))
+
+extern init_cygheap *cygheap;
+extern void *cygheap_max;
 
+class child_info;
+void __stdcall cygheap_setup_for_child (child_info *ci) __attribute__ ((regparm(1)));
+void __stdcall cygheap_setup_for_child_cleanup (child_info *ci) __attribute__ ((regparm(1)));
+void __stdcall cygheap_fixup_in_child (child_info *, bool);
 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)));
This page took 0.023855 seconds and 5 git commands to generate.