#include <sys/unix.h>
#include "ps.h"

extern int ERRNO;

char *statlet = "?RrsSPFWZ";

main( argc, argv )
int	argc;
char	*argv[];
{
	int	devmem;
	int	*ptrs[8];
	p_tab	*prcs, proc;
	u_data	*usrs,user;
	int	i, j;
	char	longname[9];

	if( ((devmem=open("/dev/mem",O_RDONLY))<0) || ERRNO )
	{
		fprintf(stderr,"%s: couldn't open /dev/mem\n",argv[0]);
		return(0);
	}

	read( devmem, ptrs, 8*sizeof(void*) );

	prcs = (p_tab*)ptrs[OFF_PTAB];
	usrs = (u_data*)ptrs[OFF_USERS];

	/* Print a little header */
	fprintf(stdout,"pid\tSIW name     owner\n");

	/* Read each user structure */
	for( i=0; i<PTABSIZE; i++ )
	{
		/* Move to ptab entry structure i */
		seek( devmem, prcs+i, 0 );
		read( devmem, &proc, sizeof(p_tab) );

		/* Is this an active process? */
		if( proc.p_status == P_EMPTY )
			continue;

		/* Read the corrosponding user entry */
		seek( devmem, usrs+i, 0 );
		read( devmem, &user, sizeof(u_data) );

		/* If this process is the current process */
		if( ptrs[OFF_YOU]==(int*)(prcs+i) )
		{
			seek( devmem, ptrs[OFF_UDATA], 0 );
			read( devmem, &user, sizeof(u_data) );
		}

		strcpy( longname, "        " );
		strcpy( longname, user.u_name );
		for(j=0;j<8;j++)
			if(longname[j]==0)
				longname[j]=32;

		fprintf( stdout, "%i\t%c%c%c %s %i\n", proc.p_pid,
		         statlet[proc.p_status], user.u_insys?'*':'-', 
			 (ptrs[3]==(int*)user.u_ptab)?'*':'-',
			 longname, proc.p_uid );
	}

	return(0);
}

