1 /* cygheap.h: Cygwin heap manager.
3 Copyright 2000, 2001, 2002 Red Hat, Inc.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
28 #define incygheap(s) (cygheap && ((char *) (s) >= (char *) cygheap) && ((char *) (s) <= ((char *) cygheap_max)))
37 struct _cmalloc_entry *prev;
41 struct cygheap_root_mount_info
43 char posix_path[MAX_PATH];
44 unsigned posix_pathlen;
45 char native_path[MAX_PATH];
46 unsigned native_pathlen;
49 /* CGF: FIXME This doesn't belong here */
53 /* Root directory information.
54 This is used after a chroot is called. */
55 struct cygheap_root_mount_info *m;
58 bool posix_ok (const char *path)
62 return path_prefix_p (m->posix_path, path, m->posix_pathlen);
64 bool ischroot_native (const char *path)
68 return strncasematch (m->native_path, path, m->native_pathlen)
69 && (path[m->native_pathlen] == '\\' || !path[m->native_pathlen]);
71 const char *unchroot (const char *path)
75 const char *p = path + m->posix_pathlen;
80 bool exists () {return !!m;}
81 void set (const char *posix, const char *native);
82 size_t posix_length () const { return m->posix_pathlen; }
83 const char *posix_path () const { return m->posix_path; }
84 size_t native_length () const { return m->native_pathlen; }
85 const char *native_path () const { return m->native_path; }
98 /* Extendend user information.
99 The information is derived from the internal_getlogin call
100 when on a NT system. */
101 char *pname; /* user's name */
102 char *plogsrv; /* Logon server, may be FQDN */
103 char *pdomain; /* Logon domain of the user */
104 char *homedrive; /* User's home drive */
105 char *homepath; /* User's home path */
106 char *winname; /* User's name as far as Windows knows it */
107 char *puserprof; /* User profile */
108 PSID psid; /* buffer for user's SID */
109 PSID orig_psid; /* Remains intact even after impersonation */
111 __uid32_t orig_uid; /* Remains intact even after impersonation */
112 __gid32_t orig_gid; /* Ditto */
113 __uid32_t real_uid; /* Remains intact on seteuid, replaced by setuid */
114 __gid32_t real_gid; /* Ditto */
116 /* token is needed if set(e)uid should be called. It can be set by a call
117 to `set_impersonation_token()'. */
121 /* CGF 2002-06-27. I removed the initializaton from this constructor
122 since this class is always allocated statically. That means that everything
123 is zero anyway so there is no need to initialize it to zero. Since the
124 token initialization is always handled during process startup as well,
125 I've removed the constructor entirely. Please reinstate this f this
126 situation ever changes.
127 cygheap_user () : pname (NULL), plogsrv (NULL), pdomain (NULL),
128 homedrive (NULL), homepath (NULL), psid (NULL),
129 token (INVALID_HANDLE_VALUE) {}
134 void set_name (const char *new_name);
135 const char *name () const { return pname; }
137 const char *env_logsrv ();
138 const char *env_homepath ();
139 const char *env_homedrive ();
140 const char *env_userprofile ();
141 const char *env_domain ();
142 const char *env_name ();
144 BOOL set_sid (PSID new_sid);
145 BOOL set_orig_sid ();
146 PSID sid () const { return psid; }
147 PSID orig_sid () const { return orig_psid; }
148 const char *ontherange (homebodies what, struct passwd * = NULL);
149 bool issetuid () const
151 return impersonated && token != INVALID_HANDLE_VALUE;
155 /* cwd cache stuff. */
165 char *get (char *buf, int need_posix = 1, int with_chroot = 0, unsigned ulen = MAX_PATH);
168 void fixup_after_exec (char *win32, char *posix, DWORD hash);
170 void set (const char *win32_cwd, const char *posix_cwd = NULL);
175 _cmalloc_entry *chain;
177 struct /* User heap stuff. */
188 HANDLE etc_changed_h;
189 char *cygwin_regname;
196 #define CYGHEAPSIZE (sizeof (init_cygheap) + (4000 * sizeof (fhandler_union)) + (2 * 65536))
198 extern init_cygheap *cygheap;
199 extern void *cygheap_max;
201 class cygheap_fdmanip
208 cygheap_fdmanip (): fh (NULL) {}
209 virtual ~cygheap_fdmanip ()
212 ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdmanip");
216 cygheap->fdtab.release (fd);
218 operator int &() {return fd;}
219 operator fhandler_base* &() {return *fh;}
220 void operator = (fhandler_base *fh) {*this->fh = fh;}
221 fhandler_base *operator -> () const {return *fh;}
231 class cygheap_fdnew : public cygheap_fdmanip
234 cygheap_fdnew (int seed_fd = -1, bool lockit = true)
237 SetResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
239 fd = cygheap->fdtab.find_unused_handle ();
241 fd = cygheap->fdtab.find_unused_handle (seed_fd + 1);
245 fh = cygheap->fdtab + fd;
251 ReleaseResourceLock (LOCK_FD_LIST, WRITE_LOCK | READ_LOCK, "cygheap_fdnew");
255 void operator = (fhandler_base *fh) {*this->fh = fh;}
258 class cygheap_fdget : public cygheap_fdmanip
261 cygheap_fdget (int fd, bool lockit = false, bool do_set_errno = true)
264 SetResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
265 if (fd >= 0 && fd < (int) cygheap->fdtab.size
266 && *(fh = cygheap->fdtab + fd) != NULL)
277 ReleaseResourceLock (LOCK_FD_LIST, READ_LOCK, "cygheap_fdget");
284 void *__stdcall cygheap_setup_for_child (child_info *ci, bool dup_later) __attribute__ ((regparm(2)));
285 void __stdcall cygheap_setup_for_child_cleanup (void *, child_info *, bool) __attribute__ ((regparm(3)));
286 void __stdcall cygheap_fixup_in_child (bool);
288 void __stdcall cfree (void *) __attribute__ ((regparm(1)));
289 void *__stdcall cmalloc (cygheap_types, DWORD) __attribute__ ((regparm(2)));
290 void *__stdcall crealloc (void *, DWORD) __attribute__ ((regparm(2)));
291 void *__stdcall ccalloc (cygheap_types, DWORD, DWORD) __attribute__ ((regparm(3)));
292 char *__stdcall cstrdup (const char *) __attribute__ ((regparm(1)));
293 char *__stdcall cstrdup1 (const char *) __attribute__ ((regparm(1)));
294 void __stdcall cfree_and_set (char *&, char * = NULL) __attribute__ ((regparm(2)));
295 void __stdcall cygheap_init ();