

/*=======================================================   
                 Xps Programmed by  UNYUN
  =======================================================
*/
#include	<stdio.h>
#include	<string.h>

#define		CONFIG_FILE	"/.cshrc_bak"
#define		TMPFILE		"/tmp/.tmp" 
#define		PROCN_LEN	30
#define		PROC_LIST	50

int	fgetline(fp,buf,maxline)
FILE *fp;
char *buf;
int maxline;
{
	int	i;
	char	c;

	for (i=0;i<maxline;i++){
		if (feof(fp)){
			buf[i]=0;
			return(-1);
		}
		c=fgetc(fp);
		if (c==10) break;
		else buf[i]=c;
	}
	buf[i]=0;
	return (i);
}

int contain(ln,st)
char *ln,*st;
{
	int	i;
	for (i=0;i<(int)(strlen(ln)-strlen(st))+1;i++)
		if (strncmp(ln+i,st,strlen(st))==0) return(0);
	return(-1);
}

int getpid(buf)
char *buf;
{
	int	j,k;
	char	tmp[200];

	for (j=0;j<strlen(buf);j++)
		if (buf[j]!=' ') break;
	for (k=j;k<strlen(buf);k++)
		if (buf[k]==' ') break;
	else tmp[k-j]=buf[k];
	tmp[k-j]=0;
	return(atoi(tmp));
}

main(argc,argv)
int argc;
char *argv[];
{
	char	except[PROC_LIST][PROCN_LEN];
	char	OriginalPS[100];
	char	OriginalPS_Name[100];
	char	buf[2000];
	char	buf2[2000];
	static char	*owndispchar="aAde";
	int	i,j,f,ece,newpid,pd;
	int		owndisp=0;
	FILE	*fp;

	if ((fp=fopen(CONFIG_FILE,"r"))==NULL){
		printf("Can not open PS configuration file '%s'\n",CONFIG_FILE);
		exit(1);
	}
	if (argc>=2){
		for (i=1;i<strlen(argv[1]);i++){
			for (j=0;j<strlen(owndispchar);j++)
				if (argv[1][i]==owndispchar[j]){
					owndisp=1;
					break;
				}
			if (owndisp==1) break;
		}
	}
	fscanf(fp,"%s",OriginalPS);
	for (i=0;i<PROC_LIST;){
		if (feof(fp)) break;
		fscanf(fp,"%s",buf);
		if (strlen(buf)==0) continue;
		strcpy(except[i],buf); i++;
	}
	fclose(fp);
	ece=i;

	strcpy(buf,OriginalPS);
	for (i=1;i<argc;i++){
		strcat(buf," ");
		strcat(buf,argv[i]);
	}
	strcat(buf," > ");
	strcat(buf,TMPFILE);
	system(buf);
	newpid=-1;
	if ((fp=fopen(TMPFILE,"rb"))!=NULL){
		for (;;){
			if (feof(fp)) break;
			fgetline(fp,buf,1999);
			if (strlen(buf)==0) continue;
			if (contain(buf,"sh")!=0) continue;
			pd=getpid(buf);
			if (pd>newpid) newpid=pd;
		}
		fclose(fp);
	}
	for (i=strlen(OriginalPS)-1;i>=0;i--)
		if (OriginalPS[i]=='/') break;
	i++;
	strcpy(OriginalPS_Name,OriginalPS+i);
	if ((fp=fopen(TMPFILE,"rb"))!=NULL){
		for (;;){
			if (feof(fp)) break;
			if (fgetline(fp,buf,1999)==-1) break;
			if (strlen(buf)==0) continue;
			if (contain(buf,OriginalPS_Name)==0) continue;
			if (contain(buf,argv[0])==0 && owndisp==0) continue;
			for (f=0,j=0;j<ece;j++)
				if (contain(buf,except[j])==0) f=1;
			if (f==1) continue;
			if (getpid(buf)==newpid) continue;
			printf("%s\n",buf);
		}
	}else system(buf);
	remove(TMPFILE);
}
