* 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:
Corinna Vinschen 2009-02-04 16:40:04 +00:00
parent 29e22d07d6
commit 8c71dc5878
3 changed files with 82 additions and 0 deletions

View File

@ -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>
* security.cc (alloc_sd): Disable generating default permission entries

View File

@ -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_partitions (void *, char *&);
static _off64_t format_proc_self (void *, char *&);
static _off64_t format_proc_mounts (void *, char *&);
/* names of objects in /proc */
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 },
{ "partitions", FH_PROC, virt_file, format_proc_partitions },
{ "self", FH_PROC, virt_symlink, format_proc_self },
{ "mounts", FH_PROC, virt_symlink, format_proc_mounts },
{ "registry32", FH_REGISTRY, virt_directory, NULL },
{ "registry64", FH_REGISTRY, 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 ());
}
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

View File

@ -10,6 +10,7 @@ details. */
#include "winsup.h"
#include <stdlib.h>
#include <stdio.h>
#include <sys/cygwin.h>
#include "cygerrno.h"
#include "security.h"
@ -22,6 +23,7 @@ details. */
#include "cygheap.h"
#include "ntdll.h"
#include "cygtls.h"
#include "pwdgrp.h"
#include "tls_pbuf.h"
#include <sys/param.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_ctty (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[] =
{
@ -70,6 +73,7 @@ static const virt_tab_t process_tab[] =
{ "root", FH_PROCESS, virt_symlink, format_process_root },
{ "exe", FH_PROCESS, virt_symlink, format_process_exename },
{ "cwd", FH_PROCESS, virt_symlink, format_process_cwd },
{ "mounts", FH_PROCESS, virt_file, format_process_mounts },
{ NULL, 0, virt_none, NULL }
};
@ -876,6 +880,68 @@ format_process_statm (void *data, char *&destbuf)
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
get_process_state (DWORD dwProcessId)
{