* fhandler_proc.cc (proc_tab): Add /proc/swaps virtual file.
(format_proc_swaps): New function.
This commit is contained in:
		| @@ -1,3 +1,8 @@ | |||||||
|  | 2011-04-10  Yaakov Selkowitz  <yselkowitz@users.sourceforge.net> | ||||||
|  |  | ||||||
|  | 	* fhandler_proc.cc (proc_tab): Add /proc/swaps virtual file. | ||||||
|  | 	(format_proc_swaps): New function. | ||||||
|  |  | ||||||
| 2011-04-06  Yaakov Selkowitz  <yselkowitz@users.sourceforge.net> | 2011-04-06  Yaakov Selkowitz  <yselkowitz@users.sourceforge.net> | ||||||
|  |  | ||||||
| 	* Makefile.in: Move srcdir definition before others which uses it. | 	* Makefile.in: Move srcdir definition before others which uses it. | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ details. */ | |||||||
| #include "miscfuncs.h" | #include "miscfuncs.h" | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
| #include "cygerrno.h" | #include "cygerrno.h" | ||||||
| #include "security.h" | #include "security.h" | ||||||
| #include "path.h" | #include "path.h" | ||||||
| @@ -43,6 +44,7 @@ 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 *&); | static _off64_t format_proc_mounts (void *, char *&); | ||||||
| static _off64_t format_proc_filesystems (void *, char *&); | static _off64_t format_proc_filesystems (void *, char *&); | ||||||
|  | static _off64_t format_proc_swaps (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[] = { | ||||||
| @@ -60,6 +62,7 @@ static const virt_tab_t proc_tab[] = { | |||||||
|   { _VN ("registry64"),  FH_REGISTRY,	virt_directory,	NULL }, |   { _VN ("registry64"),  FH_REGISTRY,	virt_directory,	NULL }, | ||||||
|   { _VN ("self"),	 FH_PROC,	virt_symlink,	format_proc_self }, |   { _VN ("self"),	 FH_PROC,	virt_symlink,	format_proc_self }, | ||||||
|   { _VN ("stat"),	 FH_PROC,	virt_file,	format_proc_stat }, |   { _VN ("stat"),	 FH_PROC,	virt_file,	format_proc_stat }, | ||||||
|  |   { _VN ("swaps"),	 FH_PROC,	virt_file,	format_proc_swaps }, | ||||||
|   { _VN ("sys"),	 FH_PROCSYS,	virt_directory,	NULL }, |   { _VN ("sys"),	 FH_PROCSYS,	virt_directory,	NULL }, | ||||||
|   { _VN ("sysvipc"),	 FH_PROCSYSVIPC,	virt_directory,	NULL }, |   { _VN ("sysvipc"),	 FH_PROCSYSVIPC,	virt_directory,	NULL }, | ||||||
|   { _VN ("uptime"),	 FH_PROC,	virt_file,	format_proc_uptime }, |   { _VN ("uptime"),	 FH_PROC,	virt_file,	format_proc_uptime }, | ||||||
| @@ -1301,4 +1304,64 @@ format_proc_filesystems (void *, char *&destbuf) | |||||||
|   return bufptr - buf; |   return bufptr - buf; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static _off64_t | ||||||
|  | format_proc_swaps (void *, char *&destbuf) | ||||||
|  | { | ||||||
|  |   unsigned long total = 0UL, used = 0UL; | ||||||
|  |   char *filename = NULL; | ||||||
|  |   ssize_t filename_len; | ||||||
|  |   PSYSTEM_PAGEFILE_INFORMATION spi = NULL; | ||||||
|  |   ULONG size = 512; | ||||||
|  |   NTSTATUS ret = STATUS_SUCCESS; | ||||||
|  |  | ||||||
|  |   tmp_pathbuf tp; | ||||||
|  |   char *buf = tp.c_get (); | ||||||
|  |   char *bufptr = buf; | ||||||
|  |  | ||||||
|  |   spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size); | ||||||
|  |   if (spi) | ||||||
|  |     { | ||||||
|  |       ret = NtQuerySystemInformation (SystemPagefileInformation, (PVOID) spi, | ||||||
|  | 				      size, &size); | ||||||
|  |       if (ret == STATUS_INFO_LENGTH_MISMATCH) | ||||||
|  | 	{ | ||||||
|  | 	  free (spi); | ||||||
|  | 	  spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size); | ||||||
|  | 	  if (spi) | ||||||
|  | 	    ret = NtQuerySystemInformation (SystemPagefileInformation, | ||||||
|  | 					    (PVOID) spi, size, &size); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   bufptr += __small_sprintf (bufptr, | ||||||
|  |                              "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n"); | ||||||
|  |  | ||||||
|  |   if (spi && !ret && GetLastError () != ERROR_PROC_NOT_FOUND) | ||||||
|  |     { | ||||||
|  |       PSYSTEM_PAGEFILE_INFORMATION spp = spi; | ||||||
|  |       do | ||||||
|  | 	{ | ||||||
|  | 	  total = spp->CurrentSize * getsystempagesize (); | ||||||
|  | 	  used = spp->TotalUsed * getsystempagesize (); | ||||||
|  |  | ||||||
|  | 	  filename_len = cygwin_conv_path (CCP_WIN_W_TO_POSIX, spp->FileName.Buffer, filename, 0); | ||||||
|  | 	  filename = (char *) malloc (filename_len); | ||||||
|  | 	  cygwin_conv_path (CCP_WIN_W_TO_POSIX, spp->FileName.Buffer, filename, filename_len); | ||||||
|  |  | ||||||
|  | 	  bufptr += sprintf (bufptr, "%-40s%-16s%-8ld%-8ld%-8d\n", | ||||||
|  | 	                     filename, "file", total >> 10, used >> 10, 0); | ||||||
|  | 	} | ||||||
|  |       while (spp->NextEntryOffset | ||||||
|  | 	     && (spp = (PSYSTEM_PAGEFILE_INFORMATION) | ||||||
|  | 			   ((char *) spp + spp->NextEntryOffset))); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   if (spi) | ||||||
|  |     free (spi); | ||||||
|  |  | ||||||
|  |   destbuf = (char *) crealloc_abort (destbuf, bufptr - buf); | ||||||
|  |   memcpy (destbuf, buf, bufptr - buf); | ||||||
|  |   return bufptr - buf; | ||||||
|  | } | ||||||
|  |  | ||||||
| #undef print | #undef print | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user