home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <a.out.h>
- #include <param.h>
- #include <proc.h>
- #include <sys/stat.h>
- struct stat xstat;
- struct proc mproc[NPROC];
- struct nlist nl[]
- { { "_proc"},
- { ""},
- };
- int err;
- main(argc,argv) char **argv;
- { int i,j;
- if(argc<=1) exit(0);
- for(i=1;i<argc;i++)
- { if((j=isalock(argv[i]))>0)
- if(isapid(j))
- { fprintf(stderr,"recovery: %s in use\n",argv[i]);
- err=1;
- }
- else unlink(argv[i]);
- else fprintf(stderr,"reocvery: %s not a lock\n",argv[i]);
- }
- exit(err);
- }
- isalock(s) char *s;
- { int pid,fd;
- if(stat(s,&xstat)<0) return(0);
- if(xstat.st_size!=2) return(0);
- fd=open(s,0);
- if(fd<0) return(-1);
- read(fd,&pid,2);
- close(fd);
- return(pid);
- }
- int gotpids,pids[NPROC];
- isapid(n)
- { int i;
- if(gotpids==0) getpids();
- for(i=0;i<NPROC;i++)
- if(n==pids[i]) return(1);
- return(0);
- }
- getpids()
- { int i,mem;
- nlist("/unix",nl);
- if(nl[0].n_type==0)
- { fprintf(stderr,"no namelist, no lock recovery\n");
- exit(1);
- }
- mem=open("/dev/mem",0);
- lseek(mem,(long)nl[0].n_value,0);
- read(mem,mproc,sizeof(mproc));
- if(mproc[0].p_pid != 0)
- { fprintf(stderr,"/unix not loaded, no lock recovery\n");
- exit(1);
- }
- for(i=0;i<NPROC;i++)
- { if(mproc[i].p_stat==0 ||
- mproc[i].p_stat==SZOMB)
- pids[i]=0;
- else pids[i]=mproc[i].p_pid;
- }
- gotpids=1;
- }
- unlock(s) char *s;
- {
- unlink(s);
- }
-