minix/servers/is/dmp_rs.c
David van Moolenbroek 6f374faca5 Add "expected size" parameter to getsysinfo()
This patch provides basic protection against damage resulting from
differently compiled servers blindly copying tables to one another.
In every getsysinfo() call, the caller is provided with the expected
size of the requested data structure. The callee fails the call if
the expected size does not match the data structure's actual size.
2011-12-11 22:34:14 +01:00

73 lines
2 KiB
C

/* This file contains procedures to dump RS data structures.
*
* The entry points into this file are
* rproc_dump: display RS system process table
*
* Created:
* Oct 03, 2005: by Jorrit N. Herder
*/
#include "inc.h"
#include <timers.h>
#include <minix/rs.h>
#include "kernel/priv.h"
#include "../rs/const.h"
#include "../rs/type.h"
PUBLIC struct rprocpub rprocpub[NR_SYS_PROCS];
PUBLIC struct rproc rproc[NR_SYS_PROCS];
FORWARD _PROTOTYPE( char *s_flags_str, (int flags, int sys_flags) );
/*===========================================================================*
* rproc_dmp *
*===========================================================================*/
PUBLIC void rproc_dmp()
{
struct rproc *rp;
struct rprocpub *rpub;
int i, n=0;
static int prev_i=0;
if (getsysinfo(RS_PROC_NR, SI_PROCPUB_TAB, rprocpub, sizeof(rprocpub)) != OK
|| getsysinfo(RS_PROC_NR, SI_PROC_TAB, rproc, sizeof(rproc)) != OK) {
printf("Error obtaining table from RS. Perhaps recompile IS?\n");
return;
}
printf("Reincarnation Server (RS) system process table dump\n");
printf("----label---- endpoint- -pid- flags- -dev- -T- alive_tm starts command\n");
for (i=prev_i; i<NR_SYS_PROCS; i++) {
rp = &rproc[i];
rpub = &rprocpub[i];
if (! (rp->r_flags & RS_IN_USE)) continue;
if (++n > 22) break;
printf("%13s %9d %5d %6s %3d/%1d %3ld %8ld %5dx %s",
rpub->label, rpub->endpoint, rp->r_pid,
s_flags_str(rp->r_flags, rpub->sys_flags), rpub->dev_nr,
rpub->dev_style, rp->r_period, rp->r_alive_tm, rp->r_restarts,
rp->r_args
);
printf("\n");
}
if (i >= NR_SYS_PROCS) i = 0;
else printf("--more--\r");
prev_i = i;
}
PRIVATE char *s_flags_str(int flags, int sys_flags)
{
static char str[10];
str[0] = (flags & RS_ACTIVE) ? 'A' : '-';
str[1] = (flags & RS_UPDATING) ? 'U' : '-';
str[2] = (flags & RS_EXITING) ? 'E' : '-';
str[3] = (flags & RS_NOPINGREPLY) ? 'N' : '-';
str[4] = (sys_flags & SF_USE_COPY) ? 'C' : '-';
str[5] = (sys_flags & SF_USE_REPL) ? 'R' : '-';
str[6] = '\0';
return(str);
}