* fhandler_proc.cc (proc_tab): Add entry for mounts symlink.
(format_proc_mounts): New function to implement mounts symlink. * fhandler_process.cc (process_tab): Add entry for mounts file. (format_process_mounts): New function to implement mounts file.
This commit is contained in:
parent
29e22d07d6
commit
8c71dc5878
|
@ -1,3 +1,10 @@
|
||||||
|
2009-02-04 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_proc.cc (proc_tab): Add entry for mounts symlink.
|
||||||
|
(format_proc_mounts): New function to implement mounts symlink.
|
||||||
|
* fhandler_process.cc (process_tab): Add entry for mounts file.
|
||||||
|
(format_process_mounts): New function to implement mounts file.
|
||||||
|
|
||||||
2009-02-04 Corinna Vinschen <corinna@vinschen.de>
|
2009-02-04 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* security.cc (alloc_sd): Disable generating default permission entries
|
* security.cc (alloc_sd): Disable generating default permission entries
|
||||||
|
|
|
@ -40,6 +40,7 @@ static _off64_t format_proc_uptime (void *, char *&);
|
||||||
static _off64_t format_proc_cpuinfo (void *, char *&);
|
static _off64_t format_proc_cpuinfo (void *, char *&);
|
||||||
static _off64_t format_proc_partitions (void *, char *&);
|
static _off64_t format_proc_partitions (void *, char *&);
|
||||||
static _off64_t format_proc_self (void *, char *&);
|
static _off64_t format_proc_self (void *, char *&);
|
||||||
|
static _off64_t format_proc_mounts (void *, char *&);
|
||||||
|
|
||||||
/* names of objects in /proc */
|
/* names of objects in /proc */
|
||||||
static const virt_tab_t proc_tab[] = {
|
static const virt_tab_t proc_tab[] = {
|
||||||
|
@ -54,6 +55,7 @@ static const virt_tab_t proc_tab[] = {
|
||||||
{ "cpuinfo", FH_PROC, virt_file, format_proc_cpuinfo },
|
{ "cpuinfo", FH_PROC, virt_file, format_proc_cpuinfo },
|
||||||
{ "partitions", FH_PROC, virt_file, format_proc_partitions },
|
{ "partitions", FH_PROC, virt_file, format_proc_partitions },
|
||||||
{ "self", FH_PROC, virt_symlink, format_proc_self },
|
{ "self", FH_PROC, virt_symlink, format_proc_self },
|
||||||
|
{ "mounts", FH_PROC, virt_symlink, format_proc_mounts },
|
||||||
{ "registry32", FH_REGISTRY, virt_directory, NULL },
|
{ "registry32", FH_REGISTRY, virt_directory, NULL },
|
||||||
{ "registry64", FH_REGISTRY, virt_directory, NULL },
|
{ "registry64", FH_REGISTRY, virt_directory, NULL },
|
||||||
{ "net", FH_PROCNET, virt_directory, NULL },
|
{ "net", FH_PROCNET, virt_directory, NULL },
|
||||||
|
@ -1127,4 +1129,11 @@ format_proc_self (void *, char *&destbuf)
|
||||||
return __small_sprintf (destbuf, "%d", getpid ());
|
return __small_sprintf (destbuf, "%d", getpid ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _off64_t
|
||||||
|
format_proc_mounts (void *, char *&destbuf)
|
||||||
|
{
|
||||||
|
destbuf = (char *) crealloc_abort (destbuf, sizeof ("self/mounts"));
|
||||||
|
return __small_sprintf (destbuf, "self/mounts");
|
||||||
|
}
|
||||||
|
|
||||||
#undef print
|
#undef print
|
||||||
|
|
|
@ -10,6 +10,7 @@ details. */
|
||||||
|
|
||||||
#include "winsup.h"
|
#include "winsup.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <sys/cygwin.h>
|
#include <sys/cygwin.h>
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include "security.h"
|
#include "security.h"
|
||||||
|
@ -22,6 +23,7 @@ details. */
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "ntdll.h"
|
#include "ntdll.h"
|
||||||
#include "cygtls.h"
|
#include "cygtls.h"
|
||||||
|
#include "pwdgrp.h"
|
||||||
#include "tls_pbuf.h"
|
#include "tls_pbuf.h"
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
@ -47,6 +49,7 @@ static _off64_t format_process_sid (void *, char *&);
|
||||||
static _off64_t format_process_gid (void *, char *&);
|
static _off64_t format_process_gid (void *, char *&);
|
||||||
static _off64_t format_process_ctty (void *, char *&);
|
static _off64_t format_process_ctty (void *, char *&);
|
||||||
static _off64_t format_process_fd (void *, char *&);
|
static _off64_t format_process_fd (void *, char *&);
|
||||||
|
static _off64_t format_process_mounts (void *, char *&);
|
||||||
|
|
||||||
static const virt_tab_t process_tab[] =
|
static const virt_tab_t process_tab[] =
|
||||||
{
|
{
|
||||||
|
@ -70,6 +73,7 @@ static const virt_tab_t process_tab[] =
|
||||||
{ "root", FH_PROCESS, virt_symlink, format_process_root },
|
{ "root", FH_PROCESS, virt_symlink, format_process_root },
|
||||||
{ "exe", FH_PROCESS, virt_symlink, format_process_exename },
|
{ "exe", FH_PROCESS, virt_symlink, format_process_exename },
|
||||||
{ "cwd", FH_PROCESS, virt_symlink, format_process_cwd },
|
{ "cwd", FH_PROCESS, virt_symlink, format_process_cwd },
|
||||||
|
{ "mounts", FH_PROCESS, virt_file, format_process_mounts },
|
||||||
{ NULL, 0, virt_none, NULL }
|
{ NULL, 0, virt_none, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -876,6 +880,68 @@ format_process_statm (void *data, char *&destbuf)
|
||||||
vmsize, vmrss, vmshare, vmtext, vmlib, vmdata, 0);
|
vmsize, vmrss, vmshare, vmtext, vmlib, vmdata, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
FILE *setmntent (const char *, const char *);
|
||||||
|
struct mntent *getmntent (FILE *);
|
||||||
|
};
|
||||||
|
|
||||||
|
static _off64_t
|
||||||
|
format_process_mounts (void *data, char *&destbuf)
|
||||||
|
{
|
||||||
|
_pinfo *p = (_pinfo *) data;
|
||||||
|
user_info *u_shared = NULL;
|
||||||
|
HANDLE u_hdl = NULL;
|
||||||
|
_off64_t len = 0;
|
||||||
|
struct mntent *mnt;
|
||||||
|
|
||||||
|
if (p->pid != myself->pid)
|
||||||
|
{
|
||||||
|
WCHAR sid_string[UNLEN + 1] = L""; /* Large enough for SID */
|
||||||
|
shared_locations sl = SH_JUSTOPEN;
|
||||||
|
|
||||||
|
cygsid p_sid;
|
||||||
|
|
||||||
|
if (!p_sid.getfrompw (internal_getpwuid (p->uid)))
|
||||||
|
return 0;
|
||||||
|
p_sid.string (sid_string);
|
||||||
|
u_shared = (user_info *) open_shared (sid_string, USER_VERSION, u_hdl,
|
||||||
|
sizeof (user_info), sl,
|
||||||
|
&sec_none_nih);
|
||||||
|
if (!u_shared)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
u_shared = user_shared;
|
||||||
|
|
||||||
|
/* Store old value of _my_tls.locals here. */
|
||||||
|
int iteration = _my_tls.locals.iteration;
|
||||||
|
unsigned available_drives = _my_tls.locals.available_drives;
|
||||||
|
/* This reinitializes the above values in _my_tls. */
|
||||||
|
setmntent (NULL, NULL);
|
||||||
|
while ((mnt = getmntent (NULL)))
|
||||||
|
{
|
||||||
|
destbuf = (char *) crealloc_abort (destbuf, len
|
||||||
|
+ strlen (mnt->mnt_fsname)
|
||||||
|
+ strlen (mnt->mnt_dir)
|
||||||
|
+ strlen (mnt->mnt_type)
|
||||||
|
+ strlen (mnt->mnt_opts)
|
||||||
|
+ 28);
|
||||||
|
len += __small_sprintf (destbuf + len, "%s %s %s %s %d %d\n",
|
||||||
|
mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type,
|
||||||
|
mnt->mnt_opts, mnt->mnt_freq, mnt->mnt_passno);
|
||||||
|
}
|
||||||
|
/* Restore old value of _my_tls.locals here. */
|
||||||
|
_my_tls.locals.iteration = iteration;
|
||||||
|
_my_tls.locals.available_drives = available_drives;
|
||||||
|
|
||||||
|
if (u_hdl) /* Only not-NULL if open_shared has been called. */
|
||||||
|
{
|
||||||
|
UnmapViewOfFile (u_shared);
|
||||||
|
CloseHandle (u_hdl);
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
get_process_state (DWORD dwProcessId)
|
get_process_state (DWORD dwProcessId)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue