main() { int n; loop0: stat(dot, &x); if((file = open(dotdot,0)) < 0) prname(); loop1: if((n = read(file,&y,16)) < 16) prname(); if(y.jnum != x.inum)goto loop1; close(file); if(y.jnum == 1) ckroot(); cat(); chdir(dotdot); goto loop0; }
cat() { int i, j; i = -1; while(y.name[++i] != 0); if((off+i+2) > 511) prname(); for(j=off+1; j>=0; --j) name[j+i+1] = name[j]; off=i+off+1; name[i] = root[0]; for(--i; i>=0; --i) name[i] = y.name[i]; }
/* get the current working directory (the following 3 routines are from pwd.c) */ void pwd(void) { for(off = 0;;) { if(stat(dot, &d) < 0) { fprintf(stderr, "pwd: cannot stat .!\n"); exit(2); } if ((file = opendir(dotdot)) == NULL) { fprintf(stderr,"pwd: cannot open ..\n"); exit(2); } if(fstat(file->dd_fd, &dd) < 0) { fprintf(stderr, "pwd: cannot stat ..!\n"); exit(2); } if(chdir(dotdot) < 0) { fprintf(stderr, "pwd: cannot chdir to ..\n"); exit(2); } if(d.st_dev == dd.st_dev) { if(d.st_ino == dd.st_ino) { prname(); chdir(directory); return; } do if ((dir = readdir(file)) == NULL) { fprintf(stderr, "pwd: read error in ..\n"); exit(2); } while (dir->d_ino != d.st_ino); } else do { if((dir = readdir(file)) == NULL) { fprintf(stderr, "pwd: read error in ..\n"); exit(2); } stat(dir->d_name, &dd); } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev); (void)closedir(file); if (cat()) { chdir(directory); return; } } }
int cat(void) { register i, j; char *name = directory + 1; /* I love C */ i = -1; while (dir->d_name[++i] != 0) if ((off+i+2) > MAXNAMLEN - 1) { prname(); return 1; } for(j=off+1; j>=0; --j) name[j+i+1] = name[j]; off=i+off+1; name[i] = '/'; for(--i; i>=0; --i) name[i] = dir->d_name[i]; return 0; }
PUBLIC void map_dmp() { register struct proc *rp; vir_clicks base, limit, first, last; phys_bytes ltmp; printf("\r\nPROC --TEXT--- --DATA--- --STACK-- SHADOW FLIP P BASE SIZE\r\n"); for (rp = &proc[NR_TASKS]; rp < &proc[NR_TASKS+NR_PROCS]; rp++) { if (rp->p_flags & P_SLOT_FREE) continue; first = rp->p_map[T].mem_phys; last = rp->p_map[S].mem_phys + rp->p_map[S].mem_len; ltmp = ((long) first << CLICK_SHIFT) + 512L; base = (vir_clicks) (ltmp/1024L); ltmp = (((long) (last-first) << CLICK_SHIFT) + 512L); limit = (vir_clicks) (ltmp/1024L); prname((int)(rp-proc)); printf(" %4x %4x %4x %4x %4x %4x %4x %4d %d %4dK %5dK\r\n", rp->p_map[T].mem_phys, rp->p_map[T].mem_len, rp->p_map[D].mem_phys, rp->p_map[D].mem_len, rp->p_map[S].mem_phys, rp->p_map[S].mem_len, rp->p_shadow, rp->p_nflips, rp->p_physio, base, limit); } }
ckroot() { int i, n; if((n = stat(y.name,&x)) < 0) prname(); i = x.devn; if((n = chdir(root)) < 0) prname(); if((file = open(root,0)) < 0) prname(); loop: if((n = read(file,&y,16)) < 16) prname(); if(y.jnum == 0) goto loop; if((n = stat(y.name,&x)) < 0) prname(); if(x.devn != i) goto loop; x.i[0] =& 060000; if(x.i[0] != 040000) goto loop; if(y.name[0]=='.')if(((y.name[1]=='.') && (y.name[2]==0)) || (y.name[1] == 0)) goto pr; cat(); pr: write(1,root,1); prname(); }
/*===========================================================================* * DEBUG routines here * *===========================================================================*/ PUBLIC void p_dmp() { /* Proc table dump */ register struct proc *rp; char *np; vir_clicks base, limit, first, last; phys_bytes ltmp, dst; int index; int i; char *cp; printf( "\r\nproc pid pc sp splow flag user sys base limit recv command\r\n"); dst = umap(proc_addr(SYSTASK), D, (vir_bytes)nbuff, (vir_bytes)NSIZE); for (rp = &proc[0]; rp < &proc[NR_PROCS+NR_TASKS]; rp++) { if (rp->p_flags & P_SLOT_FREE) continue; first = rp->p_map[T].mem_phys; last = rp->p_map[S].mem_phys + rp->p_map[S].mem_len; ltmp = ((long) first << CLICK_SHIFT) + 512L; base = (vir_clicks) (ltmp/1024L); ltmp = (((long) last << CLICK_SHIFT) + 512L); limit = (vir_clicks) (ltmp/1024L); prname((int)(rp - proc)); printf("%4d %6X %6X %6X %6x %4D %6D %4dK %4dK ", rp->p_pid, (long)rp->p_reg.pc, (long)rp->p_reg.sp, (long)rp->p_splow, rp->p_flags, rp->user_time, rp->sys_time, base, limit); if (rp->p_flags == 0) printf(" "); else prname(NR_TASKS + rp->p_getfrom); /* Fetch the command string from the user process. */ index = (int)(rp - proc) - NR_TASKS; if (index > LOW_USER && aout[index] != 0) { phys_copy(aout[index], dst, (long) NSIZE); nbuff[NSIZE] = 0; for (np = &nbuff[0]; np < &nbuff[NSIZE]; np++) if (*np <= ' ' || *np >= 0177) *np = 0; if (index == LOW_USER + 1) cp = "/bin/sh"; else cp = nbuff; for(i=0;i<100;i++) if(cp[i] == '\0') break; if(i > 6) printf("\r\n\t"); printf("%s", cp); } printf("\r\n"); } #ifdef NEEDED printf("\r\nproc callq sendlk mesbuf from nready pend blkd held alarm\r\n"); for (rp = &proc[0]; rp < &proc[NR_PROCS+NR_TASKS]; rp++) { if (rp->p_flags & P_SLOT_FREE) continue; prname((int)(rp - proc)); printf(" %6X %6X %6X %4d %6X %4d %4d %4d %X\r\n", rp->p_callerq, rp->p_sendlink, rp->p_messbuf, rp->p_getfrom, rp->p_nextready, rp->p_pending, rp->p_int_blocked, rp->p_int_held, rp->p_alarm ); } for (index = 0; index < NQ; index++) { printf("q=%d: ", index); for (rp = rdy_head[index]; rp != NIL_PROC; rp = rp->p_nextready) printf(" %d", (int)(rp-proc)); printf("\r\n"); } printf("held_head = 0x%X\r\n", held_head); #endif NEEDED printf("\r\n"); }