Add original unix v6

This commit is contained in:
memnoth
2018-01-27 22:35:41 +09:00
commit 2c7099ee50
664 changed files with 106254 additions and 0 deletions
+281
View File
@@ -0,0 +1,281 @@
#
/* mail command usage
mail
prints your mail
mail people
sends standard input to people
*/
#define SIGINT 2
struct utmp {
char name[8];
char tty;
char pad1;
int ltime[2];
int pad2;
};
struct passwd {
char *pw_name;
char *pw_passwd;
int pw_uid;
int pw_gid;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
char lettmp[] "/tmp/maxxxxx";
char preptmp[] "/tmp/mbxxxxx";
int pwfil;
main(argc, argv)
char **argv;
{
register me;
extern fout;
register struct passwd *p;
register char *cp;
static struct utmp ubuf;
int uf;
maketemp();
if (argc==1 || argc==2 && argv[1][0]=='-') {
printmail(argc, argv);
delexit();
}
signal(SIGINT, delexit);
fout = creat(lettmp, 0600);
if (((me=ttyn(1))!='x' || (me=ttyn(2))!='x')
&& (uf = open("/etc/utmp", 0)) > 0) {
while (read(uf, &ubuf, sizeof ubuf) == sizeof ubuf)
if (ubuf.tty == me) {
ubuf.name[8] = ' ';
close(uf);
for (cp=ubuf.name; *cp++!=' ';);
*--cp = 0;
bulkmail(argc, argv, ubuf.name);
}
}
me = getuid() & 0377;
setpw();
for (;;)
if ((p = getpwent()) && p->pw_uid == me)
bulkmail(argc, argv, p->pw_name);
fout = 1;
printf("Who are you?\n");
delexit();
}
printmail(argc, argv)
char **argv;
{
extern fin, fout;
register n, c, f;
if (fopen(".mail", &fin)>=0 && (c = getchar())) {
do {
putchar(c);
} while (c = getchar());
close(fin);
c = 'y';
if (argc<2) {
if (ttyn(0)!='x') {
printf("Save?");
fin = 0;
c = getchar();
}
} else
c = argv[1][1];
if (c=='y') {
prepend(".mail", "mbox");
printf("Saved mail in 'mbox'\n");
}
close(creat(".mail"));
} else
printf("No mail.\n");
}
bulkmail(argc, argv, from)
char **argv, *from;
{
extern fin, fout;
int tbuf[2];
register c;
fin = 0;
(&fin)[1] = 0;
time(tbuf);
printf("From %s %s", from, ctime(tbuf));
while (c = getchar())
putchar(c);
putchar('\n');
flush();
close(fout);
while (--argc > 0)
sendto(*++argv);
delexit();
}
sendto(person)
char *person;
{
static saved;
extern fout;
extern fin;
register struct passwd *p;
setpw();
while (p = getpwent()) {
if (equal(p->pw_name, person)) {
if (prepend(lettmp, cat(p->pw_dir, "/.mail"))==0)
break;
return;
}
}
fout = 1;
flush();
printf("Can't send to %s.\n", person);
if (ttyn(0)!='x' && saved==0) {
unlink("dead.letter");
saved++;
printf("Letter saved in 'dead.letter'\n");
prepend(lettmp, "dead.letter");
}
}
prepend(from, to)
char *from, *to;
{
extern int fin, fout;
fcreat(preptmp, &fout);
fopen(from, &fin);
while (putchar(getchar()));
close(fin);
fopen(to, &fin);
while (putchar(getchar()));
close(fin);
flush();
close(fout);
if (fcreat(to, &fout) < 0) {
fout = 1;
return(0);
}
fopen(preptmp, &fin);
while(putchar(getchar()));
flush();
close(fout);
close(fin);
fout = 1;
return(1);
}
setpw()
{
extern fin;
if (pwfil == 0) {
fopen("/etc/passwd", &fin);
pwfil = fin;
} else
fin = pwfil;
(&fin)[1] = 0;
seek(fin, 0, 0);
}
getpwent()
{
register char *p;
register c;
static struct passwd passwd;
static char line[100];
extern fin;
p = line;
while((c=getchar()) != '\n') {
if(c <= 0)
return(0);
if(p < line+98)
*p++ = c;
}
*p = 0;
p = line;
passwd.pw_name = p;
p = pwskip(p);
passwd.pw_passwd = p;
p = pwskip(p);
passwd.pw_uid = atoi(p);
p = pwskip(p);
passwd.pw_gid = atoi(p);
p = pwskip(p);
passwd.pw_gecos = p;
p = pwskip(p);
passwd.pw_dir = p;
p = pwskip(p);
passwd.pw_shell = p;
return(&passwd);
}
pwskip(ap)
char *ap;
{
register char *p;
p = ap;
while(*p != ':') {
if(*p == 0)
return(p);
p++;
}
*p++ = 0;
return(p);
}
delexit()
{
unlink(lettmp);
unlink(preptmp);
exit(0);
}
maketemp()
{
int i, pid, d;
pid = getpid();
for (i=11; i>=7; --i) {
d = (pid&07) + '0';
lettmp[i] = d;
preptmp[i] = d;
pid =>> 3;
}
}
equal(as1, as2)
{
register char *s1, *s2;
s1 = as1;
s2 = as2;
while (*s1++ == *s2)
if (*s2++ == 0)
return(1);
return(0);
}
cat(ap1, ap2)
char *ap1, *ap2;
{
register char *p1, *p2;
static char fn[32];
p1 = ap1;
p2 = fn;
while (*p2++ = *p1++);
p2--;
p1 = ap2;
while (*p2++ = *p1++);
return(fn);
}
+49
View File
@@ -0,0 +1,49 @@
/*
* mesg -- set current tty to accept or
* forbid write permission.
*
* mesg [y] [n]
* y allow messages
* n forbid messages
*/
int sbuf[40];
main(argc, argv)
char *argv[];
{
register char *tty;
tty = "/dev/ttyx";
tty[8] = ttyn(1);
if(stat(tty, sbuf) < 0) {
write(2, "cannot stat\n", 12);
exit(1);
}
if(argc < 2) {
if(sbuf[2] & 02)
goto no;
goto yes;
}
if(*argv[1] == 'y')
goto yes;
no:
if(chmod(tty, 0600) < 0)
goto bad;
goto was;
yes:
if(chmod(tty, 0622) < 0)
goto bad;
was:
if(sbuf[2] & 02)
write(2, "was y\n", 6); else
write(2, "was n\n", 6);
exit(0);
bad:
write(2, "cannot change mode\n", 19);
exit(1);
}
+91
View File
@@ -0,0 +1,91 @@
/ makdir -- make a directory
sys getuid
mov r0,uid
mov sp,r5
tst (r5)+
loop:
tst (r5)+
dec (sp)
bgt 1f
sys exit
1:
mov (r5),r0
mov $buf1,r1
mov $buf2,r2
clr r3
1:
movb (r0)+,r4
beq 2f
movb r4,(r1)+
movb r4,(r2)+
cmpb r4,$'/
bne 1b
mov r2,r3
br 1b
2:
movb $'/,(r1)+
movb $'.,(r1)+
clrb (r1)
mov $dot,dir
tst r3
beq 1f
mov $buf2,dir
clrb (r3)
cmp r3,$buf2+1
beq 1f
clrb -(r3) / ???
1:
tstb uid
beq 2f
sys stat; dir:..; stbuf / status of parent dir
bes error
mov stbuf+4,r0
cmpb uid,stbuf+7
bne 1f
ash $-6,r0
1:
ror r0
ror r0
bcc error / no write permission in parent
2:
mov (r5),0f
sys makdir; 0:..; 140777; 0
bes error / prob already exists
mov (r5),0f
sys chown; 0:..; uid:..
mov (r5),0f
sys link; 0:..; buf1
bes error
movb $'.,(r1)+
clrb (r1)
mov dir,0f
sys link; 0:..; buf1
bec loop
error:
mov (r5),r0
mov r0,0f
clr 0f+2
1:
tstb (r0)+
beq 1f
inc 0f+2
br 1b
1:
mov $1,r0
sys write; 0:..; ..
mov $1,r0
sys write; ques; 3
br loop
dot: <.\0>
ques: < ?\n>
.even
.bss
buf1: .=.+100.
buf2: .=.+100.
stbuf: .=.+40.
+504
View File
@@ -0,0 +1,504 @@
#
struct
{
char *s_isize;
char *s_fsize;
int s_nfree;
int s_free[100];
int s_ninode;
int s_inode[100];
char s_flock;
char s_ilock;
char s_fmod;
int s_time[2];
} filsys;
struct inode
{
int i_number;
int i_mode;
char i_nlink;
char i_uid;
char i_gid;
char i_size0;
char *i_size1;
int i_addr[8];
int i_time[4];
};
/* modes */
#define IALLOC 0100000
#define IFMT 060000
#define IFDIR 040000
#define IFCHR 020000
#define IFBLK 060000
#define ILARG 010000
#define ISUID 04000
#define ISGID 02000
#define IREAD 0400
#define IWRITE 0200
#define IEXEC 0100
int utime[2];
int fin;
int fsi;
int fso;
char *charp;
int buf[256];
char string[50];
char *fsys;
char *proto;
int f_n 1;
int f_m 1;
main(argc, argv)
char **argv;
{
int f, n;
/*
* open relevent files
*/
time(utime);
if(argc != 3) {
printf("arg count\n");
exit();
}
fsys = argv[1];
for(n=0; f=fsys[n+1]; n++)
if(fsys[n] == 'r') {
if(f == 'k') {
f_n = 24;
f_m = 3;
}
if(f == 'p') {
f_n = 10;
f_m = 4;
}
}
proto = argv[2];
fso = creat(fsys, 0666);
if(fso < 0) {
printf("%s: cannot create\n", fsys);
exit();
}
fsi = open(fsys, 0);
if(fsi < 0) {
printf("%s: cannot open\n", fsys);
exit();
}
fin = open(proto, 0);
if(fin < 0) {
n = 0;
for(f=0; proto[f]; f++) {
if(proto[f]<'0' || proto[f]>'9') {
printf("%s: cannot open\n", proto);
exit();
}
n = n*10 + proto[f]-'0';
}
filsys.s_fsize = n;
filsys.s_isize = ldiv(0, n, 43+ldiv(0, n, 1000));
printf("isize = %d\n", filsys.s_isize);
if(f_n != 1)
printf("free list %d/%d\n", f_m, f_n);
charp = "d--777 0 0 $ ";
goto f3;
}
/*
* get name of boot load program
* and read onto block 0
*/
getstr();
f = open(string, 0);
if(f < 0) {
printf("%s: cannot open init\n", string);
goto f2;
}
read(f, buf, 020);
if(buf[0] != 0407) {
printf("%s: bad format\n", string);
goto f1;
}
n = buf[1]+buf[2];
if(n > 512) {
printf("%s: too big\n", string);
goto f1;
}
read(f, buf, n);
wtfs(0, buf);
f1:
close(f);
/*
* get total disk size
* and inode block size
*/
f2:
filsys.s_fsize = getnum();
filsys.s_isize = getnum();
f3:
if(filsys.s_isize > filsys.s_fsize ||
filsys.s_fsize-filsys.s_isize-2 < filsys.s_isize) {
printf("%l/%l: bad ratio\n", filsys.s_fsize, filsys.s_isize);
exit();
}
bflist();
/*
* initialize files
*/
for(n=0; n<256; n++)
buf[n] = 0;
for(n=0; n!=filsys.s_isize; n++)
wtfs(n+2, buf);
cfile(0);
/*
* write out super block
*/
for(n=0; n<256; n++)
buf[n] = 0;
filsys.s_time[0] = utime[0];
filsys.s_time[1] = utime[1];
wtfs(1, &filsys);
}
cfile(par)
struct inode *par;
{
struct inode in;
int db[256], ib[256];
int dbc, ibc;
static ino;
int i, f, *p1, *p2;
/*
* get mode, uid and gid
*/
getstr();
in.i_mode = IALLOC;
in.i_mode =| gmode(string[0], "bcd", IFBLK, IFCHR, IFDIR);
in.i_mode =| gmode(string[1], "u", ISUID);
in.i_mode =| gmode(string[2], "g", ISGID);
for(i=3; i<6; i++) {
if(string[i]<'0' || string[i]>'7') {
printf("%c/%s: bad digit\n", string[i], string);
exit();
}
in.i_mode =| (string[i]-'0')<<(15-3*i);
}
in.i_uid = getnum();
in.i_gid = getnum();
/*
* general initialization prior to
* switching on format
*/
ino++;
in.i_number = ino;
if(ldiv(0, ino, 16) > filsys.s_isize) {
printf("too many inodes\n");
exit();
}
in.i_nlink = 1;
in.i_size0 = 0;
in.i_size1 = 0;
for(i=0; i<8; i++)
in.i_addr[i] = 0;
for(i=0; i<256; i++) {
db[i] = 0;
ib[i] = 0;
}
if(par == 0) {
par = &in;
in.i_nlink--;
}
dbc = 0;
ibc = 0;
switch(in.i_mode&IFMT) {
case 0:
/*
* regular file
* contents is a file name
*/
getstr();
f = open(string, 0);
if(f < 0) {
printf("%s: cannot open\n", string);
break;
}
while((i=read(f, db, 512)) > 0) {
in.i_size1 =+ i;
newblk(&dbc, db, &ibc, ib);
}
close(f);
break;
case IFBLK:
case IFCHR:
/*
* special file
* content is maj/min types
*/
in.i_addr[0] = getnum()<<8;
in.i_addr[0] =| getnum();
break;
case IFDIR:
/*
* directory
* put in extra links
* call recursively until
* name of "$" found
*/
par->i_nlink++;
entry(par->i_number, "..", &dbc, db, &ibc, ib);
in.i_nlink++;
entry(in.i_number, ".", &dbc, db, &ibc, ib);
in.i_size1 = 32;
for(;;) {
getstr();
if(string[0]=='$' && string[1]=='\0')
break;
entry(ino+1, string, &dbc, db, &ibc, ib);
in.i_size1 =+ 16;
cfile(&in);
}
break;
}
if(dbc != 0)
newblk(&dbc, db, &ibc, ib);
if(ibc > 8) {
in.i_mode =| ILARG;
dbc = alloc();
wtfs(dbc, ib);
in.i_addr[0] = dbc;
} else
for(i=0; i<ibc; i++)
in.i_addr[i] = ib[i];
in.i_time[0] = in.i_time[2] = utime[0];
in.i_time[1] = in.i_time[3] = utime[1];
i = in.i_number + 31;
dbc = ldiv(0, i, 16);
p1 = &buf[lrem(0, i, 16)*16];
p2 = &in.i_mode;
rdfs(dbc, buf);
for(i=0; i<16; i++)
*p1++ = *p2++;
wtfs(dbc, buf);
}
gmode(c, s, m0, m1, m2, m3)
char c, *s;
{
int i;
for(i=0; s[i]!='\0'; i++)
if(c == s[i])
return((&m0)[i]);
if(c == '-')
return(0);
printf("%c/%s: bad mode\n", c, string);
exit();
}
getnum()
{
int n, i;
getstr();
n = 0;
i = 0;
for(i=0; string[i]!='\0'; i++) {
if(string[i]<'0' || string[i]>'9') {
printf("%s: bad number\n", string);
exit();
}
n = n*10 + string[i] - '0';
}
return(n);
}
getstr()
{
int i, c;
loop:
switch(c=getch()) {
case ' ':
case '\t':
case '\n':
goto loop;
case '\0':
printf("EOF\n");
exit();
case ':':
while(getch() != '\n');
goto loop;
}
i = 0;
do {
string[i++] = c;
c = getch();
} while(c!=' '&&c!='\t'&&c!='\n'&&c!='\0');
string[i] = '\0';
}
rdfs(bno, bf)
{
int n;
seek(fsi, bno, 3);
n = read(fsi, bf, 512);
if(n != 512) {
printf("read error: %l\n", bno);
exit();
}
}
wtfs(bno, bf)
{
int n;
seek(fso, bno, 3);
n = write(fso, bf, 512);
if(n != 512) {
printf("write error: %l\n", bno);
exit();
}
}
alloc()
{
int bno, i;
filsys.s_nfree--;
bno = filsys.s_free[filsys.s_nfree];
filsys.s_free[filsys.s_nfree] = 0;
if(bno == 0) {
printf("out of free space\n");
exit();
}
if(filsys.s_nfree <= 0) {
rdfs(bno, buf);
filsys.s_nfree = buf[0];
for(i=0; i<100; i++)
filsys.s_free[i] = buf[i+1];
}
return(bno);
}
free(bno)
{
int i;
if(filsys.s_nfree >= 100) {
buf[0] = filsys.s_nfree;
for(i=0; i<100; i++)
buf[i+1] = filsys.s_free[i];
wtfs(bno, buf);
filsys.s_nfree = 0;
}
filsys.s_free[filsys.s_nfree] = bno;
filsys.s_nfree++;
}
entry(ino, str, adbc, db, aibc, ib)
char *str;
int *adbc, *db, *aibc, *ib;
{
char *s;
int i;
db[*adbc] = ino;
(*adbc)++;
s = &db[*adbc];
for(i=0; i<14; i++) {
*s++ = *str;
if(*str != '\0')
str++;
}
*adbc =+ 7;
if(*adbc >= 256)
newblk(adbc, db, aibc, ib);
}
newblk(adbc, db, aibc, ib)
int *adbc, *db, *aibc, *ib;
{
int bno, i;
bno = alloc();
wtfs(bno, db);
for(i=0; i<256; i++)
db[i] = 0;
*adbc = 0;
ib[*aibc] = bno;
(*aibc)++;
if(*aibc >= 256) {
printf("indirect block full\n");
exit();
}
}
getch()
{
if(charp)
return(*charp++);
return(getchar());
}
bflist()
{
char flg[100], adr[100];
register i, j;
char *low, *high;
if(f_n > 100)
f_n = 100;
for(i=0; i<f_n; i++)
flg[i] = 0;
i = 0;
for(j=0; j<f_n; j++) {
while(flg[i])
i = (i+1)%f_n;
adr[j] = i;
flg[i]++;
i = (i+f_m)%f_n;
}
high = filsys.s_fsize-1;
low = filsys.s_isize+2;
free(0);
for(i=high; lrem(0,i+1,f_n); i--) {
if(i < low)
break;
free(i);
}
for(; i >= low+f_n; i =- f_n)
for(j=0; j<f_n; j++)
free(i-adr[j]);
for(;i >= low; i--)
free(i);
}
+42
View File
@@ -0,0 +1,42 @@
main(argc, argv)
int argc;
char **argv;
{
int m, a, b;
if(argc != 5) {
printf("arg count\n");
goto usage;
}
if(*argv[2] == 'b')
m = 0160666; else
if(*argv[2] == 'c')
m = 0120666; else
goto usage;
a = number(argv[3]);
if(a < 0)
goto usage;
b = number(argv[4]);
if(b < 0)
goto usage;
if(mknod(argv[1], m, (a<<8)|b) < 0)
perror("mknod");
exit();
usage:
printf("usage: mknod name b/c major minor\n");
}
number(s)
char *s;
{
int n, c;
n = 0;
while(c = *s++) {
if(c<'0' || c>'9')
return(-1);
n = n*10 + c-'0';
}
return(n);
}
+62
View File
@@ -0,0 +1,62 @@
#define NMOUNT 16
#define NAMSIZ 32
struct mtab {
char file[NAMSIZ];
char spec[NAMSIZ];
} mtab[NMOUNT];
main(argc, argv)
char **argv;
{
register int ro;
register struct mtab *mp;
register char *np;
int n, mf;
mf = open("/etc/mtab", 0);
read(mf, mtab, NMOUNT*2*NAMSIZ);
if (argc==1) {
for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
if (mp->file[0])
printf("%s on %s\n", mp->spec, mp->file);
return;
}
if(argc < 3) {
printf("arg count\n");
return;
}
ro = 0;
if(argc > 3)
ro++;
if(mount(argv[1], argv[2], ro) < 0) {
perror("mount");
return;
}
np = argv[1];
while(*np++)
;
np--;
while(*--np == '/')
*np = '\0';
while(np > argv[1] && *--np != '/')
;
if(*np == '/')
np++;
argv[1] = np;
for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
if (mp->file[0] == 0) {
for (np = mp->spec; np < &mp->spec[NAMSIZ-1];)
if ((*np++ = *argv[1]++) == 0)
argv[1]--;
for (np = mp->file; np < &mp->file[NAMSIZ-1];)
if ((*np++ = *argv[2]++) == 0)
argv[2]--;
mp = &mtab[NMOUNT];
while ((--mp)->file[0] == 0);
mf = creat("/etc/mtab", 0644);
write(mf, mtab, (mp-mtab+1)*2*NAMSIZ);
return;
}
}
}
+177
View File
@@ -0,0 +1,177 @@
/*
mv [-d] file1 file2
unlink file2
link file1 file2
unlink file1
*/
int stbuf[42];
struct sbuf {
int dev;
int inum;
int imode;
char nlink;
char uid;
char gid;
char siz0;
char siz1;
int addr[8];
int adate[2];
int mdate[2];
};
char strbuf[70];
main(argc,argv)
int argc;
char *argv[];
{
char **argp;
char *argp1, *argp2, *argp3, *argp4;
char *p, *p1, *p2;
char place[100];
int i;
int status;
int b;
argp = argv;
/*
check for correct number
of arguments
*/
if(argc != 3){
write(1,"Usage: mv name1 name2\n",22);
exit();
}
/*
is there anything to do?
*/
argp3 = argp[1];
argp4 = argp[2];
if(stat(argp[1], stbuf) < 0){
write(1,"Source file non-existent\n",25);
exit();
}
/*
yes, there is a source.
check whether file or directory
*/
if((stbuf[0].imode & 060000) == 040000){
/*
The source is a directory, so
we do lots of checking and
messing around so as not to get
into trouble. This patch of
code contains administrative
policies rather than system
restrictions.
*/
if(stat(argp[2], stbuf) >= 0){
write(1,"Directory target exists.\n",25);
exit();
}
argp1 = argp[1];
argp2 = argp[2];
while(*argp1 == *argp2){
argp1++;
if(*argp2++ == 0){
write(1,"???\n",4);
exit();
}
}
while(*argp1)if(*argp1++ == '/'){
write(1,"Directory rename only\n",22);
exit();
}
while(*argp2)if(*argp2++ == '/'){
write(1,"Directory rename only\n",22);
exit();
}
if(*--argp1 == '.'){
write(1,"values of B will give rise to dom!\n",37);
exit();
}
}else{
/*
the source is a file.
*/
setuid(getuid());
if(stat(argp4, &stbuf[2]) >= 0){
if((stbuf[2].imode & 060000) == 040000){
argp2 = strbuf;
while(*argp2++ = *argp4++);
argp2[-1] = '/';
argp4 = argp[1];
argp1 = argp[1];
while(*argp4)
if(*argp4++ == '/')
argp1 = argp4;
while(*argp2++ = *argp1++);
argp4 = strbuf;
}
if(stat(argp4, &stbuf[2]) >= 0){
if((stbuf[0]==stbuf[2]) && (stbuf[1]==stbuf[3])){
write(1,"Files are identical.\n",21);
exit();
}
if((getuid()&0377) == stbuf[2].uid)
b = 0200; else
if((getgid()&0377) == stbuf[2].gid)
b = 020; else
b = 02;
if((stbuf[2].imode & b) == 0) {
printf("%s: %o mode ", argp4,
stbuf[2].imode & 07777);
i = b = getchar();
while(b != '\n' && b != '\0')
b = getchar();
if(i != 'y')
exit();
}
if(unlink(argp4) < 0){
write(1,"Cannot remove target file.\n",27);
exit();
}
}
}
}
if(link(argp3, argp4) < 0){
i = fork();
if(i == -1){
write(1,"Try again.\n",11);
exit();
}
if(i){
while(wait(&status) != i);
}else{
p = place;
p1 = p;
while(*p++ = *argp3++);
p2 = p;
while(*p++ = *argp4++);
execl("/bin/cp","cp", p1, p2, 0);
write(1, "no cp\n", 6);
exit(1);
}
if((status & 0377) != 0){
write(1,"?\n", 2);
exit();
}
if(status != 0) exit();
}
if(unlink(argp3) < 0){
write(1,"Cannot unlink source file.\n",27);
exit();
}
}
putchar(c)
{
write(1, &c, 1);
}
getchar()
{
char c;
if(read(0, &c, 1) != 1) return(0);
return(c);
}
+299
View File
@@ -0,0 +1,299 @@
#
char *dargv[]
{
"/dev/rrk2",
"/dev/rrp0",
0
};
#define NINODE 16*16
#include "/usr/sys/ino.h"
#include "/usr/sys/filsys.h"
struct filsys sblock;
struct inode inode[NINODE];
int sflg;
int aflg;
#define NI 20
#define NDIRS 787
int ilist[NI] { -1};
int fi;
struct htab {
int hino;
int hpino;
char hname[14];
} htab[NDIRS];
int nhent 10;
int (*pass[])() { pass1, pass2, pass3 };
char *lasts;
int ino;
int nerror;
int nffil;
int fout;
int nfiles;
struct dir {
int ino;
char name[14];
};
main(argc, argv)
char **argv;
{
register char **p;
register int n, *lp;
nffil = dup(1);
if (argc == 1) {
for (p = dargv; *p;)
check(*p++);
return(nerror);
}
while (--argc) {
argv++;
if (**argv=='-') switch ((*argv)[1]) {
case 's':
sflg++;
continue;
case 'a':
aflg++;
continue;
case 'i':
lp = ilist;
while (lp < &ilist[NI-1] && (n = number(argv[1]))) {
*lp++ = n;
argv++;
argc--;
}
*lp++ = -1;
continue;
default:
printf2("Bad flag\n");
}
check(*argv);
}
return(nerror);
}
check(file)
char *file;
{
register i, j, pno;
fi = open(file, 0);
if (fi < 0) {
printf2("cannot open %s\n", file);
return;
}
printf2("%s:\n", file);
sync();
bread(1, &sblock, 512);
nfiles = sblock.s_isize*16;
for (i=0; i<NDIRS; i++)
htab[i].hino = 0;
fout = nffil;
flush();
for (pno=0; pno<3; pno++) {
ino = 0;
for (i=0; ino<nfiles; i =+ NINODE/16) {
bread(i+2, inode, sizeof inode);
for (j=0; j<NINODE && ino<nfiles; j++) {
ino++;
(*pass[pno])(&inode[j]);
}
}
}
flush();
fout = 1;
}
pass1(ip)
{
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
return;
lookup(ino, 1);
}
pass2(ip)
struct inode *ip;
{
register doff;
register struct htab *hp;
register struct dir *dp;
int i;
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
return;
doff = 0;
while (dp = dread(ip, doff)) {
doff =+ 16;
if (dp->ino==0)
continue;
if ((hp = lookup(dp->ino, 0)) == 0)
continue;
if (dotname(dp))
continue;
hp->hpino = ino;
for (i=0; i<14; i++)
hp->hname[i] = dp->name[i];
}
}
pass3(ip)
struct inode *ip;
{
register doff;
register struct dir *dp;
register int *ilp;
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
return;
doff = 0;
while (dp = dread(ip, doff)) {
doff =+ 16;
if (dp->ino==0)
continue;
if (aflg==0 && dotname(dp))
continue;
for (ilp=ilist; *ilp >= 0; ilp++)
if (*ilp == dp->ino)
break;
if (ilp > ilist && *ilp!=dp->ino)
continue;
printf("%d ", dp->ino);
pname(ino, 0);
printf("/%.14s\n", dp->name);
}
}
dotname(adp)
{
register struct dir *dp;
dp = adp;
if (dp->name[0]=='.')
if (dp->name[1]==0 || dp->name[1]=='.' && dp->name[2]==0)
return(1);
return(0);
}
pname(i, lev)
{
register struct htab *hp;
if (i==1)
return;
if ((hp = lookup(i, 0)) == 0) {
printf("???");
return;
}
if (lev > 10) {
printf("...");
return;
}
pname(hp->hpino, ++lev);
printf("/%.14s", hp->hname);
}
lookup(i, ef)
{
register struct htab *hp;
for (hp = &htab[i%NDIRS]; hp->hino;) {
if (hp->hino==i)
return(hp);
if (++hp >= &htab[NDIRS])
hp = htab;
}
if (ef==0)
return(0);
if (++nhent >= NDIRS) {
printf2("Out of core-- increase NDIRS\n");
flush();
exit(1);
}
hp->hino = i;
return(hp);
}
dread(aip, aoff)
{
register b, off;
register struct inode *ip;
static ibuf[256];
static char buf[512];
off = aoff;
ip = aip;
if ((off&0777)==0) {
if (off==0177000) {
printf2("Monstrous directory %l\n", ino);
return(0);
}
if ((ip->i_mode&ILARG)==0) {
if (off>=010000 || (b = ip->i_addr[off>>9])==0)
return(0);
bread(b, buf, 512);
} else {
if (off==0) {
if (ip->i_addr[0]==0)
return(0);
bread(ip->i_addr[0], ibuf, 512);
}
if ((b = ibuf[(off>>9)&0177])==0)
return(0);
bread(b, buf, 512);
}
}
return(&buf[off&0777]);
}
bread(bno, buf, cnt)
{
seek(fi, bno, 3);
if (read(fi, buf, cnt) != cnt) {
printf2("read error %d\n", bno);
exit();
}
}
bwrite(bno, buf)
{
seek(fi, bno, 3);
if (write(fi, buf, 512) != 512) {
printf2("write error %d\n", bno);
exit();
}
}
number(as)
char *as;
{
register n, c;
register char *s;
s = as;
n = 0;
while ((c = *s++) >= '0' && c <= '9') {
n = n*10+c-'0';
}
return(n);
}
printf2(s, a1, a2)
{
extern fout;
flush();
fout = 2;
printf(s, a1, a2);
fout = nffil;
flush();
}
+156
View File
@@ -0,0 +1,156 @@
int gbuf[259];
int pbuf[259];
int ttyb[3];
char name[10];
char passwd[10];
char space[1000];
int peek;
int pwdflg;
main(argc, argv)
char *argv[];
{
register id;
register char *p, *q;
if(argc < 2) {
printf("usage: newgrp groupname\n");
done();
}
if(fopen("/etc/group", gbuf) < 0) {
printf("cannot open group file\n");
done();
}
do {
field(name, gbuf);
p = name;
q = argv[1];
while(*p == *q++)
if(*p++ == 0 || p >= name+8)
goto l1;
} while(skip(gbuf));
printf("%s: not a valid group name\n", argv[1]);
done();
l1:
if(fopen("/etc/passwd", pbuf) < 0) {
printf("cannot open password file\n");
done();
}
p = space;
id = getuid() & 0377;
do {
field(p, pbuf);
field(name, pbuf);
if(value(pbuf) == id) {
if(name[0] == 0)
pwdflg++;
while(*p++) ;
}
} while(skip(pbuf));
*p = 0;
field(passwd, gbuf);
id = value(gbuf);
if(id == 1) {
pwdflg = 0;
goto l2;
}
do {
p = space;
field(name, gbuf);
while(*p) {
q = name;
while(*p == *q++) {
if(*p++ == 0)
goto l2;
}
while(*p++) ;
}
} while(peek == ',');
goto no;
l2:
if(pwdflg && passwd[0]) {
printf("password: ");
gtty(0, pbuf);
pbuf[3] = pbuf[2];
pbuf[2] =& ~010;
stty(0, pbuf);
read(0, gbuf, 512);
pbuf[2] = pbuf[3];
stty(0, pbuf);
printf("\n");
p = name;
q = gbuf;
while(p < name+8) {
if(*q == '\n')
break;
*p++ = *q++;
}
*p = 0;
p = crypt(name);
q = passwd;
while(q < passwd+8)
if(*p++ != *q++)
goto no;
}
if(setgid(id) < 0) {
perror("setgid");
goto no;
}
done();
no:
printf("Sorry\n");
done();
}
skip(buf)
{
while(peek > 0) {
if(peek == '\n') {
peek = 1;
return(1);
}
peek = getc(buf);
}
return(0);
}
field(cp, buf)
{
register c;
register char *p, *q;
p = cp;
q = p+8;
while((c = getc(buf)) != '\n') {
if(c == ',' || c == ':' || c <= 0)
break;
if(p < q)
*p++ = c;
}
*p = 0;
peek = c;
}
value(buf)
{
register n, c;
n = 0;
while((c = getc(buf)) >= '0' && c <= '9')
n = n*10 + c-'0';
peek = c;
return(n);
}
done()
{
setuid(getuid());
execl("/bin/sh", "-", 0);
exit();
}
+40
View File
@@ -0,0 +1,40 @@
/* nice */
int nicarg 4;
char *args[100];
char string[10000];
main(argc, argv)
int argc;
char *argv[];
{
int i;
register char **argp, *strp, *p;
if(argc > 1 && argv[1][0] == '-') {
nicarg = atoi(&argv[1][1]);
argc--;
argv++;
}
if(argc < 2) {
printf("usage: nice [ -n ] command\n");
exit(1);
}
argc--;
argv++;
argp = args;
strp = string;
for (i=0; i<9; i++)
*strp++ = "/usr/bin/"[i];
for(i=0; i<argc; i++) {
*argp++ = strp;
p = *argv++;
while(*strp++ = *p++);
}
*argp = 0;
nice(nicarg);
execv(string+9, args);
execv(string+4, args);
execv(string, args);
printf("%s not found\n", string+9);
exit(1);
}
+149
View File
@@ -0,0 +1,149 @@
int fout;
int cflg;
int nflg;
int uflg;
int rflg 1;
int gflg;
int pflg;
struct nl
{
char name[8];
int typ;
int *val;
} *nlp;
int fi;
int buf[8];
main(argc, argv)
char **argv;
{
int n, i, j;
int compare();
if (--argc > 0 && *argv[1] == '-') {
argv++;
while (*++*argv) switch (**argv) {
case 'n':
nflg++;
continue;
case 'c':
cflg++;
continue;
case 'g':
gflg++;
continue;
case 'u':
uflg++;
continue;
case 'r':
rflg = -1;
continue;
case 'p':
pflg ++;
continue;
default:
continue;
}
argc--;
}
if (argc==0)
fi = open("a.out", 0); else
fi = open(*++argv, 0);
if(fi < 0) {
printf("cannot open input\n");
exit();
}
read(fi, buf, 020);
if(buf[0]!=0407 && buf[0]!=0410 && buf[0]!=0411) {
printf("bad format\n");
exit();
}
seek(fi, buf[1], 1); /* text */
seek(fi, buf[2], 1); /* data */
if(buf[7] != 1) {
seek(fi, buf[1], 1);
seek(fi, buf[2], 1); /* reloc */
}
n = ldiv(0, buf[4], 12);
if(n == 0) {
printf("no name list\n");
exit();
}
nlp = sbrk(12*n);
read(fi, nlp, n*12);
if (pflg==0)
qsort(nlp, n, 12, compare);
fout = dup(1);
close(1);
for(i=0; i<n; i++) {
if(gflg && (nlp->typ&040)==0)
goto out;
if(cflg) {
if(nlp->name[0] != '_')
goto out;
for(j=0; j<7; j++)
nlp->name[j] = nlp->name[j+1];
nlp->name[7] = '\0';
}
j = nlp->typ&037;
if(j > 4)
j = 1;
if(j==0 && nlp->val)
j = 5;
if(uflg && j!=0)
goto out;
if(!uflg) {
if(j==0)
printf(" "); else
printo(nlp->val);
printf("%c ", (nlp->typ&040? "UATDBC":"uatdbc")[j]);
}
printf("%.8s\n", nlp);
out:
nlp++;
}
flush();
}
compare(p1, p2)
struct nl *p1, *p2;
{
int a, i;
a = 0;
if(nflg) {
if(p1->val > p2->val) {
a = 1;
goto out;
}
if(p1->val < p2->val) {
a = -1;
goto out;
}
}
for(i=0; i<8; i++)
if(p1->name[i] != p2->name[i]) {
if(p1->name[i] > p2->name[i])
a = 1; else
a = -1;
goto out;
}
out:
return(a*rflg);
}
printo(v)
{
int i;
printf("%c", v<0?'1':'0');
for(i=0; i<5; i++) {
printf("%c", ((v>>12)&7)+'0');
v =<<3;
}
}
+35
View File
@@ -0,0 +1,35 @@
/* nohup */
char *args[100];
char string[10000];
main(argc, argv)
int argc;
char *argv[];
{
int i;
char **argp, *strp, *p;
if(argc < 2) {
printf("arg count\n");
exit();
}
argc--;
argv++;
argp = args;
strp = string;
for (i=0; i<9; i++)
*strp++ = "/usr/bin/"[i];
for(i=0; i<argc; i++) {
*argp++ = strp;
p = *argv++;
while(*strp++ = *p++);
}
*argp = 0;
signal(1, 1);
signal(2, 1);
signal(3, 1);
execv(string+9, args);
execv(string+4, args);
execv(string, args);
printf("%s not found\n", string+9);
}
+614
View File
@@ -0,0 +1,614 @@
int word[16];
char gbuf[512];
int fi;
int conv;
int base 010;
int basem 01000;
int max;
int gidx;
int gcnt;
int eof;
int addr[2];
int from[2];
int key;
int flag;
int nword 8;
main(argc, argv)
char **argv;
{
extern fout;
int f, k, w, i, a[2];
char *p;
fout = dup(1);
argv++;
if(argc > 1) {
p = *argv;
if(*p == '-') {
while((i = *p++) != '\0') {
switch(i) {
case 'o':
conv =| 001;
f = 6;
break;
case 'd':
conv =| 002;
f = 5;
break;
case 'a':
conv =| 004;
f = 4;
break;
case 'h':
conv =| 010;
f = 4;
break;
case 'c':
conv =| 020;
f = 5;
break;
case 'b':
conv =| 040;
f = 7;
break;
}
if(f > max)
max = f;
}
argc--;
argv++;
}
}
if(!conv) {
max = 6;
conv = 1;
}
if(argc > 1)
if(**argv != '+') {
fi = open(*argv, 0);
if(fi < 0) {
printf("cannot open %s\n", *argv);
goto done;
}
argv++;
argc--;
}
if(argc > 1)
offset(*argv);
loop:
f = 1;
a[0] = addr[0];
a[1] = addr[1];
for(i=0; i<nword; i++) {
w = getw();
if(eof)
break;
word[i] = w;
if(i)
f =& w==k; else
k = w;
}
if(i)
if(f && !eof) {
if(!(flag && k==key)) {
dupl();
key = k;
from[0] = a[0];
from[1] = a[1];
}
flag =+ i;
} else {
dupl();
line(a, word, i);
}
if(!eof)
goto loop;
puta(addr);
putchar('\n');
done:
flush();
}
dupl()
{
if(flag) {
flag = 0;
line(from, &key, 1);
}
}
puta(a)
int a[2];
{
putn(a[0], base, 4);
putn(a[1], base, 3);
putchar(' ');
}
line(a, w, n)
int w[];
{
int i, f, c;
f = 1;
for(c=1; c; c=+c) {
if((c&conv) == 0)
continue;
if(f) {
puta(a);
f = 0;
} else
for(i=0; i<8; i++)
putchar(' ');
for(i=0; i<n; i++) {
putx(w[i], c);
putchar(i==n-1? '\n': ' ');
}
}
}
putx(n, c)
{
switch(c) {
case 001:
pre(6);
putn(n, 8, 6);
break;
case 002:
pre(5);
putn(n, 10, 5);
break;
case 004:
pre(4);
putop(n);
break;
case 010:
pre(4);
putn(n, 16, 4);
break;
case 020:
pre(5);
putc(n);
putchar(' ');
putc(n>>8);
break;
case 040:
pre(7);
putn(n&0377, 8, 3);
putchar(' ');
putn((n>>8)&0377, 8, 3);
break;
}
}
getw()
{
int b1, b2;
b1 = getc();
if(b1 == -1) {
eof = 1;
return(0);
}
b2 = getc();
if(b2 == -1)
b2 = 0;
return(b1|(b2<<8));
}
getc()
{
if(gidx >= gcnt) {
gcnt = read(fi, gbuf, 512);
if(gcnt <= 0)
return(-1);
gidx = 0;
}
if(++addr[1] >= basem) {
addr[0]++;
addr[1] = 0;
}
return(gbuf[gidx++]&0377);
}
putc(c)
{
c =& 0377;
if(c>037 && c<0177 && c!='\\') {
putchar(' ');
putchar(c);
return;
}
putchar('\\');
switch(c) {
case '\0':
putchar('0');
break;
case '\n':
putchar('n');
break;
case '\\':
putchar('\\');
break;
case '\t':
putchar('t');
break;
default:
putchar('?');
}
}
putn(n, b, c)
{
if(!c)
return;
putn(ldiv(0,n,b),b,c-1);
if((n=lrem(0,n,b)) > 9)
putchar(n-10+'a'); else
putchar(n+'0');
}
pre(n)
{
int i;
for(i=n; i<max; i++)
putchar(' ');
}
offset(s)
char s[];
{
char *p;
int a[2], d, i, j, b;
p = s;
while(*p++);
i = p-s-1;
b = 0;
if(i > 0)
if(p[-2] == 'b') {
i--;
b++;
p--;
}
if(i > 0)
if(p[-2] == '.') {
i--;
base = 10;
basem = 1000;
}
a[0] = 0;
for(j=0; i-j>3; j++) {
d = s[j];
if(d>='0' && d<='9')
a[0] = a[0]*base + d-'0';
}
a[1] = 0;
for(; i-j>0; j++) {
d = s[j];
if(d>='0' && d<='9')
a[1] = a[1]*base + d-'0';
}
if(b) {
i = a[0]*basem+a[1];
a[0] = 0;
a[1] = 0;
while(i--) {
a[1] =+ 512;
while(a[1] >= basem) {
a[1] =- basem;
a[0]++;
}
}
}
i = 0;
while(a[0] > addr[0]+1) {
addr[1] =+ 512;
while(addr[1] >= basem) {
addr[1] =- basem;
addr[0]++;
}
i++;
}
seek(fi, i, 3);
while(a[0]!=addr[0] || a[1]!=addr[1])
if(getc() == -1)
break;
}
putop(n)
{
char *p;
int i, c;
p = getop(n);
for(i=0; (c = *p++) != '\0'; i++)
putchar(c);
for(; i<4; i++)
putchar(' ');
}
getop(n)
{
switch(n&0170000)
{
case 0000000:
switch(n&0177000)
{
case 0004000:
return("jsr");
case 0077000:
return("sob");
}
switch(n&0177400)
{
case 0000400:
return("br");
case 0001000:
return("bne");
case 0001400:
return("beq");
case 0002000:
return("bge");
case 0002400:
return("blt");
case 0003000:
return("bgt");
case 0003400:
return("ble");
}
switch(n&0177700)
{
case 0000100:
return("jmp");
case 0000300:
return("swab");
case 0005000:
return("clr");
case 0005100:
return("com");
case 0005200:
return("inc");
case 0005300:
return("dec");
case 0005400:
return("neg");
case 0005500:
return("adc");
case 0005600:
return("sbc");
case 0005700:
return("tst");
case 0006000:
return("ror");
case 0006100:
return("rol");
case 0006200:
return("asr");
case 0006300:
return("asl");
case 0006400:
return("mark");
case 0006500:
return("mfpi");
case 0006600:
return("mtpi");
case 0006700:
return("sxt");
}
switch(n&0177740)
{
case 0000240:
return("flag");
}
switch(n&0177770)
{
case 0000200:
return("rts");
case 0000230:
return("spl");
}
switch(n&0177777)
{
case 0000000:
return("halt");
case 0000001:
return("wait");
case 0000002:
return("rti");
case 0000003:
return("bpt");
case 0000004:
return("iot");
case 0000005:
return("rset");
case 0000006:
return("rtt");
}
break;
case 0010000:
return("mov ");
case 0020000:
return("cmp");
case 0030000:
return("bit");
case 0040000:
return("bic");
case 0050000:
return("bis");
case 0060000:
return("add");
case 0070000:
switch(n&0177000)
{
case 0070000:
return("mul");
case 0071000:
return("div");
case 0072000:
return("ash");
case 0073000:
return("ashc");
case 0074000:
return("xor");
}
break;
case 0100000:
switch(n&0177400)
{
case 0100000:
return("bpl");
case 0100400:
return("bmi");
case 0101000:
return("bhi");
case 0101400:
return("blos");
case 0102000:
return("bvc");
case 0102400:
return("bvs");
case 0103000:
return("bhis");
case 0103400:
return("blo");
case 0104000:
return("emt");
case 0104400:
return("sys");
}
switch(n&0177700)
{
case 0105000:
return("clrb");
case 0105100:
return("comb");
case 0105200:
return("incb");
case 0105300:
return("decb");
case 0105400:
return("negb");
case 0105500:
return("adcb");
case 0105600:
return("sbcb");
case 0105700:
return("tstb");
case 0106000:
return("rorb");
case 0106100:
return("rolb");
case 0106200:
return("asrb");
case 0106300:
return("aslb");
case 0106500:
return("mfpd");
case 0106600:
return("mfpd");
}
break;
case 0110000:
return("movb");
case 0120000:
return("cmpb");
case 0130000:
return("bitb");
case 0140000:
return("bicb");
case 0150000:
return("bisb");
case 0160000:
return("sub");
case 0170000:
switch(n&01777000)
{
case 0:0;
}
break;
}
return("???");
}
+27
View File
@@ -0,0 +1,27 @@
/*
* opr -- off line print dispatcher
* chooses spooling routine appropriate
* to destination
*
* last entry in table isdefault
*/
char *code[] {
"-lp", "/lib/lpr", /* line printer */
0
};
main(argc, argv)
char **argv;
{
int i, j;
argv[argc] = 0;
for(i=0; code[i]; i=+2)
if(argc > 1)
for(j=0; code[i][j]==argv[1][j]; j++)
if(code[i][j] == 0)
execv(code[i+1], &argv[1]);
execv(code[i-1], argv);
write(2, "can't start daemon\n", 19);
}
+151
View File
@@ -0,0 +1,151 @@
/*
* enter a password in the password file
* this program should be suid with owner
* with an owner with write permission on /etc/passwd
*/
char *tfile { "/tmp/ptmp" };
char *pfile { "/etc/passwd" };
int tbuf[259];
int pbuf[259];
main(argc, argv)
char *argv[];
{
register u, c;
register char *p;
if(argc != 3) {
write(2, "Usage: passwd user password\n", 28);
goto bex;
}
signal(1, 1);
signal(2, 1);
signal(3, 1);
if(stat(tfile, tbuf+20) >= 0) {
write(2, "Temporary file busy -- try again\n", 33);
goto bex;
}
tbuf[0] = creat(tfile, 0600);
if(tbuf[0] < 0) {
write(2, "Cannot create temporary file\n", 29);
goto bex;
}
pbuf[0] = open(pfile, 0);
if(pbuf[0] < 0) {
write(2, "Cannot open /etc/passwd\n", 24);
goto out;
}
goto l1;
/*
* skip to beginning of next line
*/
skip:
while(c != '\n') {
if(c < 0)
goto ill;
c = getc(pbuf);
putc(c, tbuf);
}
/*
* compare user names
*/
l1:
c = getc(pbuf);
putc(c, tbuf);
if(c < 0) {
write(2, "User name not found in password file\n", 37);
goto out;
}
p = argv[1];
while(c != ':') {
if(*p++ != c)
goto skip;
c = getc(pbuf);
putc(c, tbuf);
}
if(*p)
goto skip;
/*
* skip old password
*/
do {
c = getc(pbuf);
if(c < 0)
goto ill;
} while(c != ':');
/*
* copy in new password
*/
p = argv[2];
for(c=0; c<9; c++)
if(*p++ == 0)
break;
*--p = 0;
if(p != argv[2])
p = crypt(argv[2]);
while(*p)
putc(*p++, tbuf);
putc(':', tbuf);
/*
* validate uid
*/
u = 0;
do {
c = getc(pbuf);
putc(c, tbuf);
if(c >= '0' && c <= '9')
u = u*10 + c-'0';
if(c < 0)
goto ill;
} while(c != ':');
c = getuid() & 0377;
if(c != 0 && c != u) {
write(2, "Permission denied\n", 18);
goto out;
}
/*
* copy out and back
*/
for(;;) {
c = getc(pbuf);
if(c < 0) {
fflush(tbuf);
close(pbuf[0]);
close(tbuf[0]);
tbuf[0] = open(tfile, 0);
if(tbuf[0] < 0) {
write(2, "Urk\n", 4);
goto out;
}
pbuf[0] = creat(pfile, 0644);
if(pbuf[0] < 0) {
write(2, "Cannot create /etc/passwd\n", 26);
goto out;
}
while((c = read(tbuf[0], tbuf+1, 512)) > 0)
write(pbuf[0], tbuf+1, c);
unlink(tfile);
exit(0);
}
putc(c, tbuf);
}
ill:
write(2, "Password file illformed\n", 24);
out:
unlink(tfile);
bex:
exit(1);
}
+44
View File
@@ -0,0 +1,44 @@
/ print last floating error
stst = 170300^tst
stst r1
cmp r1,$14
blos 1f
clr r1
1:
bic $1,r1
mov mesg(r1),r1
1:
movb (r1)+,ch
beq 1f
mov $1,r0
sys write; ch; 1
br 1b
1:
sys exit
mesg:
1f
2f
3f
4f
5f
6f
7f
8f
1: <No error.\n\0>
2: <Floating op code error\n\0>
3: <Floating divide check\n\0>
4: <Integer conversion error\n\0>
5: <Floating overflow\n\0>
6: <Floating underflow\n\0>
7: <Floating undefined\n\0>
8: <Floating maintennace trap\n\0>
.even
.bss
ch: .=.+2
+449
View File
@@ -0,0 +1,449 @@
#
/*
* print file with headings
* 2+head+2+page[56]+5
*/
int ncol 1;
char *header;
int col;
int icol;
int file;
char *bufp;
#define BUFS 5120
char buffer[BUFS];
#define FF 014
int line;
char *colp[72];
int nofile;
char isclosed[10];
int peekc;
int fpage;
int page;
int colw;
int nspace;
int width 72;
int length 66;
int plength 61;
int margin 10;
int ntflg;
int mflg;
int tabc;
char *tty;
int mode;
struct inode {
int dev;
int inum;
int flags;
char nlink;
char uid;
char gid;
char siz0;
int size;
int ptr[8];
int atime[2];
int mtime[2];
};
main(argc, argv)
char **argv;
{
int nfdone;
int onintr();
extern fout;
tty = "/dev/ttyx";
fout = dup(1);
close(1);
if ((signal(2, 1) & 01) == 0)
signal(2, onintr);
fixtty();
for (nfdone=0; argc>1; argc--) {
argv++;
if (**argv == '-') {
switch (*++*argv) {
case 'h':
if (argc>=2) {
header = *++argv;
argc--;
}
continue;
case 't':
ntflg++;
continue;
case 'l':
length = getn(++*argv);
continue;
case 'w':
width = getn(++*argv);
continue;
case 's':
if (*++*argv)
tabc = **argv;
else
tabc = '\t';
continue;
case 'm':
mflg++;
continue;
default:
ncol = getn(*argv);
continue;
}
} else if (**argv == '+') {
fpage = getn(++*argv);
} else {
print(*argv, argv);
nfdone++;
if (mflg)
break;
}
}
if (nfdone==0)
print(0);
flush();
onintr();
}
onintr()
{
chmod(tty, mode);
exit(0);
}
fixtty()
{
struct inode sbuf;
extern fout;
tty[8] = ttyn(fout);
fstat(fout, &sbuf);
mode = sbuf.flags&0777;
chmod(tty, 0600);
}
print(fp, argp)
char *fp;
char **argp;
{
struct inode sbuf;
register int sncol, sheader;
register char *cbuf;
extern fout;
if (ntflg)
margin = 0;
else
margin = 10;
if (length <= margin)
length = 66;
if (width <= 0)
width = 72;
if (ncol>72 || ncol>width) {
write(2, "Very funny.\n", 12);
exit();
}
if (mflg) {
mopen(argp);
ncol = nofile;
}
colw = width/ncol;
sncol = ncol;
sheader = header;
plength = length-5;
if (ntflg)
plength = length;
if (--ncol<0)
ncol = 0;
if (mflg)
fp = 0;
if (fp) {
file = open(fp, 0);
if (file<0)
return;
fstat(file, &sbuf);
} else {
file = 0;
time(sbuf.mtime);
}
if (header == 0)
header = fp;
cbuf = ctime(sbuf.mtime);
cbuf[16] = '\0';
cbuf[24] = '\0';
page = 1;
icol = 0;
colp[ncol] = bufp = buffer;
if (mflg==0)
nexbuf();
while (mflg&&nofile || (!mflg)&&tpgetc(ncol)>0) {
if (mflg==0) {
colp[ncol]--;
if (colp[ncol] < buffer)
colp[ncol] = &buffer[BUFS];
}
line = 0;
if (ntflg==0) {
puts("\n\n");
puts(cbuf+4);
puts(" ");
puts(cbuf+20);
puts(" ");
puts(header);
puts(" Page ");
putd(page);
puts("\n\n\n");
}
putpage();
if (ntflg==0)
while(line<length)
put('\n');
page++;
}
if (file)
close(file);
ncol = sncol;
header = sheader;
}
mopen(ap)
char **ap;
{
register char **p, *p1;
p = ap;
while ((p1 = *p++) && p1 != -1) {
isclosed[nofile] = fopen(p1, &buffer[2*259*nofile]);
if (++nofile>=10) {
write(2, "Too many args.\n", 15);
exit();
}
}
}
putpage()
{
register int lastcol, i, c;
int j;
if (ncol==0) {
while (line<plength) {
while((c = tpgetc(0)) && c!='\n' && c!=FF)
putcp(c);
putcp('\n');
line++;
if (c==FF)
break;
}
return;
}
colp[0] = colp[ncol];
if (mflg==0) for (i=1; i<=ncol; i++) {
colp[i] = colp[i-1];
for (j = margin; j<length; j++)
while((c=tpgetc(i))!='\n')
if (c==0)
break;
}
while (line<plength) {
lastcol = colw;
for (i=0; i<ncol; i++) {
while ((c=pgetc(i)) && c!='\n')
if (col<lastcol || tabc!=0)
put(c);
if (c==0 && ntflg)
return;
if (tabc)
put(tabc);
else while (col<lastcol)
put(' ');
lastcol =+ colw;
}
while ((c = pgetc(ncol)) && c!='\n')
put(c);
put('\n');
}
}
nexbuf()
{
register int n;
register char *rbufp;
rbufp = bufp;
n = &buffer[BUFS] - rbufp;
if (n>512)
n = 512;
if ((n = read(file, rbufp, n)) <= 0)
*rbufp = 0376;
else {
rbufp =+ n;
if (rbufp >= &buffer[BUFS])
rbufp = buffer;
*rbufp = 0375;
}
bufp = rbufp;
}
tpgetc(ai)
{
register char **p;
register int c, i;
i = ai;
if (mflg) {
if ((c = getc(&buffer[2*259*i])) < 0) {
if (isclosed[i]==0) {
isclosed[i] = 1;
if (--nofile <= 0)
return(0);
}
return('\n');
}
if (c==FF && ncol>0)
c = '\n';
return(c);
}
loop:
c = **(p = &colp[i]) & 0377;
if (c == 0375) {
nexbuf();
c = **p & 0377;
}
if (c == 0376)
return(0);
(*p)++;
if (*p >= &buffer[BUFS])
*p = buffer;
if (c==0)
goto loop;
return(c);
}
pgetc(i)
{
register int c;
if (peekc) {
c = peekc;
peekc = 0;
} else
c = tpgetc(i);
if (tabc)
return(c);
switch (c) {
case '\t':
icol++;
if ((icol&07) != 0)
peekc = '\t';
return(' ');
case '\n':
icol = 0;
break;
case 010:
case 033:
icol--;
break;
}
if (c >= ' ')
icol++;
return(c);
}
puts(as)
char *as;
{
register int c;
register char *s;
if ((s=as)==0)
return;
while (c = *s++)
put(c);
}
putd(an)
{
register int a, n;
n = an;
if (a = n/10)
putd(a);
put(n%10 + '0');
}
put(ac)
{
register int ns, c;
c = ac;
if (tabc) {
putcp(c);
if (c=='\n')
line++;
return;
}
switch (c) {
case ' ':
nspace++;
col++;
return;
case '\n':
col = 0;
nspace = 0;
line++;
break;
case 010:
case 033:
if (--col<0)
col = 0;
if (--nspace<0)
nspace = 0;
}
while(nspace) {
if (nspace>2 && col > (ns=((col-nspace)|07))) {
nspace = col-ns-1;
putcp('\t');
} else {
nspace--;
putcp(' ');
}
}
if (c >= ' ')
col++;
putcp(c);
}
getn(ap)
char *ap;
{
register int n, c;
register char *p;
p = ap;
n = 0;
while ((c = *p++) >= '0' && c <= '9')
n = n*10 + c - '0';
return(n);
}
putcp(c)
{
if (page >= fpage)
putchar(c);
}
+350
View File
@@ -0,0 +1,350 @@
/*
* Print execution profile
*/
struct nl {
char name[8];
int value;
float time;
int ncall[2];
};
struct nl nl[600];
struct fnl {
char fname[8];
int flag;
int fvalue;
};
struct cnt {
int cvalue;
int cncall[2];
} cbuf[200];
struct inode {
int idev;
int inum;
int flags;
char nlink;
char uid;
char gid;
char size0;
int size;
int ptr[8];
int ctime[2];
int mtime[2];
int fill;
};
int ibuf[259];
int obuf[259];
int buf[17];
int i;
int j;
int highpc;
int lowpc;
int ccnt;
int pcl;
int pch;
int bufs;
int nname;
double time;
double totime;
double maxtime;
double scale;
double lastx;
double lasty;
struct nl *np;
struct nl *npe;
int aflg;
int vflg;
int lflg;
int symoff;
int symsiz;
int vf;
int etext;
int ncount;
main(argc, argv)
char **argv;
{
char *namfil;
int timcmp(), valcmp();
int nf, pf, overlap;
double fnc, ltod(), lastsx;
struct cnt *cp;
obuf[0] = 1;
argv++;
namfil = "a.out";
while (argc>1) {
if (**argv == '-') {
if (*++*argv == 'l')
lflg++;
if (**argv == 'a')
aflg = 040;
if(**argv == 'v')
vflg++;
} else
namfil = *argv;
argc--;
argv++;
}
if ((nf = open(namfil, 0)) < 0) {
printf("Can't find %s\n", namfil);
done();
}
read(nf, buf, 020);
if (buf[0] != 0407 && buf[0] != 0410 && buf[0] != 0411) { /* a.out magic */
printf("Bad format: %s\n", namfil);
done();
}
symsiz = buf[4];
symoff = buf[1] + buf[2];
if (buf[7] != 1)
symoff =<< 1;
seek(nf, symoff+020, 0);
if ((pf = open("mon.out", 0)) < 0) {
printf("No mon.out\n");
done();
}
fstat(pf, buf);
read(pf, &lowpc, 2);
read(pf, &highpc, 2);
read(pf, &ncount, 2);
bufs = buf->size/2 - 3*(ncount+1);
read(pf, cbuf, ncount*6);
lowpc = (lowpc>>1) & 077777;
highpc = (highpc>>1) & 077777;
npe = nl;
initf(nf);
for (nname = 0; symsiz > 0; symsiz =- 12) {
for(i=0; i<12; i++)
buf->fname[i] = getc(ibuf);
if ((buf->flag | aflg) != 042)
continue;
buf->fvalue = (buf->fvalue>>1) & 077777;
npe->value = buf->fvalue;
for (i=0; i<8; i++)
npe->name[i] = buf->fname[i];
npe++;
nname++;
}
if (nname == 0) {
printf("No symbols: %s\n", namfil);
done();
}
npe->value = 077777;
npe++;
for (cp = cbuf; cp < &cbuf[ncount]; cp++)
for (np = nl; np < npe; np++)
if (cp->cvalue-8 == np->value<<1) {
np->ncall[0] = cp->cncall[0];
np->ncall[1] = cp->cncall[1];
break;
}
qsort(nl, nname, 18, &valcmp);
scale = (highpc-lowpc)/(bufs+0.0);
initf(pf);
for (i=0; (j = getc(ibuf)) != -1; i++) {
ccnt.fname[0] = j;
ccnt.fname[1] = getc(ibuf);
if (ccnt == 0)
continue;
time = ccnt;
if (ccnt<0)
time =+ 65536.;
totime =+ time;
if(time > maxtime)
maxtime = time;
pcl = lowpc + scale*i - 1;
pch = lowpc + scale*(i+1) - 1;
for (j=0; j<nname; j++) {
if (pch < nl[j].value)
break;
if (pcl >= nl[j+1].value)
continue;
overlap=(min(pch,nl[j+1].value)-max(pcl,nl[j].value));
nl[j].time =+ overlap*time/scale;
}
}
if (totime==0.0) {
printf("No time accumulated\n");
done();
}
if(!vflg)
goto print;
vf = open("/dev/vt0", 1);
if(vf < 0) {
printf("Cannot open vt\n");
done();
}
obuf[0] = vf;
vtch(1);
vtch(1);
vtch(3);
point(-2048., -2048.);
point(-2048., 2048.);
vtch(3);
point(0., -2048.);
point(0., 2048.);
for(j=0; j<9; j++) {
vtch(3);
point(-2048., 2048. - j*512.);
point(0., 2048. - j*512.);
}
lastx = 0.;
lasty = 2048.;
scale = 4096./(i+2);
seek(pf, 6*(ncount+1), 0);
initf(pf);
lastsx = 0.0;
while((j = getc(ibuf)) != -1) {
ccnt.fname[0] = j;
ccnt.fname[1] = getc(ibuf);
time = ccnt;
if(ccnt < 0)
time =+ 65536.;
vtch(3);
point(lastsx, lasty);
lastsx =- 2000.*time/totime;
point(lastsx, lasty-scale);
if (ccnt!=0 || lastx!=0.0) {
vtch(3);
point(lastx, lasty);
lastx = -time*2000./maxtime;
point(lastx, lasty);
}
lasty =- scale;
}
scale = 4096./(highpc-lowpc);
lastx = 50.;
for(np = nl; np<npe; np++) {
if(np->value < lowpc)
continue;
if(np->value >= highpc)
continue;
time = np->time/totime;
lasty = 2048. - (np->value - lowpc)*scale;
vtch(3);
point(0., lasty);
point(50., lasty);
vtch(3);
point(lastx-50., lasty);
point(lastx, lasty);
vtch(9);
point(lastx+10., lasty+60.);
vtch(1);
vtch(3);
for(j=0; j<8; j++)
if(np->name[j] != '_')
vtch(np->name[j]);
vtch(0);
lastx =+ 500.;
if(lastx > 2000.)
lastx = 50.;
}
done();
print:
printf(" name %%time #call ms/call\n");
if (!lflg)
qsort(nl, nname, 18, &timcmp);
for (np = nl; np<npe-1; np++) {
time = np->time/totime;
printf("%8.8s%6.1f", np->name, 100*time);
fnc = ltod(np->ncall);
if (fnc != 0.0) {
printf("%6s", locv(np->ncall[0], np->ncall[1]));
printf(" %7.2f\n", np->time/(fnc*.06));
} else
printf("\n");
}
done();
}
min(a, b)
{
if (a<b)
return(a);
return(b);
}
max(a, b)
{
if (a>b)
return(a);
return(b);
}
valcmp(p1, p2)
struct nl *p1, *p2;
{
return(p1->value - p2->value);
}
timcmp(p1, p2)
struct nl *p1, *p2;
{
float d;
d = p2->time - p1->time;
if (d > 0.0)
return(1);
if (d < 0.0)
return(-1);
return(0);
}
vtch(c)
int c;
{
putchar(c&0377);
}
point(x, y)
float x, y;
{
point1(x);
point1(y);
}
putchar(c)
{
putc(c, obuf);
}
point1(xy)
float xy;
{
int ixy;
struct { char b1; char b2;};
if(xy > 2047.)
xy = 2047.;
if(xy < -2048.)
xy = -2048.;
ixy = xy;
vtch(ixy.b1);
vtch(ixy.b2);
}
done()
{
fflush(obuf);
exit();
}
initf(f)
{
ibuf[0] = f;
ibuf[1] = 0;
ibuf[2] = 0;
ibuf[3] = 0;
}
+292
View File
@@ -0,0 +1,292 @@
#
/*
* ps - process status
* examine and print certain things about processes
*/
#include "/usr/sys/param.h"
#include "/usr/sys/proc.h"
#include "/usr/sys/tty.h"
#include "/usr/sys/user.h"
struct {
char name[8];
int type;
char *value;
} nl[3];
struct proc proc[NPROC];
struct tty tty;
struct user u;
int lflg;
int kflg;
int xflg;
int tflg;
int aflg;
int mem;
int swap;
int stbuf[257];
int ndev;
char devc[65];
int devl[65];
int devt[65];
char *coref;
struct ibuf {
char idevmin, idevmaj;
int inum;
int iflags;
char inl;
char iuid;
char igid;
char isize0;
int isize;
int iaddr[8];
char *ictime[2];
char *imtime[2];
int fill;
};
int obuf[259];
main(argc, argv)
char **argv;
{
struct proc *p;
int n, b;
int i, c, mtty;
char *ap;
int uid, puid;
obuf[0] = 1;
if (argc>1) {
ap = argv[1];
while (*ap) switch (*ap++) {
case 'a':
aflg++;
break;
case 't':
tflg++;
break;
case 'x':
xflg++;
break;
case 'l':
lflg++;
break;
case 'k':
kflg++;
break;
}
}
if(chdir("/dev") < 0) {
printf("cannot change to /dev\n");
done();
}
setup(&nl[0], "_proc");
setup(&nl[1], "_swapdev");
nlist(argc>2? argv[2]:"/unix", nl);
if (nl[0].type==0) {
printf("No namelist\n");
return;
}
coref = "/dev/mem";
if(kflg)
coref = "/usr/sys/core";
if ((mem = open(coref, 0)) < 0) {
printf("No mem\n");
done();
}
seek(mem, nl[1].value, 0);
read(mem, &nl[1].value, 2);
seek(mem, nl[0].value, 0);
read(mem, proc, sizeof proc);
getdev();
mtty = ttyn(0);
uid = getuid() & 0377;
if(lflg)
printf("TTY F S UID PID PRI ADDR SZ WCHAN COMMAND\n"); else
printf("TTY PID COMMAND\n");
for (i=0; i<NPROC; i++) {
if (proc[i].p_stat==0)
continue;
if (proc[i].p_ttyp==0) {
if (xflg==0)
continue;
c = '?';
} else {
for(c=0; c<ndev; c++)
if(devt[c] == proc[i].p_ttyp) {
c = devc[c];
goto out;
}
seek(mem, proc[i].p_ttyp, 0);
read(mem, &tty, sizeof tty);
for(c=0; c<ndev; c++)
if(devl[c] == tty.t_dev) {
devt[c] = proc[i].p_ttyp;
c = devc[c];
goto out;
}
c = '?';
out:;
}
puid = proc[i].p_uid & 0377;
if (uid != puid && aflg==0)
continue;
if (lflg || c!=mtty)
printf("%c:", c);
else
printf(" ");
if (lflg) {
printf("%3o %c%4d", proc[i].p_flag,
"0SWRIZT"[proc[i].p_stat], puid);
}
printf("%6l", proc[i].p_pid);
if (lflg) {
printf("%4d%5o%4d", proc[i].p_pri, proc[i].p_addr,
(proc[i].p_size+7)>>3);
if (proc[i].p_wchan)
printf("%7o", proc[i].p_wchan); else
printf(" ");
}
if (proc[i].p_stat==5)
printf(" <defunct>");
else
prcom(i);
printf("\n");
}
done();
}
getdev()
{
register struct { int dir_ino; char dir_n[14]; } *p;
register i, c;
int f;
char dbuf[512];
int sbuf[20];
f = open("/dev");
if(f < 0) {
printf("cannot open /dev\n");
done();
}
swap = -1;
c = 0;
loop:
i = read(f, dbuf, 512);
if(i <= 0) {
close(f);
if(swap < 0) {
printf("no swap device\n");
done();
}
ndev = c;
return;
}
while(i < 512)
dbuf[i++] = 0;
for(p = dbuf; p < dbuf+512; p++) {
if(p->dir_ino == 0)
continue;
if(p->dir_n[0] == 't' &&
p->dir_n[1] == 't' &&
p->dir_n[2] == 'y' &&
p->dir_n[4] == 0 &&
p->dir_n[3] != 0) {
if(stat(p->dir_n, sbuf) < 0)
continue;
devc[c] = p->dir_n[3];
devl[c] = sbuf->iaddr[0];
c++;
continue;
}
if(swap >= 0)
continue;
if(stat(p->dir_n, sbuf) < 0)
continue;
if((sbuf->iflags & 060000) != 060000)
continue;
if(sbuf->iaddr[0] == nl[1].value)
swap = open(p->dir_n, 0);
}
goto loop;
}
setup(p, s)
char *p, *s;
{
while (*p++ = *s++);
}
prcom(i)
{
int baddr, laddr, mf;
register int *ip;
register char *cp, *cp1;
int c, nbad;
baddr = 0;
laddr = 0;
if (proc[i].p_flag&SLOAD) {
laddr = proc[i].p_addr;
mf = mem;
} else {
baddr = proc[i].p_addr;
mf = swap;
}
laddr =+ proc[i].p_size - 8;
baddr =+ laddr>>3;
laddr = (laddr&07)<<6;
seek(mf, baddr, 3);
seek(mf, laddr, 1);
if (read(mf, stbuf, 512) != 512)
return(0);
for (ip = &stbuf[256]; ip > &stbuf[0];) {
if (*--ip == -1) {
cp = ip+1;
if (*cp==0)
cp++;
nbad = 0;
for (cp1 = cp; cp1 < &stbuf[256]; cp1++) {
c = *cp1;
if (c==0)
*cp1 = ' ';
else if (c < ' ' || c > 0176) {
if (++nbad >= 5) {
*cp1++ = ' ';
break;
}
*cp1 = '?';
}
}
while (*--cp1==' ')
*cp1 = 0;
printf(lflg?" %.16s":" %.64s", cp);
return(1);
}
}
return(0);
}
done()
{
fflush(obuf);
exit();
}
putchar(c)
{
putc(c, obuf);
}
+222
View File
@@ -0,0 +1,222 @@
/* permuted title index */
char *tfil "/tmp/p.tmp";
char *sw[] {
"a",
"an",
"and",
"as",
"for",
"is",
"of",
"on",
"or",
"the",
"to",
"up",
0};
char line[200];
int ch;
int ptflg;
int llen 72;
main(argc, argv)
int argc;
char *argv[];
{
extern fin, fout;
extern onintr();
int f;
if(argc>1 && *argv[1]=='-') {
llen = 100;
ptflg++;
argc--;
argv++;
}
if(argc<2) {
printf("arg count\n");
exit();
}
fin = open(argv[1]);
if(fin < 0) {
printf("%s: cannot open\n", argv[1]);
exit();
}
f = creat(tfil, 0600);
if(f < 0) {
printf("cannot create %s\n", tfil);
exit();
}
fout = f;
if ((signal(2, 1) & 01) ==0)
signal(2, onintr);
pass1();
flush();
close(fin);
fin = 0;
close(fout);
fout = 1;
f = fork();
if(f < 0) {
printf("try again\n");
exit();
}
if(f == 0) {
execl("/bin/sort", "sort", "-d", "-o", tfil, tfil, 0);
execl("/usr/bin/sort", "sort", "-d", "-o", tfil, tfil, 0);
printf("someone moved sort\n");
exit();
}
while(wait() != f);
fin = open(tfil, 0);
if(fin < 0) {
printf("cannot reopen %s\n", tfil);
exit();
}
if (argc>=3)
f = creat(argv[2], 0666);
else
f = dup(1);
if(f < 0) {
printf("%s: cannot open\n", argv[2]);
exit();
}
fout = f;
pass2();
flush();
onintr();
}
onintr()
{
unlink(tfil);
exit();
}
pass1()
{
int n, c, i, ll, j, k, cc, ccc;
loop:
if ((c=getchar())=='\0')
return;
n = 0;
i = 0;
while(c!='\n' && c!='\0') {
if(c == '(')
c = 0177;
if(c==' ' || c=='\t') {
i++;
c = getchar();
continue;
}
if(i) {
i = 0;
if(n<=llen) line[n++] = ' ';
}
if (n<=llen) line[n++] = c;
c = getchar();
}
ll = n;
line[n++] = 0;
i = -1;
l1:
while((cc=line[++i])==' ');
n = i;
j = 0;
while(sw[j]) {
i = n;
k = 0;
while ((cc=sw[j][k++])==line[i++]);
if(cc==0 && ((ccc=line[--i])==' '||ccc==0))
goto l1;
j++;
}
i = n;
while (c=line[n++]) putchar(c);
putchar('~');
n = 0;
while (n<i) {
c = line[n++];
if (c!=' ' || n!=i)
putchar(c);
}
putchar('\n');
while((c=line[i++])!=0 && c!=' ');
--i;
if (c) goto l1;
goto loop;
}
pass2()
{
int i, n, c, tilde, llen2, nbfore, nafter;
llen2 = llen/2+6;
loop:
if ((c=getchar())=='\0')
return;
n = nbfore = nafter = 0;
tilde = -1;
while(c!='\n' && c!='\0') {
if(c == 0177)
c = '(';
if (n<=llen) line[n] = c;
if (c=='~') tilde = n;
if (tilde>=0) nafter++; else nbfore++;
n++;
c = getchar();
}
if (tilde<0)
tilde = n++;
nafter--;
if (nbfore>llen2) {
i = tilde;
while (nbfore > llen2)
while(line[--i]!=' ' && i>=0) nbfore--;
if (i<0) goto l1;
line[tilde] = 0200;
nafter =+ (tilde-i+2);
tilde = i;
}
if (nafter >= llen-llen2) {
i = tilde;
while(nafter-- >= llen-llen2)
while(line[++i]!=' ' && i<n) nafter--;
if (i>=n) goto l1;
line[tilde] = 0200;
nafter++;
tilde = i;
}
l1:
if(!ptflg) {
for(i=llen-llen2-nafter; i>=8; i =- 8)
putchar('\t');
while(--i>=0)
putchar(' ');
} else
printf(".xx \"");
i = tilde;
while (++i<n) p1char(line[i]);
if(!ptflg)
printf(" "); else
printf("\" \"");
i = -1;
while(++i<tilde) p1char(line[i]);
if(ptflg)
putchar('"');
putchar('\n');
goto loop;
}
p1char(c)
{
if ((c&0377) == 0200) {
putchar('.');
putchar('.');
c = '.';
}
putchar(c);
}
+61
View File
@@ -0,0 +1,61 @@
char dot[] ".";
char dotdot[] "..";
char root[] "/";
char name[512];
int file, off -1;
struct statb {int devn, inum, i[18];}x;
struct entry { int jnum; char name[16];}y;
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;
}
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();
}
prname() {
if(off<0)off=0;
name[off] = '\n';
write(1,name,off+1);
exit();
}
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];
}
+460
View File
@@ -0,0 +1,460 @@
#define NF 10
#define NL 200
#define NC 200
#define SL 100
#define NA 10
int tflag;
int xx[NL];
char score[NL];
int rights;
int wrongs;
int guesses;
int buf[259];
int nl 0;
int na NA;
int inc;
int ptr 0;
int nc 0;
char line[150];
char response[100];
char *tmp[NF];
int select[NF];
readline()
{
char *t;
loop:
for(t=line;(*t=getc(buf))!=-1;t++) {
nc++;
if(*t==' '&&(t==line||t[-1]==' '))
t--;
if(*t=='\n') {
if(t[-1]=='\\') /*inexact test*/
continue;
while(t>line&&t[-1]==' ')
*--t = '\n';
*++t = 0;
return(1);
}
if(t-line>=NC) {
printf("Too hard for me\n");
do {
*line = getc(buf);
if(*line==0377)
return(0);
} while(*line!='\n');
goto loop;
}
}
return(0);
}
char *eu;
char *ev;
cmp(u,v)
{
int x;
eu = u;
ev = v;
x = disj(1);
if(x!=1)
return(x);
return(eat(1,0));
}
disj(s)
{
int t, x;
char *u;
u = eu;
t = 0;
for(;;) {
x = string(s);
if(x>1)
return(x);
switch(*ev) {
case 0:
case ']':
case '}':
return(t|x&s);
case '|':
ev++;
t =| s;
s = 0;
continue;
}
if(s) eu = u;
if(string(0)>1)
return(2);
switch(*ev) {
case 0:
case ']':
return(0);
case '}':
return(1);
case '|':
ev++;
continue;
default:
return(2);
}
}
}
string(s)
{
int x;
for(;;) {
switch(*ev) {
case 0:
case '|':
case ']':
case '}':
return(1);
case '\\':
ev++;
if(*ev==0)
return(2);
if(*ev=='\n') {
ev++;
continue;
}
default:
if(eat(s,*ev)==1)
continue;
return(0);
case '[':
ev++;
x = disj(s);
if(*ev!=']' || x>1)
return(2);
ev++;
if(s==0)
continue;
if(x==0)
return(0);
continue;
case '{':
ev++;
x = disj(s);
if(*ev!='}'||x>1)
return(2);
ev++;
continue;
}
}
}
eat(s,c)
char c;
{
if(*ev!=c)
return(2);
if(s==0) {
ev++;
return(1);
}
if(fold(*eu)!=fold(c))
return(0);
eu++;
ev++;
return(1);
}
fold(c)
char c;
{
if(c<'A'||c>'Z')
return(c);
return(c|040);
}
publish(t)
char *t;
{
ev = t;
pub1(1);
}
pub1(s)
{
for(;;ev++){
switch(*ev) {
case '|':
s = 0;
ev;
continue;
case ']':
case '}':
case 0:
return;
case '[':
case '{':
ev++;
pub1(s);
ev;
continue;
case '\\':
if(*++ev=='\n')
continue;
default:
if(s)
putchar(*ev);
}
}
}
segment(u,w)
char *u, *w[];
{
char *s;
int i;
char *t;
s = u;
for(i=0;i<NF;i++) {
u = s;
t = w[i];
while(*s!=':'&&*s!='\n'&&s-u<SL) {
if(*s=='\\') {
if(s[1] == '\n') {
s =+ 2;
continue;
}
*t++ = *s++;
}
*t++ = *s++;
}
while(*s!=':'&&*s!='\n')
s++;
*t = 0;
if(*s++=='\n') {
return(i+1);
}
}
printf("Too many facts about one thing\n");
}
perm(u,m,v,n,p)
int p[];
char *u[], *v[];
{
int i, j;
int x;
for(i=0;i<m;i++) {
for(j=0;j<n;j++) {
x = cmp(u[i],v[j]);
if(x>1) badinfo();
if(x==0)
continue;
p[i] = j;
goto uloop;
}
return(0);
uloop: ;
}
return(1);
}
find(u,m)
char *u[];
{
int n;
while(readline()){
n = segment(line,tmp);
if(perm(u,m,tmp+1,n-1,select))
return(1);
}
return(0);
}
readindex()
{
xx[0] = nc = 0;
while(readline()) {
xx[++nl] = nc;
if(nl>=NL) {
printf("I've forgotten some of it\n");
break;
}
}
}
talloc()
{
int i;
for(i=0;i<NF;i++)
tmp[i] = alloc(SL);
}
main(argc,argv)
char *argv[];
{
int i;
int x;
char *info;
int tvec[2];
char *t;
extern done();
int count;
info = "/usr/lib/quiz/index";
time(tvec);
inc = tvec[1]&077774|01;
loop:
if(argc>1&&*argv[1]=='-') {
switch(argv[1][1]) {
case 'i':
if(argc>2)
info = argv[2];
argc =- 2;
argv =+ 2;
goto loop;
case 't':
tflag = 1;
argc--;
argv++;
goto loop;
}
}
if(fopen(info,buf)== -1) {
printf("No info\n");
exit();
}
talloc();
if(argc<=2)
instruct(info);
signal(2,done);
argv[argc] = 0;
if(find(&argv[1],argc-1)==0)
dunno();
close(buf[0]);
if(fopen(tmp[0],buf)== -1)
dunno();
readindex();
if(!tflag || na>nl)
na = nl;
for(;;) {
i = next();
seek(buf[0],xx[i],0);
read(buf[0],line,xx[i+1]-xx[i]);
segment(line,tmp);
if(*tmp[select[0]] == '\0' || *tmp[select[1]] == '\0') {
score[i] = 1;
continue;
}
publish(tmp[select[0]]);
printf("\n");
for(count=0;;count++) {
if(query(response)==0) {
publish(tmp[select[1]]);
printf("\n");
if(count==0) wrongs++;
score[i] = tflag?-1:1;
break;
}
x = cmp(response,tmp[select[1]]);
if(x>1) badinfo();
if(x==1) {
printf("Right!\n");
if(count==0) rights++;
if(++score[i]>=1 && na<nl)
na++;
break;
}
printf("What?\n");
if(count==0) wrongs++;
score[i] = tflag?-1:1;
}
guesses =+ count;
}
}
query(r)
char *r;
{
char *t;
for(t=r;;t++) {
if(read(0,t,1)==0)
done();
if(*t==' '&&(t==r||t[-1]==' '))
t--;
if(*t=='\n') {
while(t>r&&t[-1]==' ')
*--t = '\n';
break;
}
}
*t = 0;
return(t-r);
}
next()
{
int flag;
inc = inc*3125&077777;
ptr = (inc>>2)%na;
flag = 0;
while(score[ptr]>0)
if(++ptr>=na) {
ptr = 0;
if(flag) done();
flag = 1;
}
return(ptr);
}
done()
{
printf("\nRights %d, wrongs %d, ", rights, wrongs);
if(guesses)
printf("extra guesses %d, ", guesses);
printf("score %d%%\n",100*rights/(rights+wrongs));
exit();
}
instruct(info)
{
char *t;
int i, n;
printf("Subjects:\n\n");
while(readline()) {
printf("-");
n = segment(line,tmp);
for(i=1;i<n;i++) {
printf(" ");
publish(tmp[i]);
}
printf("\n");
}
printf("\n");
if(fopen(info,buf)== -1)
abort();
readline();
segment(line,tmp);
printf("For example,\n");
printf(" quiz ");
publish(tmp[1]);
printf(" ");
publish(tmp[2]);
printf("\nasks you a ");
publish(tmp[1]);
printf(" and you answer the ");
publish(tmp[2]);
printf("\n quiz ");
publish(tmp[2]);
printf(" ");
publish(tmp[1]);
printf("\nworks the other way around\n");
printf("\nType empty line to get correct answer.\n");
exit();
}
badinfo(){
printf("Bad info %s\n",line);
}
dunno()
{
printf("I don't know about that\n");
exit();
}
+379
View File
@@ -0,0 +1,379 @@
/* Ratfor-Fortran command */
extern int fin, fout;
char ts[1000];
char *tsp ts;
char *av[50];
char *rlist[50];
int nr 0;
char *llist[50];
int nl 0;
int nxo 0;
int bdcount 0; /* count block data files generated */
int rflag;
int dflag 0;
int vflag 1;
int fflag;
int cflag;
char *complr "/usr/fort/fc1";
char *ratfor "/usr/lib/ratfor";
main(argc, argv)
char *argv[]; {
char *t;
int i, j, c;
int dexit();
for(i=0; ++i < argc; ) {
if(*argv[i] == '-')
switch (argv[i][1]) {
default:
goto passa;
case 'd':
dflag = 1;
break;
case 'v':
vflag = 0;
break;
case 'r':
rflag = fflag = cflag = 1;
break;
case 'f':
fflag = 1;
break;
case 'c':
cflag = 1;
break;
case '2':
complr = "/usr/fort/fc2";
break;
}
else {
passa:
t = argv[i];
if( (c=getsuf(t))=='r' )
ratcomp(t);
else if( c=='f') {
fortcomp(t);
llenter(setsuf(copy(t),'o'));
}
else
llenter(copy(t));
}
}
if(rflag)
dexit();
if ((signal(2, 1) & 01) == 0)
signal(2, &dexit);
if(dflag)
printf("cflag=%d, nl=%d\n", cflag, nl);
if (cflag==0 && nl!=0) {
i = 0;
av[0] = "ld";
av[1] = "-x";
av[2] = "/lib/fr0.o";
j = 3;
while(i<nl)
av[j++] = llist[i++];
av[j++] = "-lf";
av[j++] = "/lib/filib.a";
av[j++] = "-l";
av[j++] = 0;
callsys("/bin/ld", av);
}
dexit();
}
dexit()
{
int i;
cunlink("ratjunk");
cunlink("f.tmp1");
exit(0);
}
ratcomp(s) char *s; {
int i,j,t,nerr,status;
nr = 0;
if(vflag)
printf("%s:\n",s);
av[0] = ratfor;
av[1] = s;
av[2] = 0;
if( (t=fork())==0 ){
close(1);
fout = creat("ratjunk", 0666);
execv(ratfor, av);
fout = 2;
error("can't ratfor\n");
exit(1);
}
while( t!=wait(&status) );
if( (t=(status&0377)) != 0 && t!=14 )
dexit(1);
t = (status>>8) & 0377;
if( t )
return(++cflag);
splitup();
nerr=0;
for(i=0; i<nr; i++){
if( vflag ) printf(" ");
if( fortcomp(rlist[i]) )
nerr++;
}
if( nerr )
return(1);
av[0] = "ld";
av[1] = "-r";
av[2] = "-x";
j = 3;
for(i=0; i<nr; i++)
av[j++] = rlist[i];
av[j] = 0;
callsys("/bin/ld", av);
t = setsuf(copy(s),'o');
if( move("a.out", t) )
cflag++;
llenter(t);
for(i=0; i<nr; i++) {
if( nodup(llist,rlist[i]) )
cunlink(rlist[i]);
if( fflag==0 )
cunlink(setsuf(rlist[i],'f'));
}
}
fortcomp(s) char *s; {
int t;
if( vflag ) printf("%s:\n", s);
av[0] = complr;
av[1] = s;
av[2] = 0;
if( callsys(complr, av) )
return(++cflag);
av[0] = "as";
av[1] = "-";
av[2] = "f.tmp1";
av[3] = 0;
callsys("/bin/as", av);
t = setsuf(s, 'o');
if( move("a.out", t) )
return(++cflag);
return(0);
}
getsuf(s)
char s[];
{
int c;
char t, *os;
c = 0;
os = s;
while(t = *s++)
if (t=='/')
c = 0;
else
c++;
s =- 3;
if (c<=14 && c>2 && *s++=='.')
return(*s);
return(0);
}
setsuf(s, ch)
char s[];
{
char *os;
os = s;
while(*s++);
s[-2] = ch;
return(os);
}
move(s,t) char *s, *t; {
cunlink(t);
if(link(s, t) || cunlink(s)) {
printf("move failed: %s\n", t);
return(1);
}
return(0);
}
callsys(f, v)
char f[], *v[]; {
int i, t, status;
if(dflag){
for(i=0; v[i]; i++)
printf("%s ", v[i]);
putchar('\n');
}
if ((t=fork())==0) {
execv(f, v);
printf("Can't find %s\n", f);
exit(1);
} else
if (t == -1) {
printf("Try again\n");
return(1);
}
while(t!=wait(&status));
if ((t=(status&0377)) != 0 && t!=14) {
if (t!=2) /* interrupt */
printf("Fatal error in %s\n", f);
dexit();
}
t = (status>>8) & 0377;
if(dflag && status != 0)
printf("status = %d\n", t);
return(t);
}
copy(s)
char s[]; {
char *otsp;
otsp = tsp;
while(*tsp++ = *s++);
return(otsp);
}
nodup(l, s)
char **l, s[]; {
char *t, *os, c;
if (getsuf(s) != 'o')
return(1);
os = s;
while(t = *l++) {
s = os;
while(c = *s++)
if (c != *t++)
break;
if (*t++ == '\0')
return(0);
}
return(1);
}
llenter(t) char *t; {
if (nodup(llist, t)) {
llist[nl++] = t;
if (getsuf(t)=='o')
nxo++;
}
}
cunlink(f)
char *f;
{
if( dflag )
printf("unlink %s\n", f);
if (f==0)
return(0);
return(unlink(f));
}
splitup(){
char in[200], fname[20];
int buf[259];
int i,fd,c;
if( (fin=open("ratjunk", 0)) < 0)
error("can't open ratjunk\n");
while( gets(in) ){
getname(in, fname);
savename(fname);
if( (fd = fcreat(fname, buf)) < 0)
error("can't open %s", fname);
puts(in,buf);
while( ! endcard(in) ){
gets(in);
puts(in,buf);
}
fflush(buf);
close(fd);
}
close(fin);
}
gets(s) char *s; {
int c;
while( (*s++=c=getchar()) != '\n' && c != '\0' );
*s = '\0';
return(c);
}
puts(s,b) char *s; int *b; {
while( *s )
putc(*s++, b);
}
savename(s) char *s; {
rlist[nr++] = copy(s);
}
getname(s,f) char *s,*f; {
int i,j,c;
loop:
while( *s == ' ' || *s == '\t' )
s++;
if( compar(s,"subroutine") ){ s =+ 10; goto bot; }
else if( compar( s,"function") ){ s =+ 8; goto bot; }
else if( compar(s,"real") ){ s =+ 4; goto loop; }
else if( compar(s,"integer") ){ s =+ 7; goto loop; }
else if( compar(s,"logical") ){ s =+ 7; goto loop; }
else if( compar(s,"double") ){ s =+ 6; goto loop; }
else if( compar(s,"precision") ){ s =+ 9; goto loop; }
else if( compar(s,"complex") ){ s =+ 7; goto loop; }
else if( compar(s,"block") ){
s = "blockdata ";
s[9] = (bdcount++) + '0';
goto bot;
}
else {
for(i=0; f[i]="MAIN.f"[i]; i++);
return;
}
bot:
while( *s == ' ' || *s == '\t' )
s++;
for(i=0; alphanum(s[i]); i++)
f[i] = s[i];
f[i++] = '.';
f[i++] = 'f';
f[i++] = '\0';
}
compar(s,t) char *s,*t; {
while( *t )
if( *s++ != *t++ )
return(0);
return(1);
}
alphanum(c) int c; {
return( (c>='a' && c<='z')
|| (c>='A' && c<='Z')
|| (c>='0' && c<='9') );
}
endcard(s) char *s; {
if( *s==0 )
return(1);
while( *s==' ' || *s=='\t' )
s++;
if( *s!='e' || *(s+1)!='n' || *(s+2)!='d' || *(s+3)!='\n' )
return(0);
return(1);
}
error(s1, s2){
fout = 1;
printf(s1,s2);
putchar('\n');
flush(1);
cflag++;
}
+552
View File
@@ -0,0 +1,552 @@
#
/*
* restore from incremental dumps
*/
char *dargv[]
{
0,
"t",
0
};
char *ifile;
char *ofile;
#include "/usr/sys/ino.h"
#include "/usr/sys/filsys.h"
struct filsys sblock;
int isize;
int *talist;
int fi;
int buf[256];
int dbuf[256];
int cbuf[256];
char *date[2];
char *ddate[2];
int fo;
int pher;
char *tsize 15000;
int iflg;
int wflg;
int cflg;
char file[10];
int ilist[100];
main(argc, argv)
char **argv;
{
char *key;
register *tap, *p;
register struct inode *ip;
int i, com, sz, *q, l;
ifile = "/dev/mt0";
if(argc == 1) {
argv = dargv;
for(argc = 1; dargv[argc]; argc++);
}
argc--;
argv++;
key = *argv;
while(*key)
switch(*key++) {
default:
printf("bad character in key\n");
exit();
case 't':
case 'r':
case 'x':
com = key[-1];
continue;
case 'i':
iflg++;
continue;
case '-':
continue;
case 'c':
cflg++;
continue;
case 'f':
argv++;
argc--;
ifile = *argv;
continue;
case 'w':
wflg++;
continue;
}
otape();
sread(buf, 0);
tap = buf;
isize = *tap++;
*tap++; /* fsize */
date[0] = *tap++;
date[1] = *tap++;
ddate[0] = *tap++;
ddate[1] = *tap++;
tsize = *tap++;
i = size(0, isize*32);
talist = sbrk(i*512);
tap = talist;
while(i--) {
tread(tap, 0);
tap =+ 256;
}
switch(com) {
case 't':
l = 0;
com = 0;
pdate(ddate);
pdate(date);
tap = talist;
for(i=0; i<isize*16; i++) {
sz = *tap++;
if(sz == 0 || sz == -1) {
if(com == 0)
continue;
if(i == com) {
printf("%l", i);
l =+ 5;
} else {
printf("%l-%l", com, i);
l =+ 10;
}
if(l > 60) {
printf("\n");
l = 0;
} else
printf(",");
com = 0;
} else
if(com == 0)
com = i+1;
}
if(com)
printf("%l-\n", com);
printf("\n");
exit();
case 'r':
if(argc <= 1) {
printf("no filesystem name\n");
exit();
}
ofile = argv[1];
fo = open(ofile, 2);
if(fo < 0) {
printf("can not open %s\n", ofile);
exit();
}
printf("last chance before scribbling on %s\n", ofile);
getchar();
dread(1, &sblock);
tap = talist;
for(i=0; i<sblock.s_isize; i++) {
if(i >= isize)
break;
dread(i+2, buf);
for(ip = &buf[0]; ip < &buf[256]; ip++) {
sz = *tap++;
if(sz == 0)
continue;
dealoc(ip);
if(sz == -1) {
for(p = ip; p < &ip->i_mtime[2]; )
*p++ = 0;
continue;
}
sread(dbuf, 0);
q = dbuf;
for(p = ip; p < &ip->i_mtime[2]; )
*p++ = *q++;
restor(ip, sz-1);
}
dwrite(i+2, buf);
}
dwrite(1, &sblock);
com = 0;
for(; i < isize; i++)
for(l = 0; l < 16; l++) {
sz = *tap++;
if(sz != 0 && sz != -1)
com++;
}
if(com)
printf("%l files not restored - small ilist\n", com);
exit();
case 'x':
i = 0;
tap = ilist;
while(argc > 1) {
i++;
sz = number(argv[1]);
argv++;
argc--;
if(sz <= 0 || sz >=isize*16) {
printf("%l not in range\n", sz);
continue;
}
if(talist[sz-1] == 0) {
printf("%l not dumped\n", sz);
continue;
}
if(talist[sz-1] == -1) {
printf("%l does not exist\n", sz);
continue;
}
*tap++ = sz;
}
if(i != 0 && ilist[0] == 0)
exit();
tap = talist;
for(i=1; i<=isize*16; i++) {
if(ilist[0] != 0) {
for(sz=0; ilist[sz]; sz++)
if(ilist[sz] == i)
goto yes;
sz = *tap++;
no:
if(sz == -1)
sz = 0;
while(sz--)
tread(dbuf, 1);
continue;
}
yes:
sz = *tap++;
if(sz == 0 || sz == -1)
continue;
fo = dwait(i);
if(fo < 0)
goto no;
sz--;
sread(buf, 0);
ip = buf;
while(sz--) {
tread(dbuf, 0);
com = 512;
if(ip->i_size0 == 0 && ip->i_size1 < 512)
com = ip->i_size1;
write(fo, dbuf, com);
if(com > ip->i_size1)
ip->i_size0--;
ip->i_size1 =- com;
}
close(fo);
chmod(file, ip->i_mode);
chown(file, ip->i_uid);
}
exit();
}
}
dealoc(p)
struct inode *p;
{
register struct inode *ip;
register i, j;
int k;
int xbuf[256], ybuf[256];
ip = p;
if(ip->i_mode & (IFCHR&IFBLK))
return;
for(i=7; i>=0; i--)
if(ip->i_addr[i]) {
if(ip->i_mode&ILARG) {
dread(ip->i_addr[i], xbuf);
for(j=255; j>=0; j--)
if(xbuf[j]) {
if(i == 7) {
dread(xbuf[j], ybuf);
for(k=255; k>=0; k--)
if(ybuf[k])
free(ybuf[k]);
}
free(xbuf[j]);
}
}
free(ip->i_addr[i]);
}
}
restor(p, sz)
struct inode *p;
{
register struct inode *ip;
register i, j;
int xbuf[256];
ip = p;
if(ip->i_mode & (IFCHR&IFBLK))
return;
for(i=0; i<8; i++)
ip->i_addr[i] = 0;
if(sz <= 8) {
for(i=0; i<sz; i++)
ip->i_addr[i] = rcop();
ip->i_mode =& ~ILARG;
return;
}
for(i=0; i<256; i++)
xbuf[i] = 0;
for(j=0; sz >= 256; j++) {
if(j <= 7)
ip->i_addr[j] = alloc();
if(j >= 7)
xbuf[j-7] = alloc();
for(i=0; i<256; i++)
dbuf[i] = rcop();
if(j < 7)
dwrite(ip->i_addr[j], dbuf); else
dwrite(xbuf[j-7], dbuf);
sz =- 256;
}
if(sz) {
if(j <= 7)
ip->i_addr[j] = alloc();
if(j >= 7)
xbuf[j-7] = alloc();
for(i=0; i<sz; i++)
dbuf[i] = rcop();
for(; i<256; i++)
dbuf[i] = 0;
if(j < 7)
dwrite(ip->i_addr[j], dbuf); else
dwrite(xbuf[j-7], dbuf);
}
if(j >= 7)
dwrite(ip->i_addr[7], xbuf);
ip->i_mode =| ILARG;
}
rcop()
{
register b;
b = alloc();
tread(cbuf, 0);
dwrite(b, cbuf);
return(b);
}
pdate(d)
int *d;
{
if(d[0] == 0 && d[1] == 0)
printf("the epoch\n"); else
printf(ctime(d));
}
dread(bno, b)
{
seek(fo, bno, 3);
if(read(fo, b, 512) != 512) {
printf("disk read error %l\n", bno);
exit();
}
}
dwrite(bno, b)
{
seek(fo, bno, 3);
if(write(fo, b, 512) != 512) {
printf("disk write error %l\n", bno);
exit();
}
}
sread(b, flag)
int *b;
{
register i, s, *p;
tread(b, flag);
if(flag)
return;
i = 256;
s = 0;
p = b;
while(i--)
s =+ *p++;
if(s != 031415) {
printf("checksum error\n");
if(!iflg)
exit();
}
}
tread(b, flag)
int *b;
{
register c;
static char *pta, *ata, ctflg;
if(pta++ >= tsize) {
pta = 1;
ata = 0;
close(fi);
otape();
ctflg++;
}
if(flag)
return;
if(ctflg) {
printf("change tapes\n");
if(ctflg > 1)
printf("skip %d tapes\n", ctflg-1);
while((c = getchar()) != '\n')
if(c == 0)
exit();
ctflg = 0;
}
ata++;
if(iflg)
for(; pta != ata; ata++)
read(fi, b, 512);
if(pta != ata) {
seek(fi, pta-ata, 4);
ata = pta;
}
if(read(fi, b, 512) != 512) {
printf("tape read error %l\n", ata-1);
if(!iflg)
exit();
for(c=0; c<256; c++)
b[c] = 0;
}
}
number(s)
char *s;
{
register n, c;
n = 0;
while(c = *s++) {
if(c<'0' || c>'9')
continue;
n = n*10+c-'0';
}
return(n);
}
size(s0, s1)
{
register s;
extern ldivr;
s = ldiv(s0&0377, s1, 512);
if(ldivr)
s++;
return(s);
}
otape()
{
register char *p;
fi = open(ifile, 0);
if(fi < 0) {
printf("can not open %s\n", ifile);
exit();
}
if(!cflg)
return;
p = ifile;
while(*p++)
;
p[-2]++;
}
dwait(ino)
{
register i;
dconv(ino, file);
loop:
if(wflg) {
printf("%s ", file);
i = getchar();
if(i == 'x')
exit();
if(i == '\n')
return(-1);
if(i != 'y')
goto flush;
i = getchar();
if(i != '\n') {
flush:
while((i=getchar()) != '\n')
if(i == '\0')
exit();
goto loop;
}
}
i = creat(file, 0666);
return(i);
}
dconv(n, p)
char *p;
{
register i;
if(i = ldiv(0, n, 10))
p = dconv(i, p);
*p++ = lrem(0, n, 10) + '0';
*p = '\0';
return(p);
}
alloc()
{
register b, i;
i = --sblock.s_nfree;
if(i<0 || i>=100) {
printf("bad freeblock\n");
exit();
}
b = sblock.s_free[i];
if(b == 0) {
printf("out of freelist\n");
exit();
}
if(sblock.s_nfree <= 0) {
dread(b, cbuf);
sblock.s_nfree = cbuf[0];
for(i=0; i<100; i++)
sblock.s_free[i] = cbuf[i+1];
}
return(b);
}
free(in)
{
register i;
if(sblock.s_nfree >= 100) {
cbuf[0] = sblock.s_nfree;
for(i=0; i<100; i++)
cbuf[i+1] = sblock.s_free[i];
sblock.s_nfree = 0;
dwrite(in, cbuf);
}
sblock.s_free[sblock.s_nfree++] = in;
}
+47
View File
@@ -0,0 +1,47 @@
/ rew -- rewind dec/mag tape
cmp (sp)+,$2
blt 1f
tst (sp)+
mov (sp)+,r0
movb (r0)+,r1
cmp r1,$'m
beq rewm
movb r1,tapx+8
tstb (r0)
bne error
1:
sys open; tapx; 0
br rew
rewm:
movb (r0)+,r1
beq 1f
movb r1,mtx+7
tstb (r0)
bne error
1:
sys open; mtx; 0
rew:
bes error
sys read; word; 2
bes error
sys exit
error:
mov $1,r0
sys write; 0f; 2
sys exit
0:
<?\n>
tapx:
</dev/tap0\0>
mtx:
</dev/mt0\0>
.even
.bss
word: .=.+2
+107
View File
@@ -0,0 +1,107 @@
main(argc, argv)
char *argv[];
{
char *arg;
int fflg, rflg;
fflg = 0;
rflg = 0;
while(--argc > 0) {
arg = *++argv;
if(arg[0] == '-') {
if(arg[1] == 'f') {
fflg++;
continue;
}
if(arg[1] == 'r') {
rflg++;
continue;
}
}
rm(arg, fflg, rflg);
}
}
struct stbuf {
int dev;
int inum;
int mode;
char nlink;
char uid;
char gid;
char siz0;
char siz1;
int addr[8];
int adate[2];
int mdate[2];
};
rm(arg, fflg, rflg)
char arg[];
{
char *p;
int buf[20];
int i, b;
if(stat(arg, buf)) {
printf("%s: non existent\n", arg);
return;
}
if((buf->mode & 060000) == 040000) {
if(rflg) {
i = fork();
if(i == -1) {
printf("%s: try again\n", arg);
return;
}
if(i) {
while(wait() != i);
return;
}
if(chdir(arg)) {
printf("%s: cannot chdir\n", arg);
exit();
}
p = 0;
execl("/etc/glob", "glob", "rm", "-r",
fflg? "-f": "*", fflg? "*": p, 0);
printf("%s: no glob\n", arg);
exit();
}
printf("%s: directory\n", arg);
return;
}
if(!fflg) {
if((getuid()&0377) == buf->uid)
b = 0200; else
b = 2;
if((buf->mode & b) == 0 && ttyn(0) != 'x') {
printf("%s: %o mode ", arg, buf->mode);
i = b = getchar();
i = b;
while(b != '\n' && b != '\0')
b = getchar();
if(i != 'y')
return;
}
}
if(unlink(arg))
printf("%s: not removed\n", arg);
}
putchar(c)
{
write(1, &c, 1);
}
getchar()
{
char c;
if(read(0, &c, 1) != 1) return(0);
return(c);
}
+106
View File
@@ -0,0 +1,106 @@
/ rmdir -- unlink directory
mov (sp)+,r5
tst (sp)+
loop:
dec r5
ble done
mov (sp)+,r1
mov $name,r2
clr r0
1:
inc r0
movb (r1)+,(r2)+
bne 1b
dec r2
dec r0
mov r0,size
cmp r2,$name
beq error
sys stat; name; stbuf
bes error
bic $!60000,stbuf+4
cmp $40000,stbuf+4
bne error
cmpb -1(r2),$'.
bne 1f
cmp r2,$name+1
beq error
cmpb -2(r2),$'/
beq error
cmpb -2(r2),$'.
bne 1f
cmp r2,$name+2
beq error
cmpb -3(r2),$'/
beq error
1:
sys open; name; 0
bes error
mov r0,r1
1:
mov r1,r0
sys read; stbuf; 16.
bes 1f
tst r0
beq 1f
tst stbuf
beq 1b
cmpb stbuf+2,$'.
bne error1
tstb stbuf+3
beq 1b
cmpb stbuf+3,$'.
bne error1
tstb stbuf+4
beq 1b
error1:
jsr pc,prname
mov r1,r0
sys close
mov $1,r0
sys write; mes1; emes1-mes1
br loop
1:
mov r1,r0
sys close
movb $'/,(r2)+
movb $'.,(r2)+
movb $'.,(r2)+
clrb (r2)
sys unlink; name
clrb -(r2)
sys unlink; name
clrb -2(r2)
sys unlink; name
br loop
error:
jsr pc,prname
mov $1,r0
sys write; mes2; emes2-mes2
br loop
prname:
mov $1,r0
sys write; name; size:..
rts pc
done:
sys exit
mes1:
< -- directory not empty\n>
emes1:
mes2:
< ?\n>
emes2:
.even
.bss
name: .=.+40.
stbuf: .=.+40.
+228
View File
@@ -0,0 +1,228 @@
cc -s -O mail.c
cmp a.out /bin/mail
cp a.out /bin/mail
cc -s -O mesg.c
cmp a.out /usr/bin/mesg
cp a.out /usr/bin/mesg
as mkdir.s
strip a.out
cmp a.out /bin/mkdir
cp a.out /bin/mkdir
cc -s -O mkfs.c
cmp a.out /etc/mkfs
cp a.out /etc/mkfs
cc -s -O mknod.c
cmp a.out /etc/mknod
cp a.out /etc/mknod
cc -s -O mount.c
cmp a.out /etc/mount
cp a.out /etc/mount
cc -s -O mv.c
cmp a.out /bin/mv
cp a.out /bin/mv
cc -s -O ncheck.c
cmp a.out /bin/ncheck
cp a.out /bin/ncheck
cc -s -O newgrp.c
cmp a.out /bin/newgrp
cp a.out /bin/newgrp
cc -s -O nice.c
cmp a.out /usr/bin/nice
cp a.out /usr/bin/nice
cc -s -O nm.c
cmp a.out /bin/nm
cp a.out /bin/nm
cc -s -O nohup.c
cmp a.out /usr/bin/nohup
cp a.out /usr/bin/nohup
cc -s -O od.c
cmp a.out /bin/od
cp a.out /bin/od
cc -s -O opr.c
cmp a.out /bin/opr
cp a.out /bin/opr
cc -s -O passwd.c
cmp a.out /bin/passwd
cp a.out /bin/passwd
as pfe.s
strip a.out
cmp a.out /usr/bin/pfe
cp a.out /usr/bin/pfe
cc -s -O pr.c
cmp a.out /bin/pr
cp a.out /bin/pr
cc -s -f -O prof.c
cmp a.out /usr/bin/prof
cp a.out /usr/bin/prof
cc -s -O ps.c
cmp a.out /bin/ps
cp a.out /bin/ps
cc -s -O ptx.c
cmp a.out /usr/bin/ptx
cp a.out /usr/bin/ptx
cc -s -O pwd.c
cmp a.out /usr/bin/pwd
cp a.out /usr/bin/pwd
cc -s -O quiz.c
cmp a.out /usr/bin/quiz
cp a.out /usr/bin/quiz
cc -s -O rc.c
cmp a.out /usr/bin/rc
cp a.out /usr/bin/rc
cc -s -O restor.c
cmp a.out /bin/restor
cp a.out /bin/restor
as rew.s
strip a.out
cmp a.out /bin/rew
cp a.out /bin/rew
cc -s -O rm.c
cmp a.out /bin/rm
cp a.out /bin/rm
as rmdir.s
strip a.out
cmp a.out /bin/rmdir
cp a.out /bin/rmdir
cc -s -f -O sa.c
cmp a.out /usr/bin/sa
cp a.out /usr/bin/sa
cc -s -n -O sh.c
cmp a.out /bin/sh
cp a.out /bin/sh
cc -s -O size.c
cmp a.out /bin/size
cp a.out /bin/size
cc -s -O sleep.c
cmp a.out /usr/bin/sleep
cp a.out /usr/bin/sleep
cc -s -O sort.c
cmp a.out /bin/sort
cp a.out /bin/sort
cc -s -O split.c
cmp a.out /usr/bin/split
cp a.out /usr/bin/split
as strip.s
strip a.out
cmp a.out /bin/strip
cp a.out /bin/strip
cc -s -O stty.c
cmp a.out /bin/stty
cp a.out /bin/stty
cc -s -O su.c
cmp a.out /bin/su
cp a.out /bin/su
as sum.s
strip a.out
cmp a.out /bin/sum
cp a.out /bin/sum
cc -s -O sync.c
cmp a.out /bin/sync
cp a.out /bin/sync
cc -s -O tbl.c -lp
cmp a.out /usr/bin/tbl
cp a.out /usr/bin/tbl
cc -s -O tee.c
cmp a.out /usr/bin/tee
cp a.out /usr/bin/tee
as time.s
strip a.out
cmp a.out /bin/time
cp a.out /bin/time
as tp?.s
ld a.out -lc -l
cmp a.out /bin/tp
cp a.out /bin/tp
cc -s -O tr.c
cmp a.out /usr/bin/tr
cp a.out /usr/bin/tr
as tty.s
ld -s a.out -l
cmp a.out /bin/tty
cp a.out /bin/tty
cc -s -f -O typo.c
cmp a.out /usr/bin/typo
cp a.out /usr/bin/typo
cc -s -O umount.c
cmp a.out /etc/umount
cp a.out /etc/umount
cc -s -O uniq.c
cmp a.out /bin/uniq
cp a.out /bin/uniq
cc -s -f -O units.c
cmp a.out /usr/bin/units
cp a.out /usr/bin/units
as update.s
strip a.out
cmp a.out /etc/update
cp a.out /etc/update
cc -s -O usort.c
cmp a.out /usr/bin/usort
cp a.out /usr/bin/usort
cc -s -O wall.c
cmp a.out /etc/wall
cp a.out /etc/wall
cc -s -O wc.c
cmp a.out /usr/bin/wc
cp a.out /usr/bin/wc
cc -s -O who.c
cmp a.out /bin/who
cp a.out /bin/who
as write.s
ld -s a.out -l
cmp a.out /bin/write
cp a.out /bin/write
rm a.out
+470
View File
@@ -0,0 +1,470 @@
#define size 2000
/* interpret command time accounting */
int lflg;
int cflg;
int jflg;
int nflg;
int aflg;
int rflg;
int tflg;
int vflg;
int uflg;
int thres 1;
int sflg;
int bflg;
int mflg;
int fout;
struct user {
int ncomm;
int fill;
float fctime;
} user[256];
struct tab {
char name[8];
int count;
float realt;
float cput;
float syst;
} tab[size];
struct ftab {
char fname[14];
char shf;
char uid;
int fdatet[2];
int frealt[2];
int fcput[2];
int fsyst[2];
};
float treal;
float tcpu;
float tsys;
int junkp -1;
char *sname;
float ncom;
main(argc, argv)
char **argv;
{
int i, j, k;
extern tcmp(), ncmp(), bcmp();
extern float sum();
float ft;
init();
if (argc>1)
if (argv[1][0]=='-') {
argv++;
argc--;
for(i=1; argv[0][i]; i++)
switch(argv[0][i]) {
case 'b':
bflg++;
break;
case 'l':
lflg++;
break;
case 'c':
cflg++;
break;
case 'j':
jflg++;
break;
case 'n':
nflg++;
break;
case 'a':
aflg++;
break;
case 'r':
rflg++;
break;
case 't':
tflg++;
break;
case 's':
sflg++;
aflg++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
thres = argv[0][i]-'0';
break;
case 'v':
vflg++;
break;
case 'u':
uflg++;
break;
case 'm':
mflg++;
break;
}
}
fout = dup(1);
if (argc<2)
acct("/usr/adm/sha");
else while (--argc)
acct(*++argv);
if (uflg) {
flush();
return;
}
/*
* cleanup pass
* put junk together
*/
if (vflg)
strip();
if(!aflg)
for (i=0; i<size; i++)
if (tab[i].name[0]) {
for(j=0; j<8; j++)
if(tab[i].name[j] == '?')
goto yes;
if(tab[i].count != 1)
continue;
yes:
if(junkp == -1)
junkp = enter("***other");
tab[junkp].count =+ tab[i].count;
tab[junkp].realt =+ tab[i].realt;
tab[junkp].cput =+ tab[i].cput;
tab[junkp].syst =+ tab[i].syst;
tab[i].name[0] = 0;
}
for(i=k=0; i<size; i++)
if(tab[i].name[0]) {
for(j=0; j<8; j++)
tab[k].name[j] = tab[i].name[j];
tab[k].count = tab[i].count;
tab[k].realt = tab[i].realt;
tab[k].cput = tab[i].cput;
tab[k].syst = tab[i].syst;
k++;
}
if (sflg) {
signal(2, 1);
i = creat("/usr/adm/shm", 0666);
write(i, user, sizeof(user));
close(i);
if ((i = creat("/usr/adm/sht", 0666))<0) {
printf("Can't save\n");
exit();
}
write(i, tab, k*sizeof(*tab));
close(i);
if (sname) {
if ((i = creat(sname, 0666))<0)
printf("Can't truncate\n");
close(i);
}
signal(2, 0);
}
/*
* sort and print
*/
if (mflg) {
printmoney();
flush();
exit();
}
qsort(tab, k, 22, nflg? &ncmp: (bflg?&bcmp:&tcmp));
printf("%8s", "");
column(ncom, treal, tcpu, tsys);
for (i=0; i<k; i++)
if (tab[i].name[0]) {
ft = tab[i].count;
printf("%-8.8s", tab[i].name);
column(ft, tab[i].realt, tab[i].cput, tab[i].syst);
}
flush();
}
printmoney()
{
register i;
char buf[128];
register char *cp;
for (i=0; i<256; i++) {
if (user[i].ncomm) {
if (getpw(i, buf)!=0)
printf("%-8d", i);
else {
cp = buf;
while (*cp!=':' &&*cp!='\n' && *cp)
cp++;
*cp = 0;
printf("%-8s", buf);
}
printf("%5l %7.2f\n",
user[i].ncomm, user[i].fctime/60);
}
}
}
column(n, a, b, c)
double n, a, b, c;
{
printf("%6.0f", n);
if(cflg) {
if(n == ncom)
printf("%7s", ""); else
printf("%6.2f%%", 100.*n/ncom);
}
col(n, a, treal);
if(lflg) {
col(n, b, tcpu);
col(n, c, tsys);
} else
col(n, b+c, tcpu+tsys);
if(tflg)
printf("%6.1f", a/(b+c));
putchar('\n');
}
col(n, a, m)
double n, a, m;
{
if(jflg)
printf("%9.2f", a/(n*60.)); else
printf("%9.2f", a/3600.);
if(cflg) {
if(a == m)
printf("%7s", ""); else
printf("%6.2f%%", 100.*a/m);
}
}
acct(f)
char *f;
{
int ff, i, j;
float x;
struct ftab fbuf;
register char *cp;
register int c;
extern double ltod();
if (sflg && sname) {
printf("Only 1 file with -s\n");
exit();
}
if (sflg)
sname = f;
if ((ff=open(f, 0))<0) {
printf("Can't open %s\n", f);
return;
}
while (read(ff, &fbuf, sizeof(fbuf))==sizeof(fbuf)) {
for (cp = fbuf.name; cp < &fbuf.name[8]; cp++) {
c = *cp & 0377;
if (c && (c < ' ' || c >= 0200))
*cp = '?';
}
if (uflg) {
printdate(fbuf.fdatet);
printf(" %3d %.8s\n", fbuf.uid, fbuf.name);
continue;
}
if (fbuf.shf==0) {
c = fbuf.uid&0377;
user[c].ncomm++;
user[c].fctime =+ (ltod(fbuf.fcput)+ltod(fbuf.fsyst))/60;
}
ncom =+ 1.0;
i = enter(&fbuf);
tab[i].count++;
x = ltod(fbuf.frealt);
x =* 60.;
tab[i].realt =+ x;
treal =+ x;
x = ltod(fbuf.fcput);
tab[i].cput =+ x;
tcpu =+ x;
x = ltod(fbuf.fsyst);
tab[i].syst =+ x;
tsys =+ x;
}
close(ff);
}
ncmp(p1, p2)
struct tab *p1, *p2;
{
if(p1->count == p2->count)
return(tcmp(p1, p2));
if(rflg)
return(p1->count - p2->count);
return(p2->count - p1->count);
}
bcmp(p1, p2)
struct tab *p1, *p2;
{
float f1, f2;
float sum();
f1 = sum(p1)/p1->count;
f2 = sum(p2)/p2->count;
if(f1 < f2) {
if(rflg)
return(-1);
return(1);
}
if(f1 > f2) {
if(rflg)
return(1);
return(-1);
}
return(0);
}
tcmp(p1, p2)
struct tab *p1, *p2;
{
extern float sum();
float f1, f2;
f1 = sum(p1);
f2 = sum(p2);
if(f1 < f2) {
if(rflg)
return(-1);
return(1);
}
if(f1 > f2) {
if(rflg)
return(1);
return(-1);
}
return(0);
}
float sum(p)
struct tab *p;
{
if(p->name[0] == 0)
return(0.0);
return(
p->cput+
p->syst);
}
init()
{
struct tab tbuf;
int i, j, f;
if ((f=open("/usr/adm/sht", 0))<0)
goto gshm;
while (read(f, &tbuf, sizeof(tbuf)) == sizeof(tbuf)) {
i = enter(&tbuf);
ncom =+ tbuf.count;
tab[i].count = tbuf.count;
treal =+ tbuf.realt;
tab[i].realt = tbuf.realt;
tcpu =+ tbuf.cput;
tab[i].cput = tbuf.cput;
tsys =+ tbuf.syst;
tab[i].syst = tbuf.syst;
}
close(f);
gshm:
if ((f=open("/usr/adm/shm", 0)) < 0)
return;
read(f, user, sizeof(user));
close(f);
}
enter(fbuf)
struct ftab *fbuf;
{
int i, j;
i = 0;
for (j=0; j<8; j++) {
i = i*7 + fbuf->fname[j];
}
if(i < 0)
i = -i;
for (i=%size; tab[i].name[0]; i = (i+1)%size) {
for (j=0; j<8; j++)
if (tab[i].name[j]!=fbuf->fname[j])
goto no;
goto yes;
no:;
}
for (j=0; j<8; j++)
tab[i].name[j] = fbuf->fname[j];
yes:
return(i);
}
strip()
{
int i, j, k, c;
j = enter("**junk**");
for (i = 0; i<size; i++) {
if (tab[i].name[0] && tab[i].count<=thres) {
printf("%.8s--", tab[i].name);
flush();
if ((c=getchar())=='y') {
tab[i].name[0] = '\0';
tab[j].count =+ tab[i].count;
tab[j].realt =+ tab[i].realt;
tab[j].cput =+ tab[i].cput;
tab[j].syst =+ tab[i].syst;
}
while (c && c!='\n')
c = getchar();
}
}
}
printdate(tvec)
int tvec[2];
{
int *lt;
int *localtime();
lt = localtime(tvec);
printf("%3d %c%c%c %d", lt[7],
pair(lt[2]), pair(lt[1]), pair(lt[0]), lt[6]);
}
pair(n)
{
return(n/10+'0' | (n%10+'0')<<8);
}
+898
View File
@@ -0,0 +1,898 @@
#
/*
*/
#define INTR 2
#define QUIT 3
#define LINSIZ 1000
#define ARGSIZ 50
#define TRESIZ 100
#define QUOTE 0200
#define FAND 1
#define FCAT 2
#define FPIN 4
#define FPOU 8
#define FPAR 16
#define FINT 32
#define FPRS 64
#define TCOM 1
#define TPAR 2
#define TFIL 3
#define TLST 4
#define DTYP 0
#define DLEF 1
#define DRIT 2
#define DFLG 3
#define DSPR 4
#define DCOM 5
#define ENOMEM 12
#define ENOEXEC 8
char *dolp;
char pidp[6];
int ldivr;
char **dolv;
int dolc;
char *promp;
char *linep;
char *elinep;
char **argp;
char **eargp;
int *treep;
int *treeend;
char peekc;
char gflg;
char error;
char acctf;
char uid;
char setintr;
char *arginp;
int onelflg;
char *mesg[] {
0,
"Hangup",
0,
"Quit",
"Illegal instruction",
"Trace/BPT trap",
"IOT trap",
"EMT trap",
"Floating exception",
"Killed",
"Bus error",
"Memory fault",
"Bad system call",
0,
"Sig 14",
"Sig 15",
"Sig 16",
"Sig 17",
"Sig 18",
"Sig 19",
};
struct stime {
int proct[2];
int cputim[2];
int systim[2];
} timeb;
char line[LINSIZ];
char *args[ARGSIZ];
int trebuf[TRESIZ];
main(c, av)
int c;
char **av;
{
register f;
register char *acname, **v;
for(f=2; f<15; f++)
close(f);
if((f=dup(1)) != 2)
close(f);
dolc = getpid();
for(f=4; f>=0; f--) {
dolc = ldiv(0, dolc, 10);
pidp[f] = ldivr+'0';
}
v = av;
acname = "/usr/adm/sha";
promp = "% ";
if(((uid = getuid())&0377) == 0)
promp = "# ";
acctf = open(acname, 1);
if(c > 1) {
promp = 0;
if (*v[1]=='-') {
**v = '-';
if (v[1][1]=='c' && c>2)
arginp = v[2];
else if (v[1][1]=='t')
onelflg = 2;
} else {
close(0);
f = open(v[1], 0);
if(f < 0) {
prs(v[1]);
err(": cannot open");
}
}
}
if(**v == '-') {
setintr++;
signal(QUIT, 1);
signal(INTR, 1);
}
dolv = v+1;
dolc = c-1;
loop:
if(promp != 0)
prs(promp);
peekc = getc();
main1();
goto loop;
}
main1()
{
register char c, *cp;
register *t;
argp = args;
eargp = args+ARGSIZ-5;
linep = line;
elinep = line+LINSIZ-5;
error = 0;
gflg = 0;
do {
cp = linep;
word();
} while(*cp != '\n');
treep = trebuf;
treeend = &trebuf[TRESIZ];
if(gflg == 0) {
if(error == 0) {
setexit();
if (error)
return;
t = syntax(args, argp);
}
if(error != 0)
err("syntax error"); else
execute(t);
}
}
word()
{
register char c, c1;
*argp++ = linep;
loop:
switch(c = getc()) {
case ' ':
case '\t':
goto loop;
case '\'':
case '"':
c1 = c;
while((c=readc()) != c1) {
if(c == '\n') {
error++;
peekc = c;
return;
}
*linep++ = c|QUOTE;
}
goto pack;
case '&':
case ';':
case '<':
case '>':
case '(':
case ')':
case '|':
case '^':
case '\n':
*linep++ = c;
*linep++ = '\0';
return;
}
peekc = c;
pack:
for(;;) {
c = getc();
if(any(c, " '\"\t;&<>()|^\n")) {
peekc = c;
if(any(c, "\"'"))
goto loop;
*linep++ = '\0';
return;
}
*linep++ = c;
}
}
tree(n)
int n;
{
register *t;
t = treep;
treep =+ n;
if (treep>treeend) {
prs("Command line overflow\n");
error++;
reset();
}
return(t);
}
getc()
{
register char c;
if(peekc) {
c = peekc;
peekc = 0;
return(c);
}
if(argp > eargp) {
argp =- 10;
while((c=getc()) != '\n');
argp =+ 10;
err("Too many args");
gflg++;
return(c);
}
if(linep > elinep) {
linep =- 10;
while((c=getc()) != '\n');
linep =+ 10;
err("Too many characters");
gflg++;
return(c);
}
getd:
if(dolp) {
c = *dolp++;
if(c != '\0')
return(c);
dolp = 0;
}
c = readc();
if(c == '\\') {
c = readc();
if(c == '\n')
return(' ');
return(c|QUOTE);
}
if(c == '$') {
c = readc();
if(c>='0' && c<='9') {
if(c-'0' < dolc)
dolp = dolv[c-'0'];
goto getd;
}
if(c == '$') {
dolp = pidp;
goto getd;
}
}
return(c&0177);
}
readc()
{
char cc;
register c;
if (arginp) {
if (arginp == 1)
exit();
if ((c = *arginp++) == 0) {
arginp = 1;
c = '\n';
}
return(c);
}
if (onelflg==1)
exit();
if(read(0, &cc, 1) != 1)
exit();
if (cc=='\n' && onelflg)
onelflg--;
return(cc);
}
/*
* syntax
* empty
* syn1
*/
syntax(p1, p2)
char **p1, **p2;
{
while(p1 != p2) {
if(any(**p1, ";&\n"))
p1++; else
return(syn1(p1, p2));
}
return(0);
}
/*
* syn1
* syn2
* syn2 & syntax
* syn2 ; syntax
*/
syn1(p1, p2)
char **p1, **p2;
{
register char **p;
register *t, *t1;
int l;
l = 0;
for(p=p1; p!=p2; p++)
switch(**p) {
case '(':
l++;
continue;
case ')':
l--;
if(l < 0)
error++;
continue;
case '&':
case ';':
case '\n':
if(l == 0) {
l = **p;
t = tree(4);
t[DTYP] = TLST;
t[DLEF] = syn2(p1, p);
t[DFLG] = 0;
if(l == '&') {
t1 = t[DLEF];
t1[DFLG] =| FAND|FPRS|FINT;
}
t[DRIT] = syntax(p+1, p2);
return(t);
}
}
if(l == 0)
return(syn2(p1, p2));
error++;
}
/*
* syn2
* syn3
* syn3 | syn2
*/
syn2(p1, p2)
char **p1, **p2;
{
register char **p;
register int l, *t;
l = 0;
for(p=p1; p!=p2; p++)
switch(**p) {
case '(':
l++;
continue;
case ')':
l--;
continue;
case '|':
case '^':
if(l == 0) {
t = tree(4);
t[DTYP] = TFIL;
t[DLEF] = syn3(p1, p);
t[DRIT] = syn2(p+1, p2);
t[DFLG] = 0;
return(t);
}
}
return(syn3(p1, p2));
}
/*
* syn3
* ( syn1 ) [ < in ] [ > out ]
* word word* [ < in ] [ > out ]
*/
syn3(p1, p2)
char **p1, **p2;
{
register char **p;
char **lp, **rp;
register *t;
int n, l, i, o, c, flg;
flg = 0;
if(**p2 == ')')
flg =| FPAR;
lp = 0;
rp = 0;
i = 0;
o = 0;
n = 0;
l = 0;
for(p=p1; p!=p2; p++)
switch(c = **p) {
case '(':
if(l == 0) {
if(lp != 0)
error++;
lp = p+1;
}
l++;
continue;
case ')':
l--;
if(l == 0)
rp = p;
continue;
case '>':
p++;
if(p!=p2 && **p=='>')
flg =| FCAT; else
p--;
case '<':
if(l == 0) {
p++;
if(p == p2) {
error++;
p--;
}
if(any(**p, "<>("))
error++;
if(c == '<') {
if(i != 0)
error++;
i = *p;
continue;
}
if(o != 0)
error++;
o = *p;
}
continue;
default:
if(l == 0)
p1[n++] = *p;
}
if(lp != 0) {
if(n != 0)
error++;
t = tree(5);
t[DTYP] = TPAR;
t[DSPR] = syn1(lp, rp);
goto out;
}
if(n == 0)
error++;
p1[n++] = 0;
t = tree(n+5);
t[DTYP] = TCOM;
for(l=0; l<n; l++)
t[l+DCOM] = p1[l];
out:
t[DFLG] = flg;
t[DLEF] = i;
t[DRIT] = o;
return(t);
}
scan(at, f)
int *at;
int (*f)();
{
register char *p, c;
register *t;
t = at+DCOM;
while(p = *t++)
while(c = *p)
*p++ = (*f)(c);
}
tglob(c)
int c;
{
if(any(c, "[?*"))
gflg = 1;
return(c);
}
trim(c)
int c;
{
return(c&0177);
}
execute(t, pf1, pf2)
int *t, *pf1, *pf2;
{
int i, f, pv[2];
register *t1;
register char *cp1, *cp2;
extern errno;
if(t != 0)
switch(t[DTYP]) {
case TCOM:
cp1 = t[DCOM];
if(equal(cp1, "chdir")) {
if(t[DCOM+1] != 0) {
if(chdir(t[DCOM+1]) < 0)
err("chdir: bad directory");
} else
err("chdir: arg count");
return;
}
if(equal(cp1, "shift")) {
if(dolc < 1) {
prs("shift: no args\n");
return;
}
dolv[1] = dolv[0];
dolv++;
dolc--;
return;
}
if(equal(cp1, "login")) {
if(promp != 0) {
close(acctf);
execv("/bin/login", t+DCOM);
}
prs("login: cannot execute\n");
return;
}
if(equal(cp1, "newgrp")) {
if(promp != 0) {
close(acctf);
execv("/bin/newgrp", t+DCOM);
}
prs("newgrp: cannot execute\n");
return;
}
if(equal(cp1, "wait")) {
pwait(-1, 0);
return;
}
if(equal(cp1, ":"))
return;
case TPAR:
f = t[DFLG];
i = 0;
if((f&FPAR) == 0)
i = fork();
if(i == -1) {
err("try again");
return;
}
if(i != 0) {
if((f&FPIN) != 0) {
close(pf1[0]);
close(pf1[1]);
}
if((f&FPRS) != 0) {
prn(i);
prs("\n");
}
if((f&FAND) != 0)
return;
if((f&FPOU) == 0)
pwait(i, t);
return;
}
if(t[DLEF] != 0) {
close(0);
i = open(t[DLEF], 0);
if(i < 0) {
prs(t[DLEF]);
err(": cannot open");
exit();
}
}
if(t[DRIT] != 0) {
if((f&FCAT) != 0) {
i = open(t[DRIT], 1);
if(i >= 0) {
seek(i, 0, 2);
goto f1;
}
}
i = creat(t[DRIT], 0666);
if(i < 0) {
prs(t[DRIT]);
err(": cannot create");
exit();
}
f1:
close(1);
dup(i);
close(i);
}
if((f&FPIN) != 0) {
close(0);
dup(pf1[0]);
close(pf1[0]);
close(pf1[1]);
}
if((f&FPOU) != 0) {
close(1);
dup(pf2[1]);
close(pf2[0]);
close(pf2[1]);
}
if((f&FINT)!=0 && t[DLEF]==0 && (f&FPIN)==0) {
close(0);
open("/dev/null", 0);
}
if((f&FINT) == 0 && setintr) {
signal(INTR, 0);
signal(QUIT, 0);
}
if(t[DTYP] == TPAR) {
if(t1 = t[DSPR])
t1[DFLG] =| f&FINT;
execute(t1);
exit();
}
close(acctf);
gflg = 0;
scan(t, &tglob);
if(gflg) {
t[DSPR] = "/etc/glob";
execv(t[DSPR], t+DSPR);
prs("glob: cannot execute\n");
exit();
}
scan(t, &trim);
*linep = 0;
texec(t[DCOM], t);
cp1 = linep;
cp2 = "/usr/bin/";
while(*cp1 = *cp2++)
cp1++;
cp2 = t[DCOM];
while(*cp1++ = *cp2++);
texec(linep+4, t);
texec(linep, t);
prs(t[DCOM]);
err(": not found");
exit();
case TFIL:
f = t[DFLG];
pipe(pv);
t1 = t[DLEF];
t1[DFLG] =| FPOU | (f&(FPIN|FINT|FPRS));
execute(t1, pf1, pv);
t1 = t[DRIT];
t1[DFLG] =| FPIN | (f&(FPOU|FINT|FAND|FPRS));
execute(t1, pv, pf2);
return;
case TLST:
f = t[DFLG]&FINT;
if(t1 = t[DLEF])
t1[DFLG] =| f;
execute(t1);
if(t1 = t[DRIT])
t1[DFLG] =| f;
execute(t1);
return;
}
}
texec(f, at)
int *at;
{
extern errno;
register int *t;
t = at;
execv(f, t+DCOM);
if (errno==ENOEXEC) {
if (*linep)
t[DCOM] = linep;
t[DSPR] = "/bin/sh";
execv(t[DSPR], t+DSPR);
prs("No shell!\n");
exit();
}
if (errno==ENOMEM) {
prs(t[DCOM]);
err(": too large");
exit();
}
}
err(s)
char *s;
{
prs(s);
prs("\n");
if(promp == 0) {
seek(0, 0, 2);
exit();
}
}
prs(as)
char *as;
{
register char *s;
s = as;
while(*s)
putc(*s++);
}
putc(c)
{
write(2, &c, 1);
}
prn(n)
int n;
{
register a;
if(a=ldiv(0,n,10))
prn(a);
putc(lrem(0,n,10)+'0');
}
any(c, as)
int c;
char *as;
{
register char *s;
s = as;
while(*s)
if(*s++ == c)
return(1);
return(0);
}
equal(as1, as2)
char *as1, *as2;
{
register char *s1, *s2;
s1 = as1;
s2 = as2;
while(*s1++ == *s2)
if(*s2++ == '\0')
return(1);
return(0);
}
pwait(i, t)
int i, *t;
{
register p, e;
int s;
if(i != 0)
for(;;) {
times(&timeb);
time(timeb.proct);
p = wait(&s);
if(p == -1)
break;
e = s&0177;
if(mesg[e] != 0) {
if(p != i) {
prn(p);
prs(": ");
}
prs(mesg[e]);
if(s&0200)
prs(" -- Core dumped");
}
if(e != 0)
err("");
if(i == p) {
acct(t);
break;
} else
acct(0);
}
}
acct(t)
int *t;
{
if(t == 0)
enacct("**gok"); else
if(*t == TPAR)
enacct("()"); else
enacct(t[DCOM]);
}
enacct(as)
char *as;
{
struct stime timbuf;
struct {
char cname[14];
char shf;
char uid;
int datet[2];
int realt[2];
int bcput[2];
int bsyst[2];
} tbuf;
register i;
register char *np, *s;
s = as;
times(&timbuf);
time(timbuf.proct);
lsub(tbuf.realt, timbuf.proct, timeb.proct);
lsub(tbuf.bcput, timbuf.cputim, timeb.cputim);
lsub(tbuf.bsyst, timbuf.systim, timeb.systim);
do {
np = s;
while (*s != '\0' && *s != '/')
s++;
} while (*s++ != '\0');
for (i=0; i<14; i++) {
tbuf.cname[i] = *np;
if (*np)
np++;
}
tbuf.datet[0] = timbuf.proct[0];
tbuf.datet[1] = timbuf.proct[1];
tbuf.uid = uid;
tbuf.shf = 0;
if (promp==0)
tbuf.shf = 1;
seek(acctf, 0, 2);
write(acctf, &tbuf, sizeof(tbuf));
}
+36
View File
@@ -0,0 +1,36 @@
/*
size -- determine object size
*/
main(argc, argv)
char **argv;
{
int buf[010], f, ac, sum;
ac = argc;
if (ac==1) {
*argv = "a.out";
ac++;
--argv;
}
while(--ac) {
++argv;
if((f=open(*argv, 0))<0) {
printf("%s not found\n", *argv);
continue;
}
read(f, buf, 0020);
if(buf[0]!=0411 && buf[0]!=0410 && buf[0]!=0407) {
printf("Bad format: %s\n", *argv);
close(f);
continue;
}
if (argc>2)
printf("%s: ", *argv);
printf("%l+%l+%l=", buf[1],buf[2],buf[3]);
sum = buf[1]+buf[2]+buf[3];
printf("%l (%o)\n", sum, sum);
close(f);
}
}
+21
View File
@@ -0,0 +1,21 @@
main(argc, argv)
char **argv;
{
int c, n;
char *s;
n = 0;
if(argc < 2) {
printf("arg count\n");
exit();
}
s = argv[1];
while(c = *s++) {
if(c<'0' || c>'9') {
printf("bad character\n");
exit();
}
n = n*10 + c - '0';
}
sleep(n);
}
+592
View File
@@ -0,0 +1,592 @@
#define L 512
#define N 7
#define C 20
#define MEM (16*2048)
#define NF 10
int ibuf[259];
int obuf[259];
char *file;
char *filep;
int nfiles;
int nlines;
int ntext;
int *lspace;
char *tspace;
int cmp();
int term();
int mflg;
char *outfil;
char tabchar;
int eargc;
char **eargv;
char fold[128] {
0000,0001,0002,0003,0004,0005,0006,0007,
0010,0011,0012,0013,0014,0015,0016,0017,
0020,0021,0022,0023,0024,0025,0026,0027,
0030,0031,0032,0033,0034,0035,0036,0037,
0040,0041,0042,0043,0044,0045,0046,0047,
0050,0051,0052,0053,0054,0055,0056,0057,
0060,0061,0062,0063,0064,0065,0066,0067,
0070,0071,0072,0073,0074,0075,0076,0077,
0100,0101,0102,0103,0104,0105,0106,0107,
0110,0111,0112,0113,0114,0115,0116,0117,
0120,0121,0122,0123,0124,0125,0126,0127,
0130,0131,0132,0133,0134,0134,0136,0137,
0140,0101,0102,0103,0104,0105,0106,0107,
0110,0111,0112,0113,0114,0115,0116,0117,
0120,0121,0122,0123,0124,0125,0126,0127,
0130,0131,0132,0173,0174,0175,0176,0177
};
char nofold[128];
char dict[128] {
1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
};
char nodict[128] { 1 };
struct field {
char *code;
char *ignore;
int nflg;
int rflg;
int bflg;
char *m[2];
char *n[2];
} fields[NF];
int proto[9] {
&fold,
&nodict,
0,
1,
0,
0,-1,
0,0
};
int nfields;
int error 1;
main(argc, argv)
char **argv;
{
register a, i;
char *arg;
register int *p;
int *q;
for(a=0; a<128; a++)
nofold[a] = a;
nodict[127] = 1;
copyproto();
eargv = argv;
while (--argc > 0) {
if(**++argv == '-') for(arg = *argv;;) {
switch(*++arg) {
case '\0':
if(arg[-1] == '-')
eargv[eargc++] = "-";
break;
case 'm':
mflg++;
continue;
case 'o':
if(--argc > 0)
outfil = *++argv;
continue;
default:
field(++*argv,1);
break;
}
break;
} else if (**argv == '+') {
if(++nfields>=NF) {
mess("Too many keys\n");
exit(1);
}
copyproto();
field(++*argv,0);
} else
eargv[eargc++] = *argv;
}
q = &fields[0];
for(a=1; a<=nfields; a++) {
p = &fields[a];
for(i=0; i<5; i++) /*sensitive to sizeof(proto)*/
if(p[i] != proto[i])
goto next;
for(i=0; i<5; i++)
p[i] = q[i];
next: ;
}
if(eargc == 0)
eargv[eargc++] = "-";
a = MEM;
i = lspace = sbrk(0);
while(brk(a) == -1)
a =- 512;
brk(a =- 512); /* for recursion */
a =- i;
nlines = ((a-L)>>1) & 077777;
nlines =/ 5;
ntext = nlines*8;
tspace = lspace+nlines;
file = "/usr/tmp/stmXaa";
loop:
filep = file;
while(*filep != 'X')
filep++;
for(*filep = 'a';;(*filep)++) {
if(stat(file, lspace) < 0) {
a = creat(file, 0600);
if(a >= 0)
break;
}
if(*filep == 'z') {
if(file[1] != 't') {
file = "/tmp/stmXaa";
goto loop;
}
mess("Cannot locate temp\n");
exit(1);
}
}
close(a);
filep++;
if ((signal(2, 1) & 01) == 0)
signal(2, term);
nfiles = eargc;
if(!mflg) {
ibuf[0] = -1;
sort();
close(0);
}
for(a = mflg?0:eargc; a+N < nfiles; a=+N) {
newfile();
merge(a, a+N);
}
if(a != nfiles) {
oldfile();
merge(a, nfiles);
}
error = 0;
term();
}
sort()
{
register char *cp;
register *lp, c;
int done;
int i;
int f;
done = 0;
i = 0;
do {
cp = tspace;
lp = lspace;
while(lp < lspace+nlines && cp < tspace+ntext) {
*lp++ = cp;
while((*cp++ = c = getc(ibuf)) != '\n') {
if(c >= 0) continue;
cp--;
close(ibuf[0]);
if(i < eargc) {
if((f = setfil(i++)) == 0)
ibuf[0] = 0;
else if(fopen(f, ibuf) < 0)
cant(f);
} else
break;
}
if(c < 0) {
done++;
lp--;
break;
}
}
qsort(lspace, lp-lspace, 2, cmp);
if(done == 0 || nfiles != eargc)
newfile(); else
oldfile();
while(lp > lspace) {
cp = *--lp;
do
putc(*cp, obuf);
while(*cp++ != '\n');
}
fflush(obuf);
close(obuf[0]);
} while(done == 0);
}
struct merg
{
char l[L];
int b[259];
};
merge(a, b)
{
register struct merg *p;
register char *cp;
register i;
struct { int *ip;};
int f;
int j;
p = lspace;
j = 0;
for(i=a; i<b; i++) {
f = setfil(i);
if(f == 0)
p->b[0] = dup(0);
else if(fopen(f, p->b) < 0)
cant(f);
ibuf[j] = p;
if(!rline(p)) j++;
p++;
}
i = j;
qsort(ibuf, i, 2, cmp);
if(i > 0) for(;;) {
cp = ibuf[i-1];
do
putc(*cp, obuf);
while(*cp++ != '\n');
if(rline(ibuf[i-1])) {
i--;
if(i == 0)
break;
}
cp = &ibuf[i];
while (--cp.ip > ibuf && cmp(cp.ip, cp.ip-1) < 0) {
p = *cp.ip;
*cp.ip = *(cp.ip-1);
*(cp.ip-1) = p;
}
}
p = lspace;
for(i=a; i<b; i++) {
close(p->b[0]);
p++;
if(i >= eargc)
close(creat(setfil(i)));
}
fflush(obuf);
close(obuf[0]);
}
rline(mp)
struct merg *mp;
{
register char *cp;
register *bp, c;
bp = mp->b;
cp = mp->l;
do {
c = getc(bp);
if(c < 0)
return(1);
*cp++ = c;
} while(c != '\n');
return(0);
}
newfile()
{
if(fcreat(setfil(nfiles), obuf) < 0) {
mess("Can't create temp\n");
term();
}
nfiles++;
}
char *
setfil(i)
{
if(i < eargc)
if(eargv[i][0] == '-' && eargv[i][1] == '\0')
return(0);
else
return(eargv[i]);
i =- eargc;
filep[0] = i/26 + 'a';
filep[1] = i%26 + 'a';
return(file);
}
oldfile()
{
if(outfil) {
if(fcreat(outfil, obuf) < 0) {
mess("Can't create output\n");
term();
}
} else
obuf[0] = 1;
}
cant(f)
{
mess("Can't open ");
mess(f);
mess("\n");
term();
}
term()
{
register i;
if(nfiles == eargc)
nfiles++;
for(i=eargc; i<nfiles; i++)
unlink(setfil(i));
exit(error);
}
cmp(i, j)
int *i, *j;
{
register char *pa, *pb;
char *code, *ignore;
int a, b;
int k;
char *la, *lb;
register int sa;
int sb;
char *ipa, *ipb, *jpa, *jpb;
struct field *fp;
for(k = nfields>0; k<=nfields; k++) {
fp = &fields[k];
pa = *i;
pb = *j;
if(k) {
la = skip(pa, fp, 1);
pa = skip(pa, fp, 0);
lb = skip(pb, fp, 1);
pb = skip(pb, fp, 0);
} else {
la = -1;
lb = -1;
}
if(fp->nflg) {
while(blank(*pa))
pa++;
while(blank(*pb))
pb++;
sa = sb = fp->rflg;
if(*pa == '-') {
pa++;
sa = -sa;
}
if(*pb == '-') {
pb++;
sb = -sb;
}
if(sa != sb)
sa = 0;
for(ipa = pa; ipa<la&&digit(*ipa); ipa++);
for(ipb = pb; ipb<lb&&digit(*ipb); ipb++);
jpa = ipa;
jpb = ipb;
a = 0;
if(sa) while(ipa > pa && ipb > pb)
if(b = *--ipb - *--ipa)
a = b;
while(ipa > pa)
if(*--ipa != '0')
return(sa ? -sa : sb);
while(ipb > pb)
if(*--ipb != '0')
return(sa ? sa : sb);
if(a) return(a*sa);
if(*(pa=jpa) == '.')
pa++;
if(*(pb=jpb) == '.')
pb++;
while(pa<la && digit(*pa))
if(pb<lb &&digit(*pb)) {
if(a = *pb++ - *pa++)
return(sa ? a*sa : sb);
} else if(*pa++ != '0')
return(sa ? -sa : sb);
while(pb<lb && digit(*pb))
if(*pb++ != '0')
return(sa ? sa : sb);
continue;
}
code = fp->code;
ignore = fp->ignore;
loop:
while(*pa<0 || ignore[*pa])
pa++;
while(*pb<0 || ignore[*pb])
pb++;
if(pa>=la || *pa=='\n')
if(pb<lb && *pb!='\n')
return(fp->rflg);
else continue;
if(pb>=lb || *pb=='\n')
return(-fp->rflg);
if((sa = code[*pb++]-code[*pa++]) == 0)
goto loop;
return(sa*fp->rflg);
}
pa = *i;
pb = *j;
while(*pa != '\n') {
if(*pa == *pb) {
pa++;
pb++;
continue;
}
if(*pb == '\n')
return(-1);
return(*pb - *pa);
}
return(*pb != '\n');
}
skip(pp, fp, j)
struct field *fp;
char *pp;
{
register i;
register char *p;
p = pp;
if( (i=fp->m[j]) < 0)
return(-1);
while(i-- > 0) {
if(tabchar != 0) {
while(*p != tabchar)
if(*p != '\n')
p++;
else goto ret;
p++;
} else {
while(blank(*p))
p++;
while(!blank(*p))
if(*p != '\n')
p++;
else goto ret;
}
}
if(fp->bflg)
while(blank(*p))
p++;
i = fp->n[j];
while(i-- > 0) {
if(*p != '\n')
p++;
else goto ret;
}
ret:
return(p);
}
digit(c)
{
return(c <= '9' && c >= '0');
}
mess(s)
char *s;
{
while(*s)
write(2, s++, 1);
}
copyproto()
{
register int i, *p, *q;
p = proto;
q = &fields[nfields];
for(i=0; i<sizeof(proto)/2; i++)
*q++ = *p++;
}
field(s,k)
char *s;
{
register struct field *p;
p = &fields[nfields];
for(; *s!=0; s++) {
switch(*s) {
case '\0':
return;
case 'a':
p->code = nofold;
break;
case 'b':
p->bflg++;
break;
case 'd':
p->ignore = dict;
break;
case 'n':
p->nflg++;
break;
case 't':
tabchar = *++s;
if(tabchar == 0) s--;
break;
case 'r':
p->rflg = -1;
break;
default:
p->m[k] = number(&s);
if(*s == '.')
s++;
p->n[k] = number(&s);
s--;
}
}
}
number(ppa)
char **ppa;
{
int n;
register char *pa;
pa = *ppa;
n = 0;
while(digit(*pa))
n = n*10 + *pa++ - '0';
*ppa = pa;
return(n);
}
blank(c)
{
if(c==' ' || c=='\t')
return(1);
return(0);
}
+88
View File
@@ -0,0 +1,88 @@
int count 1000;
int fnumber;
int ibuf[259];
int obuf[259];
char fname[100];
char *ifil;
char *ofil;
main(argc, argv)
char *argv[];
{
register i, c, f;
for(i=1; i<argc; i++)
if(argv[i][0] == '-')
switch(argv[i][1]) {
case '\0':
ifil = 1;
continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
count = number(argv[i]+1);
continue;
} else
if(ifil)
ofil = argv[i]; else
ifil = argv[i];
if(ifil != 0 && ifil != 1)
if(fopen(ifil, ibuf) < 0) {
write(2, "cannot open input\n", 18);
exit();
}
if(ofil == 0)
ofil = "x";
loop:
f = 1;
for(i=0; i<count; i++)
do {
c = getc(ibuf);
if(c < 0) {
if(f == 0)
fflush(obuf);
exit();
}
if(f) {
for(f=0; ofil[f]; f++)
fname[f] = ofil[f];
fname[f++] = fnumber/26 + 'a';
fname[f++] = fnumber%26 + 'a';
fname[f] = '\0';
fnumber++;
if(fcreat(fname, obuf) < 0) {
write(2, "Cannot create output\n", 20);
exit();
}
f = 0;
}
putc(c, obuf);
} while(c != '\n');
fflush(obuf);
close(obuf[0]);
goto loop;
}
number(str)
char *str;
{
register n;
register char *s;
n = 0;
for(s = str; *s; s++)
if(*s>='0' && *s<='9')
n = n*10 + *s-'0';
return(n);
}
+141
View File
@@ -0,0 +1,141 @@
/ strip -- strip relocation and symbols
mov (sp)+,argc
tst (sp)+
br loop
unloop:
sys unlink; s.tmp
loop:
dec argc
bgt 1f
sys exit
1:
mov (sp)+,r4
mov r4,0f
sys open; 0:..; 0
bec 1f
jsr r5,mesg; <open error: \0>; .even
br loop
1:
mov r0,fi
mov $'a,r1
1:
movb r1,s.tmp+8
sys stat; s.tmp; buf
bec 2f
sys creat; s.tmp; 400
bec 1f
2:
inc r1
cmp r1,$'z
blos 1b
jsr r5,mesg; <can't create temp file for \0>; .even
sys exit
1:
mov r0,fo
clr buf
mov fi,r0
sys read; buf; 512.
mov r0,r3
cmp buf,magic
beq 1f
cmp buf,magic1
beq 1f
cmp buf,magic2
beq 1f
jsr r5,mesg; <improper format: \0>; .even
br unloop
1:
mov buf+2,r2
add buf+4,r2
add $20,r2
clr r1
clr buf+10
mov $1,buf+16 / no reloc bits flag
1:
mov r2,0f
sub r1,0f
cmp 0f,r3
blos 2f
mov r3,0f
2:
mov fo,r0
sys write; buf; 0:..
add 0b,r1
cmp r1,r2
bhis 1f
mov fi,r0
sys read; buf; 512.
mov r0,r3
bne 1b
jsr r5,mesg; <unexpected EOF: \0>; .even
1:
mov fo,r0
sys close
mov fi,r0
sys close
mov r4,0f
sys creat; 0:..; 0 / same mode as before
bec 1f
jsr r5,mesg; <can't rewrite: \0>; .even
jmp unloop
1:
mov r0,fo
sys open; s.tmp; 0
bec 1f
jsr r5,mesg; <can't read temp file for: \0>; .even
sys exit
1:
mov r0,fi
1:
mov fi,r0
sys read; buf; 512.
mov r0,0f
beq 1f
mov fo,r0
sys write; buf; 0:..
br 1b
1:
mov fi,r0
sys close
mov fo,r0
sys close
jmp unloop
mesg:
movb (r5)+,ch
beq 1f
mov $1,r0
sys write; ch; 1
br mesg
1:
inc r5
bic $1,r5
mov r4,r1
1:
movb (r1)+,ch
beq 1f
mov $1,r0
sys write; ch; 1
br 1b
1:
mov $1,r0
sys write; qnl; 1
rts r5
s.tmp:
</tmp/stma\0>
qnl:
<\n>
.even
magic: 407
magic1: 410
magic2: 411
.bss
fi: .=.+2
fo: .=.+2
argc: .=.+2
buf: .=.+512.
ch: .=.+2
+322
View File
@@ -0,0 +1,322 @@
#
/*
* set teletype modes
*/
/*
* tty flags
*/
#define HUPCL 01
#define XTABS 02
#define LCASE 04
#define ECHO 010
#define CRMOD 020
#define RAW 040
#define ODDP 0100
#define EVENP 0200
#define ANYP 0300
/*
* Delay algorithms
*/
#define CR0 0
#define CR1 010000
#define CR2 020000
#define CR3 030000
#define NL0 0
#define NL1 000400
#define NL2 001000
#define NL3 001400
#define TAB0 0
#define TAB1 002000
#define TAB2 004000
#define TAB3 006000
#define FF0 0
#define FF1 040000
#define BS0 0
#define BS1 0100000
#define ALL 0177400
struct
{
char *string;
int speed;
} speeds[]
{
"0", (0<<8)|0,
"50", (1<<8)|1,
"75", (2<<8)|2,
"110", (3<<8)|3,
"134", (4<<8)|4,
"134.5",(4<<8)|4,
"150", (5<<8)|5,
"200", (6<<8)|6,
"300", (7<<8)|7,
"600", (8<<8)|8,
"1200", (9<<8)|9,
"1800", (10<<8)|10,
"2400", (11<<8)|11,
"4800", (12<<8)|12,
"9600", (13<<8)|13,
"exta", (14<<8)|14,
"extb", (15<<8)|15,
0,
};
struct
{
char *string;
int set;
int reset;
} modes[]
{
"even",
EVENP, 0,
"-even",
0, EVENP,
"odd",
ODDP, 0,
"-odd",
0, ODDP,
"raw",
RAW, 0,
"-raw",
0, RAW,
"cooked",
0, RAW,
"-nl",
CRMOD, 0,
"nl",
0, CRMOD,
"echo",
ECHO, 0,
"-echo",
0, ECHO,
"LCASE",
LCASE, 0,
"lcase",
LCASE, 0,
"-LCASE",
0, LCASE,
"-lcase",
0, LCASE,
"-tabs",
XTABS, 0,
"tabs",
0, XTABS,
"hup",
HUPCL, 0,
"-hup",
0, HUPCL,
"cr0",
CR0, CR3,
"cr1",
CR1, CR3,
"cr2",
CR2, CR3,
"cr3",
CR3, CR3,
"tab0",
TAB0, TAB3,
"tab1",
TAB1, TAB3,
"tab2",
TAB2, TAB3,
"tab3",
TAB3, TAB3,
"nl0",
NL0, NL3,
"nl1",
NL1, NL3,
"nl2",
NL2, NL3,
"nl3",
NL3, NL3,
"ff0",
FF0, FF1,
"ff1",
FF1, FF1,
"bs0",
BS0, BS1,
"bs1",
BS1, BS1,
"33",
CR1, ALL,
"tty33",
CR1, ALL,
"37",
FF1+CR2+TAB1+NL1, ALL,
"tty37",
FF1+CR2+TAB1+NL1, ALL,
"05",
NL2, ALL,
"vt05",
NL2, ALL,
"tn",
CR1, ALL,
"tn300",
CR1, ALL,
"ti",
CR2, ALL,
"ti700",
CR2, ALL,
"tek",
FF1, ALL,
0,
};
char *arg;
int mode[3];
struct { char lobyte, hibyte; };
main(argc, argv)
char *argv[];
{
int i;
gtty(1, mode);
if(argc == 1) {
prmodes();
exit(0);
}
while(--argc > 0) {
arg = *++argv;
if (eq("ek"))
mode[1] = '#@';
if (eq("erase")) {
mode[1].lobyte = **++argv;
argc--;
}
if (eq("kill")) {
mode[1].hibyte = **++argv;
argc--;
}
for(i=0; speeds[i].string; i++)
if(eq(speeds[i].string))
mode[0] = speeds[i].speed;
for(i=0; modes[i].string; i++)
if(eq(modes[i].string)) {
mode[2] =& ~modes[i].reset;
mode[2] =| modes[i].set;
}
if(arg)
printf("unknown mode: %s\n", arg);
}
stty(1,mode);
}
eq(string)
char *string;
{
int i;
if(!arg)
return(0);
i = 0;
loop:
if(arg[i] != string[i])
return(0);
if(arg[i++] != '\0')
goto loop;
arg = 0;
return(1);
}
prmodes()
{
register m;
if(mode[0].lobyte != mode[0].hibyte) {
prspeed("input speed ", mode[0].lobyte);
prspeed("output speed ", mode[0].hibyte);
} else
prspeed("speed ", mode[0].lobyte);
printf("erase = '%c'; kill = '%c'\n", mode[1].lobyte, mode[1].hibyte);
m = mode[2];
if(m & 0200) printf("even ");
if(m & 0100) printf("odd ");
if(m & 040) printf("raw ");
if(m & 020) printf("-nl ");
if(m & 010) printf("echo ");
if(m & 04) printf("lcase ");
if(m & 02) printf("-tabs ");
if(m & 01) printf("hup ");
delay(m>>8, "nl");
delay(m>>10, "tab");
delay(m>>12, "cr");
delay((m>>14)&1, "ff");
delay((m>>15)&1, "bs");
printf("\n");
}
delay(m, s)
char *s;
{
if(m =& 3)
printf("%s%d ", s, m);
}
int speed[]
{
0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
};
prspeed(c, s)
{
printf("%s%d baud\n", c, speed[s]);
}
putchar(c)
{
write(2, &c, 1);
}
+46
View File
@@ -0,0 +1,46 @@
/* su -- become super-user */
char password[100];
char pwbuf[100];
int ttybuf[3];
main()
{
register char *p, *q;
extern fin;
if(getpw(0, pwbuf))
goto badpw;
(&fin)[1] = 0;
p = pwbuf;
while(*p != ':')
if(*p++ == '\0')
goto badpw;
if(*++p == ':')
goto ok;
gtty(0, ttybuf);
ttybuf[2] =& ~010;
stty(0, ttybuf);
printf("password: ");
q = password;
while((*q = getchar()) != '\n')
if(*q++ == '\0')
return;
*q = '\0';
ttybuf[2] =| 010;
stty(0, ttybuf);
printf("\n");
q = crypt(password);
while(*q++ == *p++);
if(*--q == '\0' && *--p == ':')
goto ok;
goto error;
badpw:
printf("bad password file\n");
ok:
setuid(0);
execl("/bin/sh", "-", 0);
printf("cannot execute shell\n");
error:
printf("sorry\n");
}
+81
View File
@@ -0,0 +1,81 @@
/ sum -- check sum file
mov (sp)+,r3
tst (sp)+
loop: dec r3
bgt 1f
sys exit
1:
clr bcnt
mov (sp)+,0f
sys open; 0:..; 0
bec 3f
mov $1,r0
sys write; 1f; 2f-1f
br loop
1: <oprd\n>
2: .even
3: mov r0,r1
clr r5
1:
mov r1,r0
sys read; buf; 512.
bes err
tst r0
beq print
inc bcnt
mov $buf,r2
2:
movb (r2)+,r4
add r4,r5
adc r5
sob r0,2b
br 1b
err:
mov $1,r0
sys write; 1f; 2
print:
jsr pc,decml
mov $1,r0
sys write; bl; 1
mov bcnt,r5
jsr pc,decml
mov $1,r0
sys write; nl; 1
mov r1,r0
sys close
br loop
1: <? >
nl: <\n>
bl: < >
.even
decml:
mov r0,-(sp)
mov r1,-(sp)
mov r5,r1
jsr pc,1f
mov (sp)+,r1
mov (sp)+,r0
rts pc
1:
clr r0
dvd $10.,r0
mov r1,-(sp)
mov r0,r1
beq 1f
jsr pc,1b
1:
mov (sp)+,ch
add $'0,ch
mov $1,r0
sys write; ch; 1
rts pc
.bss
ch: .=.+2
bcnt: .=.+2
buf: .=.+512.
+5
View File
@@ -0,0 +1,5 @@
main()
{
sync();
}
+317
View File
@@ -0,0 +1,317 @@
#
# define ever (;;)
# define MAXCHS 2000
main(argc,argv)
char *argv[];
{
char line[200];
extern int cin;
extern char *cspace;
cspace = getvec(MAXCHS + 100);
for ever
{
if (argc>1)
{
argc--;
argv++;
if (match(*argv, "-ms"))
*argv = "/usr/lib/tmac.s";
cin = copen(*argv, 'r');
if (cin < 0)
{
printf(2,"where is input file %s\n",*argv);
cexit();
}
}
while (gets(line))
if (match(line, ".TS"))
tableput();
else
puts(line);
if (argc <= 1) break;
}
cexit();
}
# define MAXCOL 35
# define MAXLIN 220
# define ONELINE 250
char *tabentry[MAXLIN][MAXCOL];
char extra[MAXCHS];
char *cspace, *cstore;
char *exstore extra;
int sep[MAXCOL], dwide[MAXCOL];
char *instead[MAXLIN];
int newtab[MAXLIN];
char *style[MAXCOL];
tableput()
{
/* read input, write output, make tables on the way */
char st[ONELINE], *format;
int ilin, nlin, icol, ncol, k, ch, ws, cs, ns;
int maxchnge, ct;
printf(".TS\n");
/* get command line */
cstore = cspace;
exstore = extra;
ncol = 0;
for (ilin=0; ilin<MAXLIN; ilin++)
newtab[ilin]=0;
gets (st);
for (k=0; k<ONELINE && st[k] != '\0'; k++)
if (!space(st[k]))
{
style[ncol] = st+k;
dwide[ncol] =0;
for(; letter(st[k]); k++)
{
if ((st[k]=='n' || st[k] == 'N') &&
!dwide[ncol])
{
dwide[ncol]=1;
sep[ncol++] = 0;
style[ncol] = style[ncol-1];
dwide [ncol] = 0;
}
}
if (digit(st[k]))
sep[ncol] = numb(st+k);
else
sep[ncol] = 3;
ncol++;
while (digit(st[k]))
st[k++] = '\0';
if (st[k] == '\0')
break;
st[k] = '\0';
}
/* now get input lines */
for (nlin=0; gets(cstore) && !match(cstore, ".TE"); nlin++)
{
if (cstore[0] == '.' && letter(cstore[1]))
{
instead[nlin] = cstore;
while (*cstore) cstore++;
}
else instead[nlin] = 0;
for (icol = 0; icol <ncol; icol++)
{
tabentry[nlin][icol] = cstore;
for(; (ch= *cstore) != '\0' && ch != '\t'; cstore++)
;
*cstore++ = '\0';
if (dwide[icol] )
if (broken(style[icol],nlin))
{
tabentry[nlin][icol+1]=maknew(tabentry[nlin][icol]);
icol++;
if (tabentry[nlin][icol] ==0)
newtab[nlin]=newtab[nlin+1]=1;
}
else
tabentry[nlin][++icol] = 0;
while (span(style[icol+1],nlin) )
tabentry[nlin][++icol] = "";
if (ch == '\0') break;
}
while (++icol <ncol)
tabentry[nlin][icol] = "";
while (*cstore != '\0')
*cstore++;
if (cstore-cspace > MAXCHS)
cstore = cspace = getvec(MAXCHS+100);
}
/* find longest command string */
for (icol=maxchnge=0; icol<ncol; icol++)
if (slen(style[icol]) >maxchnge)
maxchnge = slen(style[icol]);
/* set tab stops */
printf(".nr 49 0\n");
for (icol = 0; icol<ncol; icol++)
{
ct = 1 + (icol>0 ? sep[icol-1] : 0);
printf(".nr %2d 0\n", icol+50);
for (ilin=0; ilin < nlin; ilin++)
{
if (icol>0 && dwide[icol-1]>0 && tabentry[ilin][icol]==0)
{
printf(".nr 48 \\n(%2d+\\w'%s'+%dn\n",
icol+48, tabentry[ilin][icol-1], sep[icol-1]);
printf(".if \\n(48-\\n(%2d .nr %2d \\n(48\n",
icol+50,icol+50);
}
if ( !span(style[icol],ilin) && /* not part of span */
(dwide[icol] == 0 || tabentry[ilin][icol+1]!= 0)
/* not a double item */
&& (!span(style[icol+1],ilin) || icol==ncol))
{
printf(".nr 47 \\n(%2d+\\w'%s'+%dn\n",
icol+49,tabentry[ilin][icol], ct);
printf(".if \\n(47-\\n(%2d .nr %2d \\n(47\n",
icol+50,icol+50);
}
}
/* clean up spanned headings */
for(ilin=0; ilin<maxchnge; ilin++)
{
if( !(span(style[icol],ilin)) &&
(icol ==1 || dwide[icol-1] == 0) &&
span(style[icol+(dwide[icol]?2:1)],ilin))
printf(".nr %d \\n(%2d+\\w'%s'+%dn\n",
ilin+30, icol+49, tabentry[ilin][icol], ct);
else if (span(style[icol],ilin) &&
(icol+1==ncol || !span(style[icol+1],ilin)))
printf(".if \\n(%d-\\n(%d .nr %d \\n(%d\n",
30+ilin, icol+50, icol+50, ilin+30);
}
}
/* run out table, put field characters in */
printf (".fc  @\n");
for (ilin=0; ilin<nlin; ilin++)
{
if (instead[ilin])
{
printf("%s\n",instead[ilin]);
continue;
}
/* is a new set of tab stops needed */
if (ilin < maxchnge || newtab[ilin])
settab(ncol, ilin);
for (icol=0; icol<ncol; icol++)
{
switch ( ylet(style[icol],ilin))
{
default:
case 'L': case 'l':
format = "%s@"; break;
case 'R': case 'r':
format= "@%s"; break;
case 'n': case 'N':
if (!dwide[icol] || tabentry[ilin][icol+1] != 0)
{
format=dwide[icol]? "@%s" : "%s@";
break;
}
case 'c': case 'C':
format = "@%s@"; break;
case 's': case 'S':
format= "";
break;
}
if (! (dwide [icol-1]>0 && tabentry[ilin][icol] == 0 ))
printf(format, tabentry[ilin][icol]);
if (!span(style[icol+1],ilin))
for (k=sep[icol]; k>0; k--)
printf(" ");
}
printf("\n");
}
printf(".fc\n");
printf(".TE\n");
}
match (s1, s2)
char *s1, *s2;
{
while (*s1 == *s2)
if (*s1++ == '\0')
return(1);
else
*s2++;
return(0);
}
slen(str)
char *str;
{
int k;
for (k=0; *str++ != '\0'; k++);
return(k);
}
space(ch)
{
switch (ch)
{
case ' ': case '\t':
return(1);
}
return(0);
}
letter (ch)
{
if (ch >= 'a' && ch <= 'z')
return(1);
if (ch >= 'A' && ch <= 'Z')
return(1);
return(0);
}
numb(str)
char *str;
{
/* convert to integer */
int k;
for (k=0; *str >= '0' && *str <= '9'; str++)
k = k*10 + *str - '0';
return(k);
}
broken(str, nlin)
{
switch(ylet(str,nlin))
{
case 'n': case 'N':
return(1);
}
return(0);
}
ylet (str, k)
char *str;
{
k++;
while (*str &&k--)
str++;
return(*--str);
}
span(str, k)
{
switch(ylet(str,k))
{
case 's': case 'S':
return(1);
}
return(0);
}
maknew(str)
char *str;
{
/* make two numerical fields */
int point;
char *p, *q;
p = str;
for (point=0; *str; str++)
if (*str=='.')
point=1;
if (!point && *(str-1)== '$')
return(0);
for(; str>p; str--)
if ( (point && *str == '.') ||
(!point && digit(*(str-1)) ) )
break;
if (!point && p==str) /* not numerical, don't split */
return(0);
p= str;
q = exstore;
while (*exstore++ = *str++);
*p = 0;
return(q);
}
digit(x)
{
return(x>= '0' && x<= '9');
}
settab(ncol, ilin)
{
int k, icol;
printf(".ta ");
for (icol = 0; icol<ncol; icol++)
if ((dwide[icol] == 0 || tabentry[ilin][icol+1] != 0)
&& !span(style[icol+1],ilin))
printf("\\n(%du ",icol+50);
printf("\n");
}
+50
View File
@@ -0,0 +1,50 @@
int open[9] { 1 };
int n 1;
int t 0;
char in[512];
char out[512];
main(argc,argv)
char **argv;
{
int register r,w,p;
struct { int x1[2], type, x2[15]; } buf;
fstat(1,&buf);
t = (buf.type&060000)==020000;
while(argc-->1) {
open[n++] = creat(argv[1],0666);
if(stat(argv[1],&buf)>=0)
if((buf.type&060000)==020000)
t++;
argv++;
}
r = w = 0;
for(;;) {
for(p=0;p<512;) {
if(r>=w) {
if(t>0&&p>0) break;
w = read(0,in,512);
r = 0;
if(w<=0) {
stash(p);
return;
}
}
out[p++] = in[r++];
}
stash(p);
}
}
stash(p)
{
int k;
int i;
int d;
d = t ? 10 : p;
for(i=0; i<p; i=+d)
for(k=0;k<n;k++)
write(open[k], out+i, d<p-i?d:p-i);
}
+186
View File
@@ -0,0 +1,186 @@
/ time -- prints out system times
times = 43.
cmp (sp),$1
bgt 1f
sys exit
1:
sys time
mov r1,ltbuf
jsr pc,execarg
sys time
sub ltbuf,r1
sys times; ltbuf
mov r1,r0
mul $60.,r0
mov r0,ltbuf
mov r1,ltbuf+2
jsr r5,mesg; <\nreal\0>; .even
mov $ltbuf,r2
jsr r5,ptime
jsr r5,mesg; <user\0>; .even
jsr r5,ptime
jsr r5,mesg; <sys \0>; .even
jsr r5,ptime
sys exit
execarg:
sys fork
br newproc
bec 2f
jsr r5,mesg; <Try again.\n\0>; .even
sys exit
2:
mov r0,r2
sys signal; 2; 1
2:
sys wait
cmp r0,r2
bne 2b
bit $377,r1
beq 1f
jsr r5,mesg; <Command terminated abnormally.\n\0>; .even
clr r0
sys seek; 0; 2
1:
rts pc
newproc:
tst (sp)+
mov (sp)+,r0
tst (sp)+
mov $ibuf,r1
mov $end,r2
1:
mov (sp)+,r3
mov r2,(r1)+
2:
movb (r3)+,(r2)+
bne 2b
dec r0
cmp r0,$1
bgt 1b
clr (r1)+
mov $end,r1
sys exec; end; ibuf
cmp $8,r0
beq rcom
mov $end-10.,r0
mov $"x/,(r0)+
mov $"us,(r0)+
mov $"r/,(r0)+
mov $"bi,(r0)+
mov $"n/,(r0)+
mov $end-5,r1
sys exec; end-5; ibuf
cmp $8,r0
beq rcom
mov $end-9,r1
sys exec; end-9.; ibuf
cmp $8,r0
bne 1f
rcom:
mov r1,ibuf
mov $shname+5,ibuf-2
sys exec ; shname ; ibuf-2
1:
jsr r5,mesg; <Command not found.\n\0>; .even
clr r0
sys seek; 0; 2
sys exit
printd:
mov $tbuf+4,r4
jsr r5,tdiv; 10.
jsr r5,tdiv; 10.
jsr r5,tdiv; 10.
jsr r5,tdiv; 10.
1:
cmpb (r4),$'0
bne 1f
movb $' ,(r4)+
cmp r4,$tbuf+3
bne 1b
1:
mov $2,r0
sys write; tbuf; 4
rts pc
ptime:
mov (r2)+,r0
mov (r2)+,r1
div $3600.,r0
mov r0,-(sp)
clr r0
div $60.,r0
mov r1,clicks
mov $tbuf+9.,r4
jsr r5,tdiv; 10.
jsr r5,tdiv; 6.
movb $':,-(r4)
mov (sp)+,r0
jsr r5,tdiv; 10.
jsr r5,tdiv; 6.
movb $':,-(r4)
jsr r5,tdiv; 10.
jsr r5,tdiv; 10.
jsr r5,tdiv; 10.
1:
cmpb (r4),$'0
beq 2f
cmpb (r4),$':
bne 1f
2:
movb $' ,(r4)+
cmp r4,$tbuf+8.
bne 1b
1:
mov $2,r0
sys write; tbuf; 9.
jsr r5,mesg; <.\0>; .even
mov clicks,r1
clr r0
div $6,r0
add $'0,r0
mov r0,ch
mov $2,r0
sys write; ch; 1
jsr r5,mesg; <\n\0>; .even
rts r5
tdiv:
mov r1,-(sp)
mov r0,r1
clr r0
div (r5)+,r0
add $'0,r1
movb r1,-(r4)
mov (sp)+,r1
rts r5
mesg:
movb (r5)+,ch
beq 2f
mov $2,r0
sys write; ch; 1
br mesg
2:
inc r5
bic $1,r5
rts r5
ch: .=.+1
.even
.bss
clicks: .=.+2
.=.+2
ibuf: .=.+50.
tbuf: .=.+10.
ltbuf: .=.+16.
end: .=.+1000.
.data
shname: </bin/sh\0>
.even
+267
View File
@@ -0,0 +1,267 @@
/ tap1 -- dec-disk lod/dmp
.globl _localtime, _end
namep = 0
mode = 2
uid = 4; gid = 5
size0 = 7
size1 = 8
time0 = 10.
time1 = 12.
tapea = 14.
dirsiz = 16.
mdirent = 496.
mov (sp),rnarg
mov (sp)+,narg
mov $cmr,command
incb flu
tst (sp)+
cmp narg,$2
bge 1f
mov $2,narg
br 3f
1:
mov (sp)+,r0
mov sp,parg
1:
movb (r0)+,r1
beq 3f
mov $swtab,r2
2:
cmp r1,(r2)+
beq 2f
tst (r2)+
bne 2b
br useerr
2:
jsr pc,*(r2)+
br 1b
3:
jsr pc,optap
mov $_end,r4 / string pointer
jsr pc,setb
jmp *command
optap:
tstb flm
bne 2f
mov $578.,tapsiz
mov $192.,ndirent
sys open; tc; 2
br 3f
2:
mov $-1,tapsiz
mov $mdirent,ndirent
cmp command,$cmr
beq 2f
sys open; mt; 0
br 3f
2:
sys open; mt; 1
3:
bes 1f
mov r0,fio
mov ndirent,r1
ash $-3,r1
mov r1,ndentd8
mov ndirent,r1
mul $dirsiz,r1
add $dir,r1
mov r1,edir
rts pc
1:
jsr r5,mesg
<Tape open error\n\0>; .even
jmp done
setcom:
cmp command,$cmr
bne useerr
mov (r5)+,command
rts r5
noflag:
mov (r5)+,r0
beq 1f
tstb (r0)
beq noflag
br useerr
1:
rts r5
useerr:
jsr r5,mesg
<Bad usage\n\0>; .even
jmp done
swtab:
'0; dcof
'1; dcof
'2; dcof
'3; dcof
'4; dcof
'5; dcof
'6; dcof
'7; dcof
'c; dcc
'd; dcd
'f; dcf
'i; dci
'm; dcm
'r; dcr
't; dct
'u; dcu
'v; dcv
'w; dcw
'x; dcx
0; 0
dcof:
movb r1,tcx
movb r1,mtx
rts pc
dcc:
incb flc
rts pc
dcf:
incb flf
rts pc
dcd:
jsr r5,setcom; cmd
rts pc
dci:
incb fli
rts pc
dcm:
incb flm
rts pc
dcu:
incb flu
jsr r5,setcom; cmr
rts pc
dcr:
clrb flu
jsr r5,setcom; cmr
rts pc
dct:
jsr r5,setcom; cmt
rts pc
dcv:
incb flv
rts pc
dcw:
incb flw
rts pc
dcx:
jsr r5,setcom; cmx
rts pc
cmd:
jsr r5,noflag; flm; flc; flf; 0
cmp narg,$2
bgt 1f
jmp useerr
1:
jsr pc,rddir
jsr r5,gettape; delete
jsr pc,wrdir
br check
cmr:
jsr r5,noflag; 0
tstb flc
bne 1f
tstb flm
bne 1f
jsr pc,rddir
br 2f
1:
jsr pc,clrdir
2:
jsr pc,getfiles
jsr pc,update
br check
cmt:
jsr r5,noflag; flc; flf; flw; 0
jsr pc,rddir
tstb flv
beq 1f
jsr r5,mesg
< mode uid gid tapa size date time name\n\0>; .even
1:
jsr r5,gettape; taboc
br check1
cmx:
jsr r5,noflag; flc; flf; 0
jsr pc,rddir
jsr r5,gettape; xtract
br done
check:
check1:
jsr pc,usage
done:
jsr r5,mesg
<END\n\0>; .even
sys exit
encode:
mov r2,-(sp)
mov r4,(r1)
mov (r5)+,r2
1:
movb (r2),(r4)+
jsr pc,setb
tstb (r2)+
bne 1b
mov (sp)+,r2
rts r5
decode:
mov r2,-(sp)
mov r1,-(sp)
mov (r1),r1
mov (r5)+,r2
1:
movb (r1)+,(r2)+
bne 1b
mov (sp)+,r1
mov (sp)+,r2
rts r5
setb:
mov r0,-(sp)
mov r4,r0
add $513.,r0
cmp r0,sp
bhis 2f
bic $777,r0
cmp r0,0f
beq 1f
mov r0,0f
sys break; 0:..
bes 2f
1:
mov (sp)+,r0
rts pc
2:
jsr r5,mesg
<Out of core\n\0>; .even
jmp done
+449
View File
@@ -0,0 +1,449 @@
/ tap2 -- dec-tape lod/dmp
pstr:
movb (r1)+,r0
beq 1f
jsr pc,putc
br pstr
1:
rts pc
mesg:
movb (r5)+,r0
beq 1f
jsr pc,putc
br mesg
1:
inc r5
bic $1,r5
rts r5
putc:
movb r0,ch
mov $1,r0
sys write; ch; 1
rts pc
getc:
clr r0
sys read; ch; 1
movb ch,r0
rts pc
clrdir:
mov $dir,r1
mov ndirent,r2
1:
jsr pc,clrent
sob r2,1b
rts pc
clrent:
mov r1,-(sp)
add $dirsiz,(sp)
1:
clr (r1)+
cmp r1,(sp)
blo 1b
tst (sp)+
rts pc
rddir:
clr sum
jsr pc,clrdir
clr r0
jsr pc,rseek
jsr pc,tread
mov tapeb+510.,r0
beq 1f
tstb flm
beq 1f
mov r0,ndirent
1:
mov $dir,r1
mov ndirent,r2
1:
bit $7,r2
bne 2f
jsr pc,tread
mov $tapeb,r3
2:
mov r1,-(sp)
mov r3,-(sp)
mov $32.,r0
clr -(sp)
2:
add (r3)+,(sp)
sob r0,2b
bis (sp),sum
tst (sp)+
bne 2f
mov (sp),r3
tst (r3)
beq 2f
mov r3,0f
jsr pc,9f
.data
9:
jsr r5,encode; 0:..
rts pc
.text
add $32.,r3
mov r1,-(sp)
add $dirsiz,(sp)
tst (r1)+ / namep
9:
mov (r3)+,(r1)+
cmp r1,(sp)
blo 9b
tst (sp)+
2:
mov (sp)+,r3
add $64.,r3
mov (sp)+,r1
bic $100000,mode(r1)
add $dirsiz,r1
sob r2,1b
tst sum
beq 1f
jsr r5,mesg
<Directory checksum\n\0>; .even
tstb fli
bne 1f
jmp done
1:
jsr pc,bitmap
rts pc
wrdir:
clr r0
jsr pc,wseek
tstb flm
bne 1f
sys open; tboot; 0
bes 3f
br 2f
1:
sys open; mboot; 0
bes 3f
2:
mov r0,r1
sys read; tapeb; 512.
mov r1,r0
sys close
mov ndirent,tapeb+510.
3:
jsr pc,twrite
mov $dir,r1
mov ndirent,r2
1:
bit $7,r2
bne 2f
mov $256.,r0
mov $tapeb,r3
3:
clr (r3)+
sob r0,3b
mov $tapeb,r3
2:
mov r3,-(sp)
tst (r1)
beq 2f
mov r3,0f
jsr pc,9f
.data
9:
jsr r5,decode; 0:..
rts pc
.text
2:
add $32.,r3
mov r1,-(sp)
add $dirsiz,(sp)
tst (r1)+
9:
mov (r1)+,(r3)+
cmp r1,(sp)
blo 9b
tst (sp)+
mov (sp)+,r3
clr -(sp)
mov $31.,r0
2:
sub (r3)+,(sp)
sob r0,2b
mov (sp)+,(r3)+
dec r2
bit $7,r2
bne 1b
jsr pc,twrite
tst r2
bne 1b
rts pc
tread:
mov fio,r0
sys read; tapeb; 512.
bes trderr
cmp r0,$512.
bne trderr
1:
inc rseeka
rts pc
trderr:
jsr r5,mesg
<Tape read error\n\0>; .even
tstb fli
beq 1f
mov $tapeb,r0
2:
clr (r0)+
cmp r0,$tapeb+512.
blo 2b
br 1b
1:
jmp done
twrite:
mov fio,r0
sys write; tapeb; 512.
bes twrerr
cmp r0,$512.
bne twrerr
inc wseeka
rts pc
twrerr:
jsr r5,mesg
<Tape write error\n\0>; .even
jmp done
rseek:
mov r0,rseeka
mov r0,0f
mov fio,r0
sys 0; 9f
.data
9:
sys seek; 0:..; 3
.text
bes seekerr
rts pc
wseek:
mov r0,-(sp)
sub wseeka,r0
bge 1f
neg r0
1:
cmp r0,$25. / longest write seek
ble 1f
mov (sp),0f
beq 2f
dec 0f
2:
mov fio,r0
sys 0; 9f
.data
9:
sys seek; 0:..; 3
.text
mov fio,r0
sys read; wseeka; 1
1:
mov (sp),wseeka
mov (sp)+,0f
mov fio,r0
sys 0; 9f
.data
9:
sys seek; 0:..; 3
.text
bes seekerr
rts pc
seekerr:
jsr r5,mesg
<Tape seek error\n\0>; .even
jmp done
verify:
movb (r5)+,0f
inc r5
tstb flw
bne 1f
tstb flv
beq 2f
1:
jsr pc,9f
.data
9:
jsr r5,mesg
0:<x \0>; .even
rts pc
.text
mov r1,-(sp)
mov $name,r1
jsr pc,pstr
mov (sp)+,r1
tstb flw
beq 1f
jsr r5,mesg
< \0>
jsr pc,getc
cmp r0,$'x
bne 3f
jsr pc,getc
jmp done
3:
cmp r0,$'\n
beq 3f
cmp r0,$'y
bne 4f
jsr pc,getc
cmp r0,$'\n
beq 2f
4:
jsr pc,getc
cmp r0,$'\n
bne 4b
br 1b
1:
jsr r5,mesg
<\n\0>
2:
tst (r5)+
3:
rts r5
getfiles:
cmp narg,$2
bne 1f
mov $".\0,name
jsr pc,callout
1:
cmp narg,$2
ble 1f
dec narg
mov *parg,r1
add $2,parg
mov $name,r2
2:
movb (r1)+,(r2)+
bne 2b
jsr pc,callout
br 1b
1:
rts pc
expand:
sys open; name; 0
bes fserr
mov r0,-(sp)
1:
mov (sp),r0
sys read; catlb; 16.
bes fserr
tst r0
beq 1f
tst catlb
beq 1b
mov $name,r0
mov $catlb+2,r1
cmpb (r1),$'.
beq 1b
2:
tstb (r0)+
bne 2b
dec r0
mov r0,-(sp)
cmpb -1(r0),$'/
beq 2f
movb $'/,(r0)+
2:
movb (r1)+,(r0)+
bne 2b
jsr pc,callout
clrb *(sp)+
br 1b
1:
mov (sp)+,r0
sys close
rts pc
fserr:
mov $name,r1
jsr pc,pstr
jsr r5,mesg
< -- Cannot open file\n\0>; .even
jmp done
callout:
sys stat; name; statb
bes fserr
mov statb+4,r0
bic $!60000,r0
beq 1f
cmp r0,$40000
beq expand
rts pc
1:
mov $dir,r1
clr -(sp)
1:
tst (r1)
bne 3f
tst (sp)
bne 2f
mov r1,(sp)
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
mov (sp)+,r1
bne 4f
jsr r5,mesg
<Directory overflow\n\0>; .even
jmp done
4:
jsr r5,verify; 'a
rts pc
jsr r5,encode; name
br 2f
3:
jsr r5,decode; name1
mov $name,r2
mov $name1,r3
3:
cmpb (r2)+,(r3)
bne 2b
tstb (r3)+
bne 3b
tst (sp)+
tstb flu
beq 3f
cmp time0(r1),statb+32.
blo 3f
bhi 1f
cmp time1(r1),statb+34.
bhis 1f
3:
jsr r5,verify; 'r
rts pc
2:
mov statb+4,mode(r1)
bis $100000,mode(r1)
movb statb+7,uid(r1)
movb statb+8,gid(r1)
tstb flf
beq 2f
clrb statb+9.
clr statb+10.
2:
movb statb+9.,size0(r1)
mov statb+10.,size1(r1)
mov statb+32.,time0(r1)
mov statb+34.,time1(r1)
1:
rts pc
+522
View File
@@ -0,0 +1,522 @@
/ tap3 -- dec-tape lod/dmp
gettape:
mov $dir,r1
clr -(sp)
1:
tst (r1)
beq 2f
jsr r5,decode; name
cmp rnarg,$2
ble 4f
mov $name,r2
mov *parg,r3
3:
tstb (r3)
beq 3f
cmpb (r2)+,(r3)+
beq 3b
br 2f
3:
tstb (r2)
beq 4f
cmpb (r2),$'/
bne 2f
4:
mov r1,-(sp)
jsr pc,*(r5)
mov (sp)+,r1
inc (sp)
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
tst (sp)+
bne 2f
cmp rnarg,$2
ble 2f
mov *parg,r1
jsr pc,pstr
jsr r5,mesg
< not found\n\0>; .even
2:
dec narg
add $2,parg
cmp narg,$2
bgt gettape
tst (r5)+
rts r5
delete:
jsr r5,verify; 'd
rts pc
jsr pc,clrent
rts pc
numb:
mov r1,-(sp)
mov r0,-(sp)
clr r0
br 1f
numbx:
mov r1,-(sp)
mov r0,-(sp)
movb size0(r1),r0
1:
mov $catlb,r2
1:
mov $" ,(r2)+
cmp r2,$catlb+12.
blo 1b
cmp (r5),$2
bne 1f
mov $"00,-2(r2)
1:
mov (sp)+,r1
jsr pc,numb2
mov (r5)+,r0
sub r0,r2
mov r2,0f
mov r0,0f+2
mov $1,r0
sys 0; 9f
.data
9:
sys write; 0:..; ..
.text
mov (sp)+,r1
rts r5
numb1:
clr r0
numb2:
div $10.,r0
mov r1,-(sp)
mov r0,r1
beq 1f
jsr pc,numb1
1:
mov (sp)+,r0
add $'0,r0
movb r0,(r2)+
rts pc
update:
jsr pc,bitmap
mov $dir,r1
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
beq 2f
tstb size0(r1)
bne 9f
tst size1(r1)
beq 2f
9:
mov ndentd8,-(sp)
inc (sp)
movb size0(r1),r2
mov size1(r1),r3
add $511.,r3
adc r2
ashc $-9,r2
mov r3,size
3:
mov (sp),r2
mov size,r3
4:
jsr pc,bitcalc
inc r2
bitb (sp)+,map(r0)
bne 4f
sob r3,4b
mov (sp)+,tapea(r1)
jsr pc,setmap
br 2f
4:
inc (sp)
br 3b
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
jsr pc,wrdir
update1:
mov $dir,r1
clr -(sp)
mov $-1,-(sp)
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
beq 2f
cmp tapea(r1),(sp)
bhis 2f
mov tapea(r1),(sp)
mov r1,2(sp)
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
tst (sp)+
mov (sp)+,r1
bne 1f
rts pc
1:
bic $100000,mode(r1)
movb size0(r1),mss
mov size1(r1),r2
bne 4f
tst mss
beq update1
4:
jsr r5,decode; name
mov tapea(r1),r0
jsr pc,wseek
clr r3
sys open; name; 0
bes phserr
mov r0,r3
3:
tst mss
bne 4f
cmp r2,$512.
blo 3f
4:
mov r3,r0
sys read; tapeb; 512.
bes phserr
cmp r0,$512.
bne phserr
jsr pc,twrite
sub $512.,r2
sbc mss
br 3b
3:
mov r2,0f
beq 3f
mov r3,r0
sys 0; 9f
.data
9:
sys read; tapeb; 0:..
.text
bes phserr
cmp r0,0b
bne phserr
jsr pc,twrite
3:
mov r3,r0
sys read; tapeb; 512.
bes phserr
tst r0
bne phserr
mov r3,r0
sys close
2:
jmp update1
phserr:
mov r1,-(sp)
mov $name,r1
jsr pc,pstr
jsr r5,mesg
< -- Phase error\n\0>; .even
mov (sp)+,r1
clr time0(r1) / time
beq 2b
sys close
br 2b
bitmap:
mov $map,r0
1:
clr (r0)+
cmp r0,$emap
blo 1b
mov $dir,r1
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
bne 2f
tst size1(r1)
bne 3f
tstb size0(r1)
beq 2f
3:
jsr pc,setmap
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
rts pc
setmap:
movb size0(r1),r2
mov size1(r1),r3
add $511.,r3
adc r2
ashc $-9.,r2
mov tapea(r1),r2
1:
jsr pc,bitcalc
bitb (sp),map(r0)
bne maperr
bisb (sp)+,map(r0)
inc r2
sob r3,1b
rts pc
bitcalc:
mov (sp),-(sp)
cmp r2,tapsiz
bhis maperr
mov r2,r0
bic $!7,r0
mov r0,-(sp)
mov $1,r0
als (sp)+,r0
mov r0,2(sp)
mov r2,r0
ash $-3,r0
bic $160000,r0
rts pc
maperr:
jsr r5,mesg
<Tape overflow\n\0>; .even
jmp done
usage:
jsr pc,bitmap
mov $dir,r2
1:
tst (r2)
beq 2f
inc nentr
2:
add $dirsiz,r2
cmp r2,edir
blo 1b
mov ndentd8,r2
inc r2
mov tapsiz,r3
dec r3
sub ndentd8,r3
1:
jsr pc,bitcalc
bitb (sp)+,map(r0)
beq 2f
inc nused
mov r2,lused
br 3f
2:
inc nfree
tstb flm
bne 1f
3:
inc r2
sob r3,1b
1:
mov nentr,r0
jsr r5,numb; 4
jsr r5,mesg
< entries\n\0>; .even
mov nused,r0
jsr r5,numb; 4
jsr r5,mesg
< used\n\0>; .even
tstb flm
bne 1f
mov nfree,r0
jsr r5,numb; 4
jsr r5,mesg
< free\n\0>; .even
1:
mov lused,r0
jsr r5,numb; 4
jsr r5,mesg
< last\n\0>; .even
rts pc
taboc:
tstb flv
beq 4f
mov mode(r1),r0
mov r0,-(sp)
ash $-6,r0
bit $40,r0
jsr pc,pmod
mov (sp),r0
ash $-3,r0
bit $200,r0
jsr pc,pmod
mov (sp)+,r0
bit $1000,r0
jsr pc,pmod
clr r0
bisb uid(r1),r0
jsr r5,numb; 4
clr r0
bisb gid(r1),r0
jsr r5,numb; 4
mov tapea(r1),r0
jsr r5,numb; 5
mov size1(r1),r0
jsr r5,numbx; 9.
mov r1,-(sp)
add $time0,(sp)
jsr pc,_localtime
mov r0,(sp)
mov 10.(r0),r0
jsr r5,numb; 3
mov $'/,r0
jsr pc,putc
mov (sp),r0
mov 8.(r0),r0
inc r0
jsr r5,numb; 2
mov $'/,r0
jsr pc,putc
mov (sp),r0
mov 6(r0),r0
jsr r5,numb; 2
mov (sp),r0
mov 4(r0),r0
jsr r5,numb; 3
mov $':,r0
jsr pc,putc
mov (sp)+,r0
mov 2(r0),r0
jsr r5,numb; 2
mov $' ,r0
jsr pc,putc
4:
mov $name,r1
jsr pc,pstr
jsr r5,mesg
<\n\0>
rts pc
pmod:
beq 1f
mov $'s,-(sp)
br 2f
1:
bit $1,r0
beq 1f
mov $'x,-(sp)
br 2f
1:
mov $'-,-(sp)
2:
bit $2,r0
beq 1f
mov $'w,-(sp)
br 2f
1:
mov $'-,-(sp)
2:
bit $4,r0
beq 1f
mov $'r,r0
br 2f
1:
mov $'-,r0
2:
jsr pc,putc
mov (sp)+,r0
jsr pc,putc
mov (sp)+,r0
jsr pc,putc
rts pc
xtract:
movb size0(r1),mss
bne 2f
tst size1(r1)
beq 1f
2:
jsr r5,verify; 'x
rts pc
mov size1(r1),r3
mov tapea(r1),r0
jsr pc,rseek
sys unlink; name
mov mode(r1),0f
sys 0; 9f
.data
9:
sys creat; name; 0:..
.text
bes crterr
mov r0,r2
2:
tst mss
bne 3f
cmp r3,$512.
blo 2f
3:
jsr pc,tread
mov r2,r0
sys write; tapeb; 512.
bes crterr1
cmp r0,$512.
bne crterr1
sub r0,r3
sbc mss
br 2b
2:
mov r3,0f
beq 2f
jsr pc,tread
mov r2,r0
sys 0; 9f
.data
9:
sys write; tapeb; 0:..
.text
bes crterr1
cmp r0,0b
bne crterr1
2:
mov r2,r0
sys close
movb gid(r1),0f+1
movb uid(r1),0f
sys 0; 9f
.data
9:
sys chown; name; 0:..
.text
mov time0(r1),r0
mov r1,-(sp)
mov time1(r1),r1
/ sys 0; 9f
.data
9:
sys smdate; name
.text
mov (sp)+,r1
1:
rts pc
crterr1:
clr r0
mov r1,-(sp)
clr r1
/ sys smdate; name
mov (sp)+,r1
mov r2,r0
sys close
crterr:
mov $name,r1
jsr pc,pstr
jsr r5,mesg
< -- create error\n\0>; .even
rts pc
+49
View File
@@ -0,0 +1,49 @@
/ tap4 -- dec-tape lod/dmp
.data
tc: </dev/tap>
tcx: <x\0>
mt: </dev/mt>
mtx: <0\0>
tboot: </usr/mdec/tboot\0>
mboot: </usr/mdec/mboot\0>
.even
.bss
dir: . = .+[mdirent*dirsiz]
tapeb:
map: .=.+4096.
emap:
ch: .=.+1
flc: .=.+1
flf: .=.+1
fli: .=.+1
flm: .=.+1
flu: .=.+1
flv: .=.+1
flw: .=.+1
.even
command:.=.+2
sum: .=.+2
size: .=.+2
nentr: .=.+2
nused: .=.+2
nfree: .=.+2
lused: .=.+2
catlb: .=.+20.
narg: .=.+2
rnarg: .=.+2
parg: .=.+2
fio: .=.+2
mss: .=.+2
ndirent:.=.+2
ndentd8:.=.+2
edir: .=.+2
rseeka: .=.+2
wseeka: .=.+2
tapsiz: .=.+2
name: .=.+32.
name1: .=.+32.
statb: .=.+40.
smdate = 30.
+144
View File
@@ -0,0 +1,144 @@
int dflag 0;
int sflag 0;
int cflag 0;
int save 0;
char code[256];
char squeez[256];
char vect[256];
struct string { int last, max, rep; char *p; } string1, string2;
int inbuf[259];
main(argc,argv)
char **argv;
{
int i, j;
int c, d;
char *compl;
extern fout;
string1.last = string2.last = 0;
string1.max = string2.max = 0;
string1.rep = string2.rep = 0;
string1.p = string2.p = "";
if(--argc>0) {
argv++;
if(*argv[0]=='-'&&argv[0][1]!=0) {
while(*++argv[0])
switch(*argv[0]) {
case 'c':
cflag++;
continue;
case 'd':
dflag++;
continue;
case 's':
sflag++;
continue;
}
argc--;
argv++;
}
}
if(argc>0) string1.p = argv[0];
if(argc>1) string2.p = argv[1];
for(i=0; i<256; i++)
code[i] = vect[i] = 0;
if(cflag) {
while(c = next(&string1))
vect[c&0377] = 1;
j = 0;
for(i=1; i<256; i++)
if(vect[i]==0) vect[j++] = i;
vect[j] = 0;
compl = vect;
}
for(i=0; i<256; i++)
squeez[i] = 0;
for(;;){
if(cflag) c = *compl++;
else c = next(&string1);
if(c==0) break;
d = next(&string2);
if(d==0) d = c;
code[c&0377] = d;
squeez[d&0377] = 1;
}
while(d = next(&string2))
squeez[d&0377] = 1;
squeez[0] = 1;
for(i=0;i<256;i++) {
if(code[i]==0) code[i] = i;
else if(dflag) code[i] = 0;
}
inbuf[0] = 0;
fout = dup(1);
close(1);
while((c=getc(inbuf)) >=0 ) {
if(c == 0) continue;
if(c = code[c&0377]&0377)
if(!sflag || c!=save || !squeez[c&0377])
putchar(save = c);
}
flush();
}
next(s)
struct string *s;
{
int a, b, c, n;
int base;
if(--s->rep > 0) return(s->last);
if(s->last < s->max) return(++s->last);
if(*s->p=='[') {
nextc(s);
s->last = a = nextc(s);
s->max = 0;
switch(nextc(s)) {
case '-':
b = nextc(s);
if(b<a || *s->p++!=']')
goto error;
s->max = b;
return(a);
case '*':
base = (*s->p=='0')?8:10;
n = 0;
while((c = *s->p)>='0' && c<'0'+base) {
n = base*n + c - '0';
s->p++;
}
if(*s->p++!=']') goto error;
if(n==0) n = 1000;
s->rep = n;
return(a);
default:
error:
write(1,"Bad string\n",11);
exit();
}
}
return(nextc(s));
}
nextc(s)
struct string *s;
{
int c, i, n;
c = *s->p++;
if(c=='\\') {
i = n = 0;
while(i<3 && (c = *s->p)>='0' && c<='7') {
n = n*8 + c - '0';
i++;
s->p++;
}
if(i>0) c = n;
else c = *s->p++;
}
if(c==0) *--s->p = 0;
return(c&0377);
}
+17
View File
@@ -0,0 +1,17 @@
/ tty -- get tty number
.globl ttyn
clr r0
jsr pc,ttyn
movb r0,nam
mov $1,r0
sys write; name; 5
sys exit
.data
name:
<tty>
nam:
<x\n>
.even
+347
View File
@@ -0,0 +1,347 @@
char number[3];
int eflg;
char w2006[100];
flg 0;
char realwd[100];
char *wd {&realwd[1]};
char *fptr;
char *ffptr &ffbuf;
char ffbuf[36];
int neng;
int npr;
int table[2]; /*keep these four cards in order*/
int tab1[26];
int tab2[730];
char tab3[19684];
int logtab[256];
float inctab[256];
char nwd[100];
int tot;
int wtot;
char *buf[3];
file[3];
ptr[3];
char *name[3];
bsp[768];
main(argc,argv) int argc; char *argv[]; {
char let,lt;
auto arg,t,sw,i,j,salt,er,c;
register k,l,m;
double junk;
int unl();
int ii;
double log(), exp(), pow();
nice(-20);
inctab[0] = 1;
logtab[0] = -10;
for(ii=1; ii<256; ii++){
inctab[ii] = exp(-ii/30.497);
logtab[ii] = log(30.*pow(1.0333,ii+0.) - 30.) + .5;
}
logtab[1] = -10;
number[2] = ' ';
buf[0] = bsp;
buf[1] = bsp + 0400;
buf[2] = bsp + 01000;
ptr[0] = 0; ptr[1] = 0;
ptr[2] = 1;
arg = 1;
while(argc>1 && argv[arg][0] == '-') {
switch(argv[arg][1]) {
default:
printf("Unrecognizable argument: %c\n",argv[arg][1]);
exit();
case 0:
case 'n':
neng++;
break;
case '1':
npr++;
}
arg++;
--argc;
}
if(!neng) {
salt = open("/usr/lib/salt",0);
er = read(salt,table,21200);
if(er != 21200)err("read salt");
close(salt);
}
if((signal(2,1) & 1) != 1)
signal(2,unl);
name[0] = "/usr/tmp/ttmpa1";
name[1] = "/usr/tmp/ttmpa2";
name[2] = "/usr/tmp/ttmpa3";
while((file[0] = open(name[0],1)) > 0){
close(file[0]);
for(j=0; j < 3; j++)name[j][13]++;
if(name[0][13] == 'z')err("creat tmp file");
}
file[0] = creat(name[0],0666);
fptr = argv[arg];
if(argc == 1) {argc = 2; arg = 0;}
while(--argc){
if(arg == 0){
file[2] = 0;
}else{
file[2] = open(argv[arg++],0);
if(file[2] < 0)err("open input file");
}
eflg = 1;
while((j = wdval(2)) != 0){
put(0,nwd,j);
k = -1;
l = 0;
m = 1;
if(inctab[table[0]] > (junk=rand()/32768.)) table[0]++;
while(m <= j){
c = 27*wd[k++] + wd[l++];
if(inctab[tab2[c]] > junk) tab2[c]++;
c = 27*c + wd[m++];
if(inctab[tab3[c]] > junk) tab3[c]++;
}
c = 27*wd[k] + wd[l];
if(inctab[tab2[c]] > junk) tab2[c]++;
}
if(file[2]) close(file[2]);
}
flsh(0,0);
close(file[0]);
sw = fork();
if(sw == 0){execl("/usr/bin/usort","usort","-o",name[2],name[0],0);
err("sort"); }
if(sw == -1)err("fork");
er = wait();
if(er != sw)err("probs");
file[0] = creat(name[0],0666);
if(file[0] < 0)err("creat tmp");
file[1] = open("/usr/lib/w2006",0);
if(file[1] < 0)err("open w2006");
ptr[1] = 1;
for(k=0;((c = w2006[k] = get(1)) != '\n');k++)
if(c == -1) break;
file[2] = open(name[2],0);
if(file[2] < 0)err("open tmp");
ptr[2] = 1;
while(ptr[2]){
l=0;
for(k=0;((c = wd[k] = get(2)) != '\n');k++)
if(c == -1)goto done;
for(i=0; i<=k;i++){
if(wd[i] < w2006[l]){
put(0,wd,k);
break;
}
if(wd[i] > w2006[l]){
for(l=0;((c = w2006[l] = get(1)) != '\n');l++)
if(c == -1){
put(0,wd,k);
for(k=0;((c = wd[k] =get(2))!= -1);k++){
put(0,wd,k);
k = -1;
}
goto done;
}
i = -1;
l=0;
continue;
}
l++;
}
}
done:
close(file[2]);
unlink(name[2]);
flsh(0,0);
close(file[1]);
close(file[0]);
ptr[1] = 1;
file[1] = open(name[0],0);
if(file[1] < 0)err("open tmp ");
file[0] = creat(name[1],0666);
if(file[0] < 0)err("create tmp");
while((j = nwdval(1)) != 0){
wtot = 0;
flg = 0;
k = -1; l = 0; m = 1;
while(m <= j){
tot = 0;
c = wd[k++]*27 + wd[l++];
tot =+ (logtab[tab2[c]]+logtab[tab2[wd[k]*27+wd[l]]]);
tot =>> 1;
c = c*27 + wd[m++];
tot =- logtab[tab3[c] & 0377];
if(tot > wtot) wtot = tot;
}
if(wtot < 0) wtot = 0;
t = conf(wtot,2,number);
put(0,number,2);
put(0,nwd,j);
}
flsh(0,0);
close(file[1]);
close(file[0]);
sw = fork();
if(sw == 0){execl("/bin/sort","sort","+0nr", "+1","-o",name[1],name[1]
,0);
err("sort"); }
if(sw == -1)err("fork");
er = wait();
if(er != sw)err("prob");
sw = fork();
if(sw == 0){
if(npr) {
execl("/bin/cat","cat",name[1],0);
} else {
i = 0 ;
while((c = "Possible typo's in "[i++])!=0)
*ffptr++ = c;
i = 0;
while((c = fptr[i++]) != 0)
*ffptr++ = c;
*ffptr = 0;
execl("/bin/pr","pr","-3", "-h",
ffbuf,name[1],0);
err("pr");
}
}
if(sw == -1)err("fork");
er = wait();
if(er != sw)err("prob");
unl();
}
unl() {
register j;
j = 2;
while(j--)unlink(name[j]);
exit();
}
err(c) char c[];{
register j;
printf("cannot %s\n",c);
unl();
}
get(ifile) int ifile;{
static char *ibuf[10];
if(--ptr[ifile]){
return(*ibuf[ifile]++ & 0377);}
if(ptr[ifile] = read(file[ifile],buf[ifile],512)){
if(ptr[ifile] < 0)goto prob;
ibuf[ifile] = buf[ifile];
return(*ibuf[ifile]++ & 0377);
}
ptr[ifile] = 1;
return(-1);
prob:
ptr[ifile] = 1;
printf("read error\n");
return(-1);
}
put(ofile,s,optr) char s[]; {
register i;
while(optr-- >= 0)
buf[ofile][(ptr[ofile] < 512)?ptr[ofile]++:flsh(ofile,1)] = *s++;
return;
}
flsh(ofile,i){
register error;
error = write(file[ofile],buf[ofile],ptr[ofile]);
if(error < 0)goto prob;
ptr[ofile] = i;
return(0);
prob:
printf("write error on t.%d\n",file[ofile]);
unl();
}
wdval(wfile) int wfile; {
static let,wflg;
register j;
beg:
j = -1;
if(wflg == 1){wflg = 0;
goto st; }
while((let = get(wfile)) != '\n'){
st:
switch(let){
case -1: return(0);
case '%': if(j != -1)break;
goto ret;
case '-':
if((let = get(wfile)) == '\n'){
while((let = get(wfile)) == '\n')if(let == -1)return(0);
goto st; }
else {wflg = 1;
goto ret; }
case '\'':
if(eflg != 1){
if(j < 1)goto beg;
else break;
}
case '.':
if(eflg == 1){
while((let = get(wfile)) != '\n')if(let == -1)return(0);
goto beg; }
else goto ret;
default:
eflg = 0;
if(let < 'A')goto ret;
if(let <= 'Z'){ wd[++j] = let - 0100;
nwd[j] = let + ' ';
break; }
if(let < 'a' || let > 'z')goto ret;
wd[++j] = let - 0140;
nwd[j] = let;
}
eflg = 0; }
eflg = 1;
ret:
if(j < 1)goto beg;
nwd[++j] = '\n';
wd[j] = 0;
return(j);
}
nwdval(wfile) int wfile;{
register j;
register char c;
j = -1;
do{
if(( c = nwd[++j] = get(wfile)) == -1)return(0);
wd[j] = c - 0140;
}
while(c != '\n');
wd[j] = '\0';
return(j);
}
conf(n,width,cbuf) char cbuf[]; {
register i,a;
i = width;
while(i--)cbuf[i] = ' ';
cbuf[(a = n/10)?conf(a,--width,cbuf):--width] = n%10 + '0';
return(++width);
}
rand(){
static gorp;
gorp = (gorp + 625) & 077777;
return(gorp);
}
+53
View File
@@ -0,0 +1,53 @@
#define NMOUNT 16
#define NAMSIZ 32
struct mtab {
char file[NAMSIZ];
char spec[NAMSIZ];
} mtab[NMOUNT];
main(argc, argv)
char **argv;
{
register struct mtab *mp;
register char *p1, *p2;
int mf;
sync();
mf = open("/etc/mtab", 0);
read(mf, mtab, NMOUNT*2*NAMSIZ);
if(argc != 2) {
printf("arg count\n");
return;
}
if (umount(argv[1]) < 0) {
perror("umount");
return;
}
p1 = argv[1];
while(*p1++)
;
p1--;
while(*--p1 == '/')
*p1 = '\0';
while(p1 > argv[1] && *--p1 != '/')
;
if(*p1 == '/')
p1++;
argv[1] = p1;
for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
p1 = argv[1];
p2 = &mp->spec[0];
while (*p1++ == *p2)
if (*p2++ == 0) {
for (p1 = mp->file; p1 < &mp->file[NAMSIZ*2];)
*p1++ = 0;
mp = &mtab[NMOUNT];
while ((--mp)->file[0] == 0);
mf = creat("/etc/mtab", 0644);
write(mf, mtab, (mp-mtab+1)*2*NAMSIZ);
return;
}
}
printf("%s not in mount table\n", argv[1]);
}
+162
View File
@@ -0,0 +1,162 @@
fields 0;
letters 0;
linec;
mode;
uniq;
main(argc, argv)
int argc;
char *argv[];
{
extern fin, fout;
int f;
static char b1[1000], b2[1000];
loop:
if(argc > 1) {
if(*argv[1] == '-') {
if(argv[1][1] <= '9')
fields = conv(&argv[1][1]);
else mode = argv[1][1];
argc--;
argv++;
goto loop;
}
if(*argv[1] == '+') {
letters = conv(&argv[1][1]);
argc--;
argv++;
goto loop;
}
f = open(argv[1], 0);
if(f < 0) {
printf("cannot open %s\n", argv[1]);
exit();
}
fin = f;
} else
fin = dup(0);
if(argc > 2) {
f = creat(argv[2], 0666);
if(f < 0) {
printf("cannot create %s\n", argv[2]);
exit();
}
fout = f;
} else
fout = dup(1);
close(0);
close(1);
gline(b1);
l1:
linec++;
if(gline(b2)) {
pline(b1);
flush();
exit();
}
if(equal(b1, b2)) goto l1;
pline(b1);
linec = 0;
l2:
linec++;
if(gline(b1)) {
pline(b2);
flush();
exit();
}
if(equal(b1, b2)) goto l2;
pline(b2);
linec = 0;
goto l1;
}
gline(buf)
char buf[];
{
int c;
while((c = getchar()) != '\n') {
if(c == '\0')
return(1);
*buf++ = c;
}
*buf = 0;
return(0);
}
pline(buf)
char buf[];
{
int c;
switch(mode) {
case 'u':
if(uniq) {;
uniq = 0;
return;
}
break;
case 'd':
if(uniq) break;
return;
case 'c':
printf("%4d ", linec);
}
uniq = 0;
while((c = *buf++) != 0)
putchar(c);
putchar('\n');
}
equal(b1, b2)
char b1[], b2[];
{
int c;
b1 = skip(b1);
b2 = skip(b2);
while((c = *b1++) != 0)
if(c != *b2++) return(0);
if(*b2 != 0)
return(0);
uniq++;
return(1);
}
char *
skip(s)
char *s;
{
int nf, nl;
nf = nl = 0;
while(nf++ < fields) {
while(*s==' ' || *s=='\t')
s++;
while( !(*s==' ' || *s=='\t') )
if(*s == 0) return(s);
else s++;
}
while(nl++ < letters)
if(*s == 0) return(s);
else s++;
return(s);
}
conv(s)
char *s;
{
int d, n;
n = 0;
for(;;) {
d = *s++ - '0';
if(0>d || d>9) break;
n = n*10 + d;
}
return(n);
}
+456
View File
@@ -0,0 +1,456 @@
#define NDIM 10
#define NTAB 601
char *dfile "/usr/lib/units";
char *unames[NDIM];
double getflt();
int fperr();
struct unit
{
double factor;
char dim[NDIM];
};
struct table
{
double factor;
char dim[NDIM];
char *name;
} table[NTAB];
char names[NTAB*10];
struct prefix
{
double factor;
char *pname;
} prefix[]
{
1e-18, "atto",
1e-15, "femto",
1e-12, "pico",
1e-9, "nano",
1e-6, "micro",
1e-3, "milli",
1e-2, "centi",
1e-1, "deci",
1e1, "deka",
1e2, "hecta",
1e2, "hecto",
1e3, "kilo",
1e6, "mega",
1e6, "meg",
1e9, "giga",
1e12, "tera",
0.0, 0
};
int ibuf[259];
int fperrc;
int peekc;
int dumpflg;
main(argc, argv)
char *argv[];
{
register i;
register char *file;
struct unit u1, u2;
double f;
if(argc>1 && *argv[1]=='-') {
argc--;
argv++;
dumpflg++;
}
file = dfile;
if(argc > 1)
file = argv[1];
if(fopen(file, ibuf) < 0) {
printf("no table\n");
exit();
}
ldfps(07600); /* interrupt on fp errors */
signal(8, fperr);
init();
close(ibuf[0]);
ibuf[0] = 0;
loop:
fperrc = 0;
printf("you have: ");
if(convr(&u1))
goto loop;
if(fperrc)
goto fp;
loop1:
printf("you want: ");
if(convr(&u2))
goto loop1;
for(i=0; i<NDIM; i++)
if(u1.dim[i] != u2.dim[i])
goto conform;
f = u1.factor/u2.factor;
if(fperrc)
goto fp;
printf("\t* %e\n", f);
printf("\t/ %e\n", 1./f);
goto loop;
conform:
if(fperrc)
goto fp;
printf("conformability\n");
units(&u1);
units(&u2);
goto loop;
fp:
printf("underflow or overflow\n");
goto loop;
}
units(up)
struct unit *up;
{
register struct unit *p;
register f, i;
p = up;
printf("\t%e ", p->factor);
f = 0;
for(i=0; i<NDIM; i++)
f =| pu(p->dim[i], i, f);
if(f&1) {
putchar('/');
f = 0;
for(i=0; i<NDIM; i++)
f =| pu(-p->dim[i], i, f);
}
putchar('\n');
}
pu(u, i, f)
{
if(u > 0) {
if(f&2)
putchar('-');
if(unames[i])
printf("%s", unames[i]); else
printf("*%c*", i+'a');
if(u > 1)
putchar(u+'0');
return(2);
}
if(u < 0)
return(1);
return(0);
}
convr(up)
struct unit *up;
{
register struct unit *p;
register c;
register char *cp;
char name[20];
int den, err;
p = up;
for(c=0; c<NDIM; c++)
p->dim[c] = 0;
p->factor = getflt();
if(p->factor == 0.)
p->factor = 1.0;
err = 0;
den = 0;
cp = name;
loop:
switch(c=get()) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '/':
case ' ':
case '\t':
case '\n':
if(cp != name) {
*cp++ = 0;
cp = name;
err =| lookup(cp, p, den, c);
}
if(c == '/')
den++;
if(c == '\n')
return(err);
goto loop;
}
*cp++ = c;
goto loop;
}
lookup(name, up, den, c)
char *name;
struct unit *up;
{
register struct unit *p;
register struct table *q;
register i;
char *cp1, *cp2;
double e;
p = up;
e = 1.0;
loop:
q = hash(name);
if(q->name) {
l1:
if(den) {
p->factor =/ q->factor*e;
for(i=0; i<NDIM; i++)
p->dim[i] =- q->dim[i];
} else {
p->factor =* q->factor*e;
for(i=0; i<NDIM; i++)
p->dim[i] =+ q->dim[i];
}
if(c >= '2' && c <= '9') {
c--;
goto l1;
}
return(0);
}
for(i=0; cp1 = prefix[i].pname; i++) {
cp2 = name;
while(*cp1 == *cp2++)
if(*cp1++ == 0) {
cp1--;
break;
}
if(*cp1 == 0) {
e =* prefix[i].factor;
name = cp2-1;
goto loop;
}
}
for(cp1 = name; *cp1; cp1++);
if(cp1 > name+1 && *--cp1 == 's') {
*cp1 = 0;
goto loop;
}
printf("cannot recognize %s\n", name);
return(1);
}
equal(s1, s2)
char *s1, *s2;
{
register char *c1, *c2;
c1 = s1;
c2 = s2;
while(*c1++ == *c2)
if(*c2++ == 0)
return(1);
return(0);
}
init()
{
register char *cp;
register struct table *tp, *lp;
int c, i, f, t;
char *np;
cp = names;
for(i=0; i<NDIM; i++) {
np = cp;
*cp++ = '*';
*cp++ = i+'a';
*cp++ = '*';
*cp++ = 0;
lp = hash(np);
lp->name = np;
lp->factor = 1.0;
lp->dim[i] = 1;
}
lp = hash("");
lp->name = cp-1;
lp->factor = 1.0;
l0:
c = get();
if(c == 0) {
printf("%l units; %l bytes\n\n", i, cp-names);
if(dumpflg)
for(tp = &table[0]; tp < &table[NTAB]; tp++) {
if(tp->name == 0)
continue;
printf("%s", tp->name);
units(tp);
}
return;
}
if(c == '/')
while(c != '\n')
c = get();
if(c == '\n')
goto l0;
np = cp;
while(c != ' ' && c != '\t') {
*cp++ = c;
c = get();
if(c == '\n') {
*cp++ = 0;
tp = hash(np);
if(tp->name)
goto redef;
tp->name = np;
tp->factor = lp->factor;
for(c=0; c<NDIM; c++)
tp->dim[c] = lp->dim[c];
i++;
goto l0;
}
}
*cp++ = 0;
lp = hash(np);
if(lp->name)
goto redef;
convr(lp);
lp->name = np;
f = 0;
i++;
if(lp->factor != 1.0)
goto l0;
for(c=0; c<NDIM; c++) {
t = lp->dim[c];
if(t>1 || (f>0 && t!=0))
goto l0;
if(f==0 && t==1) {
if(unames[c])
goto l0;
f = c+1;
}
}
if(f>0)
unames[f-1] = np;
goto l0;
redef:
printf("redefination %s\n", np);
goto l0;
}
double
getflt()
{
register c, i, dp;
double d, e;
int f;
d = 0.;
dp = 0;
do
c = get();
while(c == ' ' || c == '\t');
l1:
if(c >= '0' && c <= '9') {
d = d*10. + c-'0';
if(dp)
dp++;
c = get();
goto l1;
}
if(c == '.') {
dp++;
c = get();
goto l1;
}
if(dp)
dp--;
if(c == '+' || c == '-') {
f = 0;
if(c == '-')
f++;
i = 0;
c = get();
while(c >= '0' && c <= '9') {
i = i*10 + c-'0';
c = get();
}
if(f)
i = -i;
dp =- i;
}
e = 1.;
i = dp;
if(i < 0)
i = -i;
while(i--)
e =* 10.;
if(dp < 0)
d =* e; else
d =/ e;
if(c == '|')
return(d/getflt());
peekc = c;
return(d);
}
get()
{
register c;
if(c=peekc) {
peekc = 0;
return(c);
}
c = getc(ibuf);
if(c <= 0) {
if(ibuf[0])
return(0);
printf("\n");
exit();
}
return(c);
}
hash(name)
char *name;
{
register struct table *tp;
register char *np;
register h;
h = 0;
np = name;
while(*np)
h = h*57 + *np++ - '0';
h = lrem(0, h, NTAB);
tp = &table[h];
l0:
if(tp->name == 0)
return(tp);
if(equal(name, tp->name))
return(tp);
tp++;
if(tp >= &table[NTAB])
tp = table;
goto l0;
}
fperr()
{
signal(8, fperr);
fperrc++;
}
+17
View File
@@ -0,0 +1,17 @@
sys fork
br 1f
sys exit
1:
clr r0
sys close
mov $1,r0
sys close
mov $2,r0
sys close
1:
sys sync
mov $30.,r0
sys sleep
br 1b
sleep = 35.
sync = 36.
+649
View File
@@ -0,0 +1,649 @@
#define L 512
#define N 7
#define C 20
#define MEM (16*2048)
#define NF 10
int ibuf[259];
int obuf[259];
char *file;
char *filep;
int nfiles;
int nlines;
int ntext;
int *lspace;
char *tspace;
int cmp();
int term();
int mflg;
char *outfil;
char tabchar;
int eargc;
char **eargv;
char fold[128] {
0000,0001,0002,0003,0004,0005,0006,0007,
0010,0011,0012,0013,0014,0015,0016,0017,
0020,0021,0022,0023,0024,0025,0026,0027,
0030,0031,0032,0033,0034,0035,0036,0037,
0040,0041,0042,0043,0044,0045,0046,0047,
0050,0051,0052,0053,0054,0055,0056,0057,
0060,0061,0062,0063,0064,0065,0066,0067,
0070,0071,0072,0073,0074,0075,0076,0077,
0100,0101,0102,0103,0104,0105,0106,0107,
0110,0111,0112,0113,0114,0115,0116,0117,
0120,0121,0122,0123,0124,0125,0126,0127,
0130,0131,0132,0133,0134,0134,0136,0137,
0140,0101,0102,0103,0104,0105,0106,0107,
0110,0111,0112,0113,0114,0115,0116,0117,
0120,0121,0122,0123,0124,0125,0126,0127,
0130,0131,0132,0173,0174,0175,0176,0177
};
char nofold[128];
char dict[128] {
1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
};
char nodict[128] { 1 };
struct field {
char *code;
char *ignore;
int nflg;
int rflg;
int bflg;
char *m[2];
char *n[2];
} fields[NF];
int proto[9] {
&fold,
&nodict,
0,
1,
0,
0,-1,
0,0
};
int nfields;
int error 1;
main(argc, argv)
char **argv;
{
register a, i;
char *arg;
register int *p;
int *q;
for(a=0; a<128; a++)
nofold[a] = a;
nodict[127] = 1;
copyproto();
eargv = argv;
while (--argc > 0) {
if(**++argv == '-') for(arg = *argv;;) {
switch(*++arg) {
case '\0':
if(arg[-1] == '-')
eargv[eargc++] = "-";
break;
case 'm':
mflg++;
continue;
case 'o':
if(--argc > 0)
outfil = *++argv;
continue;
default:
field(++*argv,1);
break;
}
break;
} else if (**argv == '+') {
if(++nfields>=NF) {
mess("Too many keys\n");
exit(1);
}
copyproto();
field(++*argv,0);
} else
eargv[eargc++] = *argv;
}
q = &fields[0];
for(a=1; a<=nfields; a++) {
p = &fields[a];
for(i=0; i<5; i++) /*sensitive to sizeof(proto)*/
if(p[i] != proto[i])
goto next;
for(i=0; i<5; i++)
p[i] = q[i];
next: ;
}
if(eargc == 0)
eargv[eargc++] = "-";
a = MEM;
i = lspace = sbrk(0);
while(brk(a) == -1)
a =- 512;
brk(a =- 512); /* for recursion */
a =- i;
nlines = ((a-L)>>1) & 077777;
nlines =/ 5;
ntext = nlines*8;
tspace = lspace+nlines;
file = "/usr/tmp/stmXaa";
loop:
filep = file;
while(*filep != 'X')
filep++;
for(*filep = 'a';;(*filep)++) {
if(stat(file, lspace) < 0) {
a = creat(file, 0600);
if(a >= 0)
break;
}
if(*filep == 'z') {
if(file[1] != 't') {
file = "/tmp/stmXaa";
goto loop;
}
mess("Cannot locate temp\n");
exit(1);
}
}
close(a);
filep++;
if ((signal(2, 1) & 01) == 0)
signal(2, term);
nfiles = eargc;
if(!mflg) {
ibuf[0] = -1;
sort();
close(0);
}
for(a = mflg?0:eargc; a+N < nfiles; a=+N) {
newfile();
merge(a, a+N);
}
if(a != nfiles) {
oldfile();
merge(a, nfiles);
}
error = 0;
term();
}
sort()
{
register char *cp;
register *lp, c;
int done;
int i;
int f;
done = 0;
i = 0;
do {
cp = tspace;
lp = lspace;
while(lp < lspace+nlines && cp < tspace+ntext) {
*lp++ = cp;
while((*cp++ = c = getc(ibuf)) != '\n') {
if(c >= 0) continue;
cp--;
close(ibuf[0]);
if(i < eargc) {
if((f = setfil(i++)) == 0)
ibuf[0] = 0;
else if(fopen(f, ibuf) < 0)
cant(f);
} else
break;
}
if(c < 0) {
done++;
lp--;
break;
}
}
qsort(lspace, lp-lspace, 2, cmp);
if(done == 0 || nfiles != eargc)
newfile(); else
oldfile();
while(lp > lspace) {
cp = *--lp;
if(*cp)
do
putc(*cp, obuf);
while(*cp++ != '\n');
}
fflush(obuf);
close(obuf[0]);
} while(done == 0);
}
struct merg
{
char l[L];
int b[259];
};
merge(a, b)
{
register struct merg *p;
register char *cp;
register i;
struct { int *ip;};
int f;
int j;
int k,l,c;
p = lspace;
j = 0;
for(i=a; i<b; i++) {
f = setfil(i);
if(f == 0)
p->b[0] = dup(0);
else if(fopen(f, p->b) < 0)
cant(f);
ibuf[j] = p;
if(!rline(p)) j++;
p++;
}
do {
i = j;
qsort(ibuf, i, 2, cmp);
l = 0;
while(i--) {
cp = ibuf[i];
if(*cp == '\0') {
l = 1;
if(rline(ibuf[i])) {
k = i;
while(++k < j)
ibuf[k-1] = ibuf[k];
j--;
}
}
}
} while(l);
i = j;
if(i > 0) for(;;) {
cp = ibuf[i-1];
if(i == 1 || cmp(&ibuf[i-1], &ibuf[i-2]))
do
putc(*cp, obuf);
while(*cp++ != '\n');
if(rline(ibuf[i-1])) {
i--;
if(i == 0)
break;
}
cp = &ibuf[i];
while (--cp.ip > ibuf && cmp(cp.ip, cp.ip-1) < 0) {
p = *cp.ip;
*cp.ip = *(cp.ip-1);
*(cp.ip-1) = p;
}
}
p = lspace;
for(i=a; i<b; i++) {
close(p->b[0]);
p++;
if(i >= eargc)
close(creat(setfil(i)));
}
fflush(obuf);
close(obuf[0]);
}
rline(mp)
struct merg *mp;
{
register char *cp;
register *bp, c;
bp = mp->b;
cp = mp->l;
do {
c = getc(bp);
if(c < 0)
return(1);
*cp++ = c;
} while(c != '\n');
*cp = '\0';
return(0);
}
newfile()
{
if(fcreat(setfil(nfiles), obuf) < 0) {
mess("Can't create temp\n");
term();
}
nfiles++;
}
char *
setfil(i)
{
if(i < eargc)
if(eargv[i][0] == '-' && eargv[i][1] == '\0')
return(0);
else
return(eargv[i]);
i =- eargc;
filep[0] = i/26 + 'a';
filep[1] = i%26 + 'a';
return(file);
}
oldfile()
{
if(outfil) {
if(fcreat(outfil, obuf) < 0) {
mess("Can't create output\n");
term();
}
} else
obuf[0] = 1;
}
cant(f)
{
mess("Can't open ");
mess(f);
mess("\n");
term();
}
term()
{
register i;
if(nfiles == eargc)
nfiles++;
for(i=eargc; i<nfiles; i++) {
unlink(setfil(i));
}
exit(error);
}
cmp(a, b)
int *a,*b;
{
register char *ra, *rb;
ra = *a - 1;
rb = *b - 1;
while(*++ra == *++rb)
if(*ra == '\n')
return(0);
return(*rb - *ra);
}
skip(pp, fp, j)
struct field *fp;
char *pp;
{
register i;
register char *p;
p = pp;
if( (i=fp->m[j]) < 0)
return(-1);
while(i-- > 0) {
if(tabchar != 0) {
while(*p != tabchar)
if(*p != '\n')
p++;
else goto ret;
p++;
} else {
while(blank(*p))
p++;
while(!blank(*p))
if(*p != '\n')
p++;
else goto ret;
}
}
if(fp->bflg)
while(blank(*p))
p++;
i = fp->n[j];
while(i-- > 0) {
if(*p != '\n')
p++;
else goto ret;
}
ret:
return(p);
}
digit(c)
{
return(c <= '9' && c >= '0');
}
mess(s)
char *s;
{
while(*s)
write(2, s++, 1);
}
copyproto()
{
register int i, *p, *q;
p = proto;
q = &fields[nfields];
for(i=0; i<sizeof(proto)/2; i++)
*q++ = *p++;
}
field(s,k)
char *s;
{
register struct field *p;
p = &fields[nfields];
for(; *s!=0; s++) {
switch(*s) {
case '\0':
return;
case 'a':
p->code = nofold;
break;
case 'b':
p->bflg++;
break;
case 'd':
p->ignore = dict;
break;
case 'n':
p->nflg++;
break;
case 't':
tabchar = *++s;
if(tabchar == 0) s--;
break;
case 'r':
p->rflg = -1;
break;
default:
p->m[k] = number(&s);
if(*s == '.')
s++;
p->n[k] = number(&s);
s--;
}
}
}
number(ppa)
char **ppa;
{
int n;
register char *pa;
pa = *ppa;
n = 0;
while(digit(*pa))
n = n*10 + *pa++ - '0';
*ppa = pa;
return(n);
}
blank(c)
{
if(c==' ' || c=='\t')
return(1);
return(0);
}
int (*qscmp)();
int qses;
qsort(a, n, es, fc)
char *a;
int n, es;
int (*fc)();
{
qscmp = fc;
qses = es;
qs1(a, a+n*es);
}
qs1(a, l)
char *a, *l;
{
register char *i, *j, *es;
char **k;
char *lp, *hp;
int n, c;
es = qses;
start:
if((n=l-a) <= es)
return;
n = ((n/(2*es))*es) & 077777;
hp = lp = a+n;
i = a;
j = l-es;
for(;;) {
if(i < lp) {
if((c = (*qscmp)(i, lp)) == 0) {
qsexc(i, lp =- es);
continue;
}
if(c < 0) {
i =+ es;
continue;
}
}
loop:
if(j > hp) {
if((c = (*qscmp)(hp, j)) == 0) {
qsexc(hp =+ es, j);
goto loop;
}
if(c > 0) {
if(i == lp) {
qstexc(i, hp =+ es, j);
i = lp =+ es;
goto loop;
}
qsexc(i, j);
j =- es;
i =+ es;
continue;
}
j =- es;
goto loop;
}
if(i == lp) {
for(k=lp+2; k<=hp;) *(*k++)='\0';
if(lp-a >= l-hp) {
qs1(hp+es, l);
l = lp;
} else {
qs1(a, lp);
a = hp+es;
}
goto start;
}
qstexc(j, lp =- es, i);
j = hp =- es;
}
}
qsexc(i, j)
char *i, *j;
{
register char *ri, *rj, c;
int n;
n = qses;
ri = i;
rj = j;
do {
c = *ri;
*ri++ = *rj;
*rj++ = c;
} while(--n);
}
qstexc(i, j, k)
char *i, *j, *k;
{
register char *ri, *rj, *rk;
char c;
int n;
n = qses;
ri = i;
rj = j;
rk = k;
do {
c = *ri;
*ri++ = *rk;
*rk++ = *rj;
*rj++ = c;
} while(--n);
}
+68
View File
@@ -0,0 +1,68 @@
char mesg[3000];
int msize;
struct
{
char name[8];
char tty[2];
int time[2];
int junk;
} utmp[50];
main(argc, argv)
char *argv[];
{
register i, *p;
int f;
f = open("/etc/utmp", 0);
if(f < 0) {
printf("utmp?\n");
exit();
}
read(f, utmp, sizeof utmp);
close(f);
f = 0;
if(argc >= 2) {
f = open(argv[1], 0);
if(f < 0) {
printf("%s?\n", argv[1]);
exit();
}
}
while((i = read(f, &mesg[msize], sizeof mesg - msize)) > 0)
msize =+ i;
close(f);
for(i=0; i<sizeof utmp/sizeof utmp[0]; i++) {
p = &utmp[i];
if(p->tty[0] == 0)
continue;
sleep(1);
sendmes(p->tty[0]);
}
}
sendmes(tty)
{
register i;
register char *s;
i = fork();
if(i == -1) {
printf("try again\n");
return;
}
if(i)
return;
s = "/dev/ttyx";
s[8] = tty;
i = open(s, 1);
if(i < 0) {
printf("cannot open tty%c\n", tty);
exit();
}
close(1);
dup(i);
printf("Broadcast Message ...\n\n");
write(1, mesg, msize);
exit();
}
+73
View File
@@ -0,0 +1,73 @@
/* wc line and word count */
int buf[259];
int wordct[2];
int twordct[2];
int linect[2];
int tlinect[2];
main(argc,argv)
char **argv;
{
int i, token;
register char *p1, *p2;
register int c;
i = 1;
do {
if(argc<=1) buf[0] = 0;
else if(fopen(argv[i],buf)<0) {
diag(argv[i]);
diag(": cannot open\n");
continue;
}
p1 = 0;
p2 = 0;
linect[0] = linect[1] = 0;
wordct[0] = wordct[1] = 0;
token = 0;
for(;;) {
if(p1 >= p2) {
p1 = &buf[1];
c = read(buf[0], p1, 512);
if(c <= 0)
break;
p2 = p1+c;
}
c = 0;
c =| *p1++;
if(' '<c&&c<0177) {
if(!token++) {
if(++wordct[1]==0)
wordct[0]++;
}
} else {
if(c=='\n') {
if(++linect[1]==0)
linect[0]++;
}
else if(c!=' '&&c!='\t')
continue;
token = 0;
}
}
printf("%7s ",locv(linect[0],linect[1]));
printf("%7s ",locv(wordct[0],wordct[1]));
printf("%s\n", argc<=1?"":argv[i]);
close(buf[0]);
ladd(tlinect, tlinect, linect);
ladd(twordct, twordct, wordct);
} while(++i<argc);
if(argc > 2) {
printf("%7s ",locv(tlinect[0],tlinect[1]));
printf("%7s ",locv(twordct[0],twordct[1]));
printf("total\n");
}
}
diag(s)
char *s;
{
while(*s)
write(2,s++,1);
}
+68
View File
@@ -0,0 +1,68 @@
/*
* who
*/
int fout;
int buf[256];
main(argc, argv)
char **argv;
{
char *s, *cbuf;
int n, fi, i;
int tty;
struct {
char name[8];
char tty;
char pad1;
int time[2];
char pad2[2];
} *p;
s = "/etc/utmp";
if(argc == 2)
s = argv[1];
fi = open(s, 0);
if(fi < 0) {
write("cannot open wtmp\n", 17);
exit();
}
fout = dup(1);
close(1);
if (argc==3)
tty = ttyn(0);
loop:
n = read(fi, buf, 512);
if(n == 0) {
flush();
if (argc==3)
write(fout, "Nobody.\n", 8);
exit();
}
p = &buf;
for(p = &buf; (n =- 16)>=0; p++) {
if (argc==3 && tty!=p->tty)
continue;
if(p->name[0] == '\0' && argc==1)
continue;
for(i=0; i<8; i++) {
if(p->name[i] == '\0')
p->name[i] = ' ';
putchar(p->name[i]);
}
for(i=0; i<3; i++)
putchar("tty"[i]);
putchar(p->tty);
cbuf = ctime(p->time);
for(i=3; i<16; i++)
putchar(cbuf[i]);
putchar('\n');
if (argc==3) {
flush();
exit();
}
}
goto loop;
}
+204
View File
@@ -0,0 +1,204 @@
/ write -- write to another user
.globl ttyn
cmp (sp)+,$2
beq 1f
bgt 2f
mov $1,r0
sys write; argm; eargm-argm
sys exit
2:
movb *4(sp),ltty
1:
tst (sp)+
mov (sp)+,r5
sys open; utmp; 0
bec 1f
mov $1,r0
sys write; film; efilm-film
sys exit
1:
mov r0,ufil
1:
mov ufil,r0
sys read; ubuf; 16.
tst r0
bne 2f
jmp 8f
2:
tstb ltty
beq 2f
cmpb ltty,8.+ubuf
bne 1b
2:
mov $ubuf,r3
mov r5,r4
mov $9.,r2
2:
dec r2
beq 2f
cmpb (r4)+,(r3)+
beq 2b
tstb -1(r4)
bne 1b
cmpb $' ,-1(r3)
bne 1b
2:
movb 8.+ubuf,ttyno
sys open; ttyx; 1
bes 3f
sys stat; ttyx; statbuf
bes 3f
bit $2,statbuf+4
bne 2f
3:
mov $1,r0
sys write; dnymes; ednymes-dnymes
sys exit
2:
mov r0,ttyf
clr r0
jsr pc,ttyn
mov r0,r3
mov statbuf,r4
mov ufil,r0
sys seek; 0; 0
1:
mov ufil,r0
sys read; ubuf; 16.
tst r0
beq unknown
cmp r3,ubuf+8.
bne 1b
mov $ubuf,r0
mov $8.,r1
1:
cmpb $' ,(r0)+
beq 1f
dec r1
bne 1b
1:
neg r1
add $8,r1
mov r1,0f
6:
mov ttyf,r0
sys write; mesg; emesg-mesg
mov ttyf,r0
sys 0; 5f
.data
5:
sys write; ubuf; 0:2
.text
mov ttyf,r0
sys write; qnl; 4
sys signal; 2; 9f
7:
clr r0
sys read; ch; 1
tst r0
beq 9f
tst nlflg
beq 1f
cmp ch,$'!
bne 1f
sys fork
br mshproc
sys wait
mov $1,r0
sys write; excl; 2
br 7b
1:
clr nlflg
cmp ch,$'\n
bne 1f
inc nlflg
1:
mov ttyf,r0
sys write; ch; 1
br 7b
8:
movb (r5)+,ch
beq 8f
mov $1,r0
sys write; ch; 1
br 8b
8:
tstb ltty
beq 8f
mov $1,r0
sys write; ltty-1; 2
8:
mov $1,r0
sys write; errmsg; eerrmsg-errmsg
sys exit
9:
mov ttyf,r0
sys write; endmsg; eendmsg-endmsg
sys exit
unknown:
mov $"??,ubuf
br 6b
mshproc:
sys exec; msh; mshp
sys exit
.data
nlflg:
1
.text
mshp:
msh
minust
0
msh:
</bin/sh\0>
minust:
<-t\0>
argm:
<Arg count\n>
eargm:
film:
<Cannot open utmp\n>
efilm:
.data
< > / is ltty -1
ltty:
.=.+1
.text
excl:
<!\n>
qnl:
<...\n>
.data
ttyx:
</dev/ttyx\0>
ttyno = .-2
.text
utmp:
</etc/utmp\0>
endmsg:
<EOT\n>
eendmsg:
errmsg:
< not logged in.\n>
eerrmsg:
mesg:
<\nMessage from >
emesg:
dnymes:
<Permission denied.\n>
ednymes:
.even
.bss
ttyf: .=.+2
ubuf: .=.+16.
statbuf:.=.+40.
ch: .=.+2
ufil: .=.+2
signal = 48.