From 74fcdaec2071bb23c090bc13b9cfd0c4765ed3bd Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 2 Jul 2002 01:36:15 +0000 Subject: * autoload.cc (GetSecurityInfo): Define new autoload function. (RegQueryInfoKeyA): Ditto. * fhandler.h (fhandler_virtual::fill_filebuf): Change return type to bool. (fhandler_proc::fill_filebuf): Ditto. (fhandler_registry::fill_filebuf): Ditto. (fhandler_process::fill_filebuf): Ditto. (fhandler_registry::value_name): Add new member. (fhandler_registry::close): Add new method. (fhandler_process::p): Remove member. * fhandler_proc.cc (fhandler_proc::open): Add set_nohandle after calling superclass method. Check return value of fill_filebuf. (fhandler_proc::fill_filebuf): Change return type to bool. Add return statement. * fhandler_process.cc (fhandler_process::open): Add set_nohandle after calling superclass method. Remove references to p. Check return value of fill_filebuf. (fhandler_process::fill_filebuf): Change return type to bool. Don't use dereference operator on p. Add return statement. (fhandler_process::format_process_stat): Fix typo. * fhandler_registry.cc: Add static open_key declaration. (fhandler_registry::exists): Assume path is already normalised. Try opening the path as a key in its own right first, before reverting to enumerating subkeys and values of the parent key. (fhandler_registry::fstat): Add additional code to return more relevant information about the registry key/value. (fhandler_registry::readdir): Explicitly set desired access when opening registry key. Remove output of buf from debug_printf format string. (fhandler_registry::open): Use set_io_handle to store registry key handle. Set value_name member. Move code to read a value from the registry to fill_filebuf. Add call to fill_filebuf. (fhandler_registry::close): New method. (fhandler_registry::fill_filebuf): Change return type to bool. Add code to read a value from registry. (fhandler_registry::open_key): Make function static. Use KEY_READ as desired access unless this is the last path component. Check the return value of RegOpenKeyEx for an error instead of hKey. * fhandler_virtual.cc (fhandler_virtual::lseek): Check the return value of fill_filebuf. (fhandler_virtual::open): Remove call to set_nohandle. (fhandler_virtual::fill_filebuf): Change return type to bool. Add return statement. * security.cc (get_nt_object_attribute): New function. (get_object_attribute): New function. * security.h (get_object_attribute): New function declaration. --- winsup/cygwin/fhandler_process.cc | 91 ++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 48 deletions(-) (limited to 'winsup/cygwin/fhandler_process.cc') diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc index 2c5eae720..dc885820a 100644 --- a/winsup/cygwin/fhandler_process.cc +++ b/winsup/cygwin/fhandler_process.cc @@ -41,7 +41,8 @@ static const int PROCESS_CTTY = 11; static const int PROCESS_STAT = 12; static const int PROCESS_STATM = 13; -static const char *process_listing[] = { +static const char * const process_listing[] = +{ ".", "..", "ppid", @@ -59,14 +60,17 @@ static const char *process_listing[] = { NULL }; -static const int PROCESS_LINK_COUNT = (sizeof(process_listing) / sizeof(const char *)) - 1; +static const int PROCESS_LINK_COUNT = + (sizeof(process_listing) / sizeof(const char *)) - 1; static off_t format_process_stat (_pinfo *p, char *destbuf, size_t maxsize); static off_t format_process_status (_pinfo *p, char *destbuf, size_t maxsize); static off_t format_process_statm (_pinfo *p, char *destbuf, size_t maxsize); static int get_process_state (DWORD dwProcessId); -static bool get_mem_values(DWORD dwProcessId, unsigned long *vmsize, unsigned long *vmrss, unsigned long *vmtext, - unsigned long *vmdata, unsigned long *vmlib, unsigned long *vmshare); +static bool get_mem_values(DWORD dwProcessId, unsigned long *vmsize, + unsigned long *vmrss, unsigned long *vmtext, + unsigned long *vmdata, unsigned long *vmlib, + unsigned long *vmshare); /* Returns 0 if path doesn't exist, >0 if path is a directory, * <0 if path is a file. @@ -159,6 +163,8 @@ fhandler_process::open (path_conv *pc, int flags, mode_t mode) if (!res) goto out; + set_nohandle (true); + const char *path; path = get_name () + proc_len + 1; pid = atoi (path); @@ -215,25 +221,17 @@ fhandler_process::open (path_conv *pc, int flags, mode_t mode) goto out; } - { - pinfo p (pid); - if (!p) - { - set_errno (ENOENT); - res = 0; - goto out; - } - fileid = process_file_no; - this->p = &p; - fill_filebuf (); + if (!fill_filebuf ()) + { + res = 0; + goto out; + } if (flags & O_APPEND) position = filesize; else position = 0; - this->p = NULL; - } success: res = 1; @@ -244,20 +242,17 @@ out: return res; } -void +bool fhandler_process::fill_filebuf () { - pinfo pmaybe; + pinfo p (pid); if (!p) { - pmaybe.init (pid); - p = &pmaybe; + set_errno (ENOENT); + return false; } - if (!p) - return; - switch (fileid) { case PROCESS_UID: @@ -268,27 +263,27 @@ fhandler_process::fill_filebuf () case PROCESS_PPID: { if (!filebuf) - filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 40); + filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 40); int num; switch (fileid) { case PROCESS_PPID: - num = (*p)->ppid; + num = p->ppid; break; case PROCESS_UID: - num = (*p)->uid; + num = p->uid; break; case PROCESS_PGID: - num = (*p)->pgid; + num = p->pgid; break; case PROCESS_SID: - num = (*p)->sid; + num = p->sid; break; case PROCESS_GID: - num = (*p)->gid; + num = p->gid; break; case PROCESS_CTTY: - num = (*p)->ctty; + num = p->ctty; break; default: // what's this here for? num = 0; @@ -301,12 +296,12 @@ fhandler_process::fill_filebuf () case PROCESS_EXENAME: { if (!filebuf) - filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = MAX_PATH); - if ((*p)->process_state & (PID_ZOMBIE | PID_EXITED)) + filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = MAX_PATH); + if (p->process_state & (PID_ZOMBIE | PID_EXITED)) strcpy (filebuf, ""); else { - mount_table->conv_to_posix_path ((*p)->progname, filebuf, 1); + mount_table->conv_to_posix_path (p->progname, filebuf, 1); int len = strlen (filebuf); if (len > 4) { @@ -321,17 +316,17 @@ fhandler_process::fill_filebuf () case PROCESS_WINPID: { if (!filebuf) - filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 40); - __small_sprintf (filebuf, "%d\n", (*p)->dwProcessId); + filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 40); + __small_sprintf (filebuf, "%d\n", p->dwProcessId); filesize = strlen (filebuf); break; } case PROCESS_WINEXENAME: { - int len = strlen ((*p)->progname); + int len = strlen (p->progname); if (!filebuf) - filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = (len + 2)); - strcpy (filebuf, (*p)->progname); + filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = (len + 2)); + strcpy (filebuf, p->progname); filebuf[len] = '\n'; filesize = len + 1; break; @@ -340,27 +335,26 @@ fhandler_process::fill_filebuf () { if (!filebuf) filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 2048); - filesize = format_process_status ((*p), filebuf, bufalloc); + filesize = format_process_status (*p, filebuf, bufalloc); break; } case PROCESS_STAT: { if (!filebuf) filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 2048); - filesize = format_process_stat ((*p), filebuf, bufalloc); + filesize = format_process_stat (*p, filebuf, bufalloc); break; } case PROCESS_STATM: { if (!filebuf) filebuf = (char *) cmalloc (HEAP_BUF, bufalloc = 2048); - filesize = format_process_statm ((*p), filebuf, bufalloc); + filesize = format_process_statm (*p, filebuf, bufalloc); break; } } - if (p == &pmaybe) - p = NULL; + return true; } static @@ -375,7 +369,7 @@ format_process_stat (_pinfo *p, char *destbuf, size_t maxsize) vmsize = 0UL, vmrss = 0UL, vmmaxrss = 0UL; int priority = 0; if (p->process_state & (PID_ZOMBIE | PID_EXITED)) - strcpy (cmd, ""); else { strcpy(cmd, p->progname); @@ -598,11 +592,12 @@ static off_t format_process_statm (_pinfo *p, char *destbuf, size_t maxsize) { - unsigned long vmsize = 0UL, vmrss = 0UL, vmtext = 0UL, vmdata = 0UL, vmlib = 0UL, - vmshare = 0UL; + unsigned long vmsize = 0UL, vmrss = 0UL, vmtext = 0UL, vmdata = 0UL, + vmlib = 0UL, vmshare = 0UL; if (wincap.is_winnt ()) { - if (!get_mem_values (p->dwProcessId, &vmsize, &vmrss, &vmtext, &vmdata, &vmlib, &vmshare)) + if (!get_mem_values (p->dwProcessId, &vmsize, &vmrss, &vmtext, &vmdata, + &vmlib, &vmshare)) return 0; } return __small_sprintf (destbuf, "%ld %ld %ld %ld %ld %ld %ld", -- cgit v1.2.3